blob: b58ba29190d82f07d73ac388c31af7faa281b2aa [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <gtest/gtest.h>
#include "src/camera/lib/numerics/rational.h"
namespace camera {
namespace {
using numerics::Rational;
TEST(Numerics, RationalTrivial) {
for (int64_t a : {-1, 0, 1}) {
for (int64_t b : {-1, 0, 1}) {
Rational r1{.n = a};
Rational r2{.n = b};
Rational expect_add{.n = a + b};
EXPECT_EQ(r1 + r2, expect_add);
Rational expect_sub{.n = a - b};
EXPECT_EQ(r1 - r2, expect_sub);
Rational expect_mul{.n = a * b};
EXPECT_EQ(r1 * r2, expect_mul);
if (b != 0) {
Rational expect_div{.n = a / b};
EXPECT_EQ(r1 / r2, expect_div);
}
}
}
}
TEST(Numerics, RationalComplex) {
Rational r1{.n = 22, .d = 7};
Rational r2{.n = 355, .d = 113};
EXPECT_EQ(r1 + r2, (Rational{.n = 4971, .d = 791}));
EXPECT_EQ(r1 - r2, (Rational{.n = 1, .d = 791}));
EXPECT_EQ(r1 * r2, (Rational{.n = 7810, .d = 791}));
EXPECT_EQ(r1 / r2, (Rational{.n = 2486, .d = 2485}));
EXPECT_EQ(r2 + r1, (Rational{.n = 4971, .d = 791}));
EXPECT_EQ(r2 - r1, (Rational{.n = -1, .d = 791}));
EXPECT_EQ(r2 * r1, (Rational{.n = 7810, .d = 791}));
EXPECT_EQ(r2 / r1, (Rational{.n = 2485, .d = 2486}));
EXPECT_EQ(+r1, (Rational{.n = 22, .d = 7}));
EXPECT_EQ(-r1, (Rational{.n = -22, .d = 7}));
auto x1 = r1;
x1 += r2;
EXPECT_EQ(x1, r1 + r2);
auto x2 = r1;
x2 -= r2;
EXPECT_EQ(x2, r1 - r2);
auto x3 = r1;
x3 *= r2;
EXPECT_EQ(x3, r1 * r2);
auto x4 = r1;
x4 /= r2;
EXPECT_EQ(x4, r1 / r2);
}
TEST(Numerics, RationalComparators) {
Rational a{.n = 22, .d = 7};
Rational b{.n = 34, .d = 21};
Rational c{.n = 3, .d = 5};
EXPECT_FALSE(a == b);
EXPECT_FALSE(b == a);
EXPECT_TRUE(c == c);
EXPECT_TRUE(a != b);
EXPECT_TRUE(b != a);
EXPECT_FALSE(c != c);
EXPECT_FALSE(a < b);
EXPECT_TRUE(b < a);
EXPECT_FALSE(c < c);
EXPECT_FALSE(a <= b);
EXPECT_TRUE(b <= a);
EXPECT_TRUE(c <= c);
EXPECT_TRUE(a > b);
EXPECT_FALSE(b > a);
EXPECT_FALSE(c > c);
EXPECT_TRUE(a >= b);
EXPECT_FALSE(b >= a);
EXPECT_TRUE(c >= c);
}
TEST(Numerics, Reduction) {
Rational ref{.n = 22, .d = 7};
Rational a{.n = -22022, .d = -7007};
EXPECT_EQ(Reduce(a), ref);
Rational b{.n = -22, .d = -7};
EXPECT_EQ(Reduce(b), ref);
Rational c{.n = -22, .d = 7};
EXPECT_EQ(Reduce(c), -ref);
Rational d{.n = 22, .d = -7};
EXPECT_EQ(Reduce(d), -ref);
Rational e{.n = 22, .d = 7};
EXPECT_EQ(Reduce(e), ref);
}
} // namespace
} // namespace camera