blob: db894cca447c6ac6ffa6fa3844ad2e566893ee70 [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 Jansson8e064192018-08-07 12:34:33 +020018 constexpr Timestamp kTimestampInf = Timestamp::Infinity();
19 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
58 EXPECT_TRUE(Timestamp::Infinity().IsInfinite());
59 EXPECT_FALSE(Timestamp::ms(kValue).IsInfinite());
60
Sebastian Jansson30bd4032018-04-13 13:56:17 +020061 EXPECT_FALSE(Timestamp::Infinity().IsFinite());
62 EXPECT_TRUE(Timestamp::ms(kValue).IsFinite());
63}
64
65TEST(TimestampTest, ComparisonOperators) {
66 const int64_t kSmall = 450;
67 const int64_t kLarge = 451;
68
69 EXPECT_EQ(Timestamp::Infinity(), Timestamp::Infinity());
Sebastian Janssonec2eb222018-05-24 12:32:05 +020070 EXPECT_GE(Timestamp::Infinity(), Timestamp::Infinity());
71 EXPECT_GT(Timestamp::Infinity(), Timestamp::ms(kLarge));
Sebastian Jansson30bd4032018-04-13 13:56:17 +020072 EXPECT_EQ(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
73 EXPECT_LE(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
74 EXPECT_GE(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
75 EXPECT_NE(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
76 EXPECT_LE(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
77 EXPECT_LT(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
78 EXPECT_GE(Timestamp::ms(kLarge), Timestamp::ms(kSmall));
79 EXPECT_GT(Timestamp::ms(kLarge), Timestamp::ms(kSmall));
80}
81
Sebastian Jansson942b3602018-05-30 15:47:44 +020082TEST(TimestampTest, CanBeInititializedFromLargeInt) {
83 const int kMaxInt = std::numeric_limits<int>::max();
84 EXPECT_EQ(Timestamp::seconds(kMaxInt).us(),
85 static_cast<int64_t>(kMaxInt) * 1000000);
86 EXPECT_EQ(Timestamp::ms(kMaxInt).us(), static_cast<int64_t>(kMaxInt) * 1000);
87}
88
89TEST(TimestampTest, ConvertsToAndFromDouble) {
90 const int64_t kMicros = 17017;
91 const double kMicrosDouble = kMicros;
92 const double kMillisDouble = kMicros * 1e-3;
93 const double kSecondsDouble = kMillisDouble * 1e-3;
94
95 EXPECT_EQ(Timestamp::us(kMicros).seconds<double>(), kSecondsDouble);
96 EXPECT_EQ(Timestamp::seconds(kSecondsDouble).us(), kMicros);
97
98 EXPECT_EQ(Timestamp::us(kMicros).ms<double>(), kMillisDouble);
99 EXPECT_EQ(Timestamp::ms(kMillisDouble).us(), kMicros);
100
101 EXPECT_EQ(Timestamp::us(kMicros).us<double>(), kMicrosDouble);
102 EXPECT_EQ(Timestamp::us(kMicrosDouble).us(), kMicros);
103
104 const double kPlusInfinity = std::numeric_limits<double>::infinity();
105
106 EXPECT_EQ(Timestamp::Infinity().seconds<double>(), kPlusInfinity);
107 EXPECT_EQ(Timestamp::Infinity().ms<double>(), kPlusInfinity);
108 EXPECT_EQ(Timestamp::Infinity().us<double>(), kPlusInfinity);
109
110 EXPECT_TRUE(Timestamp::seconds(kPlusInfinity).IsInfinite());
111 EXPECT_TRUE(Timestamp::ms(kPlusInfinity).IsInfinite());
112 EXPECT_TRUE(Timestamp::us(kPlusInfinity).IsInfinite());
113}
114
Sebastian Jansson30bd4032018-04-13 13:56:17 +0200115TEST(UnitConversionTest, TimestampAndTimeDeltaMath) {
116 const int64_t kValueA = 267;
117 const int64_t kValueB = 450;
118 const Timestamp time_a = Timestamp::ms(kValueA);
119 const Timestamp time_b = Timestamp::ms(kValueB);
120 const TimeDelta delta_a = TimeDelta::ms(kValueA);
121
122 EXPECT_EQ((time_a - time_b), TimeDelta::ms(kValueA - kValueB));
123 EXPECT_EQ((time_b - delta_a), Timestamp::ms(kValueB - kValueA));
124 EXPECT_EQ((time_b + delta_a), Timestamp::ms(kValueB + kValueA));
125}
126} // namespace test
127} // namespace webrtc