xref: /aosp_15_r20/external/abseil-cpp/absl/time/civil_time_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include "absl/time/civil_time.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include <iomanip>
18*9356374aSAndroid Build Coastguard Worker #include <limits>
19*9356374aSAndroid Build Coastguard Worker #include <sstream>
20*9356374aSAndroid Build Coastguard Worker #include <type_traits>
21*9356374aSAndroid Build Coastguard Worker 
22*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
23*9356374aSAndroid Build Coastguard Worker #include "absl/base/macros.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_format.h"
25*9356374aSAndroid Build Coastguard Worker 
26*9356374aSAndroid Build Coastguard Worker namespace {
27*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,DefaultConstruction)28*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, DefaultConstruction) {
29*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond ss;
30*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00:00", absl::FormatCivilTime(ss));
31*9356374aSAndroid Build Coastguard Worker 
32*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute mm;
33*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00", absl::FormatCivilTime(mm));
34*9356374aSAndroid Build Coastguard Worker 
35*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hh;
36*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00", absl::FormatCivilTime(hh));
37*9356374aSAndroid Build Coastguard Worker 
38*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d;
39*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01", absl::FormatCivilTime(d));
40*9356374aSAndroid Build Coastguard Worker 
41*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth m;
42*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01", absl::FormatCivilTime(m));
43*9356374aSAndroid Build Coastguard Worker 
44*9356374aSAndroid Build Coastguard Worker   absl::CivilYear y;
45*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970", absl::FormatCivilTime(y));
46*9356374aSAndroid Build Coastguard Worker }
47*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,StructMember)48*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, StructMember) {
49*9356374aSAndroid Build Coastguard Worker   struct S {
50*9356374aSAndroid Build Coastguard Worker     absl::CivilDay day;
51*9356374aSAndroid Build Coastguard Worker   };
52*9356374aSAndroid Build Coastguard Worker   S s = {};
53*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilDay{}, s.day);
54*9356374aSAndroid Build Coastguard Worker }
55*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,FieldsConstruction)56*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, FieldsConstruction) {
57*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05",
58*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(2015, 1, 2, 3, 4, 5)));
59*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:00",
60*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(2015, 1, 2, 3, 4)));
61*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:00:00",
62*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(2015, 1, 2, 3)));
63*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T00:00:00",
64*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(2015, 1, 2)));
65*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00:00:00",
66*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(2015, 1)));
67*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00:00:00",
68*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(2015)));
69*9356374aSAndroid Build Coastguard Worker 
70*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04",
71*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMinute(2015, 1, 2, 3, 4, 5)));
72*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04",
73*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMinute(2015, 1, 2, 3, 4)));
74*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:00",
75*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMinute(2015, 1, 2, 3)));
76*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T00:00",
77*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMinute(2015, 1, 2)));
78*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00:00",
79*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMinute(2015, 1)));
80*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00:00",
81*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMinute(2015)));
82*9356374aSAndroid Build Coastguard Worker 
83*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03",
84*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilHour(2015, 1, 2, 3, 4, 5)));
85*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03",
86*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilHour(2015, 1, 2, 3, 4)));
87*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03",
88*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilHour(2015, 1, 2, 3)));
89*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T00",
90*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilHour(2015, 1, 2)));
91*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00",
92*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilHour(2015, 1)));
93*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00",
94*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilHour(2015)));
95*9356374aSAndroid Build Coastguard Worker 
96*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02",
97*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilDay(2015, 1, 2, 3, 4, 5)));
98*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02",
99*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilDay(2015, 1, 2, 3, 4)));
100*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02",
101*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilDay(2015, 1, 2, 3)));
102*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02",
103*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilDay(2015, 1, 2)));
104*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01",
105*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilDay(2015, 1)));
106*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01",
107*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilDay(2015)));
108*9356374aSAndroid Build Coastguard Worker 
109*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01",
110*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMonth(2015, 1, 2, 3, 4, 5)));
111*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01",
112*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMonth(2015, 1, 2, 3, 4)));
113*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01",
114*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMonth(2015, 1, 2, 3)));
115*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01",
116*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMonth(2015, 1, 2)));
117*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01",
118*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMonth(2015, 1)));
119*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01",
120*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilMonth(2015)));
121*9356374aSAndroid Build Coastguard Worker 
122*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015",
123*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilYear(2015, 1, 2, 3, 4, 5)));
124*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015",
125*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilYear(2015, 1, 2, 3, 4)));
126*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015",
127*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilYear(2015, 1, 2, 3)));
128*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015",
129*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilYear(2015, 1, 2)));
130*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015",
131*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilYear(2015, 1)));
132*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015",
133*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilYear(2015)));
134*9356374aSAndroid Build Coastguard Worker }
135*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,FieldsConstructionLimits)136*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, FieldsConstructionLimits) {
137*9356374aSAndroid Build Coastguard Worker   const int kIntMax = std::numeric_limits<int>::max();
138*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2038-01-19T03:14:07",
139*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
140*9356374aSAndroid Build Coastguard Worker                 1970, 1, 1, 0, 0, kIntMax)));
141*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("6121-02-11T05:21:07",
142*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
143*9356374aSAndroid Build Coastguard Worker                 1970, 1, 1, 0, kIntMax, kIntMax)));
144*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("251104-11-20T12:21:07",
145*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
146*9356374aSAndroid Build Coastguard Worker                 1970, 1, 1, kIntMax, kIntMax, kIntMax)));
147*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("6130715-05-30T12:21:07",
148*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
149*9356374aSAndroid Build Coastguard Worker                 1970, 1, kIntMax, kIntMax, kIntMax, kIntMax)));
150*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("185087685-11-26T12:21:07",
151*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
152*9356374aSAndroid Build Coastguard Worker                 1970, kIntMax, kIntMax, kIntMax, kIntMax, kIntMax)));
153*9356374aSAndroid Build Coastguard Worker 
154*9356374aSAndroid Build Coastguard Worker   const int kIntMin = std::numeric_limits<int>::min();
155*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1901-12-13T20:45:52",
156*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
157*9356374aSAndroid Build Coastguard Worker                 1970, 1, 1, 0, 0, kIntMin)));
158*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-2182-11-20T18:37:52",
159*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
160*9356374aSAndroid Build Coastguard Worker                 1970, 1, 1, 0, kIntMin, kIntMin)));
161*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-247165-02-11T10:37:52",
162*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
163*9356374aSAndroid Build Coastguard Worker                 1970, 1, 1, kIntMin, kIntMin, kIntMin)));
164*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-6126776-08-01T10:37:52",
165*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
166*9356374aSAndroid Build Coastguard Worker                 1970, 1, kIntMin, kIntMin, kIntMin, kIntMin)));
167*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-185083747-10-31T10:37:52",
168*9356374aSAndroid Build Coastguard Worker             absl::FormatCivilTime(absl::CivilSecond(
169*9356374aSAndroid Build Coastguard Worker                 1970, kIntMin, kIntMin, kIntMin, kIntMin, kIntMin)));
170*9356374aSAndroid Build Coastguard Worker }
171*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,RangeLimits)172*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, RangeLimits) {
173*9356374aSAndroid Build Coastguard Worker   const absl::civil_year_t kYearMax =
174*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::civil_year_t>::max();
175*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilYear(kYearMax),
176*9356374aSAndroid Build Coastguard Worker             absl::CivilYear::max());
177*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilMonth(kYearMax, 12),
178*9356374aSAndroid Build Coastguard Worker             absl::CivilMonth::max());
179*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilDay(kYearMax, 12, 31),
180*9356374aSAndroid Build Coastguard Worker             absl::CivilDay::max());
181*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilHour(kYearMax, 12, 31, 23),
182*9356374aSAndroid Build Coastguard Worker             absl::CivilHour::max());
183*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilMinute(kYearMax, 12, 31, 23, 59),
184*9356374aSAndroid Build Coastguard Worker             absl::CivilMinute::max());
185*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilSecond(kYearMax, 12, 31, 23, 59, 59),
186*9356374aSAndroid Build Coastguard Worker             absl::CivilSecond::max());
187*9356374aSAndroid Build Coastguard Worker 
188*9356374aSAndroid Build Coastguard Worker   const absl::civil_year_t kYearMin =
189*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::civil_year_t>::min();
190*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilYear(kYearMin),
191*9356374aSAndroid Build Coastguard Worker             absl::CivilYear::min());
192*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilMonth(kYearMin, 1),
193*9356374aSAndroid Build Coastguard Worker             absl::CivilMonth::min());
194*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilDay(kYearMin, 1, 1),
195*9356374aSAndroid Build Coastguard Worker             absl::CivilDay::min());
196*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilHour(kYearMin, 1, 1, 0),
197*9356374aSAndroid Build Coastguard Worker             absl::CivilHour::min());
198*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilMinute(kYearMin, 1, 1, 0, 0),
199*9356374aSAndroid Build Coastguard Worker             absl::CivilMinute::min());
200*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilSecond(kYearMin, 1, 1, 0, 0, 0),
201*9356374aSAndroid Build Coastguard Worker             absl::CivilSecond::min());
202*9356374aSAndroid Build Coastguard Worker }
203*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,ImplicitCrossAlignment)204*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, ImplicitCrossAlignment) {
205*9356374aSAndroid Build Coastguard Worker   absl::CivilYear year(2015);
206*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth month = year;
207*9356374aSAndroid Build Coastguard Worker   absl::CivilDay day = month;
208*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hour = day;
209*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute minute = hour;
210*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond second = minute;
211*9356374aSAndroid Build Coastguard Worker 
212*9356374aSAndroid Build Coastguard Worker   second = year;
213*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(second, year);
214*9356374aSAndroid Build Coastguard Worker   second = month;
215*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(second, month);
216*9356374aSAndroid Build Coastguard Worker   second = day;
217*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(second, day);
218*9356374aSAndroid Build Coastguard Worker   second = hour;
219*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(second, hour);
220*9356374aSAndroid Build Coastguard Worker   second = minute;
221*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(second, minute);
222*9356374aSAndroid Build Coastguard Worker 
223*9356374aSAndroid Build Coastguard Worker   minute = year;
224*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minute, year);
225*9356374aSAndroid Build Coastguard Worker   minute = month;
226*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minute, month);
227*9356374aSAndroid Build Coastguard Worker   minute = day;
228*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minute, day);
229*9356374aSAndroid Build Coastguard Worker   minute = hour;
230*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minute, hour);
231*9356374aSAndroid Build Coastguard Worker 
232*9356374aSAndroid Build Coastguard Worker   hour = year;
233*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(hour, year);
234*9356374aSAndroid Build Coastguard Worker   hour = month;
235*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(hour, month);
236*9356374aSAndroid Build Coastguard Worker   hour = day;
237*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(hour, day);
238*9356374aSAndroid Build Coastguard Worker 
239*9356374aSAndroid Build Coastguard Worker   day = year;
240*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(day, year);
241*9356374aSAndroid Build Coastguard Worker   day = month;
242*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(day, month);
243*9356374aSAndroid Build Coastguard Worker 
244*9356374aSAndroid Build Coastguard Worker   month = year;
245*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(month, year);
246*9356374aSAndroid Build Coastguard Worker 
247*9356374aSAndroid Build Coastguard Worker   // Ensures unsafe conversions are not allowed.
248*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
249*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilSecond, absl::CivilMinute>::value));
250*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
251*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilSecond, absl::CivilHour>::value));
252*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
253*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilSecond, absl::CivilDay>::value));
254*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
255*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilSecond, absl::CivilMonth>::value));
256*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
257*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilSecond, absl::CivilYear>::value));
258*9356374aSAndroid Build Coastguard Worker 
259*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
260*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilMinute, absl::CivilHour>::value));
261*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
262*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilMinute, absl::CivilDay>::value));
263*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
264*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilMinute, absl::CivilMonth>::value));
265*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
266*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilMinute, absl::CivilYear>::value));
267*9356374aSAndroid Build Coastguard Worker 
268*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
269*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilHour, absl::CivilDay>::value));
270*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
271*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilHour, absl::CivilMonth>::value));
272*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
273*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilHour, absl::CivilYear>::value));
274*9356374aSAndroid Build Coastguard Worker 
275*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
276*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilDay, absl::CivilMonth>::value));
277*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
278*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilDay, absl::CivilYear>::value));
279*9356374aSAndroid Build Coastguard Worker 
280*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
281*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::CivilMonth, absl::CivilYear>::value));
282*9356374aSAndroid Build Coastguard Worker }
283*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,ExplicitCrossAlignment)284*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, ExplicitCrossAlignment) {
285*9356374aSAndroid Build Coastguard Worker   //
286*9356374aSAndroid Build Coastguard Worker   // Assign from smaller units -> larger units
287*9356374aSAndroid Build Coastguard Worker   //
288*9356374aSAndroid Build Coastguard Worker 
289*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond second(2015, 1, 2, 3, 4, 5);
290*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05", absl::FormatCivilTime(second));
291*9356374aSAndroid Build Coastguard Worker 
292*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute minute(second);
293*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04", absl::FormatCivilTime(minute));
294*9356374aSAndroid Build Coastguard Worker 
295*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hour(minute);
296*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03", absl::FormatCivilTime(hour));
297*9356374aSAndroid Build Coastguard Worker 
298*9356374aSAndroid Build Coastguard Worker   absl::CivilDay day(hour);
299*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02", absl::FormatCivilTime(day));
300*9356374aSAndroid Build Coastguard Worker 
301*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth month(day);
302*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::FormatCivilTime(month));
303*9356374aSAndroid Build Coastguard Worker 
304*9356374aSAndroid Build Coastguard Worker   absl::CivilYear year(month);
305*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015", absl::FormatCivilTime(year));
306*9356374aSAndroid Build Coastguard Worker 
307*9356374aSAndroid Build Coastguard Worker   //
308*9356374aSAndroid Build Coastguard Worker   // Now assign from larger units -> smaller units
309*9356374aSAndroid Build Coastguard Worker   //
310*9356374aSAndroid Build Coastguard Worker 
311*9356374aSAndroid Build Coastguard Worker   month = absl::CivilMonth(year);
312*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::FormatCivilTime(month));
313*9356374aSAndroid Build Coastguard Worker 
314*9356374aSAndroid Build Coastguard Worker   day = absl::CivilDay(month);
315*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01", absl::FormatCivilTime(day));
316*9356374aSAndroid Build Coastguard Worker 
317*9356374aSAndroid Build Coastguard Worker   hour = absl::CivilHour(day);
318*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00", absl::FormatCivilTime(hour));
319*9356374aSAndroid Build Coastguard Worker 
320*9356374aSAndroid Build Coastguard Worker   minute = absl::CivilMinute(hour);
321*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00:00", absl::FormatCivilTime(minute));
322*9356374aSAndroid Build Coastguard Worker 
323*9356374aSAndroid Build Coastguard Worker   second = absl::CivilSecond(minute);
324*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-01T00:00:00", absl::FormatCivilTime(second));
325*9356374aSAndroid Build Coastguard Worker }
326*9356374aSAndroid Build Coastguard Worker 
327*9356374aSAndroid Build Coastguard Worker // Metafunction to test whether difference is allowed between two types.
328*9356374aSAndroid Build Coastguard Worker template <typename T1, typename T2>
329*9356374aSAndroid Build Coastguard Worker struct HasDiff {
330*9356374aSAndroid Build Coastguard Worker   template <typename U1, typename U2>
331*9356374aSAndroid Build Coastguard Worker   static std::false_type test(...);
332*9356374aSAndroid Build Coastguard Worker   template <typename U1, typename U2>
333*9356374aSAndroid Build Coastguard Worker   static std::true_type test(decltype(std::declval<U1>() - std::declval<U2>()));
334*9356374aSAndroid Build Coastguard Worker   static constexpr bool value = decltype(test<T1, T2>(0))::value;
335*9356374aSAndroid Build Coastguard Worker };
336*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,DisallowCrossAlignedDifference)337*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, DisallowCrossAlignedDifference) {
338*9356374aSAndroid Build Coastguard Worker   // Difference is allowed between types with the same alignment.
339*9356374aSAndroid Build Coastguard Worker   static_assert(HasDiff<absl::CivilSecond, absl::CivilSecond>::value, "");
340*9356374aSAndroid Build Coastguard Worker   static_assert(HasDiff<absl::CivilMinute, absl::CivilMinute>::value, "");
341*9356374aSAndroid Build Coastguard Worker   static_assert(HasDiff<absl::CivilHour, absl::CivilHour>::value, "");
342*9356374aSAndroid Build Coastguard Worker   static_assert(HasDiff<absl::CivilDay, absl::CivilDay>::value, "");
343*9356374aSAndroid Build Coastguard Worker   static_assert(HasDiff<absl::CivilMonth, absl::CivilMonth>::value, "");
344*9356374aSAndroid Build Coastguard Worker   static_assert(HasDiff<absl::CivilYear, absl::CivilYear>::value, "");
345*9356374aSAndroid Build Coastguard Worker 
346*9356374aSAndroid Build Coastguard Worker   // Difference is disallowed between types with different alignments.
347*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilSecond, absl::CivilMinute>::value, "");
348*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilSecond, absl::CivilHour>::value, "");
349*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilSecond, absl::CivilDay>::value, "");
350*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilSecond, absl::CivilMonth>::value, "");
351*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilSecond, absl::CivilYear>::value, "");
352*9356374aSAndroid Build Coastguard Worker 
353*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilMinute, absl::CivilHour>::value, "");
354*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilMinute, absl::CivilDay>::value, "");
355*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilMinute, absl::CivilMonth>::value, "");
356*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilMinute, absl::CivilYear>::value, "");
357*9356374aSAndroid Build Coastguard Worker 
358*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilHour, absl::CivilDay>::value, "");
359*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilHour, absl::CivilMonth>::value, "");
360*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilHour, absl::CivilYear>::value, "");
361*9356374aSAndroid Build Coastguard Worker 
362*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilDay, absl::CivilMonth>::value, "");
363*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilDay, absl::CivilYear>::value, "");
364*9356374aSAndroid Build Coastguard Worker 
365*9356374aSAndroid Build Coastguard Worker   static_assert(!HasDiff<absl::CivilMonth, absl::CivilYear>::value, "");
366*9356374aSAndroid Build Coastguard Worker }
367*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,ValueSemantics)368*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, ValueSemantics) {
369*9356374aSAndroid Build Coastguard Worker   const absl::CivilHour a(2015, 1, 2, 3);
370*9356374aSAndroid Build Coastguard Worker   const absl::CivilHour b = a;
371*9356374aSAndroid Build Coastguard Worker   const absl::CivilHour c(b);
372*9356374aSAndroid Build Coastguard Worker   absl::CivilHour d;
373*9356374aSAndroid Build Coastguard Worker   d = c;
374*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03", absl::FormatCivilTime(d));
375*9356374aSAndroid Build Coastguard Worker }
376*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,Relational)377*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, Relational) {
378*9356374aSAndroid Build Coastguard Worker   // Tests that the alignment unit is ignored in comparison.
379*9356374aSAndroid Build Coastguard Worker   const absl::CivilYear year(2014);
380*9356374aSAndroid Build Coastguard Worker   const absl::CivilMonth month(year);
381*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(year, month);
382*9356374aSAndroid Build Coastguard Worker 
383*9356374aSAndroid Build Coastguard Worker #define TEST_RELATIONAL(OLDER, YOUNGER) \
384*9356374aSAndroid Build Coastguard Worker   do {                                  \
385*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(OLDER < OLDER);        \
386*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(OLDER > OLDER);        \
387*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(OLDER >= OLDER);        \
388*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(OLDER <= OLDER);        \
389*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(YOUNGER < YOUNGER);    \
390*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(YOUNGER > YOUNGER);    \
391*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(YOUNGER >= YOUNGER);    \
392*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(YOUNGER <= YOUNGER);    \
393*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(OLDER, OLDER);            \
394*9356374aSAndroid Build Coastguard Worker     EXPECT_NE(OLDER, YOUNGER);          \
395*9356374aSAndroid Build Coastguard Worker     EXPECT_LT(OLDER, YOUNGER);          \
396*9356374aSAndroid Build Coastguard Worker     EXPECT_LE(OLDER, YOUNGER);          \
397*9356374aSAndroid Build Coastguard Worker     EXPECT_GT(YOUNGER, OLDER);          \
398*9356374aSAndroid Build Coastguard Worker     EXPECT_GE(YOUNGER, OLDER);          \
399*9356374aSAndroid Build Coastguard Worker   } while (0)
400*9356374aSAndroid Build Coastguard Worker 
401*9356374aSAndroid Build Coastguard Worker   // Alignment is ignored in comparison (verified above), so CivilSecond is
402*9356374aSAndroid Build Coastguard Worker   // used to test comparison in all field positions.
403*9356374aSAndroid Build Coastguard Worker   TEST_RELATIONAL(absl::CivilSecond(2014, 1, 1, 0, 0, 0),
404*9356374aSAndroid Build Coastguard Worker                   absl::CivilSecond(2015, 1, 1, 0, 0, 0));
405*9356374aSAndroid Build Coastguard Worker   TEST_RELATIONAL(absl::CivilSecond(2014, 1, 1, 0, 0, 0),
406*9356374aSAndroid Build Coastguard Worker                   absl::CivilSecond(2014, 2, 1, 0, 0, 0));
407*9356374aSAndroid Build Coastguard Worker   TEST_RELATIONAL(absl::CivilSecond(2014, 1, 1, 0, 0, 0),
408*9356374aSAndroid Build Coastguard Worker                   absl::CivilSecond(2014, 1, 2, 0, 0, 0));
409*9356374aSAndroid Build Coastguard Worker   TEST_RELATIONAL(absl::CivilSecond(2014, 1, 1, 0, 0, 0),
410*9356374aSAndroid Build Coastguard Worker                   absl::CivilSecond(2014, 1, 1, 1, 0, 0));
411*9356374aSAndroid Build Coastguard Worker   TEST_RELATIONAL(absl::CivilSecond(2014, 1, 1, 1, 0, 0),
412*9356374aSAndroid Build Coastguard Worker                   absl::CivilSecond(2014, 1, 1, 1, 1, 0));
413*9356374aSAndroid Build Coastguard Worker   TEST_RELATIONAL(absl::CivilSecond(2014, 1, 1, 1, 1, 0),
414*9356374aSAndroid Build Coastguard Worker                   absl::CivilSecond(2014, 1, 1, 1, 1, 1));
415*9356374aSAndroid Build Coastguard Worker 
416*9356374aSAndroid Build Coastguard Worker   // Tests the relational operators of two different civil-time types.
417*9356374aSAndroid Build Coastguard Worker   TEST_RELATIONAL(absl::CivilDay(2014, 1, 1),
418*9356374aSAndroid Build Coastguard Worker                   absl::CivilMinute(2014, 1, 1, 1, 1));
419*9356374aSAndroid Build Coastguard Worker   TEST_RELATIONAL(absl::CivilDay(2014, 1, 1),
420*9356374aSAndroid Build Coastguard Worker                   absl::CivilMonth(2014, 2));
421*9356374aSAndroid Build Coastguard Worker 
422*9356374aSAndroid Build Coastguard Worker #undef TEST_RELATIONAL
423*9356374aSAndroid Build Coastguard Worker }
424*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,Arithmetic)425*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, Arithmetic) {
426*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond second(2015, 1, 2, 3, 4, 5);
427*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:06", absl::FormatCivilTime(second += 1));
428*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:07", absl::FormatCivilTime(second + 1));
429*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:08", absl::FormatCivilTime(2 + second));
430*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05", absl::FormatCivilTime(second - 1));
431*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05", absl::FormatCivilTime(second -= 1));
432*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05", absl::FormatCivilTime(second++));
433*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:07", absl::FormatCivilTime(++second));
434*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:07", absl::FormatCivilTime(second--));
435*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05", absl::FormatCivilTime(--second));
436*9356374aSAndroid Build Coastguard Worker 
437*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute minute(2015, 1, 2, 3, 4);
438*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:05", absl::FormatCivilTime(minute += 1));
439*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:06", absl::FormatCivilTime(minute + 1));
440*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:07", absl::FormatCivilTime(2 + minute));
441*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04", absl::FormatCivilTime(minute - 1));
442*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04", absl::FormatCivilTime(minute -= 1));
443*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04", absl::FormatCivilTime(minute++));
444*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:06", absl::FormatCivilTime(++minute));
445*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:06", absl::FormatCivilTime(minute--));
446*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04", absl::FormatCivilTime(--minute));
447*9356374aSAndroid Build Coastguard Worker 
448*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hour(2015, 1, 2, 3);
449*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T04", absl::FormatCivilTime(hour += 1));
450*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T05", absl::FormatCivilTime(hour + 1));
451*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T06", absl::FormatCivilTime(2 + hour));
452*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03", absl::FormatCivilTime(hour - 1));
453*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03", absl::FormatCivilTime(hour -= 1));
454*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03", absl::FormatCivilTime(hour++));
455*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T05", absl::FormatCivilTime(++hour));
456*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T05", absl::FormatCivilTime(hour--));
457*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03", absl::FormatCivilTime(--hour));
458*9356374aSAndroid Build Coastguard Worker 
459*9356374aSAndroid Build Coastguard Worker   absl::CivilDay day(2015, 1, 2);
460*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-03", absl::FormatCivilTime(day += 1));
461*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-04", absl::FormatCivilTime(day + 1));
462*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-05", absl::FormatCivilTime(2 + day));
463*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02", absl::FormatCivilTime(day - 1));
464*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02", absl::FormatCivilTime(day -= 1));
465*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02", absl::FormatCivilTime(day++));
466*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-04", absl::FormatCivilTime(++day));
467*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-04", absl::FormatCivilTime(day--));
468*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02", absl::FormatCivilTime(--day));
469*9356374aSAndroid Build Coastguard Worker 
470*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth month(2015, 1);
471*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-02", absl::FormatCivilTime(month += 1));
472*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-03", absl::FormatCivilTime(month + 1));
473*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-04", absl::FormatCivilTime(2 + month));
474*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::FormatCivilTime(month - 1));
475*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::FormatCivilTime(month -= 1));
476*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::FormatCivilTime(month++));
477*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-03", absl::FormatCivilTime(++month));
478*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-03", absl::FormatCivilTime(month--));
479*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::FormatCivilTime(--month));
480*9356374aSAndroid Build Coastguard Worker 
481*9356374aSAndroid Build Coastguard Worker   absl::CivilYear year(2015);
482*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2016", absl::FormatCivilTime(year += 1));
483*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2017", absl::FormatCivilTime(year + 1));
484*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2018", absl::FormatCivilTime(2 + year));
485*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015", absl::FormatCivilTime(year - 1));
486*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015", absl::FormatCivilTime(year -= 1));
487*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015", absl::FormatCivilTime(year++));
488*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2017", absl::FormatCivilTime(++year));
489*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2017", absl::FormatCivilTime(year--));
490*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015", absl::FormatCivilTime(--year));
491*9356374aSAndroid Build Coastguard Worker }
492*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,ArithmeticLimits)493*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, ArithmeticLimits) {
494*9356374aSAndroid Build Coastguard Worker   const int kIntMax = std::numeric_limits<int>::max();
495*9356374aSAndroid Build Coastguard Worker   const int kIntMin = std::numeric_limits<int>::min();
496*9356374aSAndroid Build Coastguard Worker 
497*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond second(1970, 1, 1, 0, 0, 0);
498*9356374aSAndroid Build Coastguard Worker   second += kIntMax;
499*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2038-01-19T03:14:07", absl::FormatCivilTime(second));
500*9356374aSAndroid Build Coastguard Worker   second -= kIntMax;
501*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00:00", absl::FormatCivilTime(second));
502*9356374aSAndroid Build Coastguard Worker   second += kIntMin;
503*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1901-12-13T20:45:52", absl::FormatCivilTime(second));
504*9356374aSAndroid Build Coastguard Worker   second -= kIntMin;
505*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00:00", absl::FormatCivilTime(second));
506*9356374aSAndroid Build Coastguard Worker 
507*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute minute(1970, 1, 1, 0, 0);
508*9356374aSAndroid Build Coastguard Worker   minute += kIntMax;
509*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("6053-01-23T02:07", absl::FormatCivilTime(minute));
510*9356374aSAndroid Build Coastguard Worker   minute -= kIntMax;
511*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00", absl::FormatCivilTime(minute));
512*9356374aSAndroid Build Coastguard Worker   minute += kIntMin;
513*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-2114-12-08T21:52", absl::FormatCivilTime(minute));
514*9356374aSAndroid Build Coastguard Worker   minute -= kIntMin;
515*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00", absl::FormatCivilTime(minute));
516*9356374aSAndroid Build Coastguard Worker 
517*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hour(1970, 1, 1, 0);
518*9356374aSAndroid Build Coastguard Worker   hour += kIntMax;
519*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("246953-10-09T07", absl::FormatCivilTime(hour));
520*9356374aSAndroid Build Coastguard Worker   hour -= kIntMax;
521*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00", absl::FormatCivilTime(hour));
522*9356374aSAndroid Build Coastguard Worker   hour += kIntMin;
523*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-243014-03-24T16", absl::FormatCivilTime(hour));
524*9356374aSAndroid Build Coastguard Worker   hour -= kIntMin;
525*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00", absl::FormatCivilTime(hour));
526*9356374aSAndroid Build Coastguard Worker 
527*9356374aSAndroid Build Coastguard Worker   absl::CivilDay day(1970, 1, 1);
528*9356374aSAndroid Build Coastguard Worker   day += kIntMax;
529*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("5881580-07-11", absl::FormatCivilTime(day));
530*9356374aSAndroid Build Coastguard Worker   day -= kIntMax;
531*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01", absl::FormatCivilTime(day));
532*9356374aSAndroid Build Coastguard Worker   day += kIntMin;
533*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-5877641-06-23", absl::FormatCivilTime(day));
534*9356374aSAndroid Build Coastguard Worker   day -= kIntMin;
535*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01", absl::FormatCivilTime(day));
536*9356374aSAndroid Build Coastguard Worker 
537*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth month(1970, 1);
538*9356374aSAndroid Build Coastguard Worker   month += kIntMax;
539*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("178958940-08", absl::FormatCivilTime(month));
540*9356374aSAndroid Build Coastguard Worker   month -= kIntMax;
541*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01", absl::FormatCivilTime(month));
542*9356374aSAndroid Build Coastguard Worker   month += kIntMin;
543*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-178955001-05", absl::FormatCivilTime(month));
544*9356374aSAndroid Build Coastguard Worker   month -= kIntMin;
545*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01", absl::FormatCivilTime(month));
546*9356374aSAndroid Build Coastguard Worker 
547*9356374aSAndroid Build Coastguard Worker   absl::CivilYear year(0);
548*9356374aSAndroid Build Coastguard Worker   year += kIntMax;
549*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2147483647", absl::FormatCivilTime(year));
550*9356374aSAndroid Build Coastguard Worker   year -= kIntMax;
551*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("0", absl::FormatCivilTime(year));
552*9356374aSAndroid Build Coastguard Worker   year += kIntMin;
553*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-2147483648", absl::FormatCivilTime(year));
554*9356374aSAndroid Build Coastguard Worker   year -= kIntMin;
555*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("0", absl::FormatCivilTime(year));
556*9356374aSAndroid Build Coastguard Worker }
557*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,Difference)558*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, Difference) {
559*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond second(2015, 1, 2, 3, 4, 5);
560*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, second - second);
561*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(10, (second + 10) - second);
562*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-10, (second - 10) - second);
563*9356374aSAndroid Build Coastguard Worker 
564*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute minute(2015, 1, 2, 3, 4);
565*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, minute - minute);
566*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(10, (minute + 10) - minute);
567*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-10, (minute - 10) - minute);
568*9356374aSAndroid Build Coastguard Worker 
569*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hour(2015, 1, 2, 3);
570*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, hour - hour);
571*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(10, (hour + 10) - hour);
572*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-10, (hour - 10) - hour);
573*9356374aSAndroid Build Coastguard Worker 
574*9356374aSAndroid Build Coastguard Worker   absl::CivilDay day(2015, 1, 2);
575*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, day - day);
576*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(10, (day + 10) - day);
577*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-10, (day - 10) - day);
578*9356374aSAndroid Build Coastguard Worker 
579*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth month(2015, 1);
580*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, month - month);
581*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(10, (month + 10) - month);
582*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-10, (month - 10) - month);
583*9356374aSAndroid Build Coastguard Worker 
584*9356374aSAndroid Build Coastguard Worker   absl::CivilYear year(2015);
585*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, year - year);
586*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(10, (year + 10) - year);
587*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-10, (year - 10) - year);
588*9356374aSAndroid Build Coastguard Worker }
589*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,DifferenceLimits)590*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, DifferenceLimits) {
591*9356374aSAndroid Build Coastguard Worker   const absl::civil_diff_t kDiffMax =
592*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::civil_diff_t>::max();
593*9356374aSAndroid Build Coastguard Worker   const absl::civil_diff_t kDiffMin =
594*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::civil_diff_t>::min();
595*9356374aSAndroid Build Coastguard Worker 
596*9356374aSAndroid Build Coastguard Worker   // Check day arithmetic at the end of the year range.
597*9356374aSAndroid Build Coastguard Worker   const absl::CivilDay max_day(kDiffMax, 12, 31);
598*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, max_day - (max_day - 1));
599*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-1, (max_day - 1) - max_day);
600*9356374aSAndroid Build Coastguard Worker 
601*9356374aSAndroid Build Coastguard Worker   // Check day arithmetic at the start of the year range.
602*9356374aSAndroid Build Coastguard Worker   const absl::CivilDay min_day(kDiffMin, 1, 1);
603*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, (min_day + 1) - min_day);
604*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-1, min_day - (min_day + 1));
605*9356374aSAndroid Build Coastguard Worker 
606*9356374aSAndroid Build Coastguard Worker   // Check the limits of the return value.
607*9356374aSAndroid Build Coastguard Worker   const absl::CivilDay d1(1970, 1, 1);
608*9356374aSAndroid Build Coastguard Worker   const absl::CivilDay d2(25252734927768524, 7, 27);
609*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kDiffMax, d2 - d1);
610*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kDiffMin, d1 - (d2 + 1));
611*9356374aSAndroid Build Coastguard Worker }
612*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,Properties)613*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, Properties) {
614*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond ss(2015, 2, 3, 4, 5, 6);
615*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2015, ss.year());
616*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2, ss.month());
617*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, ss.day());
618*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, ss.hour());
619*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, ss.minute());
620*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(6, ss.second());
621*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(ss));
622*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(34, absl::GetYearDay(ss));
623*9356374aSAndroid Build Coastguard Worker 
624*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute mm(2015, 2, 3, 4, 5, 6);
625*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2015, mm.year());
626*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2, mm.month());
627*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, mm.day());
628*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, mm.hour());
629*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, mm.minute());
630*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, mm.second());
631*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(mm));
632*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(34, absl::GetYearDay(mm));
633*9356374aSAndroid Build Coastguard Worker 
634*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hh(2015, 2, 3, 4, 5, 6);
635*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2015, hh.year());
636*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2, hh.month());
637*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, hh.day());
638*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, hh.hour());
639*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, hh.minute());
640*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, hh.second());
641*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(hh));
642*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(34, absl::GetYearDay(hh));
643*9356374aSAndroid Build Coastguard Worker 
644*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d(2015, 2, 3, 4, 5, 6);
645*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2015, d.year());
646*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2, d.month());
647*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, d.day());
648*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, d.hour());
649*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, d.minute());
650*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, d.second());
651*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(d));
652*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(34, absl::GetYearDay(d));
653*9356374aSAndroid Build Coastguard Worker 
654*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth m(2015, 2, 3, 4, 5, 6);
655*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2015, m.year());
656*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2, m.month());
657*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, m.day());
658*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, m.hour());
659*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, m.minute());
660*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, m.second());
661*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Weekday::sunday, absl::GetWeekday(m));
662*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(32, absl::GetYearDay(m));
663*9356374aSAndroid Build Coastguard Worker 
664*9356374aSAndroid Build Coastguard Worker   absl::CivilYear y(2015, 2, 3, 4, 5, 6);
665*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2015, y.year());
666*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, y.month());
667*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, y.day());
668*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, y.hour());
669*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, y.minute());
670*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, y.second());
671*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(y));
672*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, absl::GetYearDay(y));
673*9356374aSAndroid Build Coastguard Worker }
674*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,Format)675*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, Format) {
676*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond ss;
677*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00:00", absl::FormatCivilTime(ss));
678*9356374aSAndroid Build Coastguard Worker 
679*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute mm;
680*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00", absl::FormatCivilTime(mm));
681*9356374aSAndroid Build Coastguard Worker 
682*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hh;
683*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00", absl::FormatCivilTime(hh));
684*9356374aSAndroid Build Coastguard Worker 
685*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d;
686*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01", absl::FormatCivilTime(d));
687*9356374aSAndroid Build Coastguard Worker 
688*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth m;
689*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01", absl::FormatCivilTime(m));
690*9356374aSAndroid Build Coastguard Worker 
691*9356374aSAndroid Build Coastguard Worker   absl::CivilYear y;
692*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970", absl::FormatCivilTime(y));
693*9356374aSAndroid Build Coastguard Worker }
694*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,Parse)695*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, Parse) {
696*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond ss;
697*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute mm;
698*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hh;
699*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d;
700*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth m;
701*9356374aSAndroid Build Coastguard Worker   absl::CivilYear y;
702*9356374aSAndroid Build Coastguard Worker 
703*9356374aSAndroid Build Coastguard Worker   // CivilSecond OK; others fail
704*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseCivilTime("2015-01-02T03:04:05", &ss));
705*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05", absl::FormatCivilTime(ss));
706*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04:05", &mm));
707*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04:05", &hh));
708*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04:05", &d));
709*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04:05", &m));
710*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04:05", &y));
711*9356374aSAndroid Build Coastguard Worker 
712*9356374aSAndroid Build Coastguard Worker   // CivilMinute OK; others fail
713*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04", &ss));
714*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseCivilTime("2015-01-02T03:04", &mm));
715*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04", absl::FormatCivilTime(mm));
716*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04", &hh));
717*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04", &d));
718*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04", &m));
719*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03:04", &y));
720*9356374aSAndroid Build Coastguard Worker 
721*9356374aSAndroid Build Coastguard Worker   // CivilHour OK; others fail
722*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03", &ss));
723*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03", &mm));
724*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseCivilTime("2015-01-02T03", &hh));
725*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03", absl::FormatCivilTime(hh));
726*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03", &d));
727*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03", &m));
728*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02T03", &y));
729*9356374aSAndroid Build Coastguard Worker 
730*9356374aSAndroid Build Coastguard Worker   // CivilDay OK; others fail
731*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02", &ss));
732*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02", &mm));
733*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02", &hh));
734*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseCivilTime("2015-01-02", &d));
735*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02", absl::FormatCivilTime(d));
736*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02", &m));
737*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01-02", &y));
738*9356374aSAndroid Build Coastguard Worker 
739*9356374aSAndroid Build Coastguard Worker   // CivilMonth OK; others fail
740*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01", &ss));
741*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01", &mm));
742*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01", &hh));
743*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01", &d));
744*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseCivilTime("2015-01", &m));
745*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::FormatCivilTime(m));
746*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015-01", &y));
747*9356374aSAndroid Build Coastguard Worker 
748*9356374aSAndroid Build Coastguard Worker   // CivilYear OK; others fail
749*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015", &ss));
750*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015", &mm));
751*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015", &hh));
752*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015", &d));
753*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseCivilTime("2015", &m));
754*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseCivilTime("2015", &y));
755*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015", absl::FormatCivilTime(y));
756*9356374aSAndroid Build Coastguard Worker }
757*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,FormatAndParseLenient)758*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, FormatAndParseLenient) {
759*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond ss;
760*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00:00", absl::FormatCivilTime(ss));
761*9356374aSAndroid Build Coastguard Worker 
762*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute mm;
763*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00:00", absl::FormatCivilTime(mm));
764*9356374aSAndroid Build Coastguard Worker 
765*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hh;
766*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01T00", absl::FormatCivilTime(hh));
767*9356374aSAndroid Build Coastguard Worker 
768*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d;
769*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01-01", absl::FormatCivilTime(d));
770*9356374aSAndroid Build Coastguard Worker 
771*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth m;
772*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970-01", absl::FormatCivilTime(m));
773*9356374aSAndroid Build Coastguard Worker 
774*9356374aSAndroid Build Coastguard Worker   absl::CivilYear y;
775*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1970", absl::FormatCivilTime(y));
776*9356374aSAndroid Build Coastguard Worker 
777*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("2015-01-02T03:04:05", &ss));
778*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05", absl::FormatCivilTime(ss));
779*9356374aSAndroid Build Coastguard Worker 
780*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("2015-01-02T03:04:05", &mm));
781*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04", absl::FormatCivilTime(mm));
782*9356374aSAndroid Build Coastguard Worker 
783*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("2015-01-02T03:04:05", &hh));
784*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03", absl::FormatCivilTime(hh));
785*9356374aSAndroid Build Coastguard Worker 
786*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("2015-01-02T03:04:05", &d));
787*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02", absl::FormatCivilTime(d));
788*9356374aSAndroid Build Coastguard Worker 
789*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("2015-01-02T03:04:05", &m));
790*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::FormatCivilTime(m));
791*9356374aSAndroid Build Coastguard Worker 
792*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("2015-01-02T03:04:05", &y));
793*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015", absl::FormatCivilTime(y));
794*9356374aSAndroid Build Coastguard Worker }
795*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,ParseEdgeCases)796*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, ParseEdgeCases) {
797*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond ss;
798*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
799*9356374aSAndroid Build Coastguard Worker       absl::ParseLenientCivilTime("9223372036854775807-12-31T23:59:59", &ss));
800*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("9223372036854775807-12-31T23:59:59", absl::FormatCivilTime(ss));
801*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
802*9356374aSAndroid Build Coastguard Worker       absl::ParseLenientCivilTime("-9223372036854775808-01-01T00:00:00", &ss));
803*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-9223372036854775808-01-01T00:00:00", absl::FormatCivilTime(ss));
804*9356374aSAndroid Build Coastguard Worker 
805*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute mm;
806*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
807*9356374aSAndroid Build Coastguard Worker       absl::ParseLenientCivilTime("9223372036854775807-12-31T23:59", &mm));
808*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("9223372036854775807-12-31T23:59", absl::FormatCivilTime(mm));
809*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
810*9356374aSAndroid Build Coastguard Worker       absl::ParseLenientCivilTime("-9223372036854775808-01-01T00:00", &mm));
811*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-9223372036854775808-01-01T00:00", absl::FormatCivilTime(mm));
812*9356374aSAndroid Build Coastguard Worker 
813*9356374aSAndroid Build Coastguard Worker   absl::CivilHour hh;
814*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
815*9356374aSAndroid Build Coastguard Worker       absl::ParseLenientCivilTime("9223372036854775807-12-31T23", &hh));
816*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("9223372036854775807-12-31T23", absl::FormatCivilTime(hh));
817*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
818*9356374aSAndroid Build Coastguard Worker       absl::ParseLenientCivilTime("-9223372036854775808-01-01T00", &hh));
819*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-9223372036854775808-01-01T00", absl::FormatCivilTime(hh));
820*9356374aSAndroid Build Coastguard Worker 
821*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d;
822*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("9223372036854775807-12-31", &d));
823*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("9223372036854775807-12-31", absl::FormatCivilTime(d));
824*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("-9223372036854775808-01-01", &d));
825*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-9223372036854775808-01-01", absl::FormatCivilTime(d));
826*9356374aSAndroid Build Coastguard Worker 
827*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth m;
828*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("9223372036854775807-12", &m));
829*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("9223372036854775807-12", absl::FormatCivilTime(m));
830*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("-9223372036854775808-01", &m));
831*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-9223372036854775808-01", absl::FormatCivilTime(m));
832*9356374aSAndroid Build Coastguard Worker 
833*9356374aSAndroid Build Coastguard Worker   absl::CivilYear y;
834*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("9223372036854775807", &y));
835*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("9223372036854775807", absl::FormatCivilTime(y));
836*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("-9223372036854775808", &y));
837*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-9223372036854775808", absl::FormatCivilTime(y));
838*9356374aSAndroid Build Coastguard Worker 
839*9356374aSAndroid Build Coastguard Worker   // Tests some valid, but interesting, cases
840*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("0", &ss)) << ss;
841*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilYear(0), ss);
842*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("0-1", &ss)) << ss;
843*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilMonth(0, 1), ss);
844*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime(" 2015 ", &ss)) << ss;
845*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilYear(2015), ss);
846*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime(" 2015-6 ", &ss)) << ss;
847*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilMonth(2015, 6), ss);
848*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("2015-6-7", &ss)) << ss;
849*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilDay(2015, 6, 7), ss);
850*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime(" 2015-6-7 ", &ss)) << ss;
851*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilDay(2015, 6, 7), ss);
852*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("2015-06-07T10:11:12 ", &ss)) << ss;
853*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilSecond(2015, 6, 7, 10, 11, 12), ss);
854*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime(" 2015-06-07T10:11:12 ", &ss)) << ss;
855*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilSecond(2015, 6, 7, 10, 11, 12), ss);
856*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseLenientCivilTime("-01-01", &ss)) << ss;
857*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilMonth(-1, 1), ss);
858*9356374aSAndroid Build Coastguard Worker 
859*9356374aSAndroid Build Coastguard Worker   // Tests some invalid cases
860*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("01-01-2015", &ss)) << ss;
861*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("2015-", &ss)) << ss;
862*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("0xff-01", &ss)) << ss;
863*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("2015-02-30T04:05:06", &ss)) << ss;
864*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("2015-02-03T04:05:96", &ss)) << ss;
865*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("X2015-02-03T04:05:06", &ss)) << ss;
866*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("2015-02-03T04:05:003", &ss)) << ss;
867*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("2015 -02-03T04:05:06", &ss)) << ss;
868*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("2015-02-03-04:05:06", &ss)) << ss;
869*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("2015:02:03T04-05-06", &ss)) << ss;
870*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseLenientCivilTime("9223372036854775808", &y)) << y;
871*9356374aSAndroid Build Coastguard Worker }
872*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,AbslStringify)873*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, AbslStringify) {
874*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04:05",
875*9356374aSAndroid Build Coastguard Worker             absl::StrFormat("%v", absl::CivilSecond(2015, 1, 2, 3, 4, 5)));
876*9356374aSAndroid Build Coastguard Worker 
877*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03:04",
878*9356374aSAndroid Build Coastguard Worker             absl::StrFormat("%v", absl::CivilMinute(2015, 1, 2, 3, 4)));
879*9356374aSAndroid Build Coastguard Worker 
880*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02T03",
881*9356374aSAndroid Build Coastguard Worker             absl::StrFormat("%v", absl::CivilHour(2015, 1, 2, 3)));
882*9356374aSAndroid Build Coastguard Worker 
883*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01-02", absl::StrFormat("%v", absl::CivilDay(2015, 1, 2)));
884*9356374aSAndroid Build Coastguard Worker 
885*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015-01", absl::StrFormat("%v", absl::CivilMonth(2015, 1)));
886*9356374aSAndroid Build Coastguard Worker 
887*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2015", absl::StrFormat("%v", absl::CivilYear(2015)));
888*9356374aSAndroid Build Coastguard Worker }
889*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,OutputStream)890*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, OutputStream) {
891*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs(2016, 2, 3, 4, 5, 6);
892*9356374aSAndroid Build Coastguard Worker   {
893*9356374aSAndroid Build Coastguard Worker     std::stringstream ss;
894*9356374aSAndroid Build Coastguard Worker     ss << std::left << std::setfill('.');
895*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
896*9356374aSAndroid Build Coastguard Worker     ss << std::setw(21) << absl::CivilYear(cs);
897*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
898*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("X..2016.................X..", ss.str());
899*9356374aSAndroid Build Coastguard Worker   }
900*9356374aSAndroid Build Coastguard Worker   {
901*9356374aSAndroid Build Coastguard Worker     std::stringstream ss;
902*9356374aSAndroid Build Coastguard Worker     ss << std::left << std::setfill('.');
903*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
904*9356374aSAndroid Build Coastguard Worker     ss << std::setw(21) << absl::CivilMonth(cs);
905*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
906*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("X..2016-02..............X..", ss.str());
907*9356374aSAndroid Build Coastguard Worker   }
908*9356374aSAndroid Build Coastguard Worker   {
909*9356374aSAndroid Build Coastguard Worker     std::stringstream ss;
910*9356374aSAndroid Build Coastguard Worker     ss << std::left << std::setfill('.');
911*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
912*9356374aSAndroid Build Coastguard Worker     ss << std::setw(21) << absl::CivilDay(cs);
913*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
914*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("X..2016-02-03...........X..", ss.str());
915*9356374aSAndroid Build Coastguard Worker   }
916*9356374aSAndroid Build Coastguard Worker   {
917*9356374aSAndroid Build Coastguard Worker     std::stringstream ss;
918*9356374aSAndroid Build Coastguard Worker     ss << std::left << std::setfill('.');
919*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
920*9356374aSAndroid Build Coastguard Worker     ss << std::setw(21) << absl::CivilHour(cs);
921*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
922*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("X..2016-02-03T04........X..", ss.str());
923*9356374aSAndroid Build Coastguard Worker   }
924*9356374aSAndroid Build Coastguard Worker   {
925*9356374aSAndroid Build Coastguard Worker     std::stringstream ss;
926*9356374aSAndroid Build Coastguard Worker     ss << std::left << std::setfill('.');
927*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
928*9356374aSAndroid Build Coastguard Worker     ss << std::setw(21) << absl::CivilMinute(cs);
929*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
930*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("X..2016-02-03T04:05.....X..", ss.str());
931*9356374aSAndroid Build Coastguard Worker   }
932*9356374aSAndroid Build Coastguard Worker   {
933*9356374aSAndroid Build Coastguard Worker     std::stringstream ss;
934*9356374aSAndroid Build Coastguard Worker     ss << std::left << std::setfill('.');
935*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
936*9356374aSAndroid Build Coastguard Worker     ss << std::setw(21) << absl::CivilSecond(cs);
937*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
938*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("X..2016-02-03T04:05:06..X..", ss.str());
939*9356374aSAndroid Build Coastguard Worker   }
940*9356374aSAndroid Build Coastguard Worker   {
941*9356374aSAndroid Build Coastguard Worker     std::stringstream ss;
942*9356374aSAndroid Build Coastguard Worker     ss << std::left << std::setfill('.');
943*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
944*9356374aSAndroid Build Coastguard Worker     ss << std::setw(21) << absl::Weekday::wednesday;
945*9356374aSAndroid Build Coastguard Worker     ss << std::setw(3) << 'X';
946*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("X..Wednesday............X..", ss.str());
947*9356374aSAndroid Build Coastguard Worker   }
948*9356374aSAndroid Build Coastguard Worker }
949*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,Weekday)950*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, Weekday) {
951*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d(1970, 1, 1);
952*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(d)) << d;
953*9356374aSAndroid Build Coastguard Worker 
954*9356374aSAndroid Build Coastguard Worker   // We used to get this wrong for years < -30.
955*9356374aSAndroid Build Coastguard Worker   d = absl::CivilDay(-31, 12, 24);
956*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Weekday::wednesday, absl::GetWeekday(d)) << d;
957*9356374aSAndroid Build Coastguard Worker }
958*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NextPrevWeekday)959*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NextPrevWeekday) {
960*9356374aSAndroid Build Coastguard Worker   // Jan 1, 1970 was a Thursday.
961*9356374aSAndroid Build Coastguard Worker   const absl::CivilDay thursday(1970, 1, 1);
962*9356374aSAndroid Build Coastguard Worker 
963*9356374aSAndroid Build Coastguard Worker   // Thursday -> Thursday
964*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d = absl::NextWeekday(thursday, absl::Weekday::thursday);
965*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(7, d - thursday) << d;
966*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d - 14, absl::PrevWeekday(thursday, absl::Weekday::thursday));
967*9356374aSAndroid Build Coastguard Worker 
968*9356374aSAndroid Build Coastguard Worker   // Thursday -> Friday
969*9356374aSAndroid Build Coastguard Worker   d = absl::NextWeekday(thursday, absl::Weekday::friday);
970*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, d - thursday) << d;
971*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d - 7, absl::PrevWeekday(thursday, absl::Weekday::friday));
972*9356374aSAndroid Build Coastguard Worker 
973*9356374aSAndroid Build Coastguard Worker   // Thursday -> Saturday
974*9356374aSAndroid Build Coastguard Worker   d = absl::NextWeekday(thursday, absl::Weekday::saturday);
975*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(2, d - thursday) << d;
976*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d - 7, absl::PrevWeekday(thursday, absl::Weekday::saturday));
977*9356374aSAndroid Build Coastguard Worker 
978*9356374aSAndroid Build Coastguard Worker   // Thursday -> Sunday
979*9356374aSAndroid Build Coastguard Worker   d = absl::NextWeekday(thursday, absl::Weekday::sunday);
980*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(3, d - thursday) << d;
981*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d - 7, absl::PrevWeekday(thursday, absl::Weekday::sunday));
982*9356374aSAndroid Build Coastguard Worker 
983*9356374aSAndroid Build Coastguard Worker   // Thursday -> Monday
984*9356374aSAndroid Build Coastguard Worker   d = absl::NextWeekday(thursday, absl::Weekday::monday);
985*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4, d - thursday) << d;
986*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d - 7, absl::PrevWeekday(thursday, absl::Weekday::monday));
987*9356374aSAndroid Build Coastguard Worker 
988*9356374aSAndroid Build Coastguard Worker   // Thursday -> Tuesday
989*9356374aSAndroid Build Coastguard Worker   d = absl::NextWeekday(thursday, absl::Weekday::tuesday);
990*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(5, d - thursday) << d;
991*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d - 7, absl::PrevWeekday(thursday, absl::Weekday::tuesday));
992*9356374aSAndroid Build Coastguard Worker 
993*9356374aSAndroid Build Coastguard Worker   // Thursday -> Wednesday
994*9356374aSAndroid Build Coastguard Worker   d = absl::NextWeekday(thursday, absl::Weekday::wednesday);
995*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(6, d - thursday) << d;
996*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d - 7, absl::PrevWeekday(thursday, absl::Weekday::wednesday));
997*9356374aSAndroid Build Coastguard Worker }
998*9356374aSAndroid Build Coastguard Worker 
999*9356374aSAndroid Build Coastguard Worker // NOTE: Run this with --copt=-ftrapv to detect overflow problems.
TEST(CivilTime,DifferenceWithHugeYear)1000*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, DifferenceWithHugeYear) {
1001*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d1(9223372036854775807, 1, 1);
1002*9356374aSAndroid Build Coastguard Worker   absl::CivilDay d2(9223372036854775807, 12, 31);
1003*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(364, d2 - d1);
1004*9356374aSAndroid Build Coastguard Worker 
1005*9356374aSAndroid Build Coastguard Worker   d1 = absl::CivilDay(-9223372036854775807 - 1, 1, 1);
1006*9356374aSAndroid Build Coastguard Worker   d2 = absl::CivilDay(-9223372036854775807 - 1, 12, 31);
1007*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(365, d2 - d1);
1008*9356374aSAndroid Build Coastguard Worker 
1009*9356374aSAndroid Build Coastguard Worker   // Check the limits of the return value at the end of the year range.
1010*9356374aSAndroid Build Coastguard Worker   d1 = absl::CivilDay(9223372036854775807, 1, 1);
1011*9356374aSAndroid Build Coastguard Worker   d2 = absl::CivilDay(9198119301927009252, 6, 6);
1012*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(9223372036854775807, d1 - d2);
1013*9356374aSAndroid Build Coastguard Worker   d2 = d2 - 1;
1014*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-9223372036854775807 - 1, d2 - d1);
1015*9356374aSAndroid Build Coastguard Worker 
1016*9356374aSAndroid Build Coastguard Worker   // Check the limits of the return value at the start of the year range.
1017*9356374aSAndroid Build Coastguard Worker   d1 = absl::CivilDay(-9223372036854775807 - 1, 1, 1);
1018*9356374aSAndroid Build Coastguard Worker   d2 = absl::CivilDay(-9198119301927009254, 7, 28);
1019*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(9223372036854775807, d2 - d1);
1020*9356374aSAndroid Build Coastguard Worker   d2 = d2 + 1;
1021*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-9223372036854775807 - 1, d1 - d2);
1022*9356374aSAndroid Build Coastguard Worker 
1023*9356374aSAndroid Build Coastguard Worker   // Check the limits of the return value from either side of year 0.
1024*9356374aSAndroid Build Coastguard Worker   d1 = absl::CivilDay(-12626367463883278, 9, 3);
1025*9356374aSAndroid Build Coastguard Worker   d2 = absl::CivilDay(12626367463883277, 3, 28);
1026*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(9223372036854775807, d2 - d1);
1027*9356374aSAndroid Build Coastguard Worker   d2 = d2 + 1;
1028*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-9223372036854775807 - 1, d1 - d2);
1029*9356374aSAndroid Build Coastguard Worker }
1030*9356374aSAndroid Build Coastguard Worker 
1031*9356374aSAndroid Build Coastguard Worker // NOTE: Run this with --copt=-ftrapv to detect overflow problems.
TEST(CivilTime,DifferenceNoIntermediateOverflow)1032*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, DifferenceNoIntermediateOverflow) {
1033*9356374aSAndroid Build Coastguard Worker   // The difference up to the minute field would be below the minimum
1034*9356374aSAndroid Build Coastguard Worker   // int64_t, but the 52 extra seconds brings us back to the minimum.
1035*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond s1(-292277022657, 1, 27, 8, 29 - 1, 52);
1036*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond s2(1970, 1, 1, 0, 0 - 1, 0);
1037*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-9223372036854775807 - 1, s1 - s2);
1038*9356374aSAndroid Build Coastguard Worker 
1039*9356374aSAndroid Build Coastguard Worker   // The difference up to the minute field would be above the maximum
1040*9356374aSAndroid Build Coastguard Worker   // int64_t, but the -53 extra seconds brings us back to the maximum.
1041*9356374aSAndroid Build Coastguard Worker   s1 = absl::CivilSecond(292277026596, 12, 4, 15, 30, 7 - 7);
1042*9356374aSAndroid Build Coastguard Worker   s2 = absl::CivilSecond(1970, 1, 1, 0, 0, 0 - 7);
1043*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(9223372036854775807, s1 - s2);
1044*9356374aSAndroid Build Coastguard Worker }
1045*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeSimpleOverflow)1046*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeSimpleOverflow) {
1047*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs;
1048*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16, 32, 59 + 1);
1049*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-11-15T16:33:00", absl::FormatCivilTime(cs));
1050*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16, 59 + 1, 14);
1051*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-11-15T17:00:14", absl::FormatCivilTime(cs));
1052*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 23 + 1, 32, 14);
1053*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-11-16T00:32:14", absl::FormatCivilTime(cs));
1054*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 30 + 1, 16, 32, 14);
1055*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-12-01T16:32:14", absl::FormatCivilTime(cs));
1056*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 12 + 1, 15, 16, 32, 14);
1057*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2014-01-15T16:32:14", absl::FormatCivilTime(cs));
1058*9356374aSAndroid Build Coastguard Worker }
1059*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeSimpleUnderflow)1060*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeSimpleUnderflow) {
1061*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs;
1062*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16, 32, 0 - 1);
1063*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-11-15T16:31:59", absl::FormatCivilTime(cs));
1064*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16, 0 - 1, 14);
1065*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-11-15T15:59:14", absl::FormatCivilTime(cs));
1066*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 0 - 1, 32, 14);
1067*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-11-14T23:32:14", absl::FormatCivilTime(cs));
1068*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 1 - 1, 16, 32, 14);
1069*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-10-31T16:32:14", absl::FormatCivilTime(cs));
1070*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 1 - 1, 15, 16, 32, 14);
1071*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2012-12-15T16:32:14", absl::FormatCivilTime(cs));
1072*9356374aSAndroid Build Coastguard Worker }
1073*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeMultipleOverflow)1074*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeMultipleOverflow) {
1075*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs(2013, 12, 31, 23, 59, 59 + 1);
1076*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2014-01-01T00:00:00", absl::FormatCivilTime(cs));
1077*9356374aSAndroid Build Coastguard Worker }
1078*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeMultipleUnderflow)1079*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeMultipleUnderflow) {
1080*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs(2014, 1, 1, 0, 0, 0 - 1);
1081*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-12-31T23:59:59", absl::FormatCivilTime(cs));
1082*9356374aSAndroid Build Coastguard Worker }
1083*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeOverflowLimits)1084*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeOverflowLimits) {
1085*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs;
1086*9356374aSAndroid Build Coastguard Worker 
1087*9356374aSAndroid Build Coastguard Worker   const int kintmax = std::numeric_limits<int>::max();
1088*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(0, kintmax, kintmax, kintmax, kintmax, kintmax);
1089*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("185085715-11-27T12:21:07", absl::FormatCivilTime(cs));
1090*9356374aSAndroid Build Coastguard Worker 
1091*9356374aSAndroid Build Coastguard Worker   const int kintmin = std::numeric_limits<int>::min();
1092*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(0, kintmin, kintmin, kintmin, kintmin, kintmin);
1093*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-185085717-10-31T10:37:52", absl::FormatCivilTime(cs));
1094*9356374aSAndroid Build Coastguard Worker }
1095*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeComplexOverflow)1096*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeComplexOverflow) {
1097*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs;
1098*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16, 32, 14 + 123456789);
1099*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2017-10-14T14:05:23", absl::FormatCivilTime(cs));
1100*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16, 32 + 1234567, 14);
1101*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2016-03-22T00:39:14", absl::FormatCivilTime(cs));
1102*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16 + 123456, 32, 14);
1103*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2027-12-16T16:32:14", absl::FormatCivilTime(cs));
1104*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15 + 1234, 16, 32, 14);
1105*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2017-04-02T16:32:14", absl::FormatCivilTime(cs));
1106*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11 + 123, 15, 16, 32, 14);
1107*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2024-02-15T16:32:14", absl::FormatCivilTime(cs));
1108*9356374aSAndroid Build Coastguard Worker }
1109*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeComplexUnderflow)1110*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeComplexUnderflow) {
1111*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs;
1112*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(1999, 3, 0, 0, 0, 0);  // year 400
1113*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1999-02-28T00:00:00", absl::FormatCivilTime(cs));
1114*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16, 32, 14 - 123456789);
1115*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2009-12-17T18:59:05", absl::FormatCivilTime(cs));
1116*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16, 32 - 1234567, 14);
1117*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2011-07-12T08:25:14", absl::FormatCivilTime(cs));
1118*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15, 16 - 123456, 32, 14);
1119*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1999-10-16T16:32:14", absl::FormatCivilTime(cs));
1120*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, 15 - 1234, 16, 32, 14);
1121*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2010-06-30T16:32:14", absl::FormatCivilTime(cs));
1122*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11 - 123, 15, 16, 32, 14);
1123*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2003-08-15T16:32:14", absl::FormatCivilTime(cs));
1124*9356374aSAndroid Build Coastguard Worker }
1125*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeMishmash)1126*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeMishmash) {
1127*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond cs;
1128*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11 - 123, 15 + 1234, 16 - 123456, 32 + 1234567,
1129*9356374aSAndroid Build Coastguard Worker                          14 - 123456789);
1130*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1991-05-09T03:06:05", absl::FormatCivilTime(cs));
1131*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11 + 123, 15 - 1234, 16 + 123456, 32 - 1234567,
1132*9356374aSAndroid Build Coastguard Worker                          14 + 123456789);
1133*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2036-05-24T05:58:23", absl::FormatCivilTime(cs));
1134*9356374aSAndroid Build Coastguard Worker 
1135*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11, -146097 + 1, 16, 32, 14);
1136*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1613-11-01T16:32:14", absl::FormatCivilTime(cs));
1137*9356374aSAndroid Build Coastguard Worker   cs = absl::CivilSecond(2013, 11 + 400 * 12, -146097 + 1, 16, 32, 14);
1138*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-11-01T16:32:14", absl::FormatCivilTime(cs));
1139*9356374aSAndroid Build Coastguard Worker }
1140*9356374aSAndroid Build Coastguard Worker 
1141*9356374aSAndroid Build Coastguard Worker // Convert all the days from 1970-1-1 to 1970-1-146097 (aka 2369-12-31)
1142*9356374aSAndroid Build Coastguard Worker // and check that they normalize to the expected time.  146097 days span
1143*9356374aSAndroid Build Coastguard Worker // the 400-year Gregorian cycle used during normalization.
TEST(CivilTime,NormalizeAllTheDays)1144*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeAllTheDays) {
1145*9356374aSAndroid Build Coastguard Worker   absl::CivilDay expected(1970, 1, 1);
1146*9356374aSAndroid Build Coastguard Worker   for (int day = 1; day <= 146097; ++day) {
1147*9356374aSAndroid Build Coastguard Worker     absl::CivilSecond cs(1970, 1, day, 0, 0, 0);
1148*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(expected, cs);
1149*9356374aSAndroid Build Coastguard Worker     ++expected;
1150*9356374aSAndroid Build Coastguard Worker   }
1151*9356374aSAndroid Build Coastguard Worker }
1152*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,NormalizeWithHugeYear)1153*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, NormalizeWithHugeYear) {
1154*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth c(9223372036854775807, 1);
1155*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("9223372036854775807-01", absl::FormatCivilTime(c));
1156*9356374aSAndroid Build Coastguard Worker   c = c - 1;  // Causes normalization
1157*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("9223372036854775806-12", absl::FormatCivilTime(c));
1158*9356374aSAndroid Build Coastguard Worker 
1159*9356374aSAndroid Build Coastguard Worker   c = absl::CivilMonth(-9223372036854775807 - 1, 1);
1160*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-9223372036854775808-01", absl::FormatCivilTime(c));
1161*9356374aSAndroid Build Coastguard Worker   c = c + 12;  // Causes normalization
1162*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-9223372036854775807-01", absl::FormatCivilTime(c));
1163*9356374aSAndroid Build Coastguard Worker }
1164*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,LeapYears)1165*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, LeapYears) {
1166*9356374aSAndroid Build Coastguard Worker   const absl::CivilSecond s1(2013, 2, 28 + 1, 0, 0, 0);
1167*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2013-03-01T00:00:00", absl::FormatCivilTime(s1));
1168*9356374aSAndroid Build Coastguard Worker 
1169*9356374aSAndroid Build Coastguard Worker   const absl::CivilSecond s2(2012, 2, 28 + 1, 0, 0, 0);
1170*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2012-02-29T00:00:00", absl::FormatCivilTime(s2));
1171*9356374aSAndroid Build Coastguard Worker 
1172*9356374aSAndroid Build Coastguard Worker   const absl::CivilSecond s3(1900, 2, 28 + 1, 0, 0, 0);
1173*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1900-03-01T00:00:00", absl::FormatCivilTime(s3));
1174*9356374aSAndroid Build Coastguard Worker 
1175*9356374aSAndroid Build Coastguard Worker   const struct {
1176*9356374aSAndroid Build Coastguard Worker     int year;
1177*9356374aSAndroid Build Coastguard Worker     int days;
1178*9356374aSAndroid Build Coastguard Worker     struct {
1179*9356374aSAndroid Build Coastguard Worker       int month;
1180*9356374aSAndroid Build Coastguard Worker       int day;
1181*9356374aSAndroid Build Coastguard Worker     } leap_day;  // The date of the day after Feb 28.
1182*9356374aSAndroid Build Coastguard Worker   } kLeapYearTable[]{
1183*9356374aSAndroid Build Coastguard Worker       {1900, 365, {3, 1}},
1184*9356374aSAndroid Build Coastguard Worker       {1999, 365, {3, 1}},
1185*9356374aSAndroid Build Coastguard Worker       {2000, 366, {2, 29}},  // leap year
1186*9356374aSAndroid Build Coastguard Worker       {2001, 365, {3, 1}},
1187*9356374aSAndroid Build Coastguard Worker       {2002, 365, {3, 1}},
1188*9356374aSAndroid Build Coastguard Worker       {2003, 365, {3, 1}},
1189*9356374aSAndroid Build Coastguard Worker       {2004, 366, {2, 29}},  // leap year
1190*9356374aSAndroid Build Coastguard Worker       {2005, 365, {3, 1}},
1191*9356374aSAndroid Build Coastguard Worker       {2006, 365, {3, 1}},
1192*9356374aSAndroid Build Coastguard Worker       {2007, 365, {3, 1}},
1193*9356374aSAndroid Build Coastguard Worker       {2008, 366, {2, 29}},  // leap year
1194*9356374aSAndroid Build Coastguard Worker       {2009, 365, {3, 1}},
1195*9356374aSAndroid Build Coastguard Worker       {2100, 365, {3, 1}},
1196*9356374aSAndroid Build Coastguard Worker   };
1197*9356374aSAndroid Build Coastguard Worker 
1198*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < ABSL_ARRAYSIZE(kLeapYearTable); ++i) {
1199*9356374aSAndroid Build Coastguard Worker     const int y = kLeapYearTable[i].year;
1200*9356374aSAndroid Build Coastguard Worker     const int m = kLeapYearTable[i].leap_day.month;
1201*9356374aSAndroid Build Coastguard Worker     const int d = kLeapYearTable[i].leap_day.day;
1202*9356374aSAndroid Build Coastguard Worker     const int n = kLeapYearTable[i].days;
1203*9356374aSAndroid Build Coastguard Worker 
1204*9356374aSAndroid Build Coastguard Worker     // Tests incrementing through the leap day.
1205*9356374aSAndroid Build Coastguard Worker     const absl::CivilDay feb28(y, 2, 28);
1206*9356374aSAndroid Build Coastguard Worker     const absl::CivilDay next_day = feb28 + 1;
1207*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(m, next_day.month());
1208*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(d, next_day.day());
1209*9356374aSAndroid Build Coastguard Worker 
1210*9356374aSAndroid Build Coastguard Worker     // Tests difference in days of leap years.
1211*9356374aSAndroid Build Coastguard Worker     const absl::CivilYear year(feb28);
1212*9356374aSAndroid Build Coastguard Worker     const absl::CivilYear next_year = year + 1;
1213*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(n, absl::CivilDay(next_year) - absl::CivilDay(year));
1214*9356374aSAndroid Build Coastguard Worker   }
1215*9356374aSAndroid Build Coastguard Worker }
1216*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,FirstThursdayInMonth)1217*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, FirstThursdayInMonth) {
1218*9356374aSAndroid Build Coastguard Worker   const absl::CivilDay nov1(2014, 11, 1);
1219*9356374aSAndroid Build Coastguard Worker   const absl::CivilDay thursday =
1220*9356374aSAndroid Build Coastguard Worker       absl::NextWeekday(nov1 - 1, absl::Weekday::thursday);
1221*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2014-11-06", absl::FormatCivilTime(thursday));
1222*9356374aSAndroid Build Coastguard Worker 
1223*9356374aSAndroid Build Coastguard Worker   // Bonus: Date of Thanksgiving in the United States
1224*9356374aSAndroid Build Coastguard Worker   // Rule: Fourth Thursday of November
1225*9356374aSAndroid Build Coastguard Worker   const absl::CivilDay thanksgiving = thursday +  7 * 3;
1226*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2014-11-27", absl::FormatCivilTime(thanksgiving));
1227*9356374aSAndroid Build Coastguard Worker }
1228*9356374aSAndroid Build Coastguard Worker 
TEST(CivilTime,DocumentationExample)1229*9356374aSAndroid Build Coastguard Worker TEST(CivilTime, DocumentationExample) {
1230*9356374aSAndroid Build Coastguard Worker   absl::CivilSecond second(2015, 6, 28, 1, 2, 3);  // 2015-06-28 01:02:03
1231*9356374aSAndroid Build Coastguard Worker   absl::CivilMinute minute(second);                // 2015-06-28 01:02:00
1232*9356374aSAndroid Build Coastguard Worker   absl::CivilDay day(minute);                      // 2015-06-28 00:00:00
1233*9356374aSAndroid Build Coastguard Worker 
1234*9356374aSAndroid Build Coastguard Worker   second -= 1;                    // 2015-06-28 01:02:02
1235*9356374aSAndroid Build Coastguard Worker   --second;                       // 2015-06-28 01:02:01
1236*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minute, second - 1);  // Comparison between types
1237*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(minute, second);
1238*9356374aSAndroid Build Coastguard Worker 
1239*9356374aSAndroid Build Coastguard Worker   // int diff = second - minute;  // ERROR: Mixed types, won't compile
1240*9356374aSAndroid Build Coastguard Worker 
1241*9356374aSAndroid Build Coastguard Worker   absl::CivilDay june_1(2015, 6, 1);  // Pass fields to c'tor.
1242*9356374aSAndroid Build Coastguard Worker   int diff = day - june_1;            // Num days between 'day' and June 1
1243*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(27, diff);
1244*9356374aSAndroid Build Coastguard Worker 
1245*9356374aSAndroid Build Coastguard Worker   // Fields smaller than alignment are floored to their minimum value.
1246*9356374aSAndroid Build Coastguard Worker   absl::CivilDay day_floor(2015, 1, 2, 9, 9, 9);
1247*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, day_floor.hour());  // 09:09:09 is floored
1248*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilDay(2015, 1, 2), day_floor);
1249*9356374aSAndroid Build Coastguard Worker 
1250*9356374aSAndroid Build Coastguard Worker   // Unspecified fields default to their minimum value
1251*9356374aSAndroid Build Coastguard Worker   absl::CivilDay day_default(2015);  // Defaults to Jan 1
1252*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::CivilDay(2015, 1, 1), day_default);
1253*9356374aSAndroid Build Coastguard Worker 
1254*9356374aSAndroid Build Coastguard Worker   // Iterates all the days of June.
1255*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth june(day);  // CivilDay -> CivilMonth
1256*9356374aSAndroid Build Coastguard Worker   absl::CivilMonth july = june + 1;
1257*9356374aSAndroid Build Coastguard Worker   for (absl::CivilDay day = june_1; day < july; ++day) {
1258*9356374aSAndroid Build Coastguard Worker     // ...
1259*9356374aSAndroid Build Coastguard Worker   }
1260*9356374aSAndroid Build Coastguard Worker }
1261*9356374aSAndroid Build Coastguard Worker 
1262*9356374aSAndroid Build Coastguard Worker }  // namespace
1263