/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "BLI_float3.hh" #include "FN_attributes_ref.hh" #include "FN_cpp_types.hh" #include "testing/testing.h" namespace blender::fn { TEST(attributes_info, BuildEmpty) { AttributesInfoBuilder info_builder; AttributesInfo info{info_builder}; EXPECT_EQ(info.size(), 0); } TEST(attributes_info, AddSameNameTwice) { AttributesInfoBuilder info_builder; info_builder.add("A", 4); info_builder.add("A", 5); AttributesInfo info{info_builder}; EXPECT_EQ(info.size(), 1); EXPECT_TRUE(info.has_attribute("A", CPPType::get())); EXPECT_FALSE(info.has_attribute("B", CPPType::get())); EXPECT_FALSE(info.has_attribute("A", CPPType::get())); EXPECT_EQ(info.default_of("A"), 4); EXPECT_EQ(info.name_of(0), "A"); EXPECT_EQ(info.index_range().start(), 0); EXPECT_EQ(info.index_range().one_after_last(), 1); } TEST(attributes_info, BuildWithDefaultString) { AttributesInfoBuilder info_builder; info_builder.add("A", CPPType::get()); AttributesInfo info{info_builder}; EXPECT_EQ(info.default_of("A"), ""); } TEST(attributes_info, BuildWithGivenDefault) { AttributesInfoBuilder info_builder; info_builder.add("A", "hello world"); AttributesInfo info{info_builder}; const void *default_value = info.default_of("A"); EXPECT_EQ(*(const std::string *)default_value, "hello world"); EXPECT_EQ(info.type_of("A"), CPPType::get()); } TEST(mutable_attributes_ref, ComplexTest) { AttributesInfoBuilder info_builder; info_builder.add("Position", {0, 0, 10}); info_builder.add("ID", 0); info_builder.add("Size", 0.5f); info_builder.add("Name", ""); AttributesInfo info{info_builder}; uint amount = 5; Array positions(amount); Array ids(amount, 0); Array sizes(amount); Array names(amount); Array buffers = {positions.data(), ids.data(), sizes.data(), names.data()}; MutableAttributesRef attributes{info, buffers, IndexRange(1, 3)}; EXPECT_EQ(attributes.size(), 3); EXPECT_EQ(attributes.info().size(), 4); EXPECT_EQ(attributes.get("Position").buffer(), positions.data() + 1); EXPECT_EQ(attributes.get("ID").buffer(), ids.data() + 1); EXPECT_EQ(attributes.get("Size").buffer(), sizes.data() + 1); EXPECT_EQ(attributes.get("Name").buffer(), names.data() + 1); EXPECT_EQ(attributes.get("ID").size(), 3); EXPECT_EQ(attributes.get("ID").size(), 3); EXPECT_EQ(ids[2], 0); MutableSpan ids_span = attributes.get("ID"); ids_span[1] = 42; EXPECT_EQ(ids[2], 42); EXPECT_FALSE(attributes.try_get("not existant").has_value()); EXPECT_FALSE(attributes.try_get("Position").has_value()); EXPECT_TRUE(attributes.try_get("Position").has_value()); EXPECT_FALSE(attributes.try_get("not existant", CPPType::get()).has_value()); EXPECT_FALSE(attributes.try_get("Position", CPPType::get()).has_value()); EXPECT_TRUE(attributes.try_get("Position", CPPType::get()).has_value()); MutableAttributesRef sliced = attributes.slice(IndexRange(1, 2)); EXPECT_EQ(sliced.size(), 2); sliced.get("ID")[0] = 100; EXPECT_EQ(ids[2], 100); } } // namespace blender::fn