units
Use physical dimensions at compile-time or run-time.
dim-test.cpp
Go to the documentation of this file.
1 /// @file test/dim-test.cpp
2 /// @brief Test-cases for vnix::units::dim.
3 /// @copyright 2019 Thomas E. Vaughan; all rights reserved.
4 /// @license BSD three-clause; see LICENSE.
5 
6 #include "../vnix/units/dim.hpp"
7 #include "catch.hpp"
8 #include <sstream> // for ostringstream
9 
10 using namespace vnix;
11 using namespace vnix::units;
12 
13 
14 TEST_CASE("dim can be initialized from array.", "[dim]") {
15  std::array<dim::rat, dim::NUM_BASES> a;
16  for (unsigned i = 0; i < dim::NUM_BASES; ++i) { a[i] = i; }
17  dim d(a);
18  for (auto i : dim::off::array) { REQUIRE(d[i] == dim::rat(i)); }
19 }
20 
21 
22 TEST_CASE("Encoding and decoding works as expected.", "[dim]") {
23  std::array<dim::rat, dim::NUM_BASES> a;
24  uint64_t t = 0;
25  for (unsigned i = 0; i < dim::NUM_BASES; ++i) {
26  a[i] = i;
27  using rat = dim::rat;
28  enum { BITS = rat::BITS };
29  t |= ((rat::encode(i) & bit_range<uint64_t>(0, BITS)) << i * BITS);
30  }
31  dim d(a);
32  dim::word e = d.encode();
33  REQUIRE(e == t);
34  REQUIRE(dim(e) == d);
35 }
36 
37 
38 TEST_CASE("Addition and subtraction work as expected.", "[dim]") {
39  std::array<dim::rat, dim::NUM_BASES> a, b, c, d;
40  for (unsigned i = 0; i < dim::NUM_BASES; ++i) {
41  a[i] = i;
42  std::cout << "a[i]=" << a[i] << std::endl;
43  b[i] = dim::rat(-1, 2);
44  std::cout << "b[i]=" << b[i] << std::endl;
45  c[i] = a[i] + b[i];
46  std::cout << "c[i]=" << c[i] << std::endl;
47  d[i] = a[i] / 2 - b[i];
48  std::cout << "d[i]=" << d[i] << std::endl;
49  }
50  dim x(a), y(b), z1(c), z2(d);
51  REQUIRE(x + y == z1);
52  REQUIRE(x / 2 - y == z2);
53 }
54 
55 
56 TEST_CASE("Multiplication and division work as expected.", "[dim]") {
57  std::array<dim::rat, dim::NUM_BASES> a, c, d;
58  dim::rat const b(-1, 2);
59  for (unsigned i = 0; i < dim::NUM_BASES; ++i) {
60  a[i] = i;
61  c[i] = a[i] * b;
62  d[i] = a[i] / b;
63  }
64  dim x(a), z1(c), z2(d);
65  REQUIRE(x * b == z1);
66  REQUIRE(x / b == z2);
67 }
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
constexpr basic_dim(std::array< rat, NUM_BASES > const &a)
Definition: dim.hpp:101
constexpr word encode() const
Encode data for this dim into a word.
Definition: dim.hpp:104
constexpr auto operator/(rational< NB1, DB1 > r1, typename rational< NB1, DB1 >::stype r2)
Quotient of two rational numbers.
Definition: rational.hpp:313
constexpr basic_dim operator+(basic_dim const &a) const
Add corresponding exponents.
Definition: dim.hpp:194
constexpr basic_dim(word u)
Initialize from dim that has been encoded into a word.
Definition: dim.hpp:87
constexpr auto operator*(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Product of two rational numbers.
Definition: rational.hpp:278
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 basic_dim operator-(basic_dim const &s) const
Subtract corresponding exponents.
Definition: dim.hpp:203
constexpr auto operator/(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Quotient of two rational numbers.
Definition: rational.hpp:301
constexpr rat operator[](DBO off) const
Rational exponent at specified offset.
Definition: dim.hpp:115
constexpr bool operator==(rational< NB1, DB1 > r1, rational< NB2, DB2 > r2)
Compare rationals for equality.
Definition: rational.hpp:128
static constexpr off const array[num_offs]
Array of enumerated offsets for iterating.
constexpr bool operator==(basic_dim const &d) const
Definition: dim.hpp:227
constexpr basic_dim operator*(rat f) const
Multiply exponents by rational factor.
Definition: dim.hpp:211
constexpr basic_dim operator/(rat::stype f) const
Divide exponents by rational factor.
Definition: dim.hpp:223
Thomas E. Vaughan&#39;s public software.
Definition: rational.hpp:13
constexpr I bit_range(unsigned n1, unsigned n2)
Word with specified range of bits set.
Definition: bit-range.hpp:22
Classes and functions supporting a model of physically dimensioned quantities.
constexpr basic_dim operator/(rat f) const
Divide exponents by rational factor.
Definition: dim.hpp:217