/* Apache License, Version 2.0 */ #include "BLI_float3.hh" #include "FN_attributes_ref.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}; int 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").data(), positions.data() + 1); EXPECT_EQ(attributes.get("ID").data(), ids.data() + 1); EXPECT_EQ(attributes.get("Size").data(), sizes.data() + 1); EXPECT_EQ(attributes.get("Name").data(), 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