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