Line data Source code
1 : #ifndef _TEST_SET_MATRIX4_H
2 : #define _TEST_SET_MATRIX4_H
3 :
4 : #include "Util/String.H"
5 : #include "Util/Util.H"
6 : #include "Set/Set.H"
7 : #include "Set/Matrix4.H"
8 :
9 : namespace Test
10 : {
11 : namespace Set
12 : {
13 : template <int dim, ::Set::Sym sym>
14 : class Matrix4
15 : {
16 : public:
17 10 : static int PODTest(int verbose = 1)
18 : {
19 10 : int ret = 0;
20 : if (!std::is_trivially_copyable<::Set::Matrix4<dim,sym>>::value)
21 : {
22 : if (verbose) Util::Message(INFO,"Is not trivially copyable");
23 : ret += 1;
24 : }
25 : if (std::has_virtual_destructor<::Set::Matrix4<dim,sym>>::value)
26 : {
27 : if (verbose) Util::Message(INFO,"Should not have virtual destructor");
28 : ret += 1;
29 : }
30 : if (std::is_polymorphic<::Set::Matrix4<dim,sym>>::value)
31 : {
32 : if (verbose) Util::Message(INFO,"Should not be polymorphic");
33 : ret += 1;
34 : }
35 : if (!std::is_standard_layout<::Set::Matrix4<dim,sym>>::value)
36 : {
37 : if (verbose) Util::Message(INFO,"Does not have standard layout.");
38 : ret += 1;
39 : }
40 10 : Util::Test::SubMessage("POD", ret);
41 10 : return ret;
42 : }
43 :
44 :
45 10 : static int SymmetryTest(int /*verbose*/ = 0)
46 : {
47 10 : int failed = 0;
48 10 : ::Set::Matrix4<dim,sym> matrix = ::Set::Matrix4<dim,sym>::Random();
49 :
50 : //Util::Message(INFO,matrix);
51 : //std::cout << matrix << std::endl;
52 : if (sym == ::Set::Sym::MajorMinor)
53 : {
54 7 : for (int i = 0; i < dim; i++)
55 18 : for (int j = 0; j < dim; j++)
56 48 : for (int k = 0; k < dim; k++)
57 132 : for (int l = 0; l < dim; l++)
58 : {
59 194 : if (matrix(i,j,k,l) != matrix(k,l,i,j)) failed += 1; // breaks major symmetry
60 194 : if (matrix(i,j,k,l) != matrix(i,j,l,k)) failed += 1; // breaks minor symmetry
61 194 : if (matrix(i,j,k,l) != matrix(j,i,k,l)) failed += 1; // breaks minor symmetry
62 : }
63 : }
64 : else if (sym == ::Set::Sym::Full)
65 : {
66 7 : for (int i = 0; i < dim; i++)
67 18 : for (int j = 0; j < dim; j++)
68 48 : for (int k = 0; k < dim; k++)
69 132 : for (int l = 0; l < dim; l++)
70 : {
71 194 : if (matrix(i,j,k,l) != matrix(i,j,l,k)) failed += 1;
72 194 : if (matrix(i,j,k,l) != matrix(i,k,j,l)) failed += 1;
73 194 : if (matrix(i,j,k,l) != matrix(i,k,l,j)) failed += 1;
74 194 : if (matrix(i,j,k,l) != matrix(i,l,j,k)) failed += 1;
75 194 : if (matrix(i,j,k,l) != matrix(i,l,k,j)) failed += 1;
76 194 : if (matrix(i,j,k,l) != matrix(j,i,k,l)) failed += 1;
77 194 : if (matrix(i,j,k,l) != matrix(j,i,l,k)) failed += 1;
78 194 : if (matrix(i,j,k,l) != matrix(j,k,i,l)) failed += 1;
79 194 : if (matrix(i,j,k,l) != matrix(j,k,l,i)) failed += 1;
80 194 : if (matrix(i,j,k,l) != matrix(j,l,i,k)) failed += 1;
81 194 : if (matrix(i,j,k,l) != matrix(j,l,k,i)) failed += 1;
82 194 : if (matrix(i,j,k,l) != matrix(k,i,j,l)) failed += 1;
83 194 : if (matrix(i,j,k,l) != matrix(k,i,l,j)) failed += 1;
84 194 : if (matrix(i,j,k,l) != matrix(k,j,i,l)) failed += 1;
85 194 : if (matrix(i,j,k,l) != matrix(k,j,l,i)) failed += 1;
86 194 : if (matrix(i,j,k,l) != matrix(k,l,i,j)) failed += 1;
87 194 : if (matrix(i,j,k,l) != matrix(k,l,j,i)) failed += 1;
88 194 : if (matrix(i,j,k,l) != matrix(l,i,j,k)) failed += 1;
89 194 : if (matrix(i,j,k,l) != matrix(l,i,k,j)) failed += 1;
90 194 : if (matrix(i,j,k,l) != matrix(l,j,i,k)) failed += 1;
91 194 : if (matrix(i,j,k,l) != matrix(l,j,k,i)) failed += 1;
92 194 : if (matrix(i,j,k,l) != matrix(l,k,i,j)) failed += 1;
93 194 : if (matrix(i,j,k,l) != matrix(l,k,j,i)) failed += 1;
94 : }
95 : }
96 : else
97 : {
98 6 : return failed;
99 : }
100 :
101 :
102 4 : Util::Test::SubMessage("Symmetry", failed);
103 4 : return failed;
104 : }
105 :
106 10 : static int Test(int verbose = 1)
107 : {
108 10 : std::string funcname = __PRETTY_FUNCTION__;
109 10 : auto pos = funcname.find('[');
110 10 : if (pos != std::string_view::npos) funcname = funcname.substr(0, pos);
111 :
112 10 : Util::Test::Message(funcname);
113 10 : int failed = 0;
114 :
115 10 : failed += PODTest(verbose);
116 10 : failed += SymmetryTest(verbose);
117 10 : return failed;
118 10 : }
119 :
120 : };
121 : }
122 : }
123 :
124 : #endif
|