blob: 43b2985d434d6228b6311363175d8d8054451a44 [file] [log] [blame]
Sebastian Jansson30bd4032018-04-13 11:56:171/*
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
Danil Chapovalov8d94dc22020-01-28 16:54:4711#include <limits>
12
Sebastian Jansson6fae6ec2018-05-08 08:43:1813#include "api/units/timestamp.h"
Sebastian Jansson30bd4032018-04-13 11:56:1714#include "test/gtest.h"
15
16namespace webrtc {
17namespace test {
Sebastian Jansson8e064192018-08-07 10:34:3318TEST(TimestampTest, ConstExpr) {
Sebastian Janssonc1c8b8e2018-08-07 13:29:0419 constexpr int64_t kValue = 12345;
Sebastian Jansson9de4ef42018-09-04 15:32:3620 constexpr Timestamp kTimestampInf = Timestamp::PlusInfinity();
Sebastian Jansson8e064192018-08-07 10:34:3321 static_assert(kTimestampInf.IsInfinite(), "");
Sebastian Janssonc1c8b8e2018-08-07 13:29:0422 static_assert(kTimestampInf.ms_or(-1) == -1, "");
23
Danil Chapovalov8d94dc22020-01-28 16:54:4724 constexpr Timestamp kTimestampSeconds = Timestamp::Seconds(kValue);
25 constexpr Timestamp kTimestampMs = Timestamp::Millis(kValue);
26 constexpr Timestamp kTimestampUs = Timestamp::Micros(kValue);
Sebastian Janssonc1c8b8e2018-08-07 13:29:0427
28 static_assert(kTimestampSeconds.seconds_or(0) == kValue, "");
29 static_assert(kTimestampMs.ms_or(0) == kValue, "");
30 static_assert(kTimestampUs.us_or(0) == kValue, "");
31
32 static_assert(kTimestampMs > kTimestampUs, "");
33
34 EXPECT_EQ(kTimestampSeconds.seconds(), kValue);
35 EXPECT_EQ(kTimestampMs.ms(), kValue);
36 EXPECT_EQ(kTimestampUs.us(), kValue);
Sebastian Jansson8e064192018-08-07 10:34:3337}
38
Sebastian Jansson30bd4032018-04-13 11:56:1739TEST(TimestampTest, GetBackSameValues) {
40 const int64_t kValue = 499;
Danil Chapovalov8d94dc22020-01-28 16:54:4741 EXPECT_EQ(Timestamp::Millis(kValue).ms(), kValue);
42 EXPECT_EQ(Timestamp::Micros(kValue).us(), kValue);
43 EXPECT_EQ(Timestamp::Seconds(kValue).seconds(), kValue);
Sebastian Jansson30bd4032018-04-13 11:56:1744}
45
46TEST(TimestampTest, GetDifferentPrefix) {
47 const int64_t kValue = 3000000;
Danil Chapovalov8d94dc22020-01-28 16:54:4748 EXPECT_EQ(Timestamp::Micros(kValue).seconds(), kValue / 1000000);
49 EXPECT_EQ(Timestamp::Millis(kValue).seconds(), kValue / 1000);
50 EXPECT_EQ(Timestamp::Micros(kValue).ms(), kValue / 1000);
Sebastian Jansson30bd4032018-04-13 11:56:1751
Danil Chapovalov8d94dc22020-01-28 16:54:4752 EXPECT_EQ(Timestamp::Millis(kValue).us(), kValue * 1000);
53 EXPECT_EQ(Timestamp::Seconds(kValue).ms(), kValue * 1000);
54 EXPECT_EQ(Timestamp::Seconds(kValue).us(), kValue * 1000000);
Sebastian Jansson30bd4032018-04-13 11:56:1755}
56
57TEST(TimestampTest, IdentityChecks) {
58 const int64_t kValue = 3000;
59
Sebastian Jansson9de4ef42018-09-04 15:32:3660 EXPECT_TRUE(Timestamp::PlusInfinity().IsInfinite());
61 EXPECT_TRUE(Timestamp::MinusInfinity().IsInfinite());
Danil Chapovalov8d94dc22020-01-28 16:54:4762 EXPECT_FALSE(Timestamp::Millis(kValue).IsInfinite());
Sebastian Jansson30bd4032018-04-13 11:56:1763
Sebastian Jansson9de4ef42018-09-04 15:32:3664 EXPECT_FALSE(Timestamp::PlusInfinity().IsFinite());
65 EXPECT_FALSE(Timestamp::MinusInfinity().IsFinite());
Danil Chapovalov8d94dc22020-01-28 16:54:4766 EXPECT_TRUE(Timestamp::Millis(kValue).IsFinite());
Sebastian Jansson9de4ef42018-09-04 15:32:3667
68 EXPECT_TRUE(Timestamp::PlusInfinity().IsPlusInfinity());
69 EXPECT_FALSE(Timestamp::MinusInfinity().IsPlusInfinity());
70
71 EXPECT_TRUE(Timestamp::MinusInfinity().IsMinusInfinity());
72 EXPECT_FALSE(Timestamp::PlusInfinity().IsMinusInfinity());
Sebastian Jansson30bd4032018-04-13 11:56:1773}
74
75TEST(TimestampTest, ComparisonOperators) {
76 const int64_t kSmall = 450;
77 const int64_t kLarge = 451;
78
Sebastian Jansson9de4ef42018-09-04 15:32:3679 EXPECT_EQ(Timestamp::PlusInfinity(), Timestamp::PlusInfinity());
80 EXPECT_GE(Timestamp::PlusInfinity(), Timestamp::PlusInfinity());
Danil Chapovalov8d94dc22020-01-28 16:54:4781 EXPECT_GT(Timestamp::PlusInfinity(), Timestamp::Millis(kLarge));
82 EXPECT_EQ(Timestamp::Millis(kSmall), Timestamp::Millis(kSmall));
83 EXPECT_LE(Timestamp::Millis(kSmall), Timestamp::Millis(kSmall));
84 EXPECT_GE(Timestamp::Millis(kSmall), Timestamp::Millis(kSmall));
85 EXPECT_NE(Timestamp::Millis(kSmall), Timestamp::Millis(kLarge));
86 EXPECT_LE(Timestamp::Millis(kSmall), Timestamp::Millis(kLarge));
87 EXPECT_LT(Timestamp::Millis(kSmall), Timestamp::Millis(kLarge));
88 EXPECT_GE(Timestamp::Millis(kLarge), Timestamp::Millis(kSmall));
89 EXPECT_GT(Timestamp::Millis(kLarge), Timestamp::Millis(kSmall));
Sebastian Jansson30bd4032018-04-13 11:56:1790}
91
Sebastian Jansson942b3602018-05-30 13:47:4492TEST(TimestampTest, CanBeInititializedFromLargeInt) {
93 const int kMaxInt = std::numeric_limits<int>::max();
Danil Chapovalov8d94dc22020-01-28 16:54:4794 EXPECT_EQ(Timestamp::Seconds(kMaxInt).us(),
Sebastian Jansson942b3602018-05-30 13:47:4495 static_cast<int64_t>(kMaxInt) * 1000000);
Danil Chapovalov8d94dc22020-01-28 16:54:4796 EXPECT_EQ(Timestamp::Millis(kMaxInt).us(),
97 static_cast<int64_t>(kMaxInt) * 1000);
Sebastian Jansson942b3602018-05-30 13:47:4498}
99
100TEST(TimestampTest, ConvertsToAndFromDouble) {
101 const int64_t kMicros = 17017;
102 const double kMicrosDouble = kMicros;
103 const double kMillisDouble = kMicros * 1e-3;
104 const double kSecondsDouble = kMillisDouble * 1e-3;
105
Danil Chapovalov8d94dc22020-01-28 16:54:47106 EXPECT_EQ(Timestamp::Micros(kMicros).seconds<double>(), kSecondsDouble);
107 EXPECT_EQ(Timestamp::Seconds(kSecondsDouble).us(), kMicros);
Sebastian Jansson942b3602018-05-30 13:47:44108
Danil Chapovalov8d94dc22020-01-28 16:54:47109 EXPECT_EQ(Timestamp::Micros(kMicros).ms<double>(), kMillisDouble);
110 EXPECT_EQ(Timestamp::Millis(kMillisDouble).us(), kMicros);
Sebastian Jansson942b3602018-05-30 13:47:44111
Danil Chapovalov8d94dc22020-01-28 16:54:47112 EXPECT_EQ(Timestamp::Micros(kMicros).us<double>(), kMicrosDouble);
113 EXPECT_EQ(Timestamp::Micros(kMicrosDouble).us(), kMicros);
Sebastian Jansson942b3602018-05-30 13:47:44114
115 const double kPlusInfinity = std::numeric_limits<double>::infinity();
Sebastian Jansson9de4ef42018-09-04 15:32:36116 const double kMinusInfinity = -kPlusInfinity;
Sebastian Jansson942b3602018-05-30 13:47:44117
Sebastian Jansson9de4ef42018-09-04 15:32:36118 EXPECT_EQ(Timestamp::PlusInfinity().seconds<double>(), kPlusInfinity);
119 EXPECT_EQ(Timestamp::MinusInfinity().seconds<double>(), kMinusInfinity);
120 EXPECT_EQ(Timestamp::PlusInfinity().ms<double>(), kPlusInfinity);
121 EXPECT_EQ(Timestamp::MinusInfinity().ms<double>(), kMinusInfinity);
122 EXPECT_EQ(Timestamp::PlusInfinity().us<double>(), kPlusInfinity);
123 EXPECT_EQ(Timestamp::MinusInfinity().us<double>(), kMinusInfinity);
Sebastian Jansson942b3602018-05-30 13:47:44124
Danil Chapovalov8d94dc22020-01-28 16:54:47125 EXPECT_TRUE(Timestamp::Seconds(kPlusInfinity).IsPlusInfinity());
126 EXPECT_TRUE(Timestamp::Seconds(kMinusInfinity).IsMinusInfinity());
127 EXPECT_TRUE(Timestamp::Millis(kPlusInfinity).IsPlusInfinity());
128 EXPECT_TRUE(Timestamp::Millis(kMinusInfinity).IsMinusInfinity());
129 EXPECT_TRUE(Timestamp::Micros(kPlusInfinity).IsPlusInfinity());
130 EXPECT_TRUE(Timestamp::Micros(kMinusInfinity).IsMinusInfinity());
Sebastian Jansson942b3602018-05-30 13:47:44131}
132
Sebastian Jansson30bd4032018-04-13 11:56:17133TEST(UnitConversionTest, TimestampAndTimeDeltaMath) {
134 const int64_t kValueA = 267;
135 const int64_t kValueB = 450;
Danil Chapovalov8d94dc22020-01-28 16:54:47136 const Timestamp time_a = Timestamp::Millis(kValueA);
137 const Timestamp time_b = Timestamp::Millis(kValueB);
138 const TimeDelta delta_a = TimeDelta::Millis(kValueA);
139 const TimeDelta delta_b = TimeDelta::Millis(kValueB);
Sebastian Jansson30bd4032018-04-13 11:56:17140
Danil Chapovalov8d94dc22020-01-28 16:54:47141 EXPECT_EQ((time_a - time_b), TimeDelta::Millis(kValueA - kValueB));
142 EXPECT_EQ((time_b - delta_a), Timestamp::Millis(kValueB - kValueA));
143 EXPECT_EQ((time_b + delta_a), Timestamp::Millis(kValueB + kValueA));
Sebastian Jansson88c1a9e2018-08-30 11:58:38144
145 Timestamp mutable_time = time_a;
146 mutable_time += delta_b;
147 EXPECT_EQ(mutable_time, time_a + delta_b);
148 mutable_time -= delta_b;
149 EXPECT_EQ(mutable_time, time_a);
150}
151
152TEST(UnitConversionTest, InfinityOperations) {
153 const int64_t kValue = 267;
Danil Chapovalov8d94dc22020-01-28 16:54:47154 const Timestamp finite_time = Timestamp::Millis(kValue);
155 const TimeDelta finite_delta = TimeDelta::Millis(kValue);
Sebastian Jansson9de4ef42018-09-04 15:32:36156 EXPECT_TRUE((Timestamp::PlusInfinity() + finite_delta).IsInfinite());
157 EXPECT_TRUE((Timestamp::PlusInfinity() - finite_delta).IsInfinite());
Sebastian Jansson88c1a9e2018-08-30 11:58:38158 EXPECT_TRUE((finite_time + TimeDelta::PlusInfinity()).IsInfinite());
159 EXPECT_TRUE((finite_time - TimeDelta::MinusInfinity()).IsInfinite());
Sebastian Jansson30bd4032018-04-13 11:56:17160}
161} // namespace test
162} // namespace webrtc