30TEST(ExtendedNumberTest, kinds) {
31 ExtendedRationalNumber
const two(rational(2));
32 EXPECT_TRUE(two.isFinite());
33 EXPECT_FALSE(two.isInfinite());
34 EXPECT_EQ(rational(2), two.getFinite());
36 EXPECT_TRUE(ExtendedRationalNumber::infinity().isPositiveInfinity());
37 EXPECT_TRUE(ExtendedRationalNumber::infinity().isInfinite());
38 EXPECT_TRUE(ExtendedRationalNumber::negativeInfinity().isNegativeInfinity());
39 EXPECT_FALSE(ExtendedRationalNumber::negativeInfinity().isPositiveInfinity());
42 EXPECT_TRUE(ExtendedRationalNumber().isFinite());
46TEST(ExtendedNumberTest, ordering) {
47 ExtendedRationalNumber
const inf = ExtendedRationalNumber::infinity();
48 ExtendedRationalNumber
const negInf = ExtendedRationalNumber::negativeInfinity();
49 ExtendedRationalNumber
const two(rational(2));
51 EXPECT_LT(negInf, two);
53 EXPECT_LT(negInf, inf);
59 EXPECT_LT(ExtendedRationalNumber(rational(1e12)), inf);
60 EXPECT_LT(ExtendedRationalNumber(rational(1e11)), inf);
63TEST(ExtendedNumberTest, equality) {
64 ExtendedRationalNumber
const inf = ExtendedRationalNumber::infinity();
65 EXPECT_EQ(inf, ExtendedRationalNumber::infinity());
66 EXPECT_NE(inf, ExtendedRationalNumber::negativeInfinity());
67 EXPECT_NE(inf, ExtendedRationalNumber(rational(1e11)));
68 EXPECT_EQ(ExtendedRationalNumber(rational(2)), ExtendedRationalNumber(rational(2)));
71TEST(ExtendedNumberTest, arithmeticIsAbsorbing) {
72 ExtendedRationalNumber
const inf = ExtendedRationalNumber::infinity();
73 ExtendedRationalNumber
const negInf = ExtendedRationalNumber::negativeInfinity();
74 ExtendedRationalNumber
const two(rational(2));
75 ExtendedRationalNumber
const zero;
77 EXPECT_EQ(inf, inf + two);
78 EXPECT_EQ(inf, two + inf);
79 EXPECT_EQ(inf, inf - two);
80 EXPECT_EQ(inf, inf + inf);
81 EXPECT_EQ(inf, inf * two);
82 EXPECT_EQ(negInf, inf * -two);
83 EXPECT_EQ(inf, inf / two);
84 EXPECT_EQ(negInf, inf / -two);
85 EXPECT_EQ(zero, two / inf);
86 EXPECT_EQ(negInf, -inf);
87 EXPECT_EQ(inf, -negInf);
89 EXPECT_EQ(ExtendedRationalNumber(rational(6)), ExtendedRationalNumber(rational(2)) * ExtendedRationalNumber(rational(3)));
92TEST(ExtendedNumberTest, undefinedFormsThrow) {
93 ExtendedRationalNumber
const inf = ExtendedRationalNumber::infinity();
94 ExtendedRationalNumber
const negInf = ExtendedRationalNumber::negativeInfinity();
95 ExtendedRationalNumber
const zero;
122TEST(ExtendedNumberTest, output) {
123 std::stringstream stream;
124 stream << ExtendedRationalNumber::infinity() <<
" " << ExtendedRationalNumber::negativeInfinity() <<
" " << ExtendedRationalNumber(rational(2));
125 EXPECT_EQ(
"inf -inf 2", stream.str());
128TEST(ExtendedNumberTest, mixesWithFiniteValues) {
129 ExtendedRationalNumber
const inf = ExtendedRationalNumber::infinity();
130 storm::RationalNumber
const two = rational(2);
133 EXPECT_TRUE(two < inf);
134 EXPECT_TRUE(inf > two);
135 EXPECT_EQ(ExtendedRationalNumber(rational(4)), two + ExtendedRationalNumber(two));
136 EXPECT_EQ(ExtendedRationalNumber(rational(4)), ExtendedRationalNumber(two) + two);
137 EXPECT_EQ(inf, two + inf);
138 EXPECT_EQ(ExtendedRationalNumber(two), two);
141TEST(ExtendedNumberTest, reportsItsInfinityToTheGenericUtilities) {
146 EXPECT_TRUE(std::numeric_limits<ExtendedRationalNumber>::has_infinity);
147 EXPECT_EQ(ExtendedRationalNumber::infinity(), std::numeric_limits<ExtendedRationalNumber>::infinity());
170TEST(ExtendedNumberTest, comparesAgainstAPlainValue) {
171 ExtendedRationalNumber
const inf = ExtendedRationalNumber::infinity();
172 ExtendedRationalNumber
const negInf = ExtendedRationalNumber::negativeInfinity();
173 ExtendedRationalNumber
const two(rational(2));
174 storm::RationalNumber
const plainTwo = rational(2);
175 storm::RationalNumber
const plainThree = rational(3);
178 EXPECT_TRUE(two == plainTwo);
179 EXPECT_TRUE(plainTwo == two);
180 EXPECT_FALSE(two != plainTwo);
181 EXPECT_TRUE(two < plainThree);
182 EXPECT_TRUE(plainTwo < ExtendedRationalNumber(plainThree));
183 EXPECT_TRUE(two <= plainTwo);
184 EXPECT_TRUE(two >= plainTwo);
185 EXPECT_TRUE(ExtendedRationalNumber(plainThree) > plainTwo);
186 EXPECT_TRUE(plainThree > two);
189 EXPECT_TRUE(negInf < plainTwo);
190 EXPECT_TRUE(plainTwo < inf);
191 EXPECT_FALSE(inf < plainTwo);
192 EXPECT_FALSE(plainTwo < negInf);
193 EXPECT_TRUE(inf > plainTwo);
194 EXPECT_TRUE(plainTwo > negInf);
195 EXPECT_TRUE(negInf <= plainTwo);
196 EXPECT_TRUE(inf >= plainTwo);
199 EXPECT_FALSE(inf == plainTwo);
200 EXPECT_FALSE(negInf == plainTwo);
201 EXPECT_TRUE(inf != plainTwo);
202 EXPECT_TRUE(plainTwo != negInf);
205 for (
auto const& plain : {rational(-1), rational(0), rational(2), rational(1000)}) {
206 for (
auto const& extended : {inf, negInf, two}) {
207 EXPECT_EQ(extended < ExtendedRationalNumber(plain), extended < plain);
208 EXPECT_EQ(ExtendedRationalNumber(plain) < extended, plain < extended);
209 EXPECT_EQ(extended == ExtendedRationalNumber(plain), extended == plain);
210 EXPECT_EQ(extended <= ExtendedRationalNumber(plain), extended <= plain);
211 EXPECT_EQ(extended > ExtendedRationalNumber(plain), extended > plain);
212 EXPECT_EQ(extended >= ExtendedRationalNumber(plain), extended >= plain);
217TEST(ExtendedNumberTest, negativeInfinityArithmetic) {
218 ExtendedRationalNumber
const inf = ExtendedRationalNumber::infinity();
219 ExtendedRationalNumber
const negInf = ExtendedRationalNumber::negativeInfinity();
220 ExtendedRationalNumber
const zero;
221 ExtendedRationalNumber
const two(rational(2));
223 EXPECT_EQ(negInf, negInf + negInf);
224 EXPECT_EQ(negInf, negInf + two);
225 EXPECT_EQ(negInf, negInf - two);
226 EXPECT_EQ(negInf, negInf - inf);
227 EXPECT_EQ(inf, negInf * negInf);
228 EXPECT_EQ(negInf, negInf * two);
229 EXPECT_EQ(negInf, negInf * inf);
230 EXPECT_EQ(inf, -negInf);
231 EXPECT_EQ(negInf, -inf);
232 EXPECT_EQ(zero, two / negInf);
286TEST(ExtendedNumberTest, widenAndNarrowVectors) {
287 std::vector<storm::RationalNumber>
const finite{rational(1), rational(2)};
289 ASSERT_EQ(2ull, widened.size());
290 EXPECT_EQ(ExtendedRationalNumber(rational(1)), widened[0]);
291 EXPECT_EQ(ExtendedRationalNumber(rational(2)), widened[1]);
296 ASSERT_EQ(2ull, translated.size());
297 EXPECT_TRUE(translated[0].isFinite());
298 EXPECT_TRUE(translated[1].isPositiveInfinity());
303 storm::exceptions::InvalidOperationException);
306TEST(ExtendedNumberTest, narrowsToADefaultValue) {
307 std::vector<ExtendedRationalNumber>
const values{ExtendedRationalNumber(rational(1)), ExtendedRationalNumber::infinity(),
308 ExtendedRationalNumber::negativeInfinity()};
309 std::vector<storm::RationalNumber>
const narrowed =
311 ASSERT_EQ(3ull, narrowed.size());
312 EXPECT_EQ(rational(1), narrowed[0]);
313 EXPECT_EQ(rational(7), narrowed[1]);
314 EXPECT_EQ(rational(7), narrowed[2]);
318 ASSERT_EQ(2ull, doubles.size());
319 EXPECT_EQ(1.0, doubles[0]);
320 EXPECT_EQ(7.0, doubles[1]);