1 //===- TestPoly3D.cpp - Poly3D unit tests------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/Support/TypeSize.h"
10 #include "gtest/gtest.h"
11 
12 using namespace llvm;
13 
14 class Poly3D;
15 
16 namespace llvm {
17 template <> struct LinearPolyBaseTypeTraits<Poly3D> {
18   using ScalarTy = int64_t;
19   static const unsigned Dimensions = 3;
20 };
21 }
22 
23 using Poly3DBase = LinearPolyBase<Poly3D>;
24 class Poly3D : public Poly3DBase {
25 public:
26   using ScalarTy = Poly3DBase::ScalarTy;
27   Poly3D(ScalarTy x, ScalarTy y, ScalarTy z) : Poly3DBase({x, y, z}) {}
28   Poly3D(const Poly3DBase &Convert) : Poly3DBase(Convert) {}
29 };
30 
31 TEST(LinearPolyBase, Poly3D_isZero) {
32   EXPECT_TRUE(Poly3D(0, 0, 0).isZero());
33   EXPECT_TRUE(Poly3D(0, 0, 1).isNonZero());
34   EXPECT_TRUE(Poly3D(0, 0, 1));
35 }
36 
37 TEST(LinearPolyBase, Poly3D_Equality) {
38   EXPECT_EQ(Poly3D(1, 2, 3), Poly3D(1, 2, 3));
39   EXPECT_NE(Poly3D(1, 2, 3), Poly3D(1, 2, 4));
40 }
41 
42 TEST(LinearPolyBase, Poly3D_GetValue) {
43   EXPECT_EQ(Poly3D(1, 2, 3).getValue(0), 1);
44   EXPECT_EQ(Poly3D(1, 2, 3).getValue(1), 2);
45   EXPECT_EQ(Poly3D(1, 2, 3).getValue(2), 3);
46 }
47 
48 TEST(LinearPolyBase, Poly3D_Add) {
49   // Test operator+
50   EXPECT_EQ(Poly3D(42, 0, 0) + Poly3D(0, 42, 0) + Poly3D(0, 0, 42),
51             Poly3D(42, 42, 42));
52 
53   // Test operator+=
54   Poly3D X(42, 0, 0);
55   X += Poly3D(0, 42, 0);
56   X += Poly3D(0, 0, 42);
57   EXPECT_EQ(X, Poly3D(42, 42, 42));
58 }
59 
60 TEST(LinearPolyBase, Poly3D_Sub) {
61   // Test operator-
62   EXPECT_EQ(Poly3D(42, 42, 42) - Poly3D(42, 0, 0) - Poly3D(0, 42, 0) -
63                 Poly3D(0, 0, 42),
64             Poly3D(0, 0, 0));
65 
66   // Test operator-=
67   Poly3D X(42, 42, 42);
68   X -= Poly3D(42, 0, 0);
69   X -= Poly3D(0, 42, 0);
70   X -= Poly3D(0, 0, 42);
71   EXPECT_EQ(X, Poly3D(0, 0, 0));
72 }
73 
74 TEST(LinearPolyBase, Poly3D_Scale) {
75   // Test operator*
76   EXPECT_EQ(Poly3D(1, 2, 4) * 2, Poly3D(2, 4, 8));
77   EXPECT_EQ(Poly3D(1, 2, 4) * -2, Poly3D(-2, -4, -8));
78 }
79 
80 TEST(LinearPolyBase, Poly3D_Invert) {
81   // Test operator-
82   EXPECT_EQ(-Poly3D(2, 4, 8), Poly3D(-2, -4, -8));
83 }
84 
85 class Univariate3D;
86 namespace llvm {
87 template <> struct LinearPolyBaseTypeTraits<Univariate3D> {
88   using ScalarTy = int64_t;
89   static const unsigned Dimensions = 3;
90 };
91 }
92 
93 using Univariate3DBase = UnivariateLinearPolyBase<Univariate3D>;
94 class Univariate3D : public Univariate3DBase {
95 public:
96   using ScalarTy = Univariate3DBase::ScalarTy;
97   Univariate3D(ScalarTy x, unsigned Dim) : Univariate3DBase(x, Dim) {}
98   Univariate3D(const Univariate3DBase &Convert) : Univariate3DBase(Convert) {}
99 };
100 
101 TEST(UnivariateLinearPolyBase, Univariate3D_isZero) {
102   EXPECT_TRUE(Univariate3D(0, 0).isZero());
103   EXPECT_TRUE(Univariate3D(0, 1).isZero());
104   EXPECT_TRUE(Univariate3D(0, 2).isZero());
105   EXPECT_TRUE(Univariate3D(1, 0).isNonZero());
106   EXPECT_TRUE(Univariate3D(1, 1).isNonZero());
107   EXPECT_TRUE(Univariate3D(1, 2).isNonZero());
108   EXPECT_TRUE(Univariate3D(1, 0));
109 }
110 
111 TEST(UnivariateLinearPolyBase, Univariate3D_Equality) {
112   EXPECT_EQ(Univariate3D(1, 0), Univariate3D(1, 0));
113   EXPECT_NE(Univariate3D(1, 0), Univariate3D(1, 2));
114   EXPECT_NE(Univariate3D(1, 0), Univariate3D(1, 1));
115   EXPECT_NE(Univariate3D(1, 0), Univariate3D(2, 0));
116   EXPECT_NE(Univariate3D(1, 0), Univariate3D(0, 0));
117 }
118 
119 TEST(UnivariateLinearPolyBase, Univariate3D_GetValue) {
120   EXPECT_EQ(Univariate3D(42, 0).getValue(0), 42);
121   EXPECT_EQ(Univariate3D(42, 0).getValue(1), 0);
122   EXPECT_EQ(Univariate3D(42, 0).getValue(2), 0);
123 
124   EXPECT_EQ(Univariate3D(42, 1).getValue(0), 0);
125   EXPECT_EQ(Univariate3D(42, 1).getValue(1), 42);
126   EXPECT_EQ(Univariate3D(42, 1).getValue(2), 0);
127 }
128 
129 TEST(UnivariateLinearPolyBase, Univariate3D_Add) {
130   // Test operator+
131   EXPECT_EQ(Univariate3D(42, 0) + Univariate3D(42, 0), Univariate3D(84, 0));
132   EXPECT_EQ(Univariate3D(42, 1) + Univariate3D(42, 1), Univariate3D(84, 1));
133   EXPECT_DEBUG_DEATH(Univariate3D(42, 0) + Univariate3D(42, 1),
134                      "Invalid dimensions");
135 
136   // Test operator+=
137   Univariate3D X(42, 0);
138   X += Univariate3D(42, 0);
139   EXPECT_EQ(X, Univariate3D(84, 0));
140 
141   // Test 'getWithIncrement' method
142   EXPECT_EQ(Univariate3D(42, 0).getWithIncrement(1), Univariate3D(43, 0));
143   EXPECT_EQ(Univariate3D(42, 1).getWithIncrement(2), Univariate3D(44, 1));
144   EXPECT_EQ(Univariate3D(42, 2).getWithIncrement(3), Univariate3D(45, 2));
145 }
146 
147 TEST(UnivariateLinearPolyBase, Univariate3D_Sub) {
148   // Test operator+
149   EXPECT_EQ(Univariate3D(84, 0) - Univariate3D(42, 0), Univariate3D(42, 0));
150   EXPECT_EQ(Univariate3D(84, 1) - Univariate3D(42, 1), Univariate3D(42, 1));
151   EXPECT_DEBUG_DEATH(Univariate3D(84, 0) - Univariate3D(42, 1),
152                      "Invalid dimensions");
153 
154   // Test operator+=
155   Univariate3D X(84, 0);
156   X -= Univariate3D(42, 0);
157   EXPECT_EQ(X, Univariate3D(42, 0));
158 
159   // Test 'getWithDecrement' method
160   EXPECT_EQ(Univariate3D(43, 0).getWithDecrement(1), Univariate3D(42, 0));
161   EXPECT_EQ(Univariate3D(44, 1).getWithDecrement(2), Univariate3D(42, 1));
162   EXPECT_EQ(Univariate3D(45, 2).getWithDecrement(3), Univariate3D(42, 2));
163 }
164 
165 TEST(UnivariateLinearPolyBase, Univariate3D_Scale) {
166   // Test operator*
167   EXPECT_EQ(Univariate3D(4, 0) * 2, Univariate3D(8, 0));
168   EXPECT_EQ(Univariate3D(4, 1) * -2, Univariate3D(-8, 1));
169 }
170 
171 TEST(UnivariateLinearPolyBase, Univariate3D_Invert) {
172   // Test operator-
173   EXPECT_EQ(-Univariate3D(4, 0), Univariate3D(-4, 0));
174   EXPECT_EQ(-Univariate3D(4, 1), Univariate3D(-4, 1));
175 }
176 
177