units
Use physical dimensions at compile-time or run-time.
rational-test.cpp
Go to the documentation of this file.
1 /// @file test/rational-test.cpp
2 /// @brief Test-cases for vnix::rat::rational.
3 /// @copyright 2019 Thomas E. Vaughan; all rights reserved.
4 /// @license BSD three-clause; see LICENSE.
5 
6 #include "../vnix/rat.hpp"
7 #include "catch.hpp"
8 #include <sstream> // for ostringstream
9 
10 using namespace vnix;
11 
12 
13 TEST_CASE("Constructor from num and den works as expected.", "[rational]") {
14  rat8_t constexpr r1;
15  REQUIRE(!r1.to_bool());
16  REQUIRE(r1.to_int() == 0);
17  REQUIRE(r1.to_float() == 0);
18  REQUIRE(r1.to_double() == 0);
19 
20  rat8_t constexpr r2(3);
21  REQUIRE(r2.to_bool());
22  REQUIRE(r2.to_int() == 3);
23  REQUIRE(r2.to_float() == 3);
24  REQUIRE(r2.to_double() == 3);
25 
26  rat8_t constexpr r3(3, 2);
27  REQUIRE(r3.to_bool());
28  REQUIRE_THROWS(r3.to_int());
29  REQUIRE(r3.to_float() == 1.5);
30  REQUIRE(r3.to_double() == 1.5);
31 
32  rat8_t constexpr r4(4, -4);
33  REQUIRE(r4.to_bool());
34  REQUIRE(r4.to_int() == -1);
35  REQUIRE(r4.to_float() == -1);
36  REQUIRE(r4.to_double() == -1);
37 }
38 
39 
40 TEST_CASE("Conversion-constructor works as expected.", "[rational]") {
41  rat8_t constexpr r1(3, 2);
42  rat16_t constexpr r2(r1);
43  REQUIRE(r2.to_double() == 1.5);
44  REQUIRE(r1 == r2);
45 }
46 
47 
48 TEST_CASE("Addition and subtraction work.", "[rational]") {
49  rat8_t r1(3, 2);
50  rat16_t r1a(1);
51  r1 += r1a;
52  REQUIRE(r1 == rat8_t(5, 2));
53  rat32_t r1s(1);
54  r1 -= r1s;
55  REQUIRE(r1 == rat8_t(3, 2));
56  rat16_t constexpr r2(-3, 4);
57  rat16_t constexpr r3(1, 6);
58  REQUIRE(r2 + r3 == rat16_t(-7, 12));
59  REQUIRE(r2 - r3 == rat16_t(-11, 12));
60 }
61 
62 
63 TEST_CASE("Reciprocal works as expected.", "[rational]") {
64  rat8_t r1(-3, 2);
65  rat8_t r2(2, 3);
66  REQUIRE(r1.reciprocal() == -r2);
67  REQUIRE_NOTHROW(rat8_t(8).reciprocal());
68  REQUIRE_THROWS(rat8_t(9).reciprocal());
69 }
70 
71 
72 TEST_CASE("Multiplication and division work.", "[rational]") {
73  rat8_t r1(-3, 2);
74  rat8_t r2(-1, 4);
75  REQUIRE(r1 * r2 == rat8_t(3, 8));
76  REQUIRE(r1 / r2 == rat8_t(6));
77  rat8_t r1m(1, 2);
78  r1 *= r1m;
79  REQUIRE(r1 == rat8_t(-3, 4));
80  rat8_t r1d(2, 3);
81  r1 /= r1d;
82  REQUIRE(r1 == rat8_t(-9, 8));
83 }
84 
85 
86 TEST_CASE("Encoding and decoding work as expected.", "[rational]") {
87  rat8_t r1(-3, 4);
88  uint8_t code = 0xE8 | 0x03;
89  REQUIRE(rat8_t::encode(r1) == code);
90  REQUIRE(rat8_t::decode(code) == r1);
91 }
92 
93 
94 TEST_CASE("Comparison operators work as expected.", "[rational]") {
95  rat8_t r1(1, 2);
96  rat8_t r2(-3, 8);
97  REQUIRE(r1 == r1);
98  REQUIRE(r1 != r2);
99  REQUIRE(r1 >= r1);
100  REQUIRE(r1 >= r2);
101  REQUIRE(r1 > r2);
102  REQUIRE(r2 <= r1);
103  REQUIRE(r2 < r1);
104 }
105 
106 
107 TEST_CASE("Unary operators work as expected.", "[rational]") {
108  rat8_t r1(4, 6);
109  rat8_t r2(-2, 3);
110  REQUIRE(r1 == +r1);
111  REQUIRE(r1 == -r2);
112 }
113 
114 
115 TEST_CASE("Stream-output works as expected.", "[rational]") {
116  rat8_t r1 = 4;
117  rat8_t r2(-6, 8);
118  std::ostringstream oss1, oss2;
119  oss1 << r1;
120  oss2 << r2;
121  REQUIRE(oss1.str() == "4");
122  REQUIRE(oss2.str() == "-3/4");
123 }
static constexpr utype encode(rational r)
Encoding from rational number.
Definition: rational.hpp:113
constexpr auto operator-(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Difference between two rational numbers.
Definition: rational.hpp:255
static constexpr rational decode(utype u)
Rational number from encoding.
Definition: rational.hpp:116
constexpr auto operator+(rational< NB, DB > r)
Copy rational number by way of unary operator+.
Definition: rational.hpp:206
constexpr float to_float() const
Convert to float.
Definition: rational.hpp:68
constexpr auto operator*(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Product of two rational numbers.
Definition: rational.hpp:278
constexpr double to_double() const
Convert to double.
Definition: rational.hpp:71
constexpr auto operator+(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Sum of two rational numbers.
Definition: rational.hpp:231
constexpr rational(stype n=0, stype d=1)
Initialize from numerator and denominator.
Definition: rational.hpp:47
constexpr rational reciprocal() const
Reciprocal of this rational number.
Definition: rational.hpp:90
constexpr auto operator-(rational< NB, DB > r)
Negate rational number.
Definition: rational.hpp:217
constexpr bool operator>(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Compare for greater-than ordering with another rational.
Definition: rational.hpp:195
constexpr auto operator/(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Quotient of two rational numbers.
Definition: rational.hpp:301
constexpr stype to_int() const
Convert to (signed) integer.
Definition: rational.hpp:59
constexpr bool operator==(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Compare rationals for equality.
Definition: rational.hpp:128
constexpr bool operator!=(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Compare rationals for inequality.
Definition: rational.hpp:141
constexpr bool to_bool() const
Automatically convert to boolean.
Definition: rational.hpp:65
constexpr bool operator>=(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Compare for greater-than-or-equal ordering with another rational.
Definition: rational.hpp:182
Thomas E. Vaughan&#39;s public software.
Definition: rational.hpp:13
constexpr bool operator<(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Compare for less-than ordering with another rational.
Definition: rational.hpp:168
constexpr bool operator<=(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Compare for less-than-or-equal ordering with another rational.
Definition: rational.hpp:154