11667d23eSSander de Smalen //===- TestPoly3D.cpp - Poly3D unit tests------------------------===//
21667d23eSSander de Smalen //
31667d23eSSander de Smalen // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41667d23eSSander de Smalen // See https://llvm.org/LICENSE.txt for license information.
51667d23eSSander de Smalen // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61667d23eSSander de Smalen //
71667d23eSSander de Smalen //===----------------------------------------------------------------------===//
81667d23eSSander de Smalen
91667d23eSSander de Smalen #include "llvm/Support/TypeSize.h"
101667d23eSSander de Smalen #include "gtest/gtest.h"
111667d23eSSander de Smalen
121667d23eSSander de Smalen using namespace llvm;
131667d23eSSander de Smalen
141667d23eSSander de Smalen class Poly3D;
151d3cd717SHans Wennborg
161d3cd717SHans Wennborg namespace llvm {
171d3cd717SHans Wennborg template <> struct LinearPolyBaseTypeTraits<Poly3D> {
181667d23eSSander de Smalen using ScalarTy = int64_t;
191667d23eSSander de Smalen static const unsigned Dimensions = 3;
201667d23eSSander de Smalen };
211d3cd717SHans Wennborg }
221667d23eSSander de Smalen
231667d23eSSander de Smalen using Poly3DBase = LinearPolyBase<Poly3D>;
241667d23eSSander de Smalen class Poly3D : public Poly3DBase {
251667d23eSSander de Smalen public:
261667d23eSSander de Smalen using ScalarTy = Poly3DBase::ScalarTy;
Poly3D(ScalarTy x,ScalarTy y,ScalarTy z)271667d23eSSander de Smalen Poly3D(ScalarTy x, ScalarTy y, ScalarTy z) : Poly3DBase({x, y, z}) {}
Poly3D(const Poly3DBase & Convert)281667d23eSSander de Smalen Poly3D(const Poly3DBase &Convert) : Poly3DBase(Convert) {}
291667d23eSSander de Smalen };
301667d23eSSander de Smalen
TEST(LinearPolyBase,Poly3D_isZero)311667d23eSSander de Smalen TEST(LinearPolyBase, Poly3D_isZero) {
321667d23eSSander de Smalen EXPECT_TRUE(Poly3D(0, 0, 0).isZero());
331667d23eSSander de Smalen EXPECT_TRUE(Poly3D(0, 0, 1).isNonZero());
341667d23eSSander de Smalen EXPECT_TRUE(Poly3D(0, 0, 1));
351667d23eSSander de Smalen }
361667d23eSSander de Smalen
TEST(LinearPolyBase,Poly3D_Equality)371667d23eSSander de Smalen TEST(LinearPolyBase, Poly3D_Equality) {
381667d23eSSander de Smalen EXPECT_EQ(Poly3D(1, 2, 3), Poly3D(1, 2, 3));
391667d23eSSander de Smalen EXPECT_NE(Poly3D(1, 2, 3), Poly3D(1, 2, 4));
401667d23eSSander de Smalen }
411667d23eSSander de Smalen
TEST(LinearPolyBase,Poly3D_GetValue)421667d23eSSander de Smalen TEST(LinearPolyBase, Poly3D_GetValue) {
431667d23eSSander de Smalen EXPECT_EQ(Poly3D(1, 2, 3).getValue(0), 1);
441667d23eSSander de Smalen EXPECT_EQ(Poly3D(1, 2, 3).getValue(1), 2);
451667d23eSSander de Smalen EXPECT_EQ(Poly3D(1, 2, 3).getValue(2), 3);
461667d23eSSander de Smalen }
471667d23eSSander de Smalen
TEST(LinearPolyBase,Poly3D_Add)481667d23eSSander de Smalen TEST(LinearPolyBase, Poly3D_Add) {
491667d23eSSander de Smalen // Test operator+
501667d23eSSander de Smalen EXPECT_EQ(Poly3D(42, 0, 0) + Poly3D(0, 42, 0) + Poly3D(0, 0, 42),
511667d23eSSander de Smalen Poly3D(42, 42, 42));
521667d23eSSander de Smalen
531667d23eSSander de Smalen // Test operator+=
541667d23eSSander de Smalen Poly3D X(42, 0, 0);
551667d23eSSander de Smalen X += Poly3D(0, 42, 0);
561667d23eSSander de Smalen X += Poly3D(0, 0, 42);
571667d23eSSander de Smalen EXPECT_EQ(X, Poly3D(42, 42, 42));
581667d23eSSander de Smalen }
591667d23eSSander de Smalen
TEST(LinearPolyBase,Poly3D_Sub)601667d23eSSander de Smalen TEST(LinearPolyBase, Poly3D_Sub) {
611667d23eSSander de Smalen // Test operator-
621667d23eSSander de Smalen EXPECT_EQ(Poly3D(42, 42, 42) - Poly3D(42, 0, 0) - Poly3D(0, 42, 0) -
631667d23eSSander de Smalen Poly3D(0, 0, 42),
641667d23eSSander de Smalen Poly3D(0, 0, 0));
651667d23eSSander de Smalen
661667d23eSSander de Smalen // Test operator-=
671667d23eSSander de Smalen Poly3D X(42, 42, 42);
681667d23eSSander de Smalen X -= Poly3D(42, 0, 0);
691667d23eSSander de Smalen X -= Poly3D(0, 42, 0);
701667d23eSSander de Smalen X -= Poly3D(0, 0, 42);
711667d23eSSander de Smalen EXPECT_EQ(X, Poly3D(0, 0, 0));
721667d23eSSander de Smalen }
731667d23eSSander de Smalen
TEST(LinearPolyBase,Poly3D_Scale)741667d23eSSander de Smalen TEST(LinearPolyBase, Poly3D_Scale) {
751667d23eSSander de Smalen // Test operator*
761667d23eSSander de Smalen EXPECT_EQ(Poly3D(1, 2, 4) * 2, Poly3D(2, 4, 8));
771667d23eSSander de Smalen EXPECT_EQ(Poly3D(1, 2, 4) * -2, Poly3D(-2, -4, -8));
781667d23eSSander de Smalen }
791667d23eSSander de Smalen
TEST(LinearPolyBase,Poly3D_Invert)801667d23eSSander de Smalen TEST(LinearPolyBase, Poly3D_Invert) {
811667d23eSSander de Smalen // Test operator-
821667d23eSSander de Smalen EXPECT_EQ(-Poly3D(2, 4, 8), Poly3D(-2, -4, -8));
831667d23eSSander de Smalen }
841667d23eSSander de Smalen
851667d23eSSander de Smalen class Univariate3D;
861d3cd717SHans Wennborg namespace llvm {
871d3cd717SHans Wennborg template <> struct LinearPolyBaseTypeTraits<Univariate3D> {
881667d23eSSander de Smalen using ScalarTy = int64_t;
891667d23eSSander de Smalen static const unsigned Dimensions = 3;
901667d23eSSander de Smalen };
911d3cd717SHans Wennborg }
921667d23eSSander de Smalen
931667d23eSSander de Smalen using Univariate3DBase = UnivariateLinearPolyBase<Univariate3D>;
941667d23eSSander de Smalen class Univariate3D : public Univariate3DBase {
951667d23eSSander de Smalen public:
961667d23eSSander de Smalen using ScalarTy = Univariate3DBase::ScalarTy;
Univariate3D(ScalarTy x,unsigned Dim)971667d23eSSander de Smalen Univariate3D(ScalarTy x, unsigned Dim) : Univariate3DBase(x, Dim) {}
Univariate3D(const Univariate3DBase & Convert)981667d23eSSander de Smalen Univariate3D(const Univariate3DBase &Convert) : Univariate3DBase(Convert) {}
991667d23eSSander de Smalen };
1001667d23eSSander de Smalen
TEST(UnivariateLinearPolyBase,Univariate3D_isZero)1011667d23eSSander de Smalen TEST(UnivariateLinearPolyBase, Univariate3D_isZero) {
1021667d23eSSander de Smalen EXPECT_TRUE(Univariate3D(0, 0).isZero());
1031667d23eSSander de Smalen EXPECT_TRUE(Univariate3D(0, 1).isZero());
1041667d23eSSander de Smalen EXPECT_TRUE(Univariate3D(0, 2).isZero());
1051667d23eSSander de Smalen EXPECT_TRUE(Univariate3D(1, 0).isNonZero());
1061667d23eSSander de Smalen EXPECT_TRUE(Univariate3D(1, 1).isNonZero());
1071667d23eSSander de Smalen EXPECT_TRUE(Univariate3D(1, 2).isNonZero());
1081667d23eSSander de Smalen EXPECT_TRUE(Univariate3D(1, 0));
1091667d23eSSander de Smalen }
1101667d23eSSander de Smalen
TEST(UnivariateLinearPolyBase,Univariate3D_Equality)1111667d23eSSander de Smalen TEST(UnivariateLinearPolyBase, Univariate3D_Equality) {
1121667d23eSSander de Smalen EXPECT_EQ(Univariate3D(1, 0), Univariate3D(1, 0));
1131667d23eSSander de Smalen EXPECT_NE(Univariate3D(1, 0), Univariate3D(1, 2));
1141667d23eSSander de Smalen EXPECT_NE(Univariate3D(1, 0), Univariate3D(1, 1));
1151667d23eSSander de Smalen EXPECT_NE(Univariate3D(1, 0), Univariate3D(2, 0));
1161667d23eSSander de Smalen EXPECT_NE(Univariate3D(1, 0), Univariate3D(0, 0));
1171667d23eSSander de Smalen }
1181667d23eSSander de Smalen
TEST(UnivariateLinearPolyBase,Univariate3D_GetValue)1191667d23eSSander de Smalen TEST(UnivariateLinearPolyBase, Univariate3D_GetValue) {
1201667d23eSSander de Smalen EXPECT_EQ(Univariate3D(42, 0).getValue(0), 42);
1211667d23eSSander de Smalen EXPECT_EQ(Univariate3D(42, 0).getValue(1), 0);
1221667d23eSSander de Smalen EXPECT_EQ(Univariate3D(42, 0).getValue(2), 0);
1231667d23eSSander de Smalen
1241667d23eSSander de Smalen EXPECT_EQ(Univariate3D(42, 1).getValue(0), 0);
1251667d23eSSander de Smalen EXPECT_EQ(Univariate3D(42, 1).getValue(1), 42);
1261667d23eSSander de Smalen EXPECT_EQ(Univariate3D(42, 1).getValue(2), 0);
1271667d23eSSander de Smalen }
1281667d23eSSander de Smalen
TEST(UnivariateLinearPolyBase,Univariate3D_Add)1291667d23eSSander de Smalen TEST(UnivariateLinearPolyBase, Univariate3D_Add) {
1301667d23eSSander de Smalen // Test operator+
1311667d23eSSander de Smalen EXPECT_EQ(Univariate3D(42, 0) + Univariate3D(42, 0), Univariate3D(84, 0));
1321667d23eSSander de Smalen EXPECT_EQ(Univariate3D(42, 1) + Univariate3D(42, 1), Univariate3D(84, 1));
1331667d23eSSander de Smalen EXPECT_DEBUG_DEATH(Univariate3D(42, 0) + Univariate3D(42, 1),
1341667d23eSSander de Smalen "Invalid dimensions");
1351667d23eSSander de Smalen
1361667d23eSSander de Smalen // Test operator+=
1371667d23eSSander de Smalen Univariate3D X(42, 0);
1381667d23eSSander de Smalen X += Univariate3D(42, 0);
1391667d23eSSander de Smalen EXPECT_EQ(X, Univariate3D(84, 0));
140*5ee9ef85SSander de Smalen
141*5ee9ef85SSander de Smalen // Test 'getWithIncrement' method
142*5ee9ef85SSander de Smalen EXPECT_EQ(Univariate3D(42, 0).getWithIncrement(1), Univariate3D(43, 0));
143*5ee9ef85SSander de Smalen EXPECT_EQ(Univariate3D(42, 1).getWithIncrement(2), Univariate3D(44, 1));
144*5ee9ef85SSander de Smalen EXPECT_EQ(Univariate3D(42, 2).getWithIncrement(3), Univariate3D(45, 2));
1451667d23eSSander de Smalen }
1461667d23eSSander de Smalen
TEST(UnivariateLinearPolyBase,Univariate3D_Sub)1471667d23eSSander de Smalen TEST(UnivariateLinearPolyBase, Univariate3D_Sub) {
1481667d23eSSander de Smalen // Test operator+
1491667d23eSSander de Smalen EXPECT_EQ(Univariate3D(84, 0) - Univariate3D(42, 0), Univariate3D(42, 0));
1501667d23eSSander de Smalen EXPECT_EQ(Univariate3D(84, 1) - Univariate3D(42, 1), Univariate3D(42, 1));
1511667d23eSSander de Smalen EXPECT_DEBUG_DEATH(Univariate3D(84, 0) - Univariate3D(42, 1),
1521667d23eSSander de Smalen "Invalid dimensions");
1531667d23eSSander de Smalen
1541667d23eSSander de Smalen // Test operator+=
1551667d23eSSander de Smalen Univariate3D X(84, 0);
1561667d23eSSander de Smalen X -= Univariate3D(42, 0);
1571667d23eSSander de Smalen EXPECT_EQ(X, Univariate3D(42, 0));
158*5ee9ef85SSander de Smalen
159*5ee9ef85SSander de Smalen // Test 'getWithDecrement' method
160*5ee9ef85SSander de Smalen EXPECT_EQ(Univariate3D(43, 0).getWithDecrement(1), Univariate3D(42, 0));
161*5ee9ef85SSander de Smalen EXPECT_EQ(Univariate3D(44, 1).getWithDecrement(2), Univariate3D(42, 1));
162*5ee9ef85SSander de Smalen EXPECT_EQ(Univariate3D(45, 2).getWithDecrement(3), Univariate3D(42, 2));
1631667d23eSSander de Smalen }
1641667d23eSSander de Smalen
TEST(UnivariateLinearPolyBase,Univariate3D_Scale)1651667d23eSSander de Smalen TEST(UnivariateLinearPolyBase, Univariate3D_Scale) {
1661667d23eSSander de Smalen // Test operator*
1671667d23eSSander de Smalen EXPECT_EQ(Univariate3D(4, 0) * 2, Univariate3D(8, 0));
1681667d23eSSander de Smalen EXPECT_EQ(Univariate3D(4, 1) * -2, Univariate3D(-8, 1));
1691667d23eSSander de Smalen }
1701667d23eSSander de Smalen
TEST(UnivariateLinearPolyBase,Univariate3D_Invert)1711667d23eSSander de Smalen TEST(UnivariateLinearPolyBase, Univariate3D_Invert) {
1721667d23eSSander de Smalen // Test operator-
1731667d23eSSander de Smalen EXPECT_EQ(-Univariate3D(4, 0), Univariate3D(-4, 0));
1741667d23eSSander de Smalen EXPECT_EQ(-Univariate3D(4, 1), Univariate3D(-4, 1));
1751667d23eSSander de Smalen }
1761667d23eSSander de Smalen
177