1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2019 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/fx_date_helpers.h"
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fake_time_test.h"
8*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*3ac0a46fSAndroid Build Coastguard Worker
10*3ac0a46fSAndroid Build Coastguard Worker namespace {
11*3ac0a46fSAndroid Build Coastguard Worker
12*3ac0a46fSAndroid Build Coastguard Worker constexpr double kMilliSecondsInADay = 1000 * 60 * 60 * 24;
13*3ac0a46fSAndroid Build Coastguard Worker
14*3ac0a46fSAndroid Build Coastguard Worker } // namespace
15*3ac0a46fSAndroid Build Coastguard Worker
16*3ac0a46fSAndroid Build Coastguard Worker using fxjs::ConversionStatus;
17*3ac0a46fSAndroid Build Coastguard Worker
TEST(FX_DateHelper,GetYearFromTime)18*3ac0a46fSAndroid Build Coastguard Worker TEST(FX_DateHelper, GetYearFromTime) {
19*3ac0a46fSAndroid Build Coastguard Worker static constexpr struct {
20*3ac0a46fSAndroid Build Coastguard Worker double time_ms;
21*3ac0a46fSAndroid Build Coastguard Worker int expected_year;
22*3ac0a46fSAndroid Build Coastguard Worker } kTests[] = {
23*3ac0a46fSAndroid Build Coastguard Worker {-400 * kMilliSecondsInADay, 1968},
24*3ac0a46fSAndroid Build Coastguard Worker {-1, 1969},
25*3ac0a46fSAndroid Build Coastguard Worker {0, 1970},
26*3ac0a46fSAndroid Build Coastguard Worker {1, 1970},
27*3ac0a46fSAndroid Build Coastguard Worker {364.9 * kMilliSecondsInADay, 1970},
28*3ac0a46fSAndroid Build Coastguard Worker {365.0 * kMilliSecondsInADay, 1971},
29*3ac0a46fSAndroid Build Coastguard Worker {365.1 * kMilliSecondsInADay, 1971},
30*3ac0a46fSAndroid Build Coastguard Worker {2 * 365.0 * kMilliSecondsInADay, 1972},
31*3ac0a46fSAndroid Build Coastguard Worker // 1972 is a leap year, so there should be an extra day.
32*3ac0a46fSAndroid Build Coastguard Worker {3 * 365.0 * kMilliSecondsInADay, 1972},
33*3ac0a46fSAndroid Build Coastguard Worker {(3 * 365.0 + 1) * kMilliSecondsInADay, 1973},
34*3ac0a46fSAndroid Build Coastguard Worker };
35*3ac0a46fSAndroid Build Coastguard Worker
36*3ac0a46fSAndroid Build Coastguard Worker for (const auto& test : kTests) {
37*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(test.expected_year, FX_GetYearFromTime(test.time_ms))
38*3ac0a46fSAndroid Build Coastguard Worker << test.time_ms;
39*3ac0a46fSAndroid Build Coastguard Worker }
40*3ac0a46fSAndroid Build Coastguard Worker }
41*3ac0a46fSAndroid Build Coastguard Worker
TEST(FX_DateHelper,GetMonthFromTime)42*3ac0a46fSAndroid Build Coastguard Worker TEST(FX_DateHelper, GetMonthFromTime) {
43*3ac0a46fSAndroid Build Coastguard Worker static constexpr struct {
44*3ac0a46fSAndroid Build Coastguard Worker double time_ms;
45*3ac0a46fSAndroid Build Coastguard Worker int expected_month; // Zero-based.
46*3ac0a46fSAndroid Build Coastguard Worker } kTests[] = {
47*3ac0a46fSAndroid Build Coastguard Worker {-400 * kMilliSecondsInADay, 10},
48*3ac0a46fSAndroid Build Coastguard Worker {-1, 11},
49*3ac0a46fSAndroid Build Coastguard Worker {0, 0},
50*3ac0a46fSAndroid Build Coastguard Worker {1, 0},
51*3ac0a46fSAndroid Build Coastguard Worker {364.9 * kMilliSecondsInADay, 11},
52*3ac0a46fSAndroid Build Coastguard Worker {365.0 * kMilliSecondsInADay, 0},
53*3ac0a46fSAndroid Build Coastguard Worker {365.1 * kMilliSecondsInADay, 0},
54*3ac0a46fSAndroid Build Coastguard Worker // 1972 is a leap year, so there should be an extra day.
55*3ac0a46fSAndroid Build Coastguard Worker {2 * 365.0 * kMilliSecondsInADay, 0},
56*3ac0a46fSAndroid Build Coastguard Worker {3 * 365.0 * kMilliSecondsInADay, 11},
57*3ac0a46fSAndroid Build Coastguard Worker {(3 * 365.0 + 1) * kMilliSecondsInADay, 0},
58*3ac0a46fSAndroid Build Coastguard Worker // Tests boundaries for all months in 1970 not already covered above.
59*3ac0a46fSAndroid Build Coastguard Worker {30 * kMilliSecondsInADay, 0},
60*3ac0a46fSAndroid Build Coastguard Worker {31 * kMilliSecondsInADay, 1},
61*3ac0a46fSAndroid Build Coastguard Worker {58 * kMilliSecondsInADay, 1},
62*3ac0a46fSAndroid Build Coastguard Worker {59 * kMilliSecondsInADay, 2},
63*3ac0a46fSAndroid Build Coastguard Worker {89 * kMilliSecondsInADay, 2},
64*3ac0a46fSAndroid Build Coastguard Worker {90 * kMilliSecondsInADay, 3},
65*3ac0a46fSAndroid Build Coastguard Worker {119 * kMilliSecondsInADay, 3},
66*3ac0a46fSAndroid Build Coastguard Worker {120 * kMilliSecondsInADay, 4},
67*3ac0a46fSAndroid Build Coastguard Worker {150 * kMilliSecondsInADay, 4},
68*3ac0a46fSAndroid Build Coastguard Worker {151 * kMilliSecondsInADay, 5},
69*3ac0a46fSAndroid Build Coastguard Worker {180 * kMilliSecondsInADay, 5},
70*3ac0a46fSAndroid Build Coastguard Worker {181 * kMilliSecondsInADay, 6},
71*3ac0a46fSAndroid Build Coastguard Worker {211 * kMilliSecondsInADay, 6},
72*3ac0a46fSAndroid Build Coastguard Worker {212 * kMilliSecondsInADay, 7},
73*3ac0a46fSAndroid Build Coastguard Worker {242 * kMilliSecondsInADay, 7},
74*3ac0a46fSAndroid Build Coastguard Worker {243 * kMilliSecondsInADay, 8},
75*3ac0a46fSAndroid Build Coastguard Worker {272 * kMilliSecondsInADay, 8},
76*3ac0a46fSAndroid Build Coastguard Worker {273 * kMilliSecondsInADay, 9},
77*3ac0a46fSAndroid Build Coastguard Worker {303 * kMilliSecondsInADay, 9},
78*3ac0a46fSAndroid Build Coastguard Worker {304 * kMilliSecondsInADay, 10},
79*3ac0a46fSAndroid Build Coastguard Worker {333 * kMilliSecondsInADay, 10},
80*3ac0a46fSAndroid Build Coastguard Worker {334 * kMilliSecondsInADay, 11},
81*3ac0a46fSAndroid Build Coastguard Worker {364 * kMilliSecondsInADay, 11},
82*3ac0a46fSAndroid Build Coastguard Worker // Tests boundaries for all months in 1972 not already covered above.
83*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 30) * kMilliSecondsInADay, 0},
84*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 31) * kMilliSecondsInADay, 1},
85*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 59) * kMilliSecondsInADay, 1},
86*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 60) * kMilliSecondsInADay, 2},
87*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 90) * kMilliSecondsInADay, 2},
88*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 91) * kMilliSecondsInADay, 3},
89*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 120) * kMilliSecondsInADay, 3},
90*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 121) * kMilliSecondsInADay, 4},
91*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 151) * kMilliSecondsInADay, 4},
92*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 152) * kMilliSecondsInADay, 5},
93*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 181) * kMilliSecondsInADay, 5},
94*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 182) * kMilliSecondsInADay, 6},
95*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 212) * kMilliSecondsInADay, 6},
96*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 213) * kMilliSecondsInADay, 7},
97*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 243) * kMilliSecondsInADay, 7},
98*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 244) * kMilliSecondsInADay, 8},
99*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 273) * kMilliSecondsInADay, 8},
100*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 274) * kMilliSecondsInADay, 9},
101*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 304) * kMilliSecondsInADay, 9},
102*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 305) * kMilliSecondsInADay, 10},
103*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 334) * kMilliSecondsInADay, 10},
104*3ac0a46fSAndroid Build Coastguard Worker {(2 * 365.0 + 335) * kMilliSecondsInADay, 11},
105*3ac0a46fSAndroid Build Coastguard Worker };
106*3ac0a46fSAndroid Build Coastguard Worker
107*3ac0a46fSAndroid Build Coastguard Worker for (const auto& test : kTests) {
108*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(test.expected_month, FX_GetMonthFromTime(test.time_ms))
109*3ac0a46fSAndroid Build Coastguard Worker << test.time_ms;
110*3ac0a46fSAndroid Build Coastguard Worker }
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker
113*3ac0a46fSAndroid Build Coastguard Worker using FXDateHelperFakeTimeTest = FakeTimeTest;
114*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FXDateHelperFakeTimeTest,ParseDateUsingFormatWithEmptyParams)115*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FXDateHelperFakeTimeTest, ParseDateUsingFormatWithEmptyParams) {
116*3ac0a46fSAndroid Build Coastguard Worker double result = 0.0;
117*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
118*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"", L"", &result));
119*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(1'587'654'321'000, result);
120*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
121*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"value", L"", &result));
122*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(1'587'654'321'000, result);
123*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
124*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"", L"format", &result));
125*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(1'587'654'321'000, result);
126*3ac0a46fSAndroid Build Coastguard Worker }
127*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FXDateHelperFakeTimeTest,ParseDateUsingFormatForValidMonthDay)128*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FXDateHelperFakeTimeTest, ParseDateUsingFormatForValidMonthDay) {
129*3ac0a46fSAndroid Build Coastguard Worker double result = 0.0;
130*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
131*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"01/02/2000", L"mm/dd/yyyy", &result));
132*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(946'825'521'000, result);
133*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
134*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"1/2/2000", L"m/d/yyyy", &result));
135*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(946'825'521'000, result);
136*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
137*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"1-2-2000", L"m-d-yyyy", &result));
138*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(946'825'521'000, result);
139*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
140*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"2-1-2000", L"d-m-yyyy", &result));
141*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(946'825'521'000, result);
142*3ac0a46fSAndroid Build Coastguard Worker
143*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
144*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"11/12/2000", L"mm/dd/yyyy", &result));
145*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(973'955'121'000, result);
146*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
147*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"11/12/2000", L"m/d/yyyy", &result));
148*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(973'955'121'000, result);
149*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
150*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"11-12-2000", L"m-d-yyyy", &result));
151*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(973'955'121'000, result);
152*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(ConversionStatus::kSuccess,
153*3ac0a46fSAndroid Build Coastguard Worker FX_ParseDateUsingFormat(L"12-11-2000", L"d-m-yyyy", &result));
154*3ac0a46fSAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(973'955'121'000, result);
155*3ac0a46fSAndroid Build Coastguard Worker }
156