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