1 #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
2 #include <polyxx.h>
3 
4 #include "doctest.h"
5 
6 using namespace poly;
7 
8 TEST_CASE("dyadic_interval::constructors") {
9   CHECK(DyadicInterval() == DyadicInterval(Integer(0)));
10   CHECK(DyadicInterval(DyadicRational(1), DyadicRational(2)) ==
11         DyadicInterval(1, true, 2, true));
12   CHECK(DyadicInterval(Integer(1), Integer(2)) ==
13         DyadicInterval(1, true, 2, true));
14   CHECK(DyadicInterval(1, 2) == DyadicInterval(1, true, 2, true));
15 }
16 
17 TEST_CASE("dyadic_interval::collapse") {
18   DyadicInterval di(1, 2);
19   di.collapse(17);
20   CHECK(di == Integer(17));
21 }
22 
23 TEST_CASE("dyadic_interval::set_lower") {
24   DyadicInterval di(1, 2);
25   di.set_lower(0, false);
26   CHECK(di == DyadicInterval(0, false, 2, true));
27 }
28 
29 TEST_CASE("dyadic_interval::set_upper") {
30   DyadicInterval di(1, 2);
31   di.set_upper(3, false);
32   CHECK(di == DyadicInterval(1, true, 3, false));
33 }
34 
35 TEST_CASE("dyadic_interval::scale") {
36   {
37     DyadicInterval di(-1, 1);
38     di.scale(-2);
39     CHECK(di == DyadicInterval(DyadicRational(-1,2), DyadicRational(1,2)));
40   }
41   {
42     DyadicInterval di(-1, 1);
43     di.scale(2);
44     CHECK(di == DyadicInterval(-4, 4));
45   }
46 }
47 
48 TEST_CASE("dyadic_interval::split") {
49   DyadicInterval di(Integer(0), Integer(10));
50   auto s = split(di, true, true);
51   CHECK(get_lower(di) == get_lower(s.first));
52   CHECK(get_upper(s.first) == get_lower(s.second));
53   CHECK(get_upper(di) == get_upper(s.second));
54   CHECK(disjoint(s.first, s.second));
55 }
56 
57 TEST_CASE("dyadic_interval::swap") {
58   DyadicInterval a(Integer(1), Integer(2));
59   DyadicInterval b(Integer(3), Integer(4));
60   swap(a, b);
61   CHECK(a == DyadicInterval(Integer(3), Integer(4)));
62   CHECK(b == DyadicInterval(Integer(1), Integer(2)));
63 }
64 
65 TEST_CASE("dyadic_interval::operator== / operator!=") {
66   DyadicInterval a(1, 2);
67   DyadicInterval b(DyadicRational(1), DyadicRational(2));
68   DyadicInterval c(Integer(3), Integer(4));
69   CHECK(a == a);
70   CHECK_FALSE(a != a);
71   CHECK(a == b);
72   CHECK_FALSE(a != b);
73   CHECK_FALSE(a == c);
74   CHECK(a != c);
75   CHECK(b == a);
76   CHECK_FALSE(b != a);
77   CHECK(b == b);
78   CHECK_FALSE(b != b);
79   CHECK_FALSE(b == c);
80   CHECK(b != c);
81   CHECK_FALSE(c == a);
82   CHECK(c != a);
83   CHECK_FALSE(c == b);
84   CHECK(c != b);
85   CHECK(c == c);
86   CHECK_FALSE(c != c);
87 }
88 
89 TEST_CASE("dyadic_interval::contains") {
90   CHECK_FALSE(contains(DyadicInterval(1, 3), DyadicRational(0)));
91   CHECK_FALSE(contains(DyadicInterval(1, 3), DyadicRational(1)));
92   CHECK(contains(DyadicInterval(1, 3), DyadicRational(2)));
93   CHECK_FALSE(contains(DyadicInterval(1, 3), DyadicRational(3)));
94   CHECK_FALSE(contains(DyadicInterval(1, 3), DyadicRational(4)));
95 }
96 
97 TEST_CASE("dyadic_interval::contains_zero") {
98   CHECK_FALSE(contains_zero(DyadicInterval(-2, -1)));
99   CHECK_FALSE(contains_zero(DyadicInterval(-1, 0)));
100   CHECK(contains_zero(DyadicInterval(-1, false, 0, false)));
101   CHECK_FALSE(contains_zero(DyadicInterval(-1, false, 0, true)));
102   CHECK(contains_zero(DyadicInterval(-1, true, 0, false)));
103   CHECK_FALSE(contains_zero(DyadicInterval(-1, true, 0, true)));
104   CHECK(contains_zero(DyadicInterval(-1, 1)));
105   CHECK(contains_zero(DyadicInterval(0, false, 1, false)));
106   CHECK(contains_zero(DyadicInterval(0, false, 1, true)));
107   CHECK_FALSE(contains_zero(DyadicInterval(0, true, 1, false)));
108   CHECK_FALSE(contains_zero(DyadicInterval(0, true, 1, true)));
109   CHECK_FALSE(contains_zero(DyadicInterval(1, 2)));
110 }
111 
112 TEST_CASE("dyadic_interval::disjoint") {
113     CHECK(disjoint(DyadicInterval(1, 3), DyadicInterval(4, 6)));
114     CHECK(disjoint(DyadicInterval(1, 3), DyadicInterval(3, 4)));
115     CHECK(disjoint(DyadicInterval(1, 3), DyadicInterval(3, false, 4, false)));
116     CHECK(disjoint(DyadicInterval(1, false, 3, false), DyadicInterval(3, 4)));
117     CHECK_FALSE(disjoint(DyadicInterval(1, false, 3, false), DyadicInterval(3, false, 4, false)));
118     CHECK_FALSE(disjoint(DyadicInterval(1, 3), DyadicInterval(2, 4)));
119     CHECK_FALSE(disjoint(DyadicInterval(2, 4), DyadicInterval(2, 4)));
120     CHECK_FALSE(disjoint(DyadicInterval(2, 4), DyadicInterval(1, 3)));
121     CHECK(disjoint(DyadicInterval(3, 4), DyadicInterval(1, 3)));
122     CHECK(disjoint(DyadicInterval(3, 4), DyadicInterval(1, false, 3, false)));
123     CHECK(disjoint(DyadicInterval(3, false, 4, false), DyadicInterval(1, 3)));
124     CHECK_FALSE(disjoint(DyadicInterval(3, false, 4, false), DyadicInterval(1, false, 3, false)));
125     CHECK(disjoint(DyadicInterval(4, 6), DyadicInterval(1, 3)));
126 }
127 
128 TEST_CASE("dyadic_interval::is_point") {
129     CHECK(is_point(DyadicInterval(3)));
130     CHECK_FALSE(is_point(DyadicInterval(3, true, 4, true)));
131     CHECK_FALSE(is_point(DyadicInterval(3, false, 4, false)));
132 }
133 
134 TEST_CASE("dyadic_interval::get_lower") {
135     CHECK(get_lower(DyadicInterval(3)) == DyadicRational(3));
136     CHECK(get_lower(DyadicInterval(3, true, 4, true)) == DyadicRational(3));
137     CHECK(get_lower(DyadicInterval(3, false, 4, false)) == DyadicRational(3));
138 }
139 
140 TEST_CASE("dyadic_interval::get_upper") {
141     CHECK(get_upper(DyadicInterval(3)) == DyadicRational(3));
142     CHECK(get_upper(DyadicInterval(2, true, 3, true)) == DyadicRational(3));
143     CHECK(get_upper(DyadicInterval(2, false, 3, false)) == DyadicRational(3));
144 }
145 
146 TEST_CASE("dyadic_interval::log_size") {
147     CHECK(log_size(DyadicInterval(1)) == INT_MIN);
148     CHECK(log_size(DyadicInterval(1, 2)) == 1);
149     CHECK(log_size(DyadicInterval(1, 10)) == 4);
150 }
151 
152 TEST_CASE("dyadic_interval::sgn") {
153     CHECK(sgn(DyadicInterval(-5)) == -1);
154     CHECK(sgn(DyadicInterval(-5, -4)) == -1);
155     CHECK(sgn(DyadicInterval(-1, 0)) == -1);
156     CHECK(sgn(DyadicInterval(-1, false, 0, false)) == 0);
157     CHECK(sgn(DyadicInterval(-1, 1)) == 0);
158     CHECK(sgn(DyadicInterval()) == 0);
159     CHECK(sgn(DyadicInterval(0, false, 1, false)) == 0);
160     CHECK(sgn(DyadicInterval(0, 1)) == 1);
161     CHECK(sgn(DyadicInterval(4, 5)) == 1);
162     CHECK(sgn(DyadicInterval(5)) == 1);
163 }
164