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