This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/tests/gtests/functions/FN_array_spans_test.cc
T
Jacques Lucke 2679236047 Cleanup: avoid static initialization order issues when accessing CPPTypes
Instead of depending on static initialization order of globals use
static variables within functions. Those are initialized on first use.
This is every so slighly less efficient, but avoids a full class of problems.
2020-07-17 14:15:06 +02:00

133 lines
3.7 KiB
C++

/* Apache License, Version 2.0 */
#include "testing/testing.h"
#include "FN_array_spans.hh"
#include "FN_generic_vector_array.hh"
#include "BLI_array.hh"
namespace blender::fn {
TEST(virtual_array_span, EmptyConstructor)
{
VArraySpan<int> span;
EXPECT_EQ(span.size(), 0);
EXPECT_TRUE(span.is_empty());
GVArraySpan converted(span);
EXPECT_EQ(converted.type(), CPPType::get<int>());
EXPECT_EQ(converted.size(), 0);
}
TEST(virtual_array_span, SingleArrayConstructor)
{
std::array<int, 4> values = {3, 4, 5, 6};
VArraySpan<int> span{Span<int>(values), 3};
EXPECT_EQ(span.size(), 3);
EXPECT_FALSE(span.is_empty());
EXPECT_EQ(span[0].size(), 4);
EXPECT_EQ(span[1].size(), 4);
EXPECT_EQ(span[2].size(), 4);
EXPECT_EQ(span[0][0], 3);
EXPECT_EQ(span[0][1], 4);
EXPECT_EQ(span[0][2], 5);
EXPECT_EQ(span[0][3], 6);
EXPECT_EQ(span[1][3], 6);
EXPECT_EQ(span[2][1], 4);
GVArraySpan converted(span);
EXPECT_EQ(converted.type(), CPPType::get<int>());
EXPECT_EQ(converted.size(), 3);
EXPECT_EQ(converted[0].size(), 4);
EXPECT_EQ(converted[1].size(), 4);
EXPECT_EQ(converted[1][2], &values[2]);
}
TEST(virtual_array_span, MultipleArrayConstructor)
{
std::array<int, 4> values0 = {1, 2, 3, 4};
std::array<int, 2> values1 = {6, 7};
std::array<int, 1> values2 = {8};
std::array<const int *, 3> starts = {values0.data(), values1.data(), values2.data()};
std::array<uint, 3> sizes{values0.size(), values1.size(), values2.size()};
VArraySpan<int> span{starts, sizes};
EXPECT_EQ(span.size(), 3);
EXPECT_FALSE(span.is_empty());
EXPECT_EQ(span[0].size(), 4);
EXPECT_EQ(span[1].size(), 2);
EXPECT_EQ(span[2].size(), 1);
EXPECT_EQ(&span[0][0], values0.data());
EXPECT_EQ(&span[1][0], values1.data());
EXPECT_EQ(&span[2][0], values2.data());
EXPECT_EQ(span[2][0], 8);
EXPECT_EQ(span[1][1], 7);
GVArraySpan converted(span);
EXPECT_EQ(converted.type(), CPPType::get<int>());
EXPECT_EQ(converted.size(), 3);
EXPECT_EQ(converted[0].size(), 4);
EXPECT_EQ(converted[1].size(), 2);
EXPECT_EQ(converted[2].size(), 1);
EXPECT_EQ(converted[0][0], values0.data());
EXPECT_EQ(converted[1][1], values1.data() + 1);
}
TEST(generic_virtual_array_span, TypeConstructor)
{
GVArraySpan span{CPPType::get<int32_t>()};
EXPECT_EQ(span.size(), 0);
EXPECT_TRUE(span.is_empty());
VArraySpan converted = span.typed<int>();
EXPECT_EQ(converted.size(), 0);
}
TEST(generic_virtual_array_span, GSpanConstructor)
{
std::array<std::string, 3> values = {"hello", "world", "test"};
GVArraySpan span{GSpan(CPPType::get<std::string>(), values.data(), 3), 5};
EXPECT_EQ(span.size(), 5);
EXPECT_FALSE(span.is_empty());
EXPECT_EQ(span[0][0], values.data());
EXPECT_EQ(span[1][0], values.data());
EXPECT_EQ(span[4][0], values.data());
EXPECT_EQ(span[0].size(), 3);
EXPECT_EQ(span[2].size(), 3);
EXPECT_EQ(*(std::string *)span[3][1], "world");
VArraySpan converted = span.typed<std::string>();
EXPECT_EQ(converted.size(), 5);
EXPECT_EQ(converted[0][0], "hello");
EXPECT_EQ(converted[1][0], "hello");
EXPECT_EQ(converted[4][0], "hello");
EXPECT_EQ(converted[0].size(), 3);
EXPECT_EQ(converted[2].size(), 3);
}
TEST(generic_virtual_array_span, IsSingleArray1)
{
Array<int> values = {5, 6, 7};
GVArraySpan span{GSpan(values.as_span()), 4};
EXPECT_TRUE(span.is_single_array());
VArraySpan converted = span.typed<int>();
EXPECT_TRUE(converted.is_single_array());
}
TEST(generic_virtual_array_span, IsSingleArray2)
{
GVectorArray vectors{CPPType::get<int32_t>(), 3};
GVectorArrayRef<int> vectors_ref = vectors;
vectors_ref.append(1, 4);
GVArraySpan span = vectors;
EXPECT_FALSE(span.is_single_array());
VArraySpan converted = span.typed<int>();
EXPECT_FALSE(converted.is_single_array());
}
} // namespace blender::fn