frequency_unittest.cc (6552B)
1 /* 2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #include "api/units/frequency.h" 11 12 #include <cstdint> 13 14 #include "api/units/time_delta.h" 15 #include "test/gtest.h" 16 17 namespace webrtc { 18 namespace test { 19 TEST(FrequencyTest, ConstExpr) { 20 constexpr Frequency kFrequencyZero = Frequency::Zero(); 21 constexpr Frequency kFrequencyPlusInf = Frequency::PlusInfinity(); 22 constexpr Frequency kFrequencyMinusInf = Frequency::MinusInfinity(); 23 static_assert(Frequency() == kFrequencyZero); 24 static_assert(kFrequencyZero.IsZero(), ""); 25 static_assert(kFrequencyPlusInf.IsPlusInfinity(), ""); 26 static_assert(kFrequencyMinusInf.IsMinusInfinity(), ""); 27 28 static_assert(kFrequencyPlusInf > kFrequencyZero, ""); 29 } 30 31 TEST(FrequencyTest, GetBackSameValues) { 32 const int64_t kValue = 31; 33 EXPECT_EQ(Frequency::Hertz(kValue).hertz<int64_t>(), kValue); 34 EXPECT_EQ(Frequency::Zero().hertz<int64_t>(), 0); 35 } 36 37 TEST(FrequencyTest, GetDifferentPrefix) { 38 const int64_t kValue = 30000; 39 EXPECT_EQ(Frequency::MilliHertz(kValue).hertz<int64_t>(), kValue / 1000); 40 EXPECT_EQ(Frequency::Hertz(kValue).millihertz(), kValue * 1000); 41 EXPECT_EQ(Frequency::KiloHertz(kValue).hertz(), kValue * 1000); 42 } 43 44 TEST(FrequencyTest, IdentityChecks) { 45 const int64_t kValue = 31; 46 EXPECT_TRUE(Frequency::Zero().IsZero()); 47 EXPECT_FALSE(Frequency::Hertz(kValue).IsZero()); 48 49 EXPECT_TRUE(Frequency::PlusInfinity().IsInfinite()); 50 EXPECT_TRUE(Frequency::MinusInfinity().IsInfinite()); 51 EXPECT_FALSE(Frequency::Zero().IsInfinite()); 52 EXPECT_FALSE(Frequency::Hertz(kValue).IsInfinite()); 53 54 EXPECT_FALSE(Frequency::PlusInfinity().IsFinite()); 55 EXPECT_FALSE(Frequency::MinusInfinity().IsFinite()); 56 EXPECT_TRUE(Frequency::Hertz(kValue).IsFinite()); 57 EXPECT_TRUE(Frequency::Zero().IsFinite()); 58 59 EXPECT_TRUE(Frequency::PlusInfinity().IsPlusInfinity()); 60 EXPECT_FALSE(Frequency::MinusInfinity().IsPlusInfinity()); 61 62 EXPECT_TRUE(Frequency::MinusInfinity().IsMinusInfinity()); 63 EXPECT_FALSE(Frequency::PlusInfinity().IsMinusInfinity()); 64 } 65 66 TEST(FrequencyTest, ComparisonOperators) { 67 const int64_t kSmall = 42; 68 const int64_t kLarge = 45; 69 const Frequency small = Frequency::Hertz(kSmall); 70 const Frequency large = Frequency::Hertz(kLarge); 71 72 EXPECT_EQ(Frequency::Zero(), Frequency::Hertz(0)); 73 EXPECT_EQ(Frequency::PlusInfinity(), Frequency::PlusInfinity()); 74 EXPECT_EQ(small, Frequency::Hertz(kSmall)); 75 EXPECT_LE(small, Frequency::Hertz(kSmall)); 76 EXPECT_GE(small, Frequency::Hertz(kSmall)); 77 EXPECT_NE(small, Frequency::Hertz(kLarge)); 78 EXPECT_LE(small, Frequency::Hertz(kLarge)); 79 EXPECT_LT(small, Frequency::Hertz(kLarge)); 80 EXPECT_GE(large, Frequency::Hertz(kSmall)); 81 EXPECT_GT(large, Frequency::Hertz(kSmall)); 82 EXPECT_LT(Frequency::Zero(), small); 83 84 EXPECT_GT(Frequency::PlusInfinity(), large); 85 EXPECT_LT(Frequency::MinusInfinity(), Frequency::Zero()); 86 } 87 88 TEST(FrequencyTest, Clamping) { 89 const Frequency upper = Frequency::Hertz(800); 90 const Frequency lower = Frequency::Hertz(100); 91 const Frequency under = Frequency::Hertz(100); 92 const Frequency inside = Frequency::Hertz(500); 93 const Frequency over = Frequency::Hertz(1000); 94 EXPECT_EQ(under.Clamped(lower, upper), lower); 95 EXPECT_EQ(inside.Clamped(lower, upper), inside); 96 EXPECT_EQ(over.Clamped(lower, upper), upper); 97 98 Frequency mutable_frequency = lower; 99 mutable_frequency.Clamp(lower, upper); 100 EXPECT_EQ(mutable_frequency, lower); 101 mutable_frequency = inside; 102 mutable_frequency.Clamp(lower, upper); 103 EXPECT_EQ(mutable_frequency, inside); 104 mutable_frequency = over; 105 mutable_frequency.Clamp(lower, upper); 106 EXPECT_EQ(mutable_frequency, upper); 107 } 108 109 TEST(FrequencyTest, MathOperations) { 110 const int64_t kValueA = 457; 111 const int64_t kValueB = 260; 112 const Frequency frequency_a = Frequency::Hertz(kValueA); 113 const Frequency frequency_b = Frequency::Hertz(kValueB); 114 EXPECT_EQ((frequency_a + frequency_b).hertz<int64_t>(), kValueA + kValueB); 115 EXPECT_EQ((frequency_a - frequency_b).hertz<int64_t>(), kValueA - kValueB); 116 117 EXPECT_EQ((Frequency::Hertz(kValueA) * kValueB).hertz<int64_t>(), 118 kValueA * kValueB); 119 120 EXPECT_EQ((frequency_b / 10).hertz<int64_t>(), kValueB / 10); 121 EXPECT_EQ(frequency_b / frequency_a, static_cast<double>(kValueB) / kValueA); 122 123 Frequency mutable_frequency = Frequency::Hertz(kValueA); 124 mutable_frequency += Frequency::Hertz(kValueB); 125 EXPECT_EQ(mutable_frequency, Frequency::Hertz(kValueA + kValueB)); 126 mutable_frequency -= Frequency::Hertz(kValueB); 127 EXPECT_EQ(mutable_frequency, Frequency::Hertz(kValueA)); 128 } 129 TEST(FrequencyTest, Rounding) { 130 const Frequency freq_high = Frequency::Hertz(23.976); 131 EXPECT_EQ(freq_high.hertz(), 24); 132 EXPECT_EQ(freq_high.RoundDownTo(Frequency::Hertz(1)), Frequency::Hertz(23)); 133 EXPECT_EQ(freq_high.RoundTo(Frequency::Hertz(1)), Frequency::Hertz(24)); 134 EXPECT_EQ(freq_high.RoundUpTo(Frequency::Hertz(1)), Frequency::Hertz(24)); 135 136 const Frequency freq_low = Frequency::Hertz(23.4); 137 EXPECT_EQ(freq_low.hertz(), 23); 138 EXPECT_EQ(freq_low.RoundDownTo(Frequency::Hertz(1)), Frequency::Hertz(23)); 139 EXPECT_EQ(freq_low.RoundTo(Frequency::Hertz(1)), Frequency::Hertz(23)); 140 EXPECT_EQ(freq_low.RoundUpTo(Frequency::Hertz(1)), Frequency::Hertz(24)); 141 } 142 143 TEST(FrequencyTest, InfinityOperations) { 144 const double kValue = 267; 145 const Frequency finite = Frequency::Hertz(kValue); 146 EXPECT_TRUE((Frequency::PlusInfinity() + finite).IsPlusInfinity()); 147 EXPECT_TRUE((Frequency::PlusInfinity() - finite).IsPlusInfinity()); 148 EXPECT_TRUE((finite + Frequency::PlusInfinity()).IsPlusInfinity()); 149 EXPECT_TRUE((finite - Frequency::MinusInfinity()).IsPlusInfinity()); 150 151 EXPECT_TRUE((Frequency::MinusInfinity() + finite).IsMinusInfinity()); 152 EXPECT_TRUE((Frequency::MinusInfinity() - finite).IsMinusInfinity()); 153 EXPECT_TRUE((finite + Frequency::MinusInfinity()).IsMinusInfinity()); 154 EXPECT_TRUE((finite - Frequency::PlusInfinity()).IsMinusInfinity()); 155 } 156 157 TEST(UnitConversionTest, TimeDeltaAndFrequency) { 158 EXPECT_EQ(1 / Frequency::Hertz(50), TimeDelta::Millis(20)); 159 EXPECT_EQ(1 / TimeDelta::Millis(20), Frequency::Hertz(50)); 160 EXPECT_EQ(Frequency::KiloHertz(200) * TimeDelta::Millis(2), 400.0); 161 } 162 } // namespace test 163 } // namespace webrtc