blob: 6c2d1eea82ca4fbf59c4715b146c4bf0e1342355 [file] [log] [blame]
Sebastian Jansson30bd4032018-04-13 13:56:17 +02001/*
2 * Copyright (c) 2018 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
Sebastian Jansson6fae6ec2018-05-08 10:43:18 +020011#include "api/units/timestamp.h"
Sebastian Jansson30bd4032018-04-13 13:56:17 +020012#include "test/gtest.h"
13
14namespace webrtc {
15namespace test {
Sebastian Jansson8e064192018-08-07 12:34:33 +020016TEST(TimestampTest, ConstExpr) {
Sebastian Janssonc1c8b8e2018-08-07 15:29:04 +020017 constexpr int64_t kValue = 12345;
Sebastian Jansson9de4ef42018-09-04 17:32:36 +020018 constexpr Timestamp kTimestampInf = Timestamp::PlusInfinity();
Sebastian Jansson8e064192018-08-07 12:34:33 +020019 static_assert(kTimestampInf.IsInfinite(), "");
Sebastian Janssonc1c8b8e2018-08-07 15:29:04 +020020 static_assert(kTimestampInf.ms_or(-1) == -1, "");
21
22 constexpr Timestamp kTimestampSeconds = Timestamp::Seconds<kValue>();
23 constexpr Timestamp kTimestampMs = Timestamp::Millis<kValue>();
24 constexpr Timestamp kTimestampUs = Timestamp::Micros<kValue>();
25
26 static_assert(kTimestampSeconds.seconds_or(0) == kValue, "");
27 static_assert(kTimestampMs.ms_or(0) == kValue, "");
28 static_assert(kTimestampUs.us_or(0) == kValue, "");
29
30 static_assert(kTimestampMs > kTimestampUs, "");
31
32 EXPECT_EQ(kTimestampSeconds.seconds(), kValue);
33 EXPECT_EQ(kTimestampMs.ms(), kValue);
34 EXPECT_EQ(kTimestampUs.us(), kValue);
Sebastian Jansson8e064192018-08-07 12:34:33 +020035}
36
Sebastian Jansson30bd4032018-04-13 13:56:17 +020037TEST(TimestampTest, GetBackSameValues) {
38 const int64_t kValue = 499;
39 EXPECT_EQ(Timestamp::ms(kValue).ms(), kValue);
40 EXPECT_EQ(Timestamp::us(kValue).us(), kValue);
Sebastian Janssonf7ffd942018-04-16 11:46:42 +020041 EXPECT_EQ(Timestamp::seconds(kValue).seconds(), kValue);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020042}
43
44TEST(TimestampTest, GetDifferentPrefix) {
45 const int64_t kValue = 3000000;
Sebastian Janssonf7ffd942018-04-16 11:46:42 +020046 EXPECT_EQ(Timestamp::us(kValue).seconds(), kValue / 1000000);
47 EXPECT_EQ(Timestamp::ms(kValue).seconds(), kValue / 1000);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020048 EXPECT_EQ(Timestamp::us(kValue).ms(), kValue / 1000);
49
50 EXPECT_EQ(Timestamp::ms(kValue).us(), kValue * 1000);
Sebastian Janssonf7ffd942018-04-16 11:46:42 +020051 EXPECT_EQ(Timestamp::seconds(kValue).ms(), kValue * 1000);
52 EXPECT_EQ(Timestamp::seconds(kValue).us(), kValue * 1000000);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020053}
54
55TEST(TimestampTest, IdentityChecks) {
56 const int64_t kValue = 3000;
57
Sebastian Jansson9de4ef42018-09-04 17:32:36 +020058 EXPECT_TRUE(Timestamp::PlusInfinity().IsInfinite());
59 EXPECT_TRUE(Timestamp::MinusInfinity().IsInfinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020060 EXPECT_FALSE(Timestamp::ms(kValue).IsInfinite());
61
Sebastian Jansson9de4ef42018-09-04 17:32:36 +020062 EXPECT_FALSE(Timestamp::PlusInfinity().IsFinite());
63 EXPECT_FALSE(Timestamp::MinusInfinity().IsFinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020064 EXPECT_TRUE(Timestamp::ms(kValue).IsFinite());
Sebastian Jansson9de4ef42018-09-04 17:32:36 +020065
66 EXPECT_TRUE(Timestamp::PlusInfinity().IsPlusInfinity());
67 EXPECT_FALSE(Timestamp::MinusInfinity().IsPlusInfinity());
68
69 EXPECT_TRUE(Timestamp::MinusInfinity().IsMinusInfinity());
70 EXPECT_FALSE(Timestamp::PlusInfinity().IsMinusInfinity());
Sebastian Jansson30bd4032018-04-13 13:56:17 +020071}
72
73TEST(TimestampTest, ComparisonOperators) {
74 const int64_t kSmall = 450;
75 const int64_t kLarge = 451;
76
Sebastian Jansson9de4ef42018-09-04 17:32:36 +020077 EXPECT_EQ(Timestamp::PlusInfinity(), Timestamp::PlusInfinity());
78 EXPECT_GE(Timestamp::PlusInfinity(), Timestamp::PlusInfinity());
79 EXPECT_GT(Timestamp::PlusInfinity(), Timestamp::ms(kLarge));
Sebastian Jansson30bd4032018-04-13 13:56:17 +020080 EXPECT_EQ(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
81 EXPECT_LE(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
82 EXPECT_GE(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
83 EXPECT_NE(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
84 EXPECT_LE(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
85 EXPECT_LT(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
86 EXPECT_GE(Timestamp::ms(kLarge), Timestamp::ms(kSmall));
87 EXPECT_GT(Timestamp::ms(kLarge), Timestamp::ms(kSmall));
88}
89
Sebastian Jansson942b3602018-05-30 15:47:44 +020090TEST(TimestampTest, CanBeInititializedFromLargeInt) {
91 const int kMaxInt = std::numeric_limits<int>::max();
92 EXPECT_EQ(Timestamp::seconds(kMaxInt).us(),
93 static_cast<int64_t>(kMaxInt) * 1000000);
94 EXPECT_EQ(Timestamp::ms(kMaxInt).us(), static_cast<int64_t>(kMaxInt) * 1000);
95}
96
97TEST(TimestampTest, ConvertsToAndFromDouble) {
98 const int64_t kMicros = 17017;
99 const double kMicrosDouble = kMicros;
100 const double kMillisDouble = kMicros * 1e-3;
101 const double kSecondsDouble = kMillisDouble * 1e-3;
102
103 EXPECT_EQ(Timestamp::us(kMicros).seconds<double>(), kSecondsDouble);
104 EXPECT_EQ(Timestamp::seconds(kSecondsDouble).us(), kMicros);
105
106 EXPECT_EQ(Timestamp::us(kMicros).ms<double>(), kMillisDouble);
107 EXPECT_EQ(Timestamp::ms(kMillisDouble).us(), kMicros);
108
109 EXPECT_EQ(Timestamp::us(kMicros).us<double>(), kMicrosDouble);
110 EXPECT_EQ(Timestamp::us(kMicrosDouble).us(), kMicros);
111
112 const double kPlusInfinity = std::numeric_limits<double>::infinity();
Sebastian Jansson9de4ef42018-09-04 17:32:36 +0200113 const double kMinusInfinity = -kPlusInfinity;
Sebastian Jansson942b3602018-05-30 15:47:44 +0200114
Sebastian Jansson9de4ef42018-09-04 17:32:36 +0200115 EXPECT_EQ(Timestamp::PlusInfinity().seconds<double>(), kPlusInfinity);
116 EXPECT_EQ(Timestamp::MinusInfinity().seconds<double>(), kMinusInfinity);
117 EXPECT_EQ(Timestamp::PlusInfinity().ms<double>(), kPlusInfinity);
118 EXPECT_EQ(Timestamp::MinusInfinity().ms<double>(), kMinusInfinity);
119 EXPECT_EQ(Timestamp::PlusInfinity().us<double>(), kPlusInfinity);
120 EXPECT_EQ(Timestamp::MinusInfinity().us<double>(), kMinusInfinity);
Sebastian Jansson942b3602018-05-30 15:47:44 +0200121
Sebastian Jansson9de4ef42018-09-04 17:32:36 +0200122 EXPECT_TRUE(Timestamp::seconds(kPlusInfinity).IsPlusInfinity());
123 EXPECT_TRUE(Timestamp::seconds(kMinusInfinity).IsMinusInfinity());
124 EXPECT_TRUE(Timestamp::ms(kPlusInfinity).IsPlusInfinity());
125 EXPECT_TRUE(Timestamp::ms(kMinusInfinity).IsMinusInfinity());
126 EXPECT_TRUE(Timestamp::us(kPlusInfinity).IsPlusInfinity());
127 EXPECT_TRUE(Timestamp::us(kMinusInfinity).IsMinusInfinity());
Sebastian Jansson942b3602018-05-30 15:47:44 +0200128}
129
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200130TEST(UnitConversionTest, TimestampAndTimeDeltaMath) {
131 const int64_t kValueA = 267;
132 const int64_t kValueB = 450;
133 const Timestamp time_a = Timestamp::ms(kValueA);
134 const Timestamp time_b = Timestamp::ms(kValueB);
135 const TimeDelta delta_a = TimeDelta::ms(kValueA);
Sebastian Jansson88c1a9e2018-08-30 13:58:38 +0200136 const TimeDelta delta_b = TimeDelta::ms(kValueB);
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200137
138 EXPECT_EQ((time_a - time_b), TimeDelta::ms(kValueA - kValueB));
139 EXPECT_EQ((time_b - delta_a), Timestamp::ms(kValueB - kValueA));
140 EXPECT_EQ((time_b + delta_a), Timestamp::ms(kValueB + kValueA));
Sebastian Jansson88c1a9e2018-08-30 13:58:38 +0200141
142 Timestamp mutable_time = time_a;
143 mutable_time += delta_b;
144 EXPECT_EQ(mutable_time, time_a + delta_b);
145 mutable_time -= delta_b;
146 EXPECT_EQ(mutable_time, time_a);
147}
148
149TEST(UnitConversionTest, InfinityOperations) {
150 const int64_t kValue = 267;
151 const Timestamp finite_time = Timestamp::ms(kValue);
152 const TimeDelta finite_delta = TimeDelta::ms(kValue);
Sebastian Jansson9de4ef42018-09-04 17:32:36 +0200153 EXPECT_TRUE((Timestamp::PlusInfinity() + finite_delta).IsInfinite());
154 EXPECT_TRUE((Timestamp::PlusInfinity() - finite_delta).IsInfinite());
Sebastian Jansson88c1a9e2018-08-30 13:58:38 +0200155 EXPECT_TRUE((finite_time + TimeDelta::PlusInfinity()).IsInfinite());
156 EXPECT_TRUE((finite_time - TimeDelta::MinusInfinity()).IsInfinite());
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200157}
158} // namespace test
159} // namespace webrtc