1 #include "vtkDataSetAttributes.h"
2 #include "vtkDoubleArray.h"
3 #include "vtkIntArray.h"
4 #include "vtkNew.h"
5 #include "vtkSmartPointer.h"
6
7 #include <string>
8
9 namespace
10 {
11 template <typename T>
CreateArray(const char * aname,int num_comps,vtkIdType numTuples)12 vtkSmartPointer<T> CreateArray(const char* aname, int num_comps, vtkIdType numTuples)
13 {
14 auto array = vtkSmartPointer<T>::New();
15 array->SetName(aname);
16 array->SetNumberOfComponents(num_comps);
17 array->SetNumberOfTuples(numTuples);
18 array->FillValue(typename T::ValueType());
19 return array;
20 }
21
22 #define EXPECT_THAT(v, m) \
23 if ((v) != (m)) \
24 { \
25 cerr << "FAILED at line " << __LINE__ << ": \n " << #v << " must match " << #m << endl; \
26 return EXIT_FAILURE; \
27 }
28 }
29
TestFieldList(int,char * [])30 int TestFieldList(int, char*[])
31 {
32
33 {
34 // For arrays without names, ensure we are doing a order-dependent matching.
35 // For attributes, the attribute flag is preserved if the same arrays is
36 // consistently flagged as an attribute on all DSA instances.
37 vtkNew<vtkDataSetAttributes> dsa0;
38 dsa0->SetScalars(CreateArray<vtkDoubleArray>(nullptr, 1, 20));
39 dsa0->AddArray(CreateArray<vtkDoubleArray>(nullptr, 2, 20));
40 dsa0->SetVectors(CreateArray<vtkDoubleArray>(nullptr, 3, 20));
41 EXPECT_THAT(dsa0->GetNumberOfArrays(), 3);
42
43 vtkNew<vtkDataSetAttributes> dsa1;
44 dsa1->SetScalars(CreateArray<vtkDoubleArray>(nullptr, 1, 20));
45 dsa1->AddArray(CreateArray<vtkDoubleArray>(nullptr, 3, 20));
46 dsa1->AddArray(CreateArray<vtkDoubleArray>(nullptr, 3, 20));
47 EXPECT_THAT(dsa1->GetNumberOfArrays(), 3);
48
49 vtkDataSetAttributes::FieldList fl;
50 fl.InitializeFieldList(dsa0);
51 fl.IntersectFieldList(dsa1);
52
53 vtkNew<vtkDataSetAttributes> output;
54 fl.CopyAllocate(output, vtkDataSetAttributes::COPYTUPLE, 0, 0);
55 EXPECT_THAT(output->GetNumberOfArrays(), 2);
56 EXPECT_THAT(output->GetArray(0)->GetNumberOfComponents(), 1);
57 EXPECT_THAT(output->GetArray(1)->GetNumberOfComponents(), 3);
58 EXPECT_THAT(output->GetVectors(), nullptr);
59 EXPECT_THAT(output->GetScalars() != nullptr, true);
60
61 fl.InitializeFieldList(dsa0);
62 fl.UnionFieldList(dsa1);
63 output->Initialize();
64 fl.CopyAllocate(output, vtkDataSetAttributes::COPYTUPLE, 0, 0);
65 EXPECT_THAT(output->GetNumberOfArrays(), 4);
66 EXPECT_THAT(output->GetArray(0)->GetNumberOfComponents(), 1);
67 EXPECT_THAT(output->GetArray(1)->GetNumberOfComponents(), 2);
68 EXPECT_THAT(output->GetArray(2)->GetNumberOfComponents(), 3);
69 EXPECT_THAT(output->GetArray(3)->GetNumberOfComponents(), 3);
70 EXPECT_THAT(output->GetVectors(), nullptr);
71 EXPECT_THAT(output->GetScalars() != nullptr, true);
72
73 // just to increase coverage.
74 fl.PrintSelf(cout, vtkIndent());
75 }
76
77 {
78 // If inputs arrays with different names for attributes,
79 // make sure output doesn't have either of the arrays flagged as attributes.
80 vtkNew<vtkDataSetAttributes> dsa0;
81 dsa0->SetScalars(CreateArray<vtkDoubleArray>("scalars", 1, 20));
82 dsa0->AddArray(CreateArray<vtkDoubleArray>("vectors", 3, 20));
83 dsa0->AddArray(CreateArray<vtkDoubleArray>("common", 1, 20));
84 dsa0->AddArray(CreateArray<vtkDoubleArray>("uncommon0", 1, 20));
85
86 vtkNew<vtkDataSetAttributes> dsa1;
87 dsa1->AddArray(CreateArray<vtkDoubleArray>("scalars", 1, 20));
88 dsa1->SetVectors(CreateArray<vtkDoubleArray>("vectors", 3, 20));
89 dsa1->AddArray(CreateArray<vtkDoubleArray>("common", 1, 20));
90 dsa0->AddArray(CreateArray<vtkDoubleArray>("uncommon1", 1, 20));
91
92 vtkDataSetAttributes::FieldList fl;
93 fl.InitializeFieldList(dsa0);
94 fl.IntersectFieldList(dsa1);
95
96 vtkNew<vtkDataSetAttributes> output;
97 fl.CopyAllocate(output, vtkDataSetAttributes::COPYTUPLE, 0, 0);
98 EXPECT_THAT(output->GetNumberOfArrays(), 3);
99 EXPECT_THAT(output->GetArray("uncommon0"), nullptr);
100 EXPECT_THAT(output->GetArray("uncommon1"), nullptr);
101 EXPECT_THAT(output->GetScalars(), nullptr);
102 EXPECT_THAT(output->GetVectors(), nullptr);
103 EXPECT_THAT(output->GetArray("scalars") != nullptr, true);
104 EXPECT_THAT(output->GetArray("vectors") != nullptr, true);
105
106 fl.InitializeFieldList(dsa0);
107 fl.UnionFieldList(dsa1);
108 output->Initialize();
109 fl.CopyAllocate(output, vtkDataSetAttributes::COPYTUPLE, 0, 0);
110 EXPECT_THAT(output->GetNumberOfArrays(), 5);
111 EXPECT_THAT(output->GetScalars(), nullptr);
112 EXPECT_THAT(output->GetVectors(), nullptr);
113 }
114
115 return EXIT_SUCCESS;
116 }
117