1// Copyright 2018 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <unittest/unittest.h>
6#include <zircon/time.h>
7
8static bool time_add_duration_test() {
9    BEGIN_TEST;
10
11    EXPECT_EQ(0, zx_time_add_duration(0, 0));
12
13    EXPECT_EQ(918741562, zx_time_add_duration(918729180, 12382));
14
15    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_add_duration(ZX_TIME_INFINITE_PAST, 0));
16    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_add_duration(ZX_TIME_INFINITE_PAST, -1));
17    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_add_duration(ZX_TIME_INFINITE_PAST, -3298901));
18    EXPECT_EQ(ZX_TIME_INFINITE_PAST,
19              zx_time_add_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
20
21    EXPECT_EQ(ZX_TIME_INFINITE, zx_time_add_duration(ZX_TIME_INFINITE, 0));
22    EXPECT_EQ(ZX_TIME_INFINITE, zx_time_add_duration(ZX_TIME_INFINITE, 1));
23    EXPECT_EQ(ZX_TIME_INFINITE, zx_time_add_duration(ZX_TIME_INFINITE, 3298901));
24    EXPECT_EQ(ZX_TIME_INFINITE, zx_time_add_duration(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
25
26    END_TEST;
27}
28
29static bool time_sub_duration_test() {
30    BEGIN_TEST;
31
32    EXPECT_EQ(-1, zx_time_sub_duration(1, 2));
33    EXPECT_EQ(-1, zx_time_sub_duration(0, 1));
34
35    EXPECT_EQ(0, zx_time_sub_duration(0, 0));
36    EXPECT_EQ(0, zx_time_sub_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
37    EXPECT_EQ(0, zx_time_sub_duration(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
38
39    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_duration(ZX_TIME_INFINITE_PAST, 0));
40    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_duration(ZX_TIME_INFINITE_PAST, 1));
41    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE));
42    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_duration(INT64_MIN, INT64_MAX));
43
44    EXPECT_EQ((ZX_TIME_INFINITE - 1), zx_time_sub_duration(ZX_TIME_INFINITE, 1));
45
46    EXPECT_EQ(918716798, zx_time_sub_duration(918729180, 12382));
47
48    END_TEST;
49}
50
51static bool time_sub_time_test() {
52    BEGIN_TEST;
53
54    EXPECT_EQ(-1, zx_time_sub_time(1, 2));
55    EXPECT_EQ(-1, zx_time_sub_time(0, 1));
56
57    EXPECT_EQ(0, zx_time_sub_time(0, 0));
58    EXPECT_EQ(0, zx_time_sub_time(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
59    EXPECT_EQ(0, zx_time_sub_time(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
60
61    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_time(ZX_TIME_INFINITE_PAST, 0));
62    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_time(ZX_TIME_INFINITE_PAST, 1));
63    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_time(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE));
64    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_time_sub_time(INT64_MIN, INT64_MAX));
65
66    EXPECT_EQ((ZX_TIME_INFINITE - 1), zx_time_sub_time(ZX_TIME_INFINITE, 1));
67
68    EXPECT_EQ(918716798, zx_time_sub_time(918729180, 12382));
69
70    END_TEST;
71}
72
73static bool duration_add_duration_test() {
74    BEGIN_TEST;
75
76    EXPECT_EQ(0, zx_duration_add_duration(0, 0));
77
78    EXPECT_EQ(918741562, zx_duration_add_duration(918729180, 12382));
79
80    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_add_duration(ZX_TIME_INFINITE_PAST, 0));
81    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_add_duration(ZX_TIME_INFINITE_PAST, -1));
82    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_add_duration(ZX_TIME_INFINITE_PAST, -3298901));
83    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_add_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
84
85    EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, 0));
86    EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, 1));
87    EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, 3298901));
88    EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
89    EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_add_duration(ZX_TIME_INFINITE, INT64_MAX));
90
91    END_TEST;
92}
93
94static bool duration_sub_duration_test() {
95    BEGIN_TEST;
96
97    EXPECT_EQ(918716798, zx_duration_sub_duration(918729180, 12382));
98
99    EXPECT_EQ(-1, zx_duration_sub_duration(1, 2));
100    EXPECT_EQ(-1, zx_duration_sub_duration(0, 1));
101
102    EXPECT_EQ(0, zx_duration_sub_duration(0, 0));
103    EXPECT_EQ(0, zx_duration_sub_duration(3980, 3980));
104    EXPECT_EQ(0, zx_duration_sub_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE_PAST));
105    EXPECT_EQ(0, zx_duration_sub_duration(ZX_TIME_INFINITE, ZX_TIME_INFINITE));
106
107    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_sub_duration(ZX_TIME_INFINITE_PAST, 0));
108    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_sub_duration(ZX_TIME_INFINITE_PAST, 1));
109    EXPECT_EQ(ZX_TIME_INFINITE_PAST,
110              zx_duration_sub_duration(ZX_TIME_INFINITE_PAST, ZX_TIME_INFINITE));
111    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_sub_duration(INT64_MIN, INT64_MAX));
112
113    EXPECT_EQ((ZX_TIME_INFINITE - 1), zx_duration_sub_duration(ZX_TIME_INFINITE, 1));
114
115    EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_sub_duration(0, ZX_TIME_INFINITE_PAST));
116
117    END_TEST;
118}
119
120static bool duration_mul_int64_test() {
121    BEGIN_TEST;
122
123    EXPECT_EQ(0, zx_duration_mul_int64(0, 0));
124    EXPECT_EQ(39284291, zx_duration_mul_int64(39284291, 1));
125    EXPECT_EQ(220499082795, zx_duration_mul_int64(23451, 9402545));
126    EXPECT_EQ(-39284291, zx_duration_mul_int64(39284291, -1));
127    EXPECT_EQ(-220499082795, zx_duration_mul_int64(23451, -9402545));
128    EXPECT_EQ(220499082795, zx_duration_mul_int64(-23451, -9402545));
129
130    EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_mul_int64(ZX_TIME_INFINITE, 2));
131    EXPECT_EQ(ZX_TIME_INFINITE, zx_duration_mul_int64(ZX_TIME_INFINITE_PAST, -2));
132    EXPECT_EQ(ZX_TIME_INFINITE_PAST, zx_duration_mul_int64(ZX_TIME_INFINITE_PAST, 2));
133
134    END_TEST;
135}
136
137BEGIN_TEST_CASE(time_test)
138RUN_TEST(time_add_duration_test)
139RUN_TEST(time_sub_duration_test)
140RUN_TEST(time_sub_time_test)
141RUN_TEST(duration_add_duration_test)
142
143RUN_TEST(duration_sub_duration_test)
144RUN_TEST(duration_mul_int64_test)
145END_TEST_CASE(time_test)
146
147int main(int argc, char** argv) {
148    bool success = unittest_run_all_tests(argc, argv);
149    return success ? 0 : -1;
150}
151