1*3f982cf4SFabien Sanglard // Copyright 2015 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard
5*3f982cf4SFabien Sanglard #include "cast/streaming/rtp_time.h"
6*3f982cf4SFabien Sanglard
7*3f982cf4SFabien Sanglard #include <chrono>
8*3f982cf4SFabien Sanglard
9*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
10*3f982cf4SFabien Sanglard #include "util/chrono_helpers.h"
11*3f982cf4SFabien Sanglard
12*3f982cf4SFabien Sanglard namespace openscreen {
13*3f982cf4SFabien Sanglard namespace cast {
14*3f982cf4SFabien Sanglard
15*3f982cf4SFabien Sanglard // Tests that conversions between std::chrono durations and RtpTimeDelta are
16*3f982cf4SFabien Sanglard // accurate. Note that this implicitly tests the conversions to/from
17*3f982cf4SFabien Sanglard // RtpTimeTicks as well due to shared implementation.
TEST(RtpTimeDeltaTest,ConversionToAndFromDurations)18*3f982cf4SFabien Sanglard TEST(RtpTimeDeltaTest, ConversionToAndFromDurations) {
19*3f982cf4SFabien Sanglard constexpr int kTimebase = 48000;
20*3f982cf4SFabien Sanglard
21*3f982cf4SFabien Sanglard // Origin in both timelines is equivalent.
22*3f982cf4SFabien Sanglard ASSERT_EQ(RtpTimeDelta(), RtpTimeDelta::FromTicks(0));
23*3f982cf4SFabien Sanglard ASSERT_EQ(RtpTimeDelta(),
24*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(microseconds(0), kTimebase));
25*3f982cf4SFabien Sanglard ASSERT_EQ(microseconds::zero(),
26*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(0).ToDuration<microseconds>(kTimebase));
27*3f982cf4SFabien Sanglard
28*3f982cf4SFabien Sanglard // Conversions that are exact (i.e., do not require rounding).
29*3f982cf4SFabien Sanglard ASSERT_EQ(RtpTimeDelta::FromTicks(480),
30*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(milliseconds(10), kTimebase));
31*3f982cf4SFabien Sanglard ASSERT_EQ(RtpTimeDelta::FromTicks(96000),
32*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(seconds(2), kTimebase));
33*3f982cf4SFabien Sanglard ASSERT_EQ(milliseconds(10),
34*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(480).ToDuration<microseconds>(kTimebase));
35*3f982cf4SFabien Sanglard ASSERT_EQ(seconds(2),
36*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(96000).ToDuration<microseconds>(kTimebase));
37*3f982cf4SFabien Sanglard
38*3f982cf4SFabien Sanglard // Conversions that are approximate (i.e., are rounded).
39*3f982cf4SFabien Sanglard for (int error_us = -3; error_us <= +3; ++error_us) {
40*3f982cf4SFabien Sanglard ASSERT_EQ(
41*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(0),
42*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(microseconds(0 + error_us), kTimebase));
43*3f982cf4SFabien Sanglard ASSERT_EQ(
44*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(1),
45*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(microseconds(21 + error_us), kTimebase));
46*3f982cf4SFabien Sanglard ASSERT_EQ(
47*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(2),
48*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(microseconds(42 + error_us), kTimebase));
49*3f982cf4SFabien Sanglard ASSERT_EQ(
50*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(3),
51*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(microseconds(63 + error_us), kTimebase));
52*3f982cf4SFabien Sanglard ASSERT_EQ(
53*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(4),
54*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(microseconds(83 + error_us), kTimebase));
55*3f982cf4SFabien Sanglard ASSERT_EQ(
56*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(11200000000000),
57*3f982cf4SFabien Sanglard RtpTimeDelta::FromDuration(
58*3f982cf4SFabien Sanglard microseconds(INT64_C(233333333333333) + error_us), kTimebase));
59*3f982cf4SFabien Sanglard }
60*3f982cf4SFabien Sanglard ASSERT_EQ(microseconds(21),
61*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(1).ToDuration<microseconds>(kTimebase));
62*3f982cf4SFabien Sanglard ASSERT_EQ(microseconds(42),
63*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(2).ToDuration<microseconds>(kTimebase));
64*3f982cf4SFabien Sanglard ASSERT_EQ(microseconds(63),
65*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(3).ToDuration<microseconds>(kTimebase));
66*3f982cf4SFabien Sanglard ASSERT_EQ(microseconds(83),
67*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(4).ToDuration<microseconds>(kTimebase));
68*3f982cf4SFabien Sanglard ASSERT_EQ(microseconds(INT64_C(233333333333333)),
69*3f982cf4SFabien Sanglard RtpTimeDelta::FromTicks(11200000000000)
70*3f982cf4SFabien Sanglard .ToDuration<microseconds>(kTimebase));
71*3f982cf4SFabien Sanglard }
72*3f982cf4SFabien Sanglard
73*3f982cf4SFabien Sanglard } // namespace cast
74*3f982cf4SFabien Sanglard } // namespace openscreen
75