Coverage Report

Created: 2018-09-25 14:53

/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
}