@@ -122,8 +122,8 @@ public void test_print(LocalDateTime ldt, ZoneId zone, String expected) {
122122 String output = builder .toFormatter ().format (zdt );
123123 assertEquals (output , expected );
124124 }
125-
126- @ Test
125+
126+ @ Test
127127 @ UseDataProvider ("data_print" )
128128 public void test_print_pattern_VV (LocalDateTime ldt , ZoneId zone , String expected ) {
129129 ZonedDateTime zdt = ldt .atZone (zone );
@@ -157,152 +157,192 @@ public void test_print_pattern_V5rejected() {
157157 @ DataProvider
158158 public static Object [][] data_parseSuccess () {
159159 return new Object [][] {
160- {"Z" , 1 , -1 , ZoneId .of ("Z" )},
161- {"UTC" , 3 , -1 , ZoneId .of ("UTC" )},
162- {"UT" , 2 , -1 , ZoneId .of ("UT" )},
163- {"GMT" , 3 , -1 , ZoneId .of ("GMT" )},
164-
165- {"+00:00" , 6 , -1 , ZoneOffset .UTC },
166- {"UTC+00:00" , 9 , -1 , ZoneId .of ("UTC" )},
167- {"UT+00:00" , 8 , -1 , ZoneId .of ("UT" )},
168- {"GMT+00:00" , 9 , -1 , ZoneId .of ("GMT" )},
169- {"-00:00" , 6 , -1 , ZoneOffset .UTC },
170- {"UTC-00:00" , 9 , -1 , ZoneId .of ("UTC" )},
171- {"UT-00:00" , 8 , -1 , ZoneId .of ("UT" )},
172- {"GMT-00:00" , 9 , -1 , ZoneId .of ("GMT" )},
173-
174- {"+01:30" , 6 , -1 , ZoneOffset .ofHoursMinutes (1 , 30 )},
175- {"UTC+01:30" , 9 , -1 , ZoneId .of ("UTC+01:30" )},
176- {"UT+02:30" , 8 , -1 , ZoneId .of ("UT+02:30" )},
177- {"GMT+03:30" , 9 , -1 , ZoneId .of ("GMT+03:30" )},
178- {"-01:30" , 6 , -1 , ZoneOffset .ofHoursMinutes (-1 , -30 )},
179- {"UTC-01:30" , 9 , -1 , ZoneId .of ("UTC-01:30" )},
180- {"UT-02:30" , 8 , -1 , ZoneId .of ("UT-02:30" )},
181- {"GMT-03:30" , 9 , -1 , ZoneId .of ("GMT-03:30" )},
160+ {"Z" , 1 , -1 , ZoneId .of ("Z" ), true },
161+ {"UTC" , 3 , -1 , ZoneId .of ("UTC" ), false },
162+ {"UT" , 2 , -1 , ZoneId .of ("UT" ), false },
163+ {"GMT" , 3 , -1 , ZoneId .of ("GMT" ), false },
164+ {"GMT0" , 4 , -1 , ZoneId .of ("GMT0" ), false },
165+
166+ {"+00:00" , 6 , -1 , ZoneOffset .UTC , true },
167+ {"UTC+00:00" , 9 , -1 , ZoneId .of ("UTC" ), false },
168+ {"UT+00:00" , 8 , -1 , ZoneId .of ("UT" ), false },
169+ {"GMT+00:00" , 9 , -1 , ZoneId .of ("GMT" ), false },
170+ {"-00:00" , 6 , -1 , ZoneOffset .UTC , true },
171+ {"UTC-00:00" , 9 , -1 , ZoneId .of ("UTC" ), false },
172+ {"UT-00:00" , 8 , -1 , ZoneId .of ("UT" ), false },
173+ {"GMT-00:00" , 9 , -1 , ZoneId .of ("GMT" ), false },
174+
175+ {"+01:30" , 6 , -1 , ZoneOffset .ofHoursMinutes (1 , 30 ), true },
176+ {"UTC+01:30" , 9 , -1 , ZoneId .of ("UTC+01:30" ), false },
177+ {"UT+02:30" , 8 , -1 , ZoneId .of ("UT+02:30" ), false },
178+ {"GMT+03:30" , 9 , -1 , ZoneId .of ("GMT+03:30" ), false },
179+ {"-01:30" , 6 , -1 , ZoneOffset .ofHoursMinutes (-1 , -30 ), true },
180+ {"UTC-01:30" , 9 , -1 , ZoneId .of ("UTC-01:30" ), false },
181+ {"UT-02:30" , 8 , -1 , ZoneId .of ("UT-02:30" ), false },
182+ {"GMT-03:30" , 9 , -1 , ZoneId .of ("GMT-03:30" ), false },
182183
183184 // fallback to UTC
184- {"UTC-01:WW" , 3 , -1 , ZoneId .of ("UTC" )},
185- {"UT-02:WW" , 2 , -1 , ZoneId .of ("UT" )},
186- {"GMT-03:WW" , 3 , -1 , ZoneId .of ("GMT" )},
187- {"Z0" , 1 , -1 , ZoneOffset .UTC },
188- {"UTC1" , 3 , -1 , ZoneId .of ("UTC" )},
185+ {"UTC-01:WW" , 3 , -1 , ZoneId .of ("UTC" ), false },
186+ {"UT-02:WW" , 2 , -1 , ZoneId .of ("UT" ), false },
187+ {"GMT-03:WW" , 3 , -1 , ZoneId .of ("GMT" ), false },
188+ {"Z0" , 1 , -1 , ZoneOffset .UTC , true },
189+ {"UTC1" , 3 , -1 , ZoneId .of ("UTC" ), false },
189190
190191 // Z not parsed as zero
191- {"UTCZ" , 3 , -1 , ZoneId .of ("UTC" )},
192- {"UTZ" , 2 , -1 , ZoneId .of ("UT" )},
193- {"GMTZ" , 3 , -1 , ZoneId .of ("GMT" )},
192+ {"UTCZ" , 3 , -1 , ZoneId .of ("UTC" ), false },
193+ {"UTZ" , 2 , -1 , ZoneId .of ("UT" ), false },
194+ {"GMTZ" , 3 , -1 , ZoneId .of ("GMT" ), false },
194195
195196 // 0 not parsed
196- {"UTC0" , 3 , -1 , ZoneId .of ("UTC" )},
197- {"UT0" , 2 , -1 , ZoneId .of ("UT" )},
197+ {"UTC0" , 3 , -1 , ZoneId .of ("UTC" ), false },
198+ {"UT0" , 2 , -1 , ZoneId .of ("UT" ), false },
198199
199200 // fail to parse
200- {"" , 0 , 0 , null },
201- {"A" , 0 , 0 , null },
202- {"UZ" , 0 , 0 , null },
203- {"GMA" , 0 , 0 , null },
204- {"0" , 0 , 0 , null },
205- {"+" , 0 , 0 , null },
206- {"-" , 0 , 0 , null },
201+ {"" , 0 , 0 , null , false },
202+ {"A" , 0 , 0 , null , false },
203+ {"UZ" , 0 , 0 , null , false },
204+ {"GMA" , 0 , 0 , null , false },
205+ {"0" , 0 , 0 , null , false },
206+ {"+" , 0 , 0 , null , false },
207+ {"-" , 0 , 0 , null , false },
207208
208209 // zone IDs
209- {"Europe/London" , 13 , -1 , ZoneId .of ("Europe/London" )},
210- {"America/New_York" , 16 , -1 , ZoneId .of ("America/New_York" )},
211- {"America/Bogusville" , 0 , 0 , null },
210+ {"Europe/London" , 13 , -1 , ZoneId .of ("Europe/London" ), false },
211+ {"America/New_York" , 16 , -1 , ZoneId .of ("America/New_York" ), false },
212+ {"America/Bogusville" , 0 , 0 , null , false },
212213 };
213214 }
214215
215216 @ Test
216217 @ UseDataProvider ("data_parseSuccess" )
217- public void test_parseSuccess_plain (String text , int expectedIndex , int expectedErrorIndex , ZoneId expected ) {
218+ public void test_ZoneId_parseSuccess_plain (
219+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
220+ {
218221 builder .appendZoneId ();
219- TemporalAccessor parsed = builder .toFormatter ().parseUnresolved (text , pos );
220- assertEquals ("Incorrect error index parsing: " + text , pos .getErrorIndex (), expectedErrorIndex );
221- assertEquals ("Incorrect index parsing: " + text , pos .getIndex (), expectedIndex );
222- if (expected != null ) {
223- assertEquals ("Incorrect zoneId parsing: " + text , parsed .query (TemporalQueries .zoneId ()), expected );
224- assertEquals ("Incorrect offset parsing: " + text , parsed .query (TemporalQueries .offset ()), null );
225- assertEquals ("Incorrect zone parsing: " + text , parsed .query (TemporalQueries .zone ()), expected );
226- } else {
227- assertEquals (parsed , null );
228- }
222+ test (text , expectedIndex , expectedErrorIndex , expected , isZoneOffset );
229223 }
230224
231225 @ Test
232226 @ UseDataProvider ("data_parseSuccess" )
233- public void test_parseSuccess_prefix (String text , int expectedIndex , int expectedErrorIndex , ZoneId expected ) {
227+ public void test_ZoneId_parseSuccess_prefix (
228+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
229+ {
234230 builder .appendZoneId ();
235231 pos .setIndex (3 );
236- String prefixText = "XXX" + text ;
237- TemporalAccessor parsed = builder .toFormatter ().parseUnresolved (prefixText , pos );
238- assertEquals ("Incorrect error index parsing: " + prefixText , pos .getErrorIndex (), expectedErrorIndex >= 0 ? expectedErrorIndex + 3 : expectedErrorIndex );
239- assertEquals ("Incorrect index parsing: " + prefixText , pos .getIndex (), expectedIndex + 3 );
240- if (expected != null ) {
241- assertEquals ("Incorrect zoneId parsing: " + prefixText , parsed .query (TemporalQueries .zoneId ()), expected );
242- assertEquals ("Incorrect offset parsing: " + prefixText , parsed .query (TemporalQueries .offset ()), null );
243- assertEquals ("Incorrect zone parsing: " + prefixText , parsed .query (TemporalQueries .zone ()), expected );
244- } else {
245- assertEquals (parsed , null );
246- }
232+ test ("XXX" + text ,
233+ expectedIndex + 3 ,
234+ expectedErrorIndex >= 0 ? expectedErrorIndex + 3 : expectedErrorIndex ,
235+ expected , isZoneOffset );
247236 }
248237
249238 @ Test
250239 @ UseDataProvider ("data_parseSuccess" )
251- public void test_parseSuccess_suffix (String text , int expectedIndex , int expectedErrorIndex , ZoneId expected ) {
240+ public void test_ZoneId_parseSuccess_suffix (
241+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
242+ {
252243 builder .appendZoneId ();
253- String suffixText = text + "XXX" ;
254- TemporalAccessor parsed = builder .toFormatter ().parseUnresolved (suffixText , pos );
255- assertEquals ("Incorrect error index parsing: " + suffixText , pos .getErrorIndex (), expectedErrorIndex );
256- assertEquals ("Incorrect index parsing: " + suffixText , pos .getIndex (), expectedIndex );
257- if (expected != null ) {
258- assertEquals ("Incorrect zoneId parsing: " + suffixText , parsed .query (TemporalQueries .zoneId ()), expected );
259- assertEquals ("Incorrect offset parsing: " + suffixText , parsed .query (TemporalQueries .offset ()), null );
260- assertEquals ("Incorrect zone parsing: " + suffixText , parsed .query (TemporalQueries .zone ()), expected );
261- } else {
262- assertEquals (parsed , null );
263- }
244+ test (text + "XXX" , expectedIndex , expectedErrorIndex , expected , isZoneOffset );
264245 }
265246
266247 @ Test
267248 @ UseDataProvider ("data_parseSuccess" )
268- public void test_parseSuccess_caseSensitive (String text , int expectedIndex , int expectedErrorIndex , ZoneId expected ) {
249+ public void test_ZoneId_parseSuccess_caseSensitive (
250+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
251+ {
269252 builder .parseCaseSensitive ().appendZoneId ();
270- String lcText = text .toLowerCase (Locale .ENGLISH );
271- TemporalAccessor parsed = builder .toFormatter ().parseUnresolved (lcText , pos );
253+
272254 if (text .matches ("[^A-Z]*[A-Z].*" )) { // if input has letters
255+ String lcText = text .toLowerCase (Locale .ENGLISH );
256+ TemporalAccessor parsed = builder .toFormatter ().parseUnresolved (lcText , pos );
273257 assertEquals (pos .getErrorIndex () >= 0 , true );
274258 assertEquals (pos .getIndex (), 0 );
275259 assertEquals (parsed , null );
276260 } else {
277- // case sensitive made no difference
278- assertEquals ("Incorrect index parsing: " + lcText , pos .getIndex (), expectedIndex );
279- assertEquals ("Incorrect error index parsing: " + lcText , pos .getErrorIndex (), expectedErrorIndex );
280- if (expected != null ) {
281- assertEquals (parsed .query (TemporalQueries .zoneId ()), expected );
282- assertEquals (parsed .query (TemporalQueries .offset ()), null );
283- assertEquals (parsed .query (TemporalQueries .zone ()), expected );
284- } else {
285- assertEquals (parsed , null );
286- }
261+ test (text .toLowerCase (Locale .ENGLISH ), expectedIndex , expectedErrorIndex , expected , isZoneOffset );
287262 }
288263 }
289264
290265 @ Test
291266 @ UseDataProvider ("data_parseSuccess" )
292- public void test_parseSuccess_caseInsensitive (String text , int expectedIndex , int expectedErrorIndex , ZoneId expected ) {
267+ public void test_ZoneId_parseSuccess_caseInsensitive (
268+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
269+ {
293270 builder .parseCaseInsensitive ().appendZoneId ();
294- String lcText = text .toLowerCase (Locale .ENGLISH );
295- TemporalAccessor parsed = builder .toFormatter ().parseUnresolved (lcText , pos );
296- assertEquals ("Incorrect error index parsing: " + lcText , pos .getErrorIndex (), expectedErrorIndex );
297- assertEquals ("Incorrect index parsing: " + lcText , pos .getIndex (), expectedIndex );
271+ test (text .toLowerCase (Locale .ENGLISH ), expectedIndex , expectedErrorIndex , expected , isZoneOffset );
272+ }
273+
274+ @ Test
275+ @ UseDataProvider ("data_parseSuccess" )
276+ public void test_ZoneOrOffsetId_parseSuccess_plain (
277+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
278+ {
279+ builder .appendZoneOrOffsetId ();
280+ test (text , expectedIndex , expectedErrorIndex , expected , isZoneOffset );
281+ }
282+
283+ @ Test
284+ @ UseDataProvider ("data_parseSuccess" )
285+ public void test_ZoneOrOffsetId_parseSuccess_prefix (
286+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
287+ {
288+ builder .appendZoneOrOffsetId ();
289+ pos .setIndex (3 );
290+ test ("XXX" + text ,
291+ expectedIndex + 3 ,
292+ expectedErrorIndex >= 0 ? expectedErrorIndex + 3 : expectedErrorIndex ,
293+ expected , isZoneOffset );
294+ }
295+
296+ @ Test
297+ @ UseDataProvider ("data_parseSuccess" )
298+ public void test_ZoneOrOffsetId_parseSuccess_suffix (
299+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
300+ {
301+ builder .appendZoneOrOffsetId ();
302+ test (text + "XXX" , expectedIndex , expectedErrorIndex , expected , isZoneOffset );
303+ }
304+
305+ @ Test
306+ @ UseDataProvider ("data_parseSuccess" )
307+ public void test_ZoneOrOffsetId_parseSuccess_caseSensitive (
308+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
309+ {
310+ builder .parseCaseSensitive ().appendZoneOrOffsetId ();
311+ if (text .matches ("[^A-Z]*[A-Z].*" )) { // if input has letters
312+ String lcText = text .toLowerCase (Locale .ENGLISH );
313+ TemporalAccessor parsed = builder .toFormatter ().parseUnresolved (lcText , pos );
314+ assertEquals (pos .getErrorIndex () >= 0 , true );
315+ assertEquals (pos .getIndex (), 0 );
316+ assertEquals (parsed , null );
317+ } else {
318+ test (text .toLowerCase (Locale .ENGLISH ), expectedIndex , expectedErrorIndex , expected , isZoneOffset );
319+ }
320+ }
321+
322+ @ Test
323+ @ UseDataProvider ("data_parseSuccess" )
324+ public void test_ZoneOrOffsetIdparseSuccess_caseInsensitive (
325+ String text , int expectedIndex , int expectedErrorIndex , ZoneId expected , boolean isZoneOffset )
326+ {
327+ builder .parseCaseInsensitive ().appendZoneOrOffsetId ();
328+ test (text .toLowerCase (Locale .ENGLISH ), expectedIndex , expectedErrorIndex , expected , isZoneOffset );
329+ }
330+
331+ private void test (String text , int expectedIndex , int expectedErrorIndex , ZoneId expected ,
332+ boolean isZoneOffset ) {
333+ TemporalAccessor parsed = builder .toFormatter ().parseUnresolved (text , pos );
334+ assertEquals (pos .getErrorIndex (), expectedErrorIndex );
335+ assertEquals (pos .getIndex (), expectedIndex );
298336 if (expected != null ) {
299- ZoneId zid = parsed .query (TemporalQueries .zoneId ());
300- assertEquals ("Incorrect zoneId parsing: " + lcText , parsed .query (TemporalQueries .zoneId ()), expected );
301- assertEquals ("Incorrect offset parsing: " + lcText , parsed .query (TemporalQueries .offset ()), null );
302- assertEquals ("Incorrect zone parsing: " + lcText , parsed .query (TemporalQueries .zone ()), expected );
337+ assertEquals (parsed .query (TemporalQueries .zoneId ()),
338+ expected );
339+ assertEquals (parsed .query (TemporalQueries .offset ()),
340+ isZoneOffset ? expected : null );
341+ assertEquals (parsed .query (TemporalQueries .zone ()),
342+ expected );
303343 } else {
304344 assertEquals (parsed , null );
305345 }
306346 }
307347
308- }
348+ }
0 commit comments