xref: /aosp_15_r20/external/libtextclassifier/native/utils/calendar/calendar_test.cc (revision 993b0882672172b81d12fad7a7ac0c3e5c824a12)
1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker  *
4*993b0882SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker  *
8*993b0882SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker  *
10*993b0882SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker  * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker  */
16*993b0882SAndroid Build Coastguard Worker 
17*993b0882SAndroid Build Coastguard Worker #include "utils/jvm-test-utils.h"
18*993b0882SAndroid Build Coastguard Worker #include "gtest/gtest.h"
19*993b0882SAndroid Build Coastguard Worker 
20*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
21*993b0882SAndroid Build Coastguard Worker namespace {
22*993b0882SAndroid Build Coastguard Worker 
23*993b0882SAndroid Build Coastguard Worker class CalendarTest : public ::testing::Test {
24*993b0882SAndroid Build Coastguard Worker  protected:
CalendarTest()25*993b0882SAndroid Build Coastguard Worker   CalendarTest()
26*993b0882SAndroid Build Coastguard Worker       : calendarlib_(libtextclassifier3::CreateCalendarLibForTesting()) {}
27*993b0882SAndroid Build Coastguard Worker 
28*993b0882SAndroid Build Coastguard Worker   static constexpr int kWednesday = 4;
29*993b0882SAndroid Build Coastguard Worker   std::unique_ptr<CalendarLib> calendarlib_;
30*993b0882SAndroid Build Coastguard Worker };
31*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,Interface)32*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest, Interface) {
33*993b0882SAndroid Build Coastguard Worker   int64 time;
34*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
35*993b0882SAndroid Build Coastguard Worker   std::string timezone;
36*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData data;
37*993b0882SAndroid Build Coastguard Worker   bool result = calendarlib_->InterpretParseData(
38*993b0882SAndroid Build Coastguard Worker       data, /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Zurich",
39*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
40*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity);
41*993b0882SAndroid Build Coastguard Worker   TC3_LOG(INFO) << result;
42*993b0882SAndroid Build Coastguard Worker }
43*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,SetsZeroTimeWhenNotRelative)44*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest, SetsZeroTimeWhenNotRelative) {
45*993b0882SAndroid Build Coastguard Worker   int64 time;
46*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
47*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData data;
48*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::YEAR, 2018);
49*993b0882SAndroid Build Coastguard Worker 
50*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
51*993b0882SAndroid Build Coastguard Worker       data,
52*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
53*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
54*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
55*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1514761200000L /* Jan 01 2018 00:00:00 */);
56*993b0882SAndroid Build Coastguard Worker 
57*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
58*993b0882SAndroid Build Coastguard Worker       data,
59*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/1L, /*reference_timezone=*/"Europe/Zurich",
60*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
61*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
62*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1514761200000L /* Jan 01 2018 00:00:00 */);
63*993b0882SAndroid Build Coastguard Worker }
64*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,SetsTimeZone)65*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest, SetsTimeZone) {
66*993b0882SAndroid Build Coastguard Worker   int64 time;
67*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
68*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData data;
69*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::YEAR, 2018);
70*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::HOUR, 7);
71*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::MINUTE, 30);
72*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::SECOND, 10);
73*993b0882SAndroid Build Coastguard Worker 
74*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
75*993b0882SAndroid Build Coastguard Worker       data,
76*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
77*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
78*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
79*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1514788210000L /* Jan 01 2018 07:30:10 GMT+01:00 */);
80*993b0882SAndroid Build Coastguard Worker 
81*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::ZONE_OFFSET,
82*993b0882SAndroid Build Coastguard Worker                         60);  // GMT+01:00
83*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
84*993b0882SAndroid Build Coastguard Worker       data,
85*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
86*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
87*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
88*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1514788210000L /* Jan 01 2018 07:30:10 GMT+01:00 */);
89*993b0882SAndroid Build Coastguard Worker 
90*993b0882SAndroid Build Coastguard Worker   // Now the hour is in terms of GMT+02:00 which is one hour ahead of
91*993b0882SAndroid Build Coastguard Worker   // GMT+01:00.
92*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::ZONE_OFFSET,
93*993b0882SAndroid Build Coastguard Worker                         120);  // GMT+02:00
94*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
95*993b0882SAndroid Build Coastguard Worker       data,
96*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
97*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
98*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
99*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1514784610000L /* Jan 01 2018 06:30:10 GMT+01:00 */);
100*993b0882SAndroid Build Coastguard Worker }
101*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,RoundingToGranularityBasic)102*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest, RoundingToGranularityBasic) {
103*993b0882SAndroid Build Coastguard Worker   int64 time;
104*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
105*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData data;
106*993b0882SAndroid Build Coastguard Worker 
107*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::YEAR, 2018);
108*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
109*993b0882SAndroid Build Coastguard Worker       data,
110*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
111*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
112*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
113*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1514761200000L /* Jan 01 2018 00:00:00 */);
114*993b0882SAndroid Build Coastguard Worker 
115*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::MONTH, 4);
116*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
117*993b0882SAndroid Build Coastguard Worker       data,
118*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
119*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
120*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
121*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1522533600000L /* Apr 01 2018 00:00:00 */);
122*993b0882SAndroid Build Coastguard Worker 
123*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::DAY_OF_MONTH, 25);
124*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
125*993b0882SAndroid Build Coastguard Worker       data,
126*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
127*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
128*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
129*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524607200000L /* Apr 25 2018 00:00:00 */);
130*993b0882SAndroid Build Coastguard Worker 
131*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::HOUR, 9);
132*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
133*993b0882SAndroid Build Coastguard Worker       data,
134*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
135*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
136*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
137*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524639600000L /* Apr 25 2018 09:00:00 */);
138*993b0882SAndroid Build Coastguard Worker 
139*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::MINUTE, 33);
140*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
141*993b0882SAndroid Build Coastguard Worker       data,
142*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
143*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
144*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
145*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524641580000 /* Apr 25 2018 09:33:00 */);
146*993b0882SAndroid Build Coastguard Worker 
147*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::SECOND, 59);
148*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
149*993b0882SAndroid Build Coastguard Worker       data,
150*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
151*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
152*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
153*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524641639000 /* Apr 25 2018 09:33:59 */);
154*993b0882SAndroid Build Coastguard Worker }
155*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,RoundingToGranularityWeek)156*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest, RoundingToGranularityWeek) {
157*993b0882SAndroid Build Coastguard Worker   int64 time;
158*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
159*993b0882SAndroid Build Coastguard Worker   // Prepare data structure that means: "next week"
160*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData data;
161*993b0882SAndroid Build Coastguard Worker   data.SetRelativeValue(DatetimeComponent::ComponentType::WEEK,
162*993b0882SAndroid Build Coastguard Worker                         DatetimeComponent::RelativeQualifier::NEXT);
163*993b0882SAndroid Build Coastguard Worker   data.SetRelativeCount(DatetimeComponent::ComponentType::WEEK, 1);
164*993b0882SAndroid Build Coastguard Worker 
165*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
166*993b0882SAndroid Build Coastguard Worker       data,
167*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
168*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"de-CH",
169*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
170*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 342000000L /* Mon Jan 05 1970 00:00:00 */);
171*993b0882SAndroid Build Coastguard Worker 
172*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
173*993b0882SAndroid Build Coastguard Worker       data,
174*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/0L, /*reference_timezone=*/"Europe/Zurich",
175*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
176*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
177*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 255600000L /* Sun Jan 04 1970 00:00:00 */);
178*993b0882SAndroid Build Coastguard Worker }
179*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,RelativeTime)180*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest, RelativeTime) {
181*993b0882SAndroid Build Coastguard Worker   const int64 ref_time = 1524648839000L; /* 25 April 2018 09:33:59 */
182*993b0882SAndroid Build Coastguard Worker   int64 time;
183*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
184*993b0882SAndroid Build Coastguard Worker 
185*993b0882SAndroid Build Coastguard Worker   // Two Weds from now.
186*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData future_wed_parse;
187*993b0882SAndroid Build Coastguard Worker   future_wed_parse.SetRelativeValue(
188*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::ComponentType::DAY_OF_WEEK,
189*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::RelativeQualifier::FUTURE);
190*993b0882SAndroid Build Coastguard Worker   future_wed_parse.SetRelativeCount(
191*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::ComponentType::DAY_OF_WEEK, 2);
192*993b0882SAndroid Build Coastguard Worker   future_wed_parse.SetAbsoluteValue(
193*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::ComponentType::DAY_OF_WEEK, kWednesday);
194*993b0882SAndroid Build Coastguard Worker 
195*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
196*993b0882SAndroid Build Coastguard Worker       future_wed_parse, ref_time, /*reference_timezone=*/"Europe/Zurich",
197*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
198*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
199*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1525858439000L /* Wed May 09 2018 11:33:59 */);
200*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(granularity, GRANULARITY_DAY);
201*993b0882SAndroid Build Coastguard Worker 
202*993b0882SAndroid Build Coastguard Worker   // Next Wed.
203*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData next_wed_parse;
204*993b0882SAndroid Build Coastguard Worker   next_wed_parse.SetAbsoluteValue(DatetimeComponent::ComponentType::DAY_OF_WEEK,
205*993b0882SAndroid Build Coastguard Worker                                   kWednesday);
206*993b0882SAndroid Build Coastguard Worker   next_wed_parse.SetRelativeValue(DatetimeComponent::ComponentType::DAY_OF_WEEK,
207*993b0882SAndroid Build Coastguard Worker                                   DatetimeComponent::RelativeQualifier::NEXT);
208*993b0882SAndroid Build Coastguard Worker   next_wed_parse.SetRelativeCount(DatetimeComponent::ComponentType::DAY_OF_WEEK,
209*993b0882SAndroid Build Coastguard Worker                                   1);
210*993b0882SAndroid Build Coastguard Worker 
211*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
212*993b0882SAndroid Build Coastguard Worker       next_wed_parse, ref_time, /*reference_timezone=*/"Europe/Zurich",
213*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
214*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
215*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1525212000000L /* Wed May 02 2018 00:00:00 */);
216*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(granularity, GRANULARITY_DAY);
217*993b0882SAndroid Build Coastguard Worker 
218*993b0882SAndroid Build Coastguard Worker   // Same Wed.
219*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData same_wed_parse;
220*993b0882SAndroid Build Coastguard Worker   same_wed_parse.SetRelativeValue(DatetimeComponent::ComponentType::DAY_OF_WEEK,
221*993b0882SAndroid Build Coastguard Worker                                   DatetimeComponent::RelativeQualifier::THIS);
222*993b0882SAndroid Build Coastguard Worker   same_wed_parse.SetAbsoluteValue(DatetimeComponent::ComponentType::DAY_OF_WEEK,
223*993b0882SAndroid Build Coastguard Worker                                   kWednesday);
224*993b0882SAndroid Build Coastguard Worker   same_wed_parse.SetRelativeCount(DatetimeComponent::ComponentType::DAY_OF_WEEK,
225*993b0882SAndroid Build Coastguard Worker                                   1);
226*993b0882SAndroid Build Coastguard Worker 
227*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
228*993b0882SAndroid Build Coastguard Worker       same_wed_parse, ref_time, /*reference_timezone=*/"Europe/Zurich",
229*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
230*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
231*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524607200000L /* Wed Apr 25 2018 00:00:00 */);
232*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(granularity, GRANULARITY_DAY);
233*993b0882SAndroid Build Coastguard Worker 
234*993b0882SAndroid Build Coastguard Worker   // Previous Wed.
235*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData last_wed_parse;
236*993b0882SAndroid Build Coastguard Worker   last_wed_parse.SetRelativeValue(DatetimeComponent::ComponentType::DAY_OF_WEEK,
237*993b0882SAndroid Build Coastguard Worker                                   DatetimeComponent::RelativeQualifier::LAST);
238*993b0882SAndroid Build Coastguard Worker   last_wed_parse.SetAbsoluteValue(DatetimeComponent::ComponentType::DAY_OF_WEEK,
239*993b0882SAndroid Build Coastguard Worker                                   kWednesday);
240*993b0882SAndroid Build Coastguard Worker   last_wed_parse.SetRelativeCount(DatetimeComponent::ComponentType::DAY_OF_WEEK,
241*993b0882SAndroid Build Coastguard Worker                                   1);
242*993b0882SAndroid Build Coastguard Worker 
243*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
244*993b0882SAndroid Build Coastguard Worker       last_wed_parse, ref_time, /*reference_timezone=*/"Europe/Zurich",
245*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
246*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
247*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524002400000L /* Wed Apr 18 2018 00:00:00 */);
248*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(granularity, GRANULARITY_DAY);
249*993b0882SAndroid Build Coastguard Worker 
250*993b0882SAndroid Build Coastguard Worker   // Two Weds ago.
251*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData past_wed_parse;
252*993b0882SAndroid Build Coastguard Worker   past_wed_parse.SetRelativeValue(DatetimeComponent::ComponentType::DAY_OF_WEEK,
253*993b0882SAndroid Build Coastguard Worker                                   DatetimeComponent::RelativeQualifier::PAST);
254*993b0882SAndroid Build Coastguard Worker   past_wed_parse.SetAbsoluteValue(DatetimeComponent::ComponentType::DAY_OF_WEEK,
255*993b0882SAndroid Build Coastguard Worker                                   kWednesday);
256*993b0882SAndroid Build Coastguard Worker   past_wed_parse.SetRelativeCount(DatetimeComponent::ComponentType::DAY_OF_WEEK,
257*993b0882SAndroid Build Coastguard Worker                                   -2);
258*993b0882SAndroid Build Coastguard Worker 
259*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
260*993b0882SAndroid Build Coastguard Worker       past_wed_parse, ref_time, /*reference_timezone=*/"Europe/Zurich",
261*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
262*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
263*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1523439239000L /* Wed Apr 11 2018 11:33:59 */);
264*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(granularity, GRANULARITY_DAY);
265*993b0882SAndroid Build Coastguard Worker 
266*993b0882SAndroid Build Coastguard Worker   // In 3 hours.
267*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData in_3_hours_parse;
268*993b0882SAndroid Build Coastguard Worker   in_3_hours_parse.SetRelativeValue(
269*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::ComponentType::HOUR,
270*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::RelativeQualifier::FUTURE);
271*993b0882SAndroid Build Coastguard Worker   in_3_hours_parse.SetRelativeCount(DatetimeComponent::ComponentType::HOUR, 3);
272*993b0882SAndroid Build Coastguard Worker 
273*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
274*993b0882SAndroid Build Coastguard Worker       in_3_hours_parse, ref_time, /*reference_timezone=*/"Europe/Zurich",
275*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
276*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
277*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524659639000L /* Wed Apr 25 2018 14:33:59 */);
278*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(granularity, GRANULARITY_HOUR);
279*993b0882SAndroid Build Coastguard Worker 
280*993b0882SAndroid Build Coastguard Worker   // In 5 minutes.
281*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData in_5_minutes_parse;
282*993b0882SAndroid Build Coastguard Worker   in_5_minutes_parse.SetRelativeValue(
283*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::ComponentType::MINUTE,
284*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::RelativeQualifier::FUTURE);
285*993b0882SAndroid Build Coastguard Worker   in_5_minutes_parse.SetRelativeCount(DatetimeComponent::ComponentType::MINUTE,
286*993b0882SAndroid Build Coastguard Worker                                       5);
287*993b0882SAndroid Build Coastguard Worker 
288*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
289*993b0882SAndroid Build Coastguard Worker       in_5_minutes_parse, ref_time, /*reference_timezone=*/"Europe/Zurich",
290*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
291*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
292*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524649139000L /* Wed Apr 25 2018 14:33:59 */);
293*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(granularity, GRANULARITY_MINUTE);
294*993b0882SAndroid Build Coastguard Worker 
295*993b0882SAndroid Build Coastguard Worker   // In 10 seconds.
296*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData in_10_seconds_parse;
297*993b0882SAndroid Build Coastguard Worker   in_10_seconds_parse.SetRelativeValue(
298*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::ComponentType::SECOND,
299*993b0882SAndroid Build Coastguard Worker       DatetimeComponent::RelativeQualifier::FUTURE);
300*993b0882SAndroid Build Coastguard Worker   in_10_seconds_parse.SetRelativeCount(DatetimeComponent::ComponentType::SECOND,
301*993b0882SAndroid Build Coastguard Worker                                        10);
302*993b0882SAndroid Build Coastguard Worker 
303*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
304*993b0882SAndroid Build Coastguard Worker       in_10_seconds_parse, ref_time, /*reference_timezone=*/"Europe/Zurich",
305*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-US",
306*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
307*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1524648849000L /* Wed Apr 25 2018 14:33:59 */);
308*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(granularity, GRANULARITY_SECOND);
309*993b0882SAndroid Build Coastguard Worker }
310*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,AddsADayWhenTimeInThePastAndDayNotSpecified)311*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest, AddsADayWhenTimeInThePastAndDayNotSpecified) {
312*993b0882SAndroid Build Coastguard Worker   int64 time;
313*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
314*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData data;
315*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::HOUR, 7);
316*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::MINUTE, 10);
317*993b0882SAndroid Build Coastguard Worker 
318*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
319*993b0882SAndroid Build Coastguard Worker       data,
320*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/1567317600000L /* Sept 01 2019 00:00:00 */,
321*993b0882SAndroid Build Coastguard Worker       /*reference_timezone=*/"Europe/Zurich",
322*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH", /*prefer_future_for_unspecified_date=*/true,
323*993b0882SAndroid Build Coastguard Worker       &time, &granularity));
324*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1567401000000L /* Sept 02 2019 07:10:00 */);
325*993b0882SAndroid Build Coastguard Worker }
326*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,DoesntAddADayWhenTimeInThePastAndDayNotSpecifiedAndDisabled)327*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest,
328*993b0882SAndroid Build Coastguard Worker        DoesntAddADayWhenTimeInThePastAndDayNotSpecifiedAndDisabled) {
329*993b0882SAndroid Build Coastguard Worker   int64 time;
330*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
331*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData data;
332*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::HOUR, 7);
333*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::MINUTE, 10);
334*993b0882SAndroid Build Coastguard Worker 
335*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
336*993b0882SAndroid Build Coastguard Worker       data,
337*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/1567317600000L /* Sept 01 2019 00:00:00 */,
338*993b0882SAndroid Build Coastguard Worker       /*reference_timezone=*/"Europe/Zurich",
339*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
340*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
341*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1567314600000L /* Sept 01 2019 07:10:00 */);
342*993b0882SAndroid Build Coastguard Worker }
343*993b0882SAndroid Build Coastguard Worker 
TEST_F(CalendarTest,DoesntAddADayWhenTimeInTheFutureAndDayNotSpecified)344*993b0882SAndroid Build Coastguard Worker TEST_F(CalendarTest, DoesntAddADayWhenTimeInTheFutureAndDayNotSpecified) {
345*993b0882SAndroid Build Coastguard Worker   int64 time;
346*993b0882SAndroid Build Coastguard Worker   DatetimeGranularity granularity;
347*993b0882SAndroid Build Coastguard Worker   DatetimeParsedData data;
348*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::HOUR, 9);
349*993b0882SAndroid Build Coastguard Worker   data.SetAbsoluteValue(DatetimeComponent::ComponentType::MINUTE, 10);
350*993b0882SAndroid Build Coastguard Worker 
351*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
352*993b0882SAndroid Build Coastguard Worker       data,
353*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/1567317600000L /* Sept 01 2019 00:00:00 */,
354*993b0882SAndroid Build Coastguard Worker       /*reference_timezone=*/"Europe/Zurich",
355*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH", /*prefer_future_for_unspecified_date=*/true,
356*993b0882SAndroid Build Coastguard Worker       &time, &granularity));
357*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1567321800000L /* Sept 01 2019 09:10:00 */);
358*993b0882SAndroid Build Coastguard Worker 
359*993b0882SAndroid Build Coastguard Worker   ASSERT_TRUE(calendarlib_->InterpretParseData(
360*993b0882SAndroid Build Coastguard Worker       data,
361*993b0882SAndroid Build Coastguard Worker       /*reference_time_ms_utc=*/1567317600000L /* Sept 01 2019 00:00:00 */,
362*993b0882SAndroid Build Coastguard Worker       /*reference_timezone=*/"Europe/Zurich",
363*993b0882SAndroid Build Coastguard Worker       /*reference_locale=*/"en-CH",
364*993b0882SAndroid Build Coastguard Worker       /*prefer_future_for_unspecified_date=*/false, &time, &granularity));
365*993b0882SAndroid Build Coastguard Worker   EXPECT_EQ(time, 1567321800000L /* Sept 01 2019 09:10:00 */);
366*993b0882SAndroid Build Coastguard Worker }
367*993b0882SAndroid Build Coastguard Worker 
368*993b0882SAndroid Build Coastguard Worker }  // namespace
369*993b0882SAndroid Build Coastguard Worker }  // namespace libtextclassifier3
370