6 #include "../vnix/units.hpp" 14 TEST_CASE(
"dimval's dimension is accessible.",
"[dimval]") {
19 REQUIRE(ddv
.d(dim::off::off(2)
) == dim
::rat
(-1
, 2
));
23 REQUIRE(sdv
.d(dim::off::off(0)
) == dim::rat
(1
));
24 REQUIRE(sdv
.d(dim::off::off(2)
) == dim::rat
(-1
));
28 TEST_CASE(
"dimval's comparisons work.",
"[dimval]") {
33 dbl::time sdv2 = ddv2;
35 REQUIRE(ddv1 == ddv1);
36 REQUIRE(ddv1 == sdv1);
38 REQUIRE(ddv1 != 1.1 * ddv1);
39 REQUIRE(ddv1 != 1.1 * sdv1);
41 REQUIRE(ddv1 < 1.1 * ddv1);
42 REQUIRE(ddv1 < 1.1 * sdv1);
44 REQUIRE(ddv1 <= 1.1 * ddv1);
45 REQUIRE(ddv1 <= 1.1 * sdv1);
47 REQUIRE(ddv1 > 0.9 * ddv1);
48 REQUIRE(ddv1 > 0.9 * sdv1);
50 REQUIRE(ddv1 >= 0.9 * ddv1);
51 REQUIRE(ddv1 >= 0.9 * sdv1);
53 REQUIRE_THROWS(ddv1 == ddv2);
54 REQUIRE_THROWS(ddv1 == sdv2);
56 REQUIRE_THROWS(ddv1 != ddv2);
57 REQUIRE_THROWS(ddv1 != sdv2);
59 REQUIRE_THROWS(ddv1 < ddv2);
60 REQUIRE_THROWS(ddv1 < sdv2);
62 REQUIRE_THROWS(ddv1 <= ddv2);
63 REQUIRE_THROWS(ddv1 <= sdv2);
65 REQUIRE_THROWS(ddv1 > ddv2);
66 REQUIRE_THROWS(ddv1 > sdv2);
68 REQUIRE_THROWS(ddv1 >= ddv2);
69 REQUIRE_THROWS(ddv1 >= sdv2);
73 TEST_CASE(
"dimval's addition and subtraction work.",
"[dimval]") {
78 ldbl::time sdv2 = ddv2;
80 REQUIRE(ddv1 + ddv1 == 2 * ddv1);
81 REQUIRE(ddv1 + sdv1 == 2 * ddv1);
82 REQUIRE(sdv1 + ddv1 == 2 * ddv1);
83 REQUIRE(sdv1 + sdv1 == 2 * ddv1);
85 REQUIRE(ddv1 - ddv1 == 0 * ddv1);
86 REQUIRE(ddv1 - sdv1 == 0 * ddv1);
87 REQUIRE(sdv1 - ddv1 == 0 * ddv1);
88 REQUIRE(sdv1 - sdv1 == 0 * ddv1);
90 REQUIRE_THROWS(ddv1 + ddv2);
91 REQUIRE_THROWS(ddv1 + sdv2);
92 REQUIRE_THROWS(sdv1 + ddv2);
93 REQUIRE_THROWS(sdv1 + sdv2);
95 REQUIRE_THROWS(ddv1 - ddv2);
96 REQUIRE_THROWS(ddv1 - sdv2);
97 REQUIRE_THROWS(sdv1 - ddv2);
98 REQUIRE_THROWS(sdv1 - sdv2);
100 REQUIRE((ddv1 += sdv1) == 2 * sdv1);
101 REQUIRE((ddv1 -= sdv1) == sdv1);
102 REQUIRE((sdv1 += ddv1) == 2 * ddv1);
103 REQUIRE((sdv1 -= ddv1) == ddv1);
105 REQUIRE((ddv1 += dyndim(sdv1)) == 2 * sdv1);
106 REQUIRE((ddv1 -= dyndim(sdv1)) == sdv1);
107 REQUIRE((sdv2 +=
dbl::time(ddv2)) == 2 * ddv2);
108 REQUIRE((sdv2 -=
flt::time(ddv2)) == ddv2);
110 REQUIRE_THROWS(ddv1 += ddv2);
111 REQUIRE_THROWS(ddv1 += sdv2);
112 REQUIRE_THROWS(sdv1 += ddv2);
113 REQUIRE_THROWS(sdv1 += sdv2);
115 REQUIRE_THROWS(ddv1 -= ddv2);
116 REQUIRE_THROWS(ddv1 -= sdv2);
117 REQUIRE_THROWS(sdv1 -= ddv2);
118 REQUIRE_THROWS(sdv1 -= sdv2);
122 TEST_CASE(
"dimval's multiplication and division work.",
"[dimval]") {
129 REQUIRE(ddv1 * ddv2 == 6 *
J);
130 REQUIRE(ddv1 * sdv2 == 6 *
J);
134 REQUIRE(sdv1 * ddv2 == 6 *
J);
135 REQUIRE(sdv1 * sdv2 == 6 *
J);
147 REQUIRE((ddv1 *= 2) == 6 *
m);
148 REQUIRE((ddv1 /= 2) == 3 *
m);
150 REQUIRE((sdv1 *= 2) == 6 *
m);
151 REQUIRE((sdv1 /= 2) == 3 *
m);
155 TEST_CASE(
"pow and sqrt work for dimval.",
"[dimval]") {
160 using volume =
decltype(
m *
m *
m);
163 REQUIRE(ddv2 == 9 *
m *
m);
164 REQUIRE(
sqrt(ddv2
) == ddv1);
165 REQUIRE(sdv1 == 27 *
m *
m *
m);
169 std::cout <<
"sqrt(sdv1) = " <<
sqrt(sdv1
) << std::endl;
170 std::cout <<
"pow(ddv1, {2,3}) = " <<
pow(ddv1
, {3
, 2
}) << std::endl;
175 TEST_CASE(
"Printing works for dimval.",
"[dimval]") {
176 std::ostringstream oss;
177 using namespace ldbl;
179 REQUIRE(oss.str() ==
"1 m s^[-1/2]");
183 TEST_CASE(
"Example in 'README.md' works.",
"[dimval]") {
186 flt::time t = 4.0_ms;
187 std::cout <<
"d=" << d <<
" t=" << t << std::endl;
189 std::cout << v << std::endl;
190 std::ostringstream oss;
192 REQUIRE(oss.str() ==
"750000 m s^-1");
constexpr auto m
Constant-expression symbol for m.
constexpr auto N
Constant-expression symbol for N.
constexpr auto pow(dimval< T, B > const &v)
Raise dimensioned value to rational power.
constexpr auto sqrt(dimval< T, B > const &v)
Take the squre root of a dimensioned quantity.
Single-precision dimensions and units.
constexpr auto m
Constant-expression symbol for m.
constexpr auto operator/(OT const &d, dimval< T, B > const &v)
Invert dimensioned value by dividing it into number.
constexpr rational(stype n=0, stype d=1)
Initialize from numerator and denominator.
constexpr auto s
Constant-expression symbol for s.
constexpr T to_number() const
Convert to dimensionless number.
Double-precision dimensions and units.
constexpr auto s
Constant-expression symbol for s.
constexpr auto J
Constant-expression symbol for J.
constexpr bool operator==(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Compare rationals for equality.
Extended-precision dimensions and units.
constexpr dim::rat d(dim::off off) const
Exponent for base at specified offset.
constexpr auto m
Constant-expression symbol for m.
constexpr auto pow(dimval< T, B > const &v, dim::rat p)
Raise dimensioned value to rational power.
Thomas E. Vaughan's public software.
Classes and functions supporting a model of physically dimensioned quantities.
constexpr auto s
Constant-expression symbol for s.