/src/mozilla-central/dom/media/doctor/gtest/TestRollingNumber.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
5 | | * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #include "RollingNumber.h" |
8 | | |
9 | | #include "mozilla/Assertions.h" |
10 | | #include "mozilla/TypeTraits.h" |
11 | | |
12 | | #include <cstdint> |
13 | | #include <gtest/gtest.h> |
14 | | |
15 | | using RN8 = mozilla::RollingNumber<uint8_t>; |
16 | | |
17 | | TEST(RollingNumber, Value) |
18 | 0 | { |
19 | 0 | // Value type should reflect template argument. |
20 | 0 | static_assert(mozilla::IsSame<RN8::ValueType, uint8_t>::value, ""); |
21 | 0 |
|
22 | 0 | // Default init to 0. |
23 | 0 | const RN8 n; |
24 | 0 | // Access through Value(). |
25 | 0 | EXPECT_EQ(0, n.Value()); |
26 | 0 |
|
27 | 0 | // Conversion constructor. |
28 | 0 | RN8 n42{ 42 }; |
29 | 0 | EXPECT_EQ(42, n42.Value()); |
30 | 0 |
|
31 | 0 | // Copy Constructor. |
32 | 0 | RN8 n42Copied{ n42 }; |
33 | 0 | EXPECT_EQ(42, n42Copied.Value()); |
34 | 0 |
|
35 | 0 | // Assignment construction. |
36 | 0 | RN8 n42Assigned = n42; |
37 | 0 | EXPECT_EQ(42, n42Assigned.Value()); |
38 | 0 |
|
39 | 0 | // Assignment. |
40 | 0 | n42 = n; |
41 | 0 | EXPECT_EQ(0, n42.Value()); |
42 | 0 | } |
43 | | |
44 | | TEST(RollingNumber, Operations) |
45 | 0 | { |
46 | 0 | RN8 n; |
47 | 0 | EXPECT_EQ(0, n.Value()); |
48 | 0 |
|
49 | 0 | RN8 nPreInc = ++n; |
50 | 0 | EXPECT_EQ(1, n.Value()); |
51 | 0 | EXPECT_EQ(1, nPreInc.Value()); |
52 | 0 |
|
53 | 0 | RN8 nPostInc = n++; |
54 | 0 | EXPECT_EQ(2, n.Value()); |
55 | 0 | EXPECT_EQ(1, nPostInc.Value()); |
56 | 0 |
|
57 | 0 | RN8 nPreDec = --n; |
58 | 0 | EXPECT_EQ(1, n.Value()); |
59 | 0 | EXPECT_EQ(1, nPreDec.Value()); |
60 | 0 |
|
61 | 0 | RN8 nPostDec = n--; |
62 | 0 | EXPECT_EQ(0, n.Value()); |
63 | 0 | EXPECT_EQ(1, nPostDec.Value()); |
64 | 0 |
|
65 | 0 | RN8 nPlus = n + 10; |
66 | 0 | EXPECT_EQ(0, n.Value()); |
67 | 0 | EXPECT_EQ(10, nPlus.Value()); |
68 | 0 |
|
69 | 0 | n += 20; |
70 | 0 | EXPECT_EQ(20, n.Value()); |
71 | 0 |
|
72 | 0 | RN8 nMinus = n - 2; |
73 | 0 | EXPECT_EQ(20, n.Value()); |
74 | 0 | EXPECT_EQ(18, nMinus.Value()); |
75 | 0 |
|
76 | 0 | n -= 5; |
77 | 0 | EXPECT_EQ(15, n.Value()); |
78 | 0 |
|
79 | 0 | uint8_t diff = nMinus - n; |
80 | 0 | EXPECT_EQ(3, diff); |
81 | 0 |
|
82 | 0 | // Overflows. |
83 | 0 | n = RN8(0); |
84 | 0 | EXPECT_EQ(0, n.Value()); |
85 | 0 | n--; |
86 | 0 | EXPECT_EQ(255, n.Value()); |
87 | 0 | n++; |
88 | 0 | EXPECT_EQ(0, n.Value()); |
89 | 0 | n -= 10; |
90 | 0 | EXPECT_EQ(246, n.Value()); |
91 | 0 | n += 20; |
92 | 0 | EXPECT_EQ(10, n.Value()); |
93 | 0 | } |
94 | | |
95 | | TEST(RollingNumber, Comparisons) |
96 | 0 | { |
97 | 0 | uint8_t i = 0; |
98 | 0 | do { |
99 | 0 | RN8 n{ i }; |
100 | 0 | EXPECT_EQ(i, n.Value()); |
101 | 0 | EXPECT_TRUE(n == n); |
102 | 0 | EXPECT_FALSE(n != n); |
103 | 0 | EXPECT_FALSE(n < n); |
104 | 0 | EXPECT_TRUE(n <= n); |
105 | 0 | EXPECT_FALSE(n > n); |
106 | 0 | EXPECT_TRUE(n >= n); |
107 | 0 |
|
108 | 0 | RN8 same = n; |
109 | 0 | EXPECT_TRUE(n == same); |
110 | 0 | EXPECT_FALSE(n != same); |
111 | 0 | EXPECT_FALSE(n < same); |
112 | 0 | EXPECT_TRUE(n <= same); |
113 | 0 | EXPECT_FALSE(n > same); |
114 | 0 | EXPECT_TRUE(n >= same); |
115 | 0 |
|
116 | | #ifdef DEBUG |
117 | | // In debug builds, we are only allowed a quarter of the type range. |
118 | | const uint8_t maxDiff = 255 / 4; |
119 | | #else |
120 | | // In non-debug builds, we can go half-way up or down the type range, and |
121 | 0 | // still conserve the expected ordering. |
122 | 0 | const uint8_t maxDiff = 255 / 2; |
123 | 0 | #endif |
124 | 0 | for (uint8_t add = 1; add <= maxDiff; ++add) { |
125 | 0 | RN8 bigger = n + add; |
126 | 0 | EXPECT_FALSE(n == bigger); |
127 | 0 | EXPECT_TRUE(n != bigger); |
128 | 0 | EXPECT_TRUE(n < bigger); |
129 | 0 | EXPECT_TRUE(n <= bigger); |
130 | 0 | EXPECT_FALSE(n > bigger); |
131 | 0 | EXPECT_FALSE(n >= bigger); |
132 | 0 | } |
133 | 0 |
|
134 | 0 | for (uint8_t sub = 1; sub <= maxDiff; ++sub) { |
135 | 0 | RN8 smaller = n - sub; |
136 | 0 | EXPECT_FALSE(n == smaller); |
137 | 0 | EXPECT_TRUE(n != smaller); |
138 | 0 | EXPECT_FALSE(n < smaller); |
139 | 0 | EXPECT_FALSE(n <= smaller); |
140 | 0 | EXPECT_TRUE(n > smaller); |
141 | 0 | EXPECT_TRUE(n >= smaller); |
142 | 0 | } |
143 | 0 |
|
144 | 0 | ++i; |
145 | 0 | } while (i != 0); |
146 | 0 | } |