| 
									
										
										
										
											2020-07-08 15:01:33 +02:00
										 |  |  | /* Apache License, Version 2.0 */ | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "testing/testing.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "FN_array_spans.hh"
 | 
					
						
							| 
									
										
										
										
											2020-06-22 15:48:08 +02:00
										 |  |  | #include "FN_generic_vector_array.hh"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_array.hh"
 | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 12:19:11 +02:00
										 |  |  | namespace blender::fn::tests { | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | TEST(virtual_array_span, EmptyConstructor) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   VArraySpan<int> span; | 
					
						
							|  |  |  |   EXPECT_EQ(span.size(), 0); | 
					
						
							|  |  |  |   EXPECT_TRUE(span.is_empty()); | 
					
						
							| 
									
										
										
										
											2020-06-22 15:48:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   GVArraySpan converted(span); | 
					
						
							|  |  |  |   EXPECT_EQ(converted.type(), CPPType::get<int>()); | 
					
						
							|  |  |  |   EXPECT_EQ(converted.size(), 0); | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							| 
									
										
										
										
											2020-06-22 15:48:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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]); | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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()}; | 
					
						
							| 
									
										
										
										
											2020-08-19 16:56:36 +02:00
										 |  |  |   std::array<int64_t, 3> sizes{static_cast<int64_t>(values0.size()), | 
					
						
							|  |  |  |                                static_cast<int64_t>(values1.size()), | 
					
						
							|  |  |  |                                static_cast<int64_t>(values2.size())}; | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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); | 
					
						
							| 
									
										
										
										
											2020-06-22 15:48:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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); | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST(generic_virtual_array_span, TypeConstructor) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-07-17 14:15:06 +02:00
										 |  |  |   GVArraySpan span{CPPType::get<int32_t>()}; | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  |   EXPECT_EQ(span.size(), 0); | 
					
						
							|  |  |  |   EXPECT_TRUE(span.is_empty()); | 
					
						
							| 
									
										
										
										
											2020-06-22 15:48:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   VArraySpan converted = span.typed<int>(); | 
					
						
							|  |  |  |   EXPECT_EQ(converted.size(), 0); | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST(generic_virtual_array_span, GSpanConstructor) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   std::array<std::string, 3> values = {"hello", "world", "test"}; | 
					
						
							| 
									
										
										
										
											2020-07-17 14:15:06 +02:00
										 |  |  |   GVArraySpan span{GSpan(CPPType::get<std::string>(), values.data(), 3), 5}; | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  |   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"); | 
					
						
							| 
									
										
										
										
											2020-06-22 15:48:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-07-17 14:15:06 +02:00
										 |  |  |   GVectorArray vectors{CPPType::get<int32_t>(), 3}; | 
					
						
							| 
									
										
										
										
											2020-06-22 15:48:08 +02:00
										 |  |  |   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()); | 
					
						
							| 
									
										
										
										
											2020-06-16 16:35:57 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-26 12:19:11 +02:00
										 |  |  | }  // namespace blender::fn::tests
 |