blob: 7dfe6695d214cc40ff5bf45924c417dcccc736b0 [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) {
17 constexpr Timestamp kTimestampInf = Timestamp::Infinity();
18 static_assert(kTimestampInf.IsInfinite(), "");
19}
20
Sebastian Jansson30bd4032018-04-13 13:56:17 +020021TEST(TimestampTest, GetBackSameValues) {
22 const int64_t kValue = 499;
23 EXPECT_EQ(Timestamp::ms(kValue).ms(), kValue);
24 EXPECT_EQ(Timestamp::us(kValue).us(), kValue);
Sebastian Janssonf7ffd942018-04-16 11:46:42 +020025 EXPECT_EQ(Timestamp::seconds(kValue).seconds(), kValue);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020026}
27
28TEST(TimestampTest, GetDifferentPrefix) {
29 const int64_t kValue = 3000000;
Sebastian Janssonf7ffd942018-04-16 11:46:42 +020030 EXPECT_EQ(Timestamp::us(kValue).seconds(), kValue / 1000000);
31 EXPECT_EQ(Timestamp::ms(kValue).seconds(), kValue / 1000);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020032 EXPECT_EQ(Timestamp::us(kValue).ms(), kValue / 1000);
33
34 EXPECT_EQ(Timestamp::ms(kValue).us(), kValue * 1000);
Sebastian Janssonf7ffd942018-04-16 11:46:42 +020035 EXPECT_EQ(Timestamp::seconds(kValue).ms(), kValue * 1000);
36 EXPECT_EQ(Timestamp::seconds(kValue).us(), kValue * 1000000);
Sebastian Jansson30bd4032018-04-13 13:56:17 +020037}
38
39TEST(TimestampTest, IdentityChecks) {
40 const int64_t kValue = 3000;
41
42 EXPECT_TRUE(Timestamp::Infinity().IsInfinite());
43 EXPECT_FALSE(Timestamp::ms(kValue).IsInfinite());
44
Sebastian Jansson30bd4032018-04-13 13:56:17 +020045 EXPECT_FALSE(Timestamp::Infinity().IsFinite());
46 EXPECT_TRUE(Timestamp::ms(kValue).IsFinite());
47}
48
49TEST(TimestampTest, ComparisonOperators) {
50 const int64_t kSmall = 450;
51 const int64_t kLarge = 451;
52
53 EXPECT_EQ(Timestamp::Infinity(), Timestamp::Infinity());
Sebastian Janssonec2eb222018-05-24 12:32:05 +020054 EXPECT_GE(Timestamp::Infinity(), Timestamp::Infinity());
55 EXPECT_GT(Timestamp::Infinity(), Timestamp::ms(kLarge));
Sebastian Jansson30bd4032018-04-13 13:56:17 +020056 EXPECT_EQ(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
57 EXPECT_LE(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
58 EXPECT_GE(Timestamp::ms(kSmall), Timestamp::ms(kSmall));
59 EXPECT_NE(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
60 EXPECT_LE(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
61 EXPECT_LT(Timestamp::ms(kSmall), Timestamp::ms(kLarge));
62 EXPECT_GE(Timestamp::ms(kLarge), Timestamp::ms(kSmall));
63 EXPECT_GT(Timestamp::ms(kLarge), Timestamp::ms(kSmall));
64}
65
Sebastian Jansson942b3602018-05-30 15:47:44 +020066TEST(TimestampTest, CanBeInititializedFromLargeInt) {
67 const int kMaxInt = std::numeric_limits<int>::max();
68 EXPECT_EQ(Timestamp::seconds(kMaxInt).us(),
69 static_cast<int64_t>(kMaxInt) * 1000000);
70 EXPECT_EQ(Timestamp::ms(kMaxInt).us(), static_cast<int64_t>(kMaxInt) * 1000);
71}
72
73TEST(TimestampTest, ConvertsToAndFromDouble) {
74 const int64_t kMicros = 17017;
75 const double kMicrosDouble = kMicros;
76 const double kMillisDouble = kMicros * 1e-3;
77 const double kSecondsDouble = kMillisDouble * 1e-3;
78
79 EXPECT_EQ(Timestamp::us(kMicros).seconds<double>(), kSecondsDouble);
80 EXPECT_EQ(Timestamp::seconds(kSecondsDouble).us(), kMicros);
81
82 EXPECT_EQ(Timestamp::us(kMicros).ms<double>(), kMillisDouble);
83 EXPECT_EQ(Timestamp::ms(kMillisDouble).us(), kMicros);
84
85 EXPECT_EQ(Timestamp::us(kMicros).us<double>(), kMicrosDouble);
86 EXPECT_EQ(Timestamp::us(kMicrosDouble).us(), kMicros);
87
88 const double kPlusInfinity = std::numeric_limits<double>::infinity();
89
90 EXPECT_EQ(Timestamp::Infinity().seconds<double>(), kPlusInfinity);
91 EXPECT_EQ(Timestamp::Infinity().ms<double>(), kPlusInfinity);
92 EXPECT_EQ(Timestamp::Infinity().us<double>(), kPlusInfinity);
93
94 EXPECT_TRUE(Timestamp::seconds(kPlusInfinity).IsInfinite());
95 EXPECT_TRUE(Timestamp::ms(kPlusInfinity).IsInfinite());
96 EXPECT_TRUE(Timestamp::us(kPlusInfinity).IsInfinite());
97}
98
Sebastian Jansson30bd4032018-04-13 13:56:17 +020099TEST(UnitConversionTest, TimestampAndTimeDeltaMath) {
100 const int64_t kValueA = 267;
101 const int64_t kValueB = 450;
102 const Timestamp time_a = Timestamp::ms(kValueA);
103 const Timestamp time_b = Timestamp::ms(kValueB);
104 const TimeDelta delta_a = TimeDelta::ms(kValueA);
105
106 EXPECT_EQ((time_a - time_b), TimeDelta::ms(kValueA - kValueB));
107 EXPECT_EQ((time_b - delta_a), Timestamp::ms(kValueB - kValueA));
108 EXPECT_EQ((time_b + delta_a), Timestamp::ms(kValueB + kValueA));
109}
110} // namespace test
111} // namespace webrtc