diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/libwebrtc/rtc_base/units/unit_base_unittest.cc | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | third_party/libwebrtc/rtc_base/units/unit_base_unittest.cc | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_base/units/unit_base_unittest.cc b/third_party/libwebrtc/rtc_base/units/unit_base_unittest.cc new file mode 100644 index 0000000000..258d7d1268 --- /dev/null +++ b/third_party/libwebrtc/rtc_base/units/unit_base_unittest.cc @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "rtc_base/units/unit_base.h" + +#include "test/gtest.h" + +namespace webrtc { +namespace { +class TestUnit final : public rtc_units_impl::RelativeUnit<TestUnit> { + public: + TestUnit() = delete; + + using UnitBase::FromValue; + using UnitBase::ToValue; + using UnitBase::ToValueOr; + + template <typename T> + static constexpr TestUnit FromKilo(T kilo) { + return FromFraction(1000, kilo); + } + template <typename T = int64_t> + T ToKilo() const { + return UnitBase::ToFraction<1000, T>(); + } + constexpr int64_t ToKiloOr(int64_t fallback) const { + return UnitBase::ToFractionOr<1000>(fallback); + } + template <typename T> + constexpr T ToMilli() const { + return UnitBase::ToMultiple<1000, T>(); + } + + private: + friend class rtc_units_impl::UnitBase<TestUnit>; + static constexpr bool one_sided = false; + using RelativeUnit<TestUnit>::RelativeUnit; +}; +constexpr TestUnit TestUnitAddKilo(TestUnit value, int add_kilo) { + value += TestUnit::FromKilo(add_kilo); + return value; +} +} // namespace +namespace test { +TEST(UnitBaseTest, ConstExpr) { + constexpr int64_t kValue = -12345; + constexpr TestUnit kTestUnitZero = TestUnit::Zero(); + constexpr TestUnit kTestUnitPlusInf = TestUnit::PlusInfinity(); + constexpr TestUnit kTestUnitMinusInf = TestUnit::MinusInfinity(); + static_assert(kTestUnitZero.IsZero(), ""); + static_assert(kTestUnitPlusInf.IsPlusInfinity(), ""); + static_assert(kTestUnitMinusInf.IsMinusInfinity(), ""); + static_assert(kTestUnitPlusInf.ToKiloOr(-1) == -1, ""); + + static_assert(kTestUnitPlusInf > kTestUnitZero, ""); + + constexpr TestUnit kTestUnitKilo = TestUnit::FromKilo(kValue); + constexpr TestUnit kTestUnitValue = TestUnit::FromValue(kValue); + + static_assert(kTestUnitKilo.ToKiloOr(0) == kValue, ""); + static_assert(kTestUnitValue.ToValueOr(0) == kValue, ""); + static_assert(TestUnitAddKilo(kTestUnitValue, 2).ToValue() == kValue + 2000, + ""); + static_assert(TestUnit::FromValue(500) / 2 == TestUnit::FromValue(250)); +} + +TEST(UnitBaseTest, GetBackSameValues) { + const int64_t kValue = 499; + for (int sign = -1; sign <= 1; ++sign) { + int64_t value = kValue * sign; + EXPECT_EQ(TestUnit::FromKilo(value).ToKilo(), value); + EXPECT_EQ(TestUnit::FromValue(value).ToValue<int64_t>(), value); + } + EXPECT_EQ(TestUnit::Zero().ToValue<int64_t>(), 0); +} + +TEST(UnitBaseTest, GetDifferentPrefix) { + const int64_t kValue = 3000000; + EXPECT_EQ(TestUnit::FromValue(kValue).ToKilo(), kValue / 1000); + EXPECT_EQ(TestUnit::FromKilo(kValue).ToValue<int64_t>(), kValue * 1000); +} + +TEST(UnitBaseTest, IdentityChecks) { + const int64_t kValue = 3000; + EXPECT_TRUE(TestUnit::Zero().IsZero()); + EXPECT_FALSE(TestUnit::FromKilo(kValue).IsZero()); + + EXPECT_TRUE(TestUnit::PlusInfinity().IsInfinite()); + EXPECT_TRUE(TestUnit::MinusInfinity().IsInfinite()); + EXPECT_FALSE(TestUnit::Zero().IsInfinite()); + EXPECT_FALSE(TestUnit::FromKilo(-kValue).IsInfinite()); + EXPECT_FALSE(TestUnit::FromKilo(kValue).IsInfinite()); + + EXPECT_FALSE(TestUnit::PlusInfinity().IsFinite()); + EXPECT_FALSE(TestUnit::MinusInfinity().IsFinite()); + EXPECT_TRUE(TestUnit::FromKilo(-kValue).IsFinite()); + EXPECT_TRUE(TestUnit::FromKilo(kValue).IsFinite()); + EXPECT_TRUE(TestUnit::Zero().IsFinite()); + + EXPECT_TRUE(TestUnit::PlusInfinity().IsPlusInfinity()); + EXPECT_FALSE(TestUnit::MinusInfinity().IsPlusInfinity()); + + EXPECT_TRUE(TestUnit::MinusInfinity().IsMinusInfinity()); + EXPECT_FALSE(TestUnit::PlusInfinity().IsMinusInfinity()); +} + +TEST(UnitBaseTest, ComparisonOperators) { + const int64_t kSmall = 450; + const int64_t kLarge = 451; + const TestUnit small = TestUnit::FromKilo(kSmall); + const TestUnit large = TestUnit::FromKilo(kLarge); + + EXPECT_EQ(TestUnit::Zero(), TestUnit::FromKilo(0)); + EXPECT_EQ(TestUnit::PlusInfinity(), TestUnit::PlusInfinity()); + EXPECT_EQ(small, TestUnit::FromKilo(kSmall)); + EXPECT_LE(small, TestUnit::FromKilo(kSmall)); + EXPECT_GE(small, TestUnit::FromKilo(kSmall)); + EXPECT_NE(small, TestUnit::FromKilo(kLarge)); + EXPECT_LE(small, TestUnit::FromKilo(kLarge)); + EXPECT_LT(small, TestUnit::FromKilo(kLarge)); + EXPECT_GE(large, TestUnit::FromKilo(kSmall)); + EXPECT_GT(large, TestUnit::FromKilo(kSmall)); + EXPECT_LT(TestUnit::Zero(), small); + EXPECT_GT(TestUnit::Zero(), TestUnit::FromKilo(-kSmall)); + EXPECT_GT(TestUnit::Zero(), TestUnit::FromKilo(-kSmall)); + + EXPECT_GT(TestUnit::PlusInfinity(), large); + EXPECT_LT(TestUnit::MinusInfinity(), TestUnit::Zero()); +} + +TEST(UnitBaseTest, Clamping) { + const TestUnit upper = TestUnit::FromKilo(800); + const TestUnit lower = TestUnit::FromKilo(100); + const TestUnit under = TestUnit::FromKilo(100); + const TestUnit inside = TestUnit::FromKilo(500); + const TestUnit over = TestUnit::FromKilo(1000); + EXPECT_EQ(under.Clamped(lower, upper), lower); + EXPECT_EQ(inside.Clamped(lower, upper), inside); + EXPECT_EQ(over.Clamped(lower, upper), upper); + + TestUnit mutable_delta = lower; + mutable_delta.Clamp(lower, upper); + EXPECT_EQ(mutable_delta, lower); + mutable_delta = inside; + mutable_delta.Clamp(lower, upper); + EXPECT_EQ(mutable_delta, inside); + mutable_delta = over; + mutable_delta.Clamp(lower, upper); + EXPECT_EQ(mutable_delta, upper); +} + +TEST(UnitBaseTest, CanBeInititializedFromLargeInt) { + const int kMaxInt = std::numeric_limits<int>::max(); + EXPECT_EQ(TestUnit::FromKilo(kMaxInt).ToValue<int64_t>(), + static_cast<int64_t>(kMaxInt) * 1000); +} + +TEST(UnitBaseTest, ConvertsToAndFromDouble) { + const int64_t kValue = 17017; + const double kMilliDouble = kValue * 1e3; + const double kValueDouble = kValue; + const double kKiloDouble = kValue * 1e-3; + + EXPECT_EQ(TestUnit::FromValue(kValue).ToKilo<double>(), kKiloDouble); + EXPECT_EQ(TestUnit::FromKilo(kKiloDouble).ToValue<int64_t>(), kValue); + + EXPECT_EQ(TestUnit::FromValue(kValue).ToValue<double>(), kValueDouble); + EXPECT_EQ(TestUnit::FromValue(kValueDouble).ToValue<int64_t>(), kValue); + + EXPECT_NEAR(TestUnit::FromValue(kValue).ToMilli<double>(), kMilliDouble, 1); + + const double kPlusInfinity = std::numeric_limits<double>::infinity(); + const double kMinusInfinity = -kPlusInfinity; + + EXPECT_EQ(TestUnit::PlusInfinity().ToKilo<double>(), kPlusInfinity); + EXPECT_EQ(TestUnit::MinusInfinity().ToKilo<double>(), kMinusInfinity); + EXPECT_EQ(TestUnit::PlusInfinity().ToValue<double>(), kPlusInfinity); + EXPECT_EQ(TestUnit::MinusInfinity().ToValue<double>(), kMinusInfinity); + EXPECT_EQ(TestUnit::PlusInfinity().ToMilli<double>(), kPlusInfinity); + EXPECT_EQ(TestUnit::MinusInfinity().ToMilli<double>(), kMinusInfinity); + + EXPECT_TRUE(TestUnit::FromKilo(kPlusInfinity).IsPlusInfinity()); + EXPECT_TRUE(TestUnit::FromKilo(kMinusInfinity).IsMinusInfinity()); + EXPECT_TRUE(TestUnit::FromValue(kPlusInfinity).IsPlusInfinity()); + EXPECT_TRUE(TestUnit::FromValue(kMinusInfinity).IsMinusInfinity()); +} + +TEST(UnitBaseTest, MathOperations) { + const int64_t kValueA = 267; + const int64_t kValueB = 450; + const TestUnit delta_a = TestUnit::FromKilo(kValueA); + const TestUnit delta_b = TestUnit::FromKilo(kValueB); + EXPECT_EQ((delta_a + delta_b).ToKilo(), kValueA + kValueB); + EXPECT_EQ((delta_a - delta_b).ToKilo(), kValueA - kValueB); + + const int32_t kInt32Value = 123; + const double kFloatValue = 123.0; + EXPECT_EQ((TestUnit::FromValue(kValueA) * kValueB).ToValue<int64_t>(), + kValueA * kValueB); + EXPECT_EQ((TestUnit::FromValue(kValueA) * kInt32Value).ToValue<int64_t>(), + kValueA * kInt32Value); + EXPECT_EQ((TestUnit::FromValue(kValueA) * kFloatValue).ToValue<int64_t>(), + kValueA * kFloatValue); + + EXPECT_EQ((delta_b / 10).ToKilo(), kValueB / 10); + EXPECT_EQ(delta_b / delta_a, static_cast<double>(kValueB) / kValueA); + + TestUnit mutable_delta = TestUnit::FromKilo(kValueA); + mutable_delta += TestUnit::FromKilo(kValueB); + EXPECT_EQ(mutable_delta, TestUnit::FromKilo(kValueA + kValueB)); + mutable_delta -= TestUnit::FromKilo(kValueB); + EXPECT_EQ(mutable_delta, TestUnit::FromKilo(kValueA)); + + // Division by an int rounds towards zero to follow regular int division. + EXPECT_EQ(TestUnit::FromValue(789) / 10, TestUnit::FromValue(78)); + EXPECT_EQ(TestUnit::FromValue(-789) / 10, TestUnit::FromValue(-78)); +} + +TEST(UnitBaseTest, InfinityOperations) { + const int64_t kValue = 267; + const TestUnit finite = TestUnit::FromKilo(kValue); + EXPECT_TRUE((TestUnit::PlusInfinity() + finite).IsPlusInfinity()); + EXPECT_TRUE((TestUnit::PlusInfinity() - finite).IsPlusInfinity()); + EXPECT_TRUE((finite + TestUnit::PlusInfinity()).IsPlusInfinity()); + EXPECT_TRUE((finite - TestUnit::MinusInfinity()).IsPlusInfinity()); + + EXPECT_TRUE((TestUnit::MinusInfinity() + finite).IsMinusInfinity()); + EXPECT_TRUE((TestUnit::MinusInfinity() - finite).IsMinusInfinity()); + EXPECT_TRUE((finite + TestUnit::MinusInfinity()).IsMinusInfinity()); + EXPECT_TRUE((finite - TestUnit::PlusInfinity()).IsMinusInfinity()); +} + +TEST(UnitBaseTest, UnaryMinus) { + const int64_t kValue = 1337; + const TestUnit unit = TestUnit::FromValue(kValue); + EXPECT_EQ(-unit.ToValue(), -kValue); + + // Check infinity. + EXPECT_EQ(-TestUnit::PlusInfinity(), TestUnit::MinusInfinity()); + EXPECT_EQ(-TestUnit::MinusInfinity(), TestUnit::PlusInfinity()); +} + +} // namespace test +} // namespace webrtc |