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