1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    TestSortFieldData.cxx
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 #include "vtkSortFieldData.h"
16 #include "vtkIntArray.h"
17 #include "vtkStringArray.h"
18 #include "vtkDoubleArray.h"
19 #include "vtkVariantArray.h"
20 #include "vtkFieldData.h"
21 #include "vtkMath.h"
22 
23 #include <sstream> // to_string chokes some compilers
24 #include <locale> // C++ locale
25 
26 // A simple test sorts on one of the components of a 3-tuple array, and then
27 // orders all of the arrays based on the sort indices.
TestSortFieldData(int,char * [])28 int TestSortFieldData(int, char*[])
29 {
30   // Create the arrays
31   vtkIntArray *iArray = vtkIntArray::New();
32   iArray->SetName("Int Array");
33   iArray->SetNumberOfComponents(3);
34   iArray->SetNumberOfTuples(10);
35 
36   vtkStringArray *sArray = vtkStringArray::New();
37   sArray->SetName("String Array");
38   sArray->SetNumberOfComponents(1);
39   sArray->SetNumberOfTuples(10);
40 
41   vtkDoubleArray *dArray = vtkDoubleArray::New();
42   dArray->SetName("Double Array");
43   dArray->SetNumberOfComponents(2);
44   dArray->SetNumberOfTuples(10);
45 
46   vtkVariantArray *vArray = vtkVariantArray::New();
47   vArray->SetName("Variant Array");
48   vArray->SetNumberOfComponents(1);
49   vArray->SetNumberOfTuples(10);
50 
51   // Populate the arrays. Mostly random numbers with a some values
52   // set to compare against expected output.
53   std::ostringstream ostr;
54   ostr.imbue(std::locale::classic());
55   int permute[] = {3,0,9,6,7,4,5,8,2,1};
56   for (int i=0; i < 10; ++i)
57   {
58     iArray->SetComponent(i,0, i);
59     iArray->SetComponent(permute[i],1, i);
60     iArray->SetComponent(i,2, static_cast<int>(vtkMath::Random(0,100)));
61     ostr.str(""); //clear it out
62     ostr << i;
63     sArray->SetValue(permute[i], ostr.str());
64     dArray->SetComponent(i,0, static_cast<double>(vtkMath::Random(-1,1)));
65     dArray->SetComponent(permute[i],1, static_cast<double>(i));
66     vArray->SetValue(permute[i],vtkVariant(ostr.str()));
67   }
68 
69   // Create the field data
70   vtkFieldData *fd = vtkFieldData::New();
71   fd->AddArray(iArray);
72   fd->AddArray(dArray);
73   fd->AddArray(vArray);
74   fd->AddArray(sArray);
75 
76   // Sort the data
77   vtkIdType *idx = vtkSortFieldData::Sort(fd,"Int Array",1,1,0);
78 
79   // Now test the result
80   cout << "Ordering:\n\t( ";
81   for (int i=0; i<10; ++i)
82   {
83     cout << idx[i] << " ";
84     if (idx[i] != permute[i])
85     {
86       cout << "Bad sort order!\n";
87       delete [] idx;
88       return 1;
89     }
90   }
91   delete [] idx;
92   cout << ")";
93 
94   cout << "\n\nInteger Array (sorted by component==1):\n";
95   for (int i=0; i<10; ++i)
96   {
97     cout << "\t(" << iArray->GetComponent(i,0) << ","
98          << iArray->GetComponent(i,1) << ","
99          << iArray->GetComponent(i,2) << ")\n";
100     if (iArray->GetComponent(i,1) != i )
101     {
102       cout << "Bad sort order!\n";
103       return 1;
104     }
105   }
106 
107   cout << "\nDouble Array:\n";
108   for (int i=0; i<10; ++i)
109   {
110     cout << "\t(" << dArray->GetComponent(i,0) << ","
111          << dArray->GetComponent(i,1) << ")\n";
112     if (dArray->GetComponent(i,1) != i )
113     {
114       cout << "Bad sort order!\n";
115       return 1;
116     }
117   }
118 
119   cout << "\nString Array:\n\t( ";
120   for (int i=0; i<10; ++i)
121   {
122     cout << sArray->GetValue(i) << " ";
123     ostr.str(""); //clear it out
124     ostr << i;
125     if (sArray->GetValue(i) != ostr.str())
126     {
127       cout << "Bad sort order!\n";
128       return 1;
129     }
130   }
131   cout << ")\n";
132 
133   cout << "\nVariant Array:\n\t( ";
134   for (int i=0; i<10; ++i)
135   {
136     cout << vArray->GetValue(i).ToString() << " ";
137     ostr.str(""); //clear it out
138     ostr << i;
139     if (vArray->GetValue(i).ToString() != ostr.str() )
140     {
141       cout << "Bad sort order!\n";
142       return 1;
143     }
144   }
145   cout << ")\n";
146 
147   // Clean up
148   iArray->Delete();
149   sArray->Delete();
150   dArray->Delete();
151   vArray->Delete();
152   fd->Delete();
153 
154   return 0;
155 }
156