| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <limits> | |
| 6 | |
| 7 #include "mojo/services/media/common/cpp/ratio.h" | |
| 8 #include "services/media/common/test/test_base.h" | |
| 9 | |
| 10 namespace mojo { | |
| 11 namespace media { | |
| 12 namespace { | |
| 13 | |
| 14 class RatioTest : public TestBase { | |
| 15 static uint32_t gcd(uint32_t a, uint32_t b) { | |
| 16 while (b != 0) { | |
| 17 uint32_t t = a; | |
| 18 a = b; | |
| 19 b = t % b; | |
| 20 } | |
| 21 return a; | |
| 22 } | |
| 23 | |
| 24 public: | |
| 25 // Verifies Ratio::Reduce and the constructor, ensuring that the ratio | |
| 26 // numerator * common_factor / denominator * common_factor is reduced to | |
| 27 // numerator / denominator. numerator and denominator need to be relatively | |
| 28 // prime for this to work. | |
| 29 void VerifyReduce(uint32_t numerator, | |
| 30 uint32_t denominator, | |
| 31 uint32_t common_factor) { | |
| 32 // Make sure numerator and denominator are relatively prime. | |
| 33 EXPECT_EQ(1u, gcd(numerator, denominator)); | |
| 34 | |
| 35 uint32_t test_numerator = numerator * common_factor; | |
| 36 uint32_t test_denominator = denominator * common_factor; | |
| 37 | |
| 38 // Make sure the constructor reduces. | |
| 39 Ratio ratio(test_numerator, test_denominator); | |
| 40 EXPECT_EQ(numerator, ratio.numerator()); | |
| 41 EXPECT_EQ(denominator, ratio.denominator()); | |
| 42 | |
| 43 // Test the static method. | |
| 44 Ratio::Reduce(&test_numerator, &test_denominator); | |
| 45 EXPECT_EQ(numerator, test_numerator); | |
| 46 EXPECT_EQ(denominator, test_denominator); | |
| 47 } | |
| 48 | |
| 49 // Verifies the Ratio::Scale methods by scaling value by numerator / | |
| 50 // denominator and verifying the result. | |
| 51 void VerifyScale(int64_t value, | |
| 52 uint32_t numerator, | |
| 53 uint32_t denominator, | |
| 54 int64_t result) { | |
| 55 // Test the instance method. | |
| 56 EXPECT_EQ(result, Ratio(numerator, denominator).Scale(value)); | |
| 57 | |
| 58 // Test the static method. | |
| 59 EXPECT_EQ(result, Ratio::Scale(value, numerator, denominator)); | |
| 60 | |
| 61 // Test the operators. | |
| 62 EXPECT_EQ(result, value * Ratio(numerator, denominator)); | |
| 63 EXPECT_EQ(result, Ratio(numerator, denominator) * value); | |
| 64 if (numerator != 0) { | |
| 65 EXPECT_EQ(result, value / Ratio(denominator, numerator)); | |
| 66 } | |
| 67 } | |
| 68 | |
| 69 // Verifies the Ratio::Product methods by multiplying the given a and b | |
| 70 // ratios and checking the result against the expected ratio. | |
| 71 void VerifyProduct(uint32_t a_numerator, | |
| 72 uint32_t a_denominator, | |
| 73 uint32_t b_numerator, | |
| 74 uint32_t b_denominator, | |
| 75 uint32_t expected_numerator, | |
| 76 uint32_t expected_denominator, | |
| 77 bool exact) { | |
| 78 // Test the first static method. | |
| 79 uint32_t actual_numerator; | |
| 80 uint32_t actual_denominator; | |
| 81 Ratio::Product(a_numerator, a_denominator, b_numerator, b_denominator, | |
| 82 &actual_numerator, &actual_denominator, exact); | |
| 83 EXPECT_EQ(expected_numerator, actual_numerator); | |
| 84 EXPECT_EQ(expected_denominator, actual_denominator); | |
| 85 | |
| 86 // Test the second static method. | |
| 87 EXPECT_EQ(Ratio(expected_numerator, expected_denominator), | |
| 88 Ratio::Product(Ratio(a_numerator, a_denominator), | |
| 89 Ratio(b_numerator, b_denominator), exact)); | |
| 90 | |
| 91 // Test the operator | |
| 92 if (exact) { | |
| 93 EXPECT_EQ(Ratio(expected_numerator, expected_denominator), | |
| 94 Ratio(a_numerator, a_denominator) * | |
| 95 Ratio(b_numerator, b_denominator)); | |
| 96 } | |
| 97 } | |
| 98 | |
| 99 // Verifies the Ration::Inverse method using the given ratio. | |
| 100 void VerifyInverse(uint32_t numerator, uint32_t denominator) { | |
| 101 Ratio ratio(numerator, denominator); | |
| 102 Ratio inverse(ratio.Inverse()); | |
| 103 EXPECT_EQ(ratio.denominator(), inverse.numerator()); | |
| 104 EXPECT_EQ(ratio.numerator(), inverse.denominator()); | |
| 105 } | |
| 106 }; | |
| 107 | |
| 108 // Tests Ratio::Reduce and that the Ratio constructor reduces. | |
| 109 TEST_F(RatioTest, Reduce) { | |
| 110 VerifyReduce(0, 1, 1); | |
| 111 VerifyReduce(1, 1, 1); | |
| 112 VerifyReduce(1234, 1, 1); | |
| 113 VerifyReduce(1, 1234, 14); | |
| 114 VerifyReduce(1, 1, 1234); | |
| 115 VerifyReduce(10, 1, 1234); | |
| 116 VerifyReduce(1, 10, 1234); | |
| 117 VerifyReduce(49, 81, 1); | |
| 118 VerifyReduce(49, 81, 10); | |
| 119 VerifyReduce(49, 81, 100); | |
| 120 VerifyReduce(1, 8, 65536); | |
| 121 VerifyReduce(8, 1, 65536); | |
| 122 } | |
| 123 | |
| 124 // Tests Ratio::Scale, static, instance and operator versions. | |
| 125 TEST_F(RatioTest, Scale) { | |
| 126 const int64_t int64_min = std::numeric_limits<int64_t>::min(); | |
| 127 VerifyScale(0, 0, 1, 0); | |
| 128 VerifyScale(1, 0, 1, 0); | |
| 129 VerifyScale(0, 1, 1, 0); | |
| 130 VerifyScale(1, 1, 1, 1); | |
| 131 VerifyScale(1, 2, 1, 2); | |
| 132 VerifyScale(1, 1, 2, 0); | |
| 133 VerifyScale(-1, 1, 2, -1); | |
| 134 VerifyScale(1000, 1, 2, 500); | |
| 135 VerifyScale(1001, 1, 2, 500); | |
| 136 VerifyScale(-1000, 1, 2, -500); | |
| 137 VerifyScale(-1001, 1, 2, -501); | |
| 138 VerifyScale(1000, 2, 1, 2000); | |
| 139 VerifyScale(1001, 2, 1, 2002); | |
| 140 VerifyScale(-1000, 2, 1, -2000); | |
| 141 VerifyScale(-1001, 2, 1, -2002); | |
| 142 VerifyScale(1ll << 32, 1, 1, 1ll << 32); | |
| 143 VerifyScale(1ll << 32, 1, 2, 1ll << 31); | |
| 144 VerifyScale(1ll << 32, 2, 1, 1ll << 33); | |
| 145 VerifyScale(1234ll << 30, 1, 1, 1234ll << 30); | |
| 146 VerifyScale(1234ll << 30, 1, 2, 1234ll << 29); | |
| 147 VerifyScale(1234ll << 30, 2, 1, 1234ll << 31); | |
| 148 VerifyScale(1234ll << 30, 1 << 31, 1, Ratio::kOverflow); | |
| 149 VerifyScale(1234ll << 30, 1ll << 31, (1ll << 31) - 2, | |
| 150 (1234ll << 30) + 1234ll); | |
| 151 VerifyScale(int64_min, 1, 1, int64_min); | |
| 152 VerifyScale(int64_min, 1, 2, int64_min / 2); | |
| 153 VerifyScale(int64_min / 2, 2, 1, int64_min); | |
| 154 VerifyScale(int64_min, 1000001, 1000000, Ratio::kOverflow); | |
| 155 } | |
| 156 | |
| 157 // Tests Ratio::Product, static and operator versions. | |
| 158 TEST_F(RatioTest, Product) { | |
| 159 VerifyProduct(0, 1, 0, 1, 0, 1, true); | |
| 160 VerifyProduct(1, 1, 1, 1, 1, 1, true); | |
| 161 VerifyProduct(10, 1, 1, 10, 1, 1, true); | |
| 162 VerifyProduct(4321, 1234, 617, 4321, 1, 2, true); | |
| 163 VerifyProduct(1234, 4321, 4321, 617, 2, 1, true); | |
| 164 VerifyProduct(1ll << 31, (1ll << 31) - 1, (1ll << 31) - 1, 1ll << 31, 1, 1, | |
| 165 true); | |
| 166 VerifyProduct(1ll << 31, (1ll << 31) - 1, (1ll << 31) - 2, 1ll << 31, | |
| 167 0x7ffffffe, 0x7fffffff, false); | |
| 168 } | |
| 169 | |
| 170 // Tests Ratio::Inverse. | |
| 171 TEST_F(RatioTest, Inverse) { | |
| 172 VerifyInverse(1, 1); | |
| 173 VerifyInverse(2, 1); | |
| 174 VerifyInverse(1, 2); | |
| 175 VerifyInverse(1000000, 1234); | |
| 176 VerifyInverse(1234, 1000000); | |
| 177 } | |
| 178 | |
| 179 } // namespace | |
| 180 } // namespace media | |
| 181 } // namespace mojo | |
| OLD | NEW |