• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
3  *
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  *  * Redistributions of source code must retain the above copyright notice,
10  *    this list of conditions and the following disclaimer.
11  *
12  *  * Redistributions in binary form must reproduce the above copyright notice,
13  *    this list of conditions and the following disclaimer in the documentation
14  *    and/or other materials provided with the distribution.
15  *
16  *  * Neither the name of JSR-310 nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 package org.threeten.bp;
33 
34 import static org.testng.Assert.assertEquals;
35 import static org.testng.Assert.assertNotNull;
36 import static org.testng.Assert.assertTrue;
37 import static org.testng.Assert.fail;
38 import static org.threeten.bp.temporal.ChronoField.AMPM_OF_DAY;
39 import static org.threeten.bp.temporal.ChronoField.CLOCK_HOUR_OF_AMPM;
40 import static org.threeten.bp.temporal.ChronoField.CLOCK_HOUR_OF_DAY;
41 import static org.threeten.bp.temporal.ChronoField.HOUR_OF_AMPM;
42 import static org.threeten.bp.temporal.ChronoField.HOUR_OF_DAY;
43 import static org.threeten.bp.temporal.ChronoField.MICRO_OF_DAY;
44 import static org.threeten.bp.temporal.ChronoField.MICRO_OF_SECOND;
45 import static org.threeten.bp.temporal.ChronoField.MILLI_OF_DAY;
46 import static org.threeten.bp.temporal.ChronoField.MILLI_OF_SECOND;
47 import static org.threeten.bp.temporal.ChronoField.MINUTE_OF_DAY;
48 import static org.threeten.bp.temporal.ChronoField.MINUTE_OF_HOUR;
49 import static org.threeten.bp.temporal.ChronoField.NANO_OF_DAY;
50 import static org.threeten.bp.temporal.ChronoField.NANO_OF_SECOND;
51 import static org.threeten.bp.temporal.ChronoField.SECOND_OF_DAY;
52 import static org.threeten.bp.temporal.ChronoField.SECOND_OF_MINUTE;
53 import static org.threeten.bp.temporal.ChronoUnit.DAYS;
54 import static org.threeten.bp.temporal.ChronoUnit.FOREVER;
55 import static org.threeten.bp.temporal.ChronoUnit.HALF_DAYS;
56 import static org.threeten.bp.temporal.ChronoUnit.HOURS;
57 import static org.threeten.bp.temporal.ChronoUnit.MICROS;
58 import static org.threeten.bp.temporal.ChronoUnit.MILLIS;
59 import static org.threeten.bp.temporal.ChronoUnit.MINUTES;
60 import static org.threeten.bp.temporal.ChronoUnit.MONTHS;
61 import static org.threeten.bp.temporal.ChronoUnit.NANOS;
62 import static org.threeten.bp.temporal.ChronoUnit.SECONDS;
63 import static org.threeten.bp.temporal.ChronoUnit.WEEKS;
64 import static org.threeten.bp.temporal.ChronoUnit.YEARS;
65 
66 import java.io.IOException;
67 import java.util.ArrayList;
68 import java.util.Arrays;
69 import java.util.EnumSet;
70 import java.util.Iterator;
71 import java.util.List;
72 
73 import org.testng.annotations.BeforeMethod;
74 import org.testng.annotations.DataProvider;
75 import org.testng.annotations.Test;
76 import org.threeten.bp.format.DateTimeFormatter;
77 import org.threeten.bp.format.DateTimeParseException;
78 import org.threeten.bp.temporal.ChronoField;
79 import org.threeten.bp.temporal.ChronoUnit;
80 import org.threeten.bp.temporal.JulianFields;
81 import org.threeten.bp.temporal.MockFieldNoValue;
82 import org.threeten.bp.temporal.Temporal;
83 import org.threeten.bp.temporal.TemporalAccessor;
84 import org.threeten.bp.temporal.TemporalAdjuster;
85 import org.threeten.bp.temporal.TemporalAmount;
86 import org.threeten.bp.temporal.TemporalField;
87 import org.threeten.bp.temporal.TemporalQueries;
88 import org.threeten.bp.temporal.TemporalUnit;
89 import org.threeten.bp.temporal.UnsupportedTemporalTypeException;
90 
91 /**
92  * Test LocalTime.
93  */
94 @Test
95 public class TestLocalTime extends AbstractDateTimeTest {
96 
97     private LocalTime TEST_12_30_40_987654321;
98 
99     private static final TemporalUnit[] INVALID_UNITS;
100     static {
101         EnumSet<ChronoUnit> set = EnumSet.range(WEEKS, FOREVER);
102         INVALID_UNITS = set.toArray(new TemporalUnit[set.size()]);
103     }
104 
105     @BeforeMethod
setUp()106     public void setUp() {
107         TEST_12_30_40_987654321 = LocalTime.of(12, 30, 40, 987654321);
108     }
109 
110     //-----------------------------------------------------------------------
111     @Override
samples()112     protected List<TemporalAccessor> samples() {
113         TemporalAccessor[] array = {TEST_12_30_40_987654321, LocalTime.MIN, LocalTime.MAX, LocalTime.MIDNIGHT, LocalTime.NOON};
114         return Arrays.asList(array);
115     }
116 
117     @Override
validFields()118     protected List<TemporalField> validFields() {
119         TemporalField[] array = {
120             NANO_OF_SECOND,
121             NANO_OF_DAY,
122             MICRO_OF_SECOND,
123             MICRO_OF_DAY,
124             MILLI_OF_SECOND,
125             MILLI_OF_DAY,
126             SECOND_OF_MINUTE,
127             SECOND_OF_DAY,
128             MINUTE_OF_HOUR,
129             MINUTE_OF_DAY,
130             CLOCK_HOUR_OF_AMPM,
131             HOUR_OF_AMPM,
132             CLOCK_HOUR_OF_DAY,
133             HOUR_OF_DAY,
134             AMPM_OF_DAY,
135         };
136         return Arrays.asList(array);
137     }
138 
139     @Override
invalidFields()140     protected List<TemporalField> invalidFields() {
141         List<TemporalField> list = new ArrayList<TemporalField>(Arrays.<TemporalField>asList(ChronoField.values()));
142         list.removeAll(validFields());
143         list.add(JulianFields.JULIAN_DAY);
144         list.add(JulianFields.MODIFIED_JULIAN_DAY);
145         list.add(JulianFields.RATA_DIE);
146         return list;
147     }
148 
149     //-----------------------------------------------------------------------
150     @Test
test_serialization_format()151     public void test_serialization_format() throws ClassNotFoundException, IOException {
152         assertEqualsSerialisedForm(LocalTime.of(22, 17, 59, 460 * 1000000));
153     }
154 
155     @Test
test_serialization()156     public void test_serialization() throws IOException, ClassNotFoundException {
157         assertSerializable(TEST_12_30_40_987654321);
158     }
159 
160     //-----------------------------------------------------------------------
check(LocalTime time, int h, int m, int s, int n)161     private void check(LocalTime time, int h, int m, int s, int n) {
162         assertEquals(time.getHour(), h);
163         assertEquals(time.getMinute(), m);
164         assertEquals(time.getSecond(), s);
165         assertEquals(time.getNano(), n);
166     }
167 
168     //-----------------------------------------------------------------------
169     @Test
constant_MIDNIGHT()170     public void constant_MIDNIGHT() {
171         check(LocalTime.MIDNIGHT, 0, 0, 0, 0);
172     }
173 
174     @Test
constant_MIDNIGHT_equal()175     public void constant_MIDNIGHT_equal() {
176         assertEquals(LocalTime.MIDNIGHT, LocalTime.MIDNIGHT);
177         assertEquals(LocalTime.MIDNIGHT, LocalTime.of(0, 0));
178     }
179 
180     @Test
constant_MIDDAY()181     public void constant_MIDDAY() {
182         check(LocalTime.NOON, 12, 0, 0, 0);
183     }
184 
185     @Test
constant_MIDDAY_equal()186     public void constant_MIDDAY_equal() {
187         assertEquals(LocalTime.NOON, LocalTime.NOON);
188         assertEquals(LocalTime.NOON, LocalTime.of(12, 0));
189     }
190 
191     //-----------------------------------------------------------------------
192     @Test
constant_MIN_TIME()193     public void constant_MIN_TIME() {
194         check(LocalTime.MIN, 0, 0, 0, 0);
195     }
196 
197     @Test
constant_MIN_TIME_equal()198     public void constant_MIN_TIME_equal() {
199         assertEquals(LocalTime.MIN, LocalTime.of(0, 0));
200     }
201 
202     @Test
constant_MAX_TIME()203     public void constant_MAX_TIME() {
204         check(LocalTime.MAX, 23, 59, 59, 999999999);
205     }
206 
207     @Test
constant_MAX_TIME_equal()208     public void constant_MAX_TIME_equal() {
209         assertEquals(LocalTime.NOON, LocalTime.NOON);
210         assertEquals(LocalTime.NOON, LocalTime.of(12, 0));
211     }
212 
213     //-----------------------------------------------------------------------
214     // now()
215     //-----------------------------------------------------------------------
216     @Test
now()217     public void now() {
218         LocalTime expected = LocalTime.now(Clock.systemDefaultZone());
219         LocalTime test = LocalTime.now();
220         long diff = Math.abs(test.toNanoOfDay() - expected.toNanoOfDay());
221         assertTrue(diff < 100000000);  // less than 0.1 secs
222     }
223 
224     //-----------------------------------------------------------------------
225     // now(ZoneId)
226     //-----------------------------------------------------------------------
227     @Test(expectedExceptions=NullPointerException.class)
228     public void now_ZoneId_nullZoneId() {
229         LocalTime.now((ZoneId) null);
230     }
231 
232     @Test
233     public void now_ZoneId() {
234         ZoneId zone = ZoneId.of("UTC+01:02:03");
235         LocalTime expected = LocalTime.now(Clock.system(zone));
236         LocalTime test = LocalTime.now(zone);
237         for (int i = 0; i < 100; i++) {
238             if (expected.equals(test)) {
239                 return;
240             }
241             expected = LocalTime.now(Clock.system(zone));
242             test = LocalTime.now(zone);
243         }
244         assertEquals(test, expected);
245     }
246 
247     //-----------------------------------------------------------------------
248     // now(Clock)
249     //-----------------------------------------------------------------------
250     @Test(expectedExceptions=NullPointerException.class)
251     public void now_Clock_nullClock() {
252         LocalTime.now((Clock) null);
253     }
254 
255     @Test
256     public void now_Clock_allSecsInDay() {
257         for (int i = 0; i < (2 * 24 * 60 * 60); i++) {
258             Instant instant = Instant.ofEpochSecond(i, 8);
259             Clock clock = Clock.fixed(instant, ZoneOffset.UTC);
260             LocalTime test = LocalTime.now(clock);
261             assertEquals(test.getHour(), (i / (60 * 60)) % 24);
262             assertEquals(test.getMinute(), (i / 60) % 60);
263             assertEquals(test.getSecond(), i % 60);
264             assertEquals(test.getNano(), 8);
265         }
266     }
267 
268     @Test
269     public void now_Clock_beforeEpoch() {
270         for (int i =-1; i >= -(24 * 60 * 60); i--) {
271             Instant instant = Instant.ofEpochSecond(i, 8);
272             Clock clock = Clock.fixed(instant, ZoneOffset.UTC);
273             LocalTime test = LocalTime.now(clock);
274             assertEquals(test.getHour(), ((i + 24 * 60 * 60) / (60 * 60)) % 24);
275             assertEquals(test.getMinute(), ((i + 24 * 60 * 60) / 60) % 60);
276             assertEquals(test.getSecond(), (i + 24 * 60 * 60) % 60);
277             assertEquals(test.getNano(), 8);
278         }
279     }
280 
281     //-----------------------------------------------------------------------
282     @Test
283     public void now_Clock_max() {
284         Clock clock = Clock.fixed(Instant.MAX, ZoneOffset.UTC);
285         LocalTime test = LocalTime.now(clock);
286         assertEquals(test.getHour(), 23);
287         assertEquals(test.getMinute(), 59);
288         assertEquals(test.getSecond(), 59);
289         assertEquals(test.getNano(), 999999999);
290     }
291 
292     @Test
293     public void now_Clock_min() {
294         Clock clock = Clock.fixed(Instant.MIN, ZoneOffset.UTC);
295         LocalTime test = LocalTime.now(clock);
296         assertEquals(test.getHour(), 0);
297         assertEquals(test.getMinute(), 0);
298         assertEquals(test.getSecond(), 0);
299         assertEquals(test.getNano(), 0);
300     }
301 
302     //-----------------------------------------------------------------------
303     // of() factories
304     //-----------------------------------------------------------------------
305     @Test
306     public void factory_time_2ints() {
307         LocalTime test = LocalTime.of(12, 30);
308         check(test, 12, 30, 0, 0);
309     }
310 
311     @Test(expectedExceptions=DateTimeException.class)
312     public void factory_time_2ints_hourTooLow() {
313         LocalTime.of(-1, 0);
314     }
315 
316     @Test(expectedExceptions=DateTimeException.class)
317     public void factory_time_2ints_hourTooHigh() {
318         LocalTime.of(24, 0);
319     }
320 
321     @Test(expectedExceptions=DateTimeException.class)
322     public void factory_time_2ints_minuteTooLow() {
323         LocalTime.of(0, -1);
324     }
325 
326     @Test(expectedExceptions=DateTimeException.class)
327     public void factory_time_2ints_minuteTooHigh() {
328         LocalTime.of(0, 60);
329     }
330 
331     //-----------------------------------------------------------------------
332     @Test
333     public void factory_time_3ints() {
334         LocalTime test = LocalTime.of(12, 30, 40);
335         check(test, 12, 30, 40, 0);
336     }
337 
338     @Test(expectedExceptions=DateTimeException.class)
339     public void factory_time_3ints_hourTooLow() {
340         LocalTime.of(-1, 0, 0);
341     }
342 
343     @Test(expectedExceptions=DateTimeException.class)
344     public void factory_time_3ints_hourTooHigh() {
345         LocalTime.of(24, 0, 0);
346     }
347 
348     @Test(expectedExceptions=DateTimeException.class)
349     public void factory_time_3ints_minuteTooLow() {
350         LocalTime.of(0, -1, 0);
351     }
352 
353     @Test(expectedExceptions=DateTimeException.class)
354     public void factory_time_3ints_minuteTooHigh() {
355         LocalTime.of(0, 60, 0);
356     }
357 
358     @Test(expectedExceptions=DateTimeException.class)
359     public void factory_time_3ints_secondTooLow() {
360         LocalTime.of(0, 0, -1);
361     }
362 
363     @Test(expectedExceptions=DateTimeException.class)
364     public void factory_time_3ints_secondTooHigh() {
365         LocalTime.of(0, 0, 60);
366     }
367 
368     //-----------------------------------------------------------------------
369     @Test
370     public void factory_time_4ints() {
371         LocalTime test = LocalTime.of(12, 30, 40, 987654321);
372         check(test, 12, 30, 40, 987654321);
373         test = LocalTime.of(12, 0, 40, 987654321);
374         check(test, 12, 0, 40, 987654321);
375     }
376 
377     @Test(expectedExceptions=DateTimeException.class)
378     public void factory_time_4ints_hourTooLow() {
379         LocalTime.of(-1, 0, 0, 0);
380     }
381 
382     @Test(expectedExceptions=DateTimeException.class)
383     public void factory_time_4ints_hourTooHigh() {
384         LocalTime.of(24, 0, 0, 0);
385     }
386 
387     @Test(expectedExceptions=DateTimeException.class)
388     public void factory_time_4ints_minuteTooLow() {
389         LocalTime.of(0, -1, 0, 0);
390     }
391 
392     @Test(expectedExceptions=DateTimeException.class)
393     public void factory_time_4ints_minuteTooHigh() {
394         LocalTime.of(0, 60, 0, 0);
395     }
396 
397     @Test(expectedExceptions=DateTimeException.class)
398     public void factory_time_4ints_secondTooLow() {
399         LocalTime.of(0, 0, -1, 0);
400     }
401 
402     @Test(expectedExceptions=DateTimeException.class)
403     public void factory_time_4ints_secondTooHigh() {
404         LocalTime.of(0, 0, 60, 0);
405     }
406 
407     @Test(expectedExceptions=DateTimeException.class)
408     public void factory_time_4ints_nanoTooLow() {
409         LocalTime.of(0, 0, 0, -1);
410     }
411 
412     @Test(expectedExceptions=DateTimeException.class)
413     public void factory_time_4ints_nanoTooHigh() {
414         LocalTime.of(0, 0, 0, 1000000000);
415     }
416 
417     //-----------------------------------------------------------------------
418     // ofSecondOfDay(long)
419     //-----------------------------------------------------------------------
420     @Test
421     public void factory_ofSecondOfDay() {
422         LocalTime localTime = LocalTime.ofSecondOfDay(2 * 60 * 60 + 17 * 60 + 23);
423         check(localTime, 2, 17, 23, 0);
424     }
425 
426     @Test(expectedExceptions=DateTimeException.class)
427     public void factory_ofSecondOfDay_tooLow() {
428         LocalTime.ofSecondOfDay(-1);
429     }
430 
431     @Test(expectedExceptions=DateTimeException.class)
432     public void factory_ofSecondOfDay_tooHigh() {
433         LocalTime.ofSecondOfDay(24 * 60 * 60);
434     }
435 
436     //-----------------------------------------------------------------------
437     // ofSecondOfDay(long, int)
438     //-----------------------------------------------------------------------
439     @Test
440     public void factory_ofSecondOfDay_long_int() {
441         LocalTime localTime = LocalTime.ofSecondOfDay(2 * 60 * 60 + 17 * 60 + 23, 987);
442         check(localTime, 2, 17, 23, 987);
443     }
444 
445     @Test(expectedExceptions=DateTimeException.class)
446     public void factory_ofSecondOfDay_long_int_tooLowSecs() {
447         LocalTime.ofSecondOfDay(-1, 0);
448     }
449 
450     @Test(expectedExceptions=DateTimeException.class)
451     public void factory_ofSecondOfDay_long_int_tooHighSecs() {
452         LocalTime.ofSecondOfDay(24 * 60 * 60, 0);
453     }
454 
455     @Test(expectedExceptions=DateTimeException.class)
456     public void factory_ofSecondOfDay_long_int_tooLowNanos() {
457         LocalTime.ofSecondOfDay(0, -1);
458     }
459 
460     @Test(expectedExceptions=DateTimeException.class)
461     public void factory_ofSecondOfDay_long_int_tooHighNanos() {
462         LocalTime.ofSecondOfDay(0, 1000000000);
463     }
464 
465     //-----------------------------------------------------------------------
466     // ofNanoOfDay(long)
467     //-----------------------------------------------------------------------
468     @Test
469     public void factory_ofNanoOfDay() {
470         LocalTime localTime = LocalTime.ofNanoOfDay(60 * 60 * 1000000000L + 17);
471         check(localTime, 1, 0, 0, 17);
472     }
473 
474     @Test(expectedExceptions=DateTimeException.class)
475     public void factory_ofNanoOfDay_tooLow() {
476         LocalTime.ofNanoOfDay(-1);
477     }
478 
479     @Test(expectedExceptions=DateTimeException.class)
480     public void factory_ofNanoOfDay_tooHigh() {
481         LocalTime.ofNanoOfDay(24 * 60 * 60 * 1000000000L);
482     }
483 
484     //-----------------------------------------------------------------------
485     // from()
486     //-----------------------------------------------------------------------
487     @Test
488     public void factory_from_DateTimeAccessor() {
489         assertEquals(LocalTime.from(LocalTime.of(17, 30)), LocalTime.of(17, 30));
490         assertEquals(LocalTime.from(LocalDateTime.of(2012, 5, 1, 17, 30)), LocalTime.of(17, 30));
491     }
492 
493     @Test(expectedExceptions=DateTimeException.class)
494     public void factory_from_DateTimeAccessor_invalid_noDerive() {
495         LocalTime.from(LocalDate.of(2007, 7, 15));
496     }
497 
498     @Test(expectedExceptions=NullPointerException.class)
499     public void factory_from_DateTimeAccessor_null() {
500         LocalTime.from((TemporalAccessor) null);
501     }
502 
503     //-----------------------------------------------------------------------
504     // parse()
505     //-----------------------------------------------------------------------
506     @Test(dataProvider = "sampleToString")
507     public void factory_parse_validText(int h, int m, int s, int n, String parsable) {
508         LocalTime t = LocalTime.parse(parsable);
509         assertNotNull(t, parsable);
510         assertEquals(t.getHour(), h);
511         assertEquals(t.getMinute(), m);
512         assertEquals(t.getSecond(), s);
513         assertEquals(t.getNano(), n);
514     }
515 
516     @DataProvider(name="sampleBadParse")
517     Object[][] provider_sampleBadParse() {
518         return new Object[][]{
519                 {"00;00"},
520                 {"12-00"},
521                 {"-01:00"},
522                 {"00:00:00-09"},
523                 {"00:00:00,09"},
524                 {"00:00:abs"},
525                 {"11"},
526                 {"11:30+01:00"},
527                 {"11:30+01:00[Europe/Paris]"},
528         };
529     }
530 
531     @Test(dataProvider = "sampleBadParse", expectedExceptions={DateTimeParseException.class})
532     public void factory_parse_invalidText(String unparsable) {
533         LocalTime.parse(unparsable);
534     }
535 
536     //-----------------------------------------------------------------------s
537     @Test(expectedExceptions=DateTimeParseException.class)
538     public void factory_parse_illegalHour() {
539         LocalTime.parse("25:00");
540     }
541 
542     @Test(expectedExceptions=DateTimeParseException.class)
543     public void factory_parse_illegalMinute() {
544         LocalTime.parse("12:60");
545     }
546 
547     @Test(expectedExceptions=DateTimeParseException.class)
548     public void factory_parse_illegalSecond() {
549         LocalTime.parse("12:12:60");
550     }
551 
552     //-----------------------------------------------------------------------s
553     @Test(expectedExceptions = {NullPointerException.class})
554     public void factory_parse_nullTest() {
555         LocalTime.parse((String) null);
556     }
557 
558     //-----------------------------------------------------------------------
559     // parse(DateTimeFormatter)
560     //-----------------------------------------------------------------------
561     @Test
562     public void factory_parse_formatter() {
563         DateTimeFormatter f = DateTimeFormatter.ofPattern("H m s");
564         LocalTime test = LocalTime.parse("14 30 40", f);
565         assertEquals(test, LocalTime.of(14, 30, 40));
566     }
567 
568     @Test(expectedExceptions=NullPointerException.class)
569     public void factory_parse_formatter_nullText() {
570         DateTimeFormatter f = DateTimeFormatter.ofPattern("H m s");
571         LocalTime.parse((String) null, f);
572     }
573 
574     @Test(expectedExceptions=NullPointerException.class)
575     public void factory_parse_formatter_nullFormatter() {
576         LocalTime.parse("ANY", null);
577     }
578 
579     //-----------------------------------------------------------------------
580     // get(TemporalField)
581     //-----------------------------------------------------------------------
582     @Test
583     public void test_get_TemporalField() {
584         LocalTime test = TEST_12_30_40_987654321;
585         assertEquals(test.get(ChronoField.HOUR_OF_DAY), 12);
586         assertEquals(test.get(ChronoField.MINUTE_OF_HOUR), 30);
587         assertEquals(test.get(ChronoField.SECOND_OF_MINUTE), 40);
588         assertEquals(test.get(ChronoField.NANO_OF_SECOND), 987654321);
589 
590         assertEquals(test.get(ChronoField.SECOND_OF_DAY), 12 * 3600 + 30 * 60 + 40);
591         assertEquals(test.get(ChronoField.MINUTE_OF_DAY), 12 * 60 + 30);
592         assertEquals(test.get(ChronoField.HOUR_OF_AMPM), 0);
593         assertEquals(test.get(ChronoField.CLOCK_HOUR_OF_AMPM), 12);
594         assertEquals(test.get(ChronoField.CLOCK_HOUR_OF_DAY), 12);
595         assertEquals(test.get(ChronoField.AMPM_OF_DAY), 1);
596     }
597 
598     @Test(expectedExceptions=DateTimeException.class)
599     public void test_get_TemporalField_tooBig() {
600         TEST_12_30_40_987654321.get(NANO_OF_DAY);
601     }
602 
603     @Test(expectedExceptions=NullPointerException.class)
604     public void test_get_TemporalField_null() {
605         TEST_12_30_40_987654321.get((TemporalField) null);
606     }
607 
608     @Test(expectedExceptions=DateTimeException.class)
609     public void test_get_TemporalField_invalidField() {
610         TEST_12_30_40_987654321.get(MockFieldNoValue.INSTANCE);
611     }
612 
613     @Test(expectedExceptions=DateTimeException.class)
614     public void test_get_TemporalField_dateField() {
615         TEST_12_30_40_987654321.get(ChronoField.DAY_OF_MONTH);
616     }
617 
618     //-----------------------------------------------------------------------
619     // getLong(TemporalField)
620     //-----------------------------------------------------------------------
621     @Test
622     public void test_getLong_TemporalField() {
623         LocalTime test = TEST_12_30_40_987654321;
624         assertEquals(test.getLong(ChronoField.HOUR_OF_DAY), 12);
625         assertEquals(test.getLong(ChronoField.MINUTE_OF_HOUR), 30);
626         assertEquals(test.getLong(ChronoField.SECOND_OF_MINUTE), 40);
627         assertEquals(test.getLong(ChronoField.NANO_OF_SECOND), 987654321);
628 
629         assertEquals(test.getLong(ChronoField.NANO_OF_DAY), ((12 * 3600 + 30 * 60 + 40) * 1000000000L) + 987654321);
630         assertEquals(test.getLong(ChronoField.SECOND_OF_DAY), 12 * 3600 + 30 * 60 + 40);
631         assertEquals(test.getLong(ChronoField.MINUTE_OF_DAY), 12 * 60 + 30);
632         assertEquals(test.getLong(ChronoField.HOUR_OF_AMPM), 0);
633         assertEquals(test.getLong(ChronoField.CLOCK_HOUR_OF_AMPM), 12);
634         assertEquals(test.getLong(ChronoField.CLOCK_HOUR_OF_DAY), 12);
635         assertEquals(test.getLong(ChronoField.AMPM_OF_DAY), 1);
636     }
637 
638     @Test(expectedExceptions=NullPointerException.class)
639     public void test_getLong_TemporalField_null() {
640         TEST_12_30_40_987654321.getLong((TemporalField) null);
641     }
642 
643     @Test(expectedExceptions=DateTimeException.class)
644     public void test_getLong_TemporalField_invalidField() {
645         TEST_12_30_40_987654321.getLong(MockFieldNoValue.INSTANCE);
646     }
647 
648     @Test(expectedExceptions=DateTimeException.class)
649     public void test_getLong_TemporalField_dateField() {
650         TEST_12_30_40_987654321.getLong(ChronoField.DAY_OF_MONTH);
651     }
652 
653     //-----------------------------------------------------------------------
654     // query(TemporalQuery)
655     //-----------------------------------------------------------------------
656     @Test
657     public void test_query() {
658         assertEquals(TEST_12_30_40_987654321.query(TemporalQueries.chronology()), null);
659         assertEquals(TEST_12_30_40_987654321.query(TemporalQueries.localDate()), null);
660         assertEquals(TEST_12_30_40_987654321.query(TemporalQueries.localTime()), TEST_12_30_40_987654321);
661         assertEquals(TEST_12_30_40_987654321.query(TemporalQueries.offset()), null);
662         assertEquals(TEST_12_30_40_987654321.query(TemporalQueries.precision()), ChronoUnit.NANOS);
663         assertEquals(TEST_12_30_40_987654321.query(TemporalQueries.zone()), null);
664         assertEquals(TEST_12_30_40_987654321.query(TemporalQueries.zoneId()), null);
665     }
666 
667     @Test(expectedExceptions=NullPointerException.class)
668     public void test_query_null() {
669         TEST_12_30_40_987654321.query(null);
670     }
671 
672     //-----------------------------------------------------------------------
673     // get*()
674     //-----------------------------------------------------------------------
675     @DataProvider(name="sampleTimes")
676     Object[][] provider_sampleTimes() {
677         return new Object[][] {
678             {0, 0, 0, 0},
679             {0, 0, 0, 1},
680             {0, 0, 1, 0},
681             {0, 0, 1, 1},
682             {0, 1, 0, 0},
683             {0, 1, 0, 1},
684             {0, 1, 1, 0},
685             {0, 1, 1, 1},
686             {1, 0, 0, 0},
687             {1, 0, 0, 1},
688             {1, 0, 1, 0},
689             {1, 0, 1, 1},
690             {1, 1, 0, 0},
691             {1, 1, 0, 1},
692             {1, 1, 1, 0},
693             {1, 1, 1, 1},
694         };
695     }
696 
697     //-----------------------------------------------------------------------
698     @Test(dataProvider="sampleTimes")
699     public void test_get(int h, int m, int s, int ns) {
700         LocalTime a = LocalTime.of(h, m, s, ns);
701         assertEquals(a.getHour(), h);
702         assertEquals(a.getMinute(), m);
703         assertEquals(a.getSecond(), s);
704         assertEquals(a.getNano(), ns);
705     }
706 
707     //-----------------------------------------------------------------------
708     // with()
709     //-----------------------------------------------------------------------
710     @Test
711     public void test_with_adjustment() {
712         final LocalTime sample = LocalTime.of(23, 5);
713         TemporalAdjuster adjuster = new TemporalAdjuster() {
714             @Override
715             public Temporal adjustInto(Temporal dateTime) {
716                 return sample;
717             }
718         };
719         assertEquals(TEST_12_30_40_987654321.with(adjuster), sample);
720     }
721 
722     @Test(expectedExceptions=NullPointerException.class)
723     public void test_with_adjustment_null() {
724         TEST_12_30_40_987654321.with((TemporalAdjuster) null);
725     }
726 
727     //-----------------------------------------------------------------------
728     // withHour()
729     //-----------------------------------------------------------------------
730     @Test
731     public void test_withHour_normal() {
732         LocalTime t = TEST_12_30_40_987654321;
733         for (int i = 0; i < 24; i++) {
734             t = t.withHour(i);
735             assertEquals(t.getHour(), i);
736         }
737     }
738 
739     @Test
740     public void test_withHour_noChange_equal() {
741         LocalTime t = TEST_12_30_40_987654321.withHour(12);
742         assertEquals(t, TEST_12_30_40_987654321);
743     }
744 
745     @Test
746     public void test_withHour_toMidnight_equal() {
747         LocalTime t = LocalTime.of(1, 0).withHour(0);
748         assertEquals(t, LocalTime.MIDNIGHT);
749     }
750 
751     @Test
752     public void test_withHour_toMidday_equal() {
753         LocalTime t = LocalTime.of(1, 0).withHour(12);
754         assertEquals(t, LocalTime.NOON);
755     }
756 
757     @Test(expectedExceptions=DateTimeException.class)
758     public void test_withHour_hourTooLow() {
759         TEST_12_30_40_987654321.withHour(-1);
760     }
761 
762     @Test(expectedExceptions=DateTimeException.class)
763     public void test_withHour_hourTooHigh() {
764         TEST_12_30_40_987654321.withHour(24);
765     }
766 
767     //-----------------------------------------------------------------------
768     // withMinute()
769     //-----------------------------------------------------------------------
770     @Test
771     public void test_withMinute_normal() {
772         LocalTime t = TEST_12_30_40_987654321;
773         for (int i = 0; i < 60; i++) {
774             t = t.withMinute(i);
775             assertEquals(t.getMinute(), i);
776         }
777     }
778 
779     @Test
780     public void test_withMinute_noChange_equal() {
781         LocalTime t = TEST_12_30_40_987654321.withMinute(30);
782         assertEquals(t, TEST_12_30_40_987654321);
783     }
784 
785     @Test
786     public void test_withMinute_toMidnight_equal() {
787         LocalTime t = LocalTime.of(0, 1).withMinute(0);
788         assertEquals(t, LocalTime.MIDNIGHT);
789     }
790 
791     @Test
792     public void test_withMinute_toMidday_equals() {
793         LocalTime t = LocalTime.of(12, 1).withMinute(0);
794         assertEquals(t, LocalTime.NOON);
795     }
796 
797     @Test(expectedExceptions=DateTimeException.class)
798     public void test_withMinute_minuteTooLow() {
799         TEST_12_30_40_987654321.withMinute(-1);
800     }
801 
802     @Test(expectedExceptions=DateTimeException.class)
803     public void test_withMinute_minuteTooHigh() {
804         TEST_12_30_40_987654321.withMinute(60);
805     }
806 
807     //-----------------------------------------------------------------------
808     // withSecond()
809     //-----------------------------------------------------------------------
810     @Test
811     public void test_withSecond_normal() {
812         LocalTime t = TEST_12_30_40_987654321;
813         for (int i = 0; i < 60; i++) {
814             t = t.withSecond(i);
815             assertEquals(t.getSecond(), i);
816         }
817     }
818 
819     @Test
820     public void test_withSecond_noChange_equal() {
821         LocalTime t = TEST_12_30_40_987654321.withSecond(40);
822         assertEquals(t, TEST_12_30_40_987654321);
823     }
824 
825     @Test
826     public void test_withSecond_toMidnight_equal() {
827         LocalTime t = LocalTime.of(0, 0, 1).withSecond(0);
828         assertEquals(t, LocalTime.MIDNIGHT);
829     }
830 
831     @Test
832     public void test_withSecond_toMidday_equal() {
833         LocalTime t = LocalTime.of(12, 0, 1).withSecond(0);
834         assertEquals(t, LocalTime.NOON);
835     }
836 
837     @Test(expectedExceptions=DateTimeException.class)
838     public void test_withSecond_secondTooLow() {
839         TEST_12_30_40_987654321.withSecond(-1);
840     }
841 
842     @Test(expectedExceptions=DateTimeException.class)
843     public void test_withSecond_secondTooHigh() {
844         TEST_12_30_40_987654321.withSecond(60);
845     }
846 
847     //-----------------------------------------------------------------------
848     // withNano()
849     //-----------------------------------------------------------------------
850     @Test
851     public void test_withNanoOfSecond_normal() {
852         LocalTime t = TEST_12_30_40_987654321;
853         t = t.withNano(1);
854         assertEquals(t.getNano(), 1);
855         t = t.withNano(10);
856         assertEquals(t.getNano(), 10);
857         t = t.withNano(100);
858         assertEquals(t.getNano(), 100);
859         t = t.withNano(999999999);
860         assertEquals(t.getNano(), 999999999);
861     }
862 
863     @Test
864     public void test_withNanoOfSecond_noChange_equal() {
865         LocalTime t = TEST_12_30_40_987654321.withNano(987654321);
866         assertEquals(t, TEST_12_30_40_987654321);
867     }
868 
869     @Test
870     public void test_withNanoOfSecond_toMidnight_equal() {
871         LocalTime t = LocalTime.of(0, 0, 0, 1).withNano(0);
872         assertEquals(t, LocalTime.MIDNIGHT);
873     }
874 
875     @Test
876     public void test_withNanoOfSecond_toMidday_equal() {
877         LocalTime t = LocalTime.of(12, 0, 0, 1).withNano(0);
878         assertEquals(t, LocalTime.NOON);
879     }
880 
881     @Test(expectedExceptions=DateTimeException.class)
882     public void test_withNanoOfSecond_nanoTooLow() {
883         TEST_12_30_40_987654321.withNano(-1);
884     }
885 
886     @Test(expectedExceptions=DateTimeException.class)
887     public void test_withNanoOfSecond_nanoTooHigh() {
888         TEST_12_30_40_987654321.withNano(1000000000);
889     }
890 
891     //-----------------------------------------------------------------------
892     // truncated(TemporalUnit)
893     //-----------------------------------------------------------------------
894     TemporalUnit NINETY_MINS = new TemporalUnit() {
895         @Override
896         public String toString() {
897             return "NinetyMins";
898         }
899         @Override
900         public Duration getDuration() {
901             return Duration.ofMinutes(90);
902         }
903         @Override
904         public boolean isDurationEstimated() {
905             return false;
906         }
907         @Override
908         public boolean isDateBased() {
909             return false;
910         }
911         @Override
912         public boolean isTimeBased() {
913             return true;
914         }
915         @Override
916         public boolean isSupportedBy(Temporal temporal) {
917             return false;
918         }
919         @Override
920         public <R extends Temporal> R addTo(R r, long l) {
921             throw new UnsupportedOperationException();
922         }
923         @Override
924         public long between(Temporal r, Temporal r2) {
925             throw new UnsupportedOperationException();
926         }
927     };
928 
929     TemporalUnit NINETY_FIVE_MINS = new TemporalUnit() {
930         @Override
931         public String toString() {
932             return "NinetyFiveMins";
933         }
934         @Override
935         public Duration getDuration() {
936             return Duration.ofMinutes(95);
937         }
938         @Override
939         public boolean isDurationEstimated() {
940             return false;
941         }
942         @Override
943         public boolean isDateBased() {
944             return false;
945         }
946         @Override
947         public boolean isTimeBased() {
948             return true;
949         }
950         @Override
951         public boolean isSupportedBy(Temporal temporal) {
952             return false;
953         }
954         @Override
955         public <R extends Temporal> R addTo(R r, long l) {
956             throw new UnsupportedOperationException();
957         }
958         @Override
959         public long between(Temporal r, Temporal r2) {
960             throw new UnsupportedOperationException();
961         }
962     };
963 
964     @DataProvider(name="truncatedToValid")
965     Object[][] data_truncatedToValid() {
966         return new Object[][] {
967             {LocalTime.of(1, 2, 3, 123456789), NANOS, LocalTime.of(1, 2, 3, 123456789)},
968             {LocalTime.of(1, 2, 3, 123456789), MICROS, LocalTime.of(1, 2, 3, 123456000)},
969             {LocalTime.of(1, 2, 3, 123456789), MILLIS, LocalTime.of(1, 2, 3, 123000000)},
970             {LocalTime.of(1, 2, 3, 123456789), SECONDS, LocalTime.of(1, 2, 3)},
971             {LocalTime.of(1, 2, 3, 123456789), MINUTES, LocalTime.of(1, 2)},
972             {LocalTime.of(1, 2, 3, 123456789), HOURS, LocalTime.of(1, 0)},
973             {LocalTime.of(1, 2, 3, 123456789), DAYS, LocalTime.MIDNIGHT},
974 
975             {LocalTime.of(1, 1, 1, 123456789), NINETY_MINS, LocalTime.of(0, 0)},
976             {LocalTime.of(2, 1, 1, 123456789), NINETY_MINS, LocalTime.of(1, 30)},
977             {LocalTime.of(3, 1, 1, 123456789), NINETY_MINS, LocalTime.of(3, 0)},
978         };
979     }
980 
981     @Test(groups={"tck"}, dataProvider="truncatedToValid")
982     public void test_truncatedTo_valid(LocalTime input, TemporalUnit unit, LocalTime expected) {
983         assertEquals(input.truncatedTo(unit), expected);
984     }
985 
986     @DataProvider(name="truncatedToInvalid")
987     Object[][] data_truncatedToInvalid() {
988         return new Object[][] {
989             {LocalTime.of(1, 2, 3, 123456789), NINETY_FIVE_MINS},
990             {LocalTime.of(1, 2, 3, 123456789), WEEKS},
991             {LocalTime.of(1, 2, 3, 123456789), MONTHS},
992             {LocalTime.of(1, 2, 3, 123456789), YEARS},
993         };
994     }
995 
996     @Test(groups={"tck"}, dataProvider="truncatedToInvalid", expectedExceptions=DateTimeException.class)
997     public void test_truncatedTo_invalid(LocalTime input, TemporalUnit unit) {
998         input.truncatedTo(unit);
999     }
1000 
1001     @Test(expectedExceptions=NullPointerException.class, groups={"tck"})
1002     public void test_truncatedTo_null() {
1003         TEST_12_30_40_987654321.truncatedTo(null);
1004     }
1005 
1006     //-----------------------------------------------------------------------
1007     // plus(PlusAdjuster)
1008     //-----------------------------------------------------------------------
1009     @Test
1010     public void test_plus_Adjuster_positiveHours() {
1011         TemporalAmount period = MockSimplePeriod.of(7, ChronoUnit.HOURS);
1012         LocalTime t = TEST_12_30_40_987654321.plus(period);
1013         assertEquals(t, LocalTime.of(19, 30, 40, 987654321));
1014     }
1015 
1016     @Test
1017     public void test_plus_Adjuster_negativeMinutes() {
1018         TemporalAmount period = MockSimplePeriod.of(-25, ChronoUnit.MINUTES);
1019         LocalTime t = TEST_12_30_40_987654321.plus(period);
1020         assertEquals(t, LocalTime.of(12, 5, 40, 987654321));
1021     }
1022 
1023     @Test
1024     public void test_plus_Adjuster_zero() {
1025         TemporalAmount period = Period.ZERO;
1026         LocalTime t = TEST_12_30_40_987654321.plus(period);
1027         assertEquals(t, TEST_12_30_40_987654321);
1028     }
1029 
1030     @Test
1031     public void test_plus_Adjuster_wrap() {
1032         TemporalAmount p = Duration.ofHours(1);
1033         LocalTime t = LocalTime.of(23, 30).plus(p);
1034         assertEquals(t, LocalTime.of(0, 30));
1035     }
1036 
1037     @Test(expectedExceptions=DateTimeException.class)
1038     public void test_plus_Adjuster_dateNotAllowed() {
1039         TemporalAmount period = MockSimplePeriod.of(7, ChronoUnit.MONTHS);
1040         TEST_12_30_40_987654321.plus(period);
1041     }
1042 
1043     @Test(expectedExceptions=NullPointerException.class)
1044     public void test_plus_Adjuster_null() {
1045         TEST_12_30_40_987654321.plus((TemporalAmount) null);
1046     }
1047 
1048     //-----------------------------------------------------------------------
1049     // plus(long,PeriodUnit)
1050     //-----------------------------------------------------------------------
1051     @Test
1052     public void test_plus_longPeriodUnit_positiveHours() {
1053         LocalTime t = TEST_12_30_40_987654321.plus(7, ChronoUnit.HOURS);
1054         assertEquals(t, LocalTime.of(19, 30, 40, 987654321));
1055     }
1056 
1057     @Test
1058     public void test_plus_longPeriodUnit_negativeMinutes() {
1059         LocalTime t = TEST_12_30_40_987654321.plus(-25, ChronoUnit.MINUTES);
1060         assertEquals(t, LocalTime.of(12, 5, 40, 987654321));
1061     }
1062 
1063     @Test
1064     public void test_plus_longPeriodUnit_zero() {
1065         LocalTime t = TEST_12_30_40_987654321.plus(0, ChronoUnit.MINUTES);
1066         assertEquals(t, TEST_12_30_40_987654321);
1067     }
1068 
1069     @Test
1070     public void test_plus_long_unit_invalidUnit() {
1071         for (TemporalUnit unit : INVALID_UNITS) {
1072             try {
1073                 TEST_12_30_40_987654321.plus(1, unit);
1074                 fail("Unit should not be allowed " + unit);
1075             } catch (DateTimeException ex) {
1076                 // expected
1077             }
1078         }
1079     }
1080 
1081     @Test(expectedExceptions=UnsupportedTemporalTypeException.class)
1082     public void test_plus_long_multiples() {
1083         TEST_12_30_40_987654321.plus(0, DAYS);
1084     }
1085 
1086     @Test(expectedExceptions=NullPointerException.class)
1087     public void test_plus_longPeriodUnit_null() {
1088         TEST_12_30_40_987654321.plus(1, (TemporalUnit) null);
1089     }
1090 
1091     //-----------------------------------------------------------------------
1092     // plus(adjuster)
1093     //-----------------------------------------------------------------------
1094     @Test
1095     public void test_plus_adjuster() {
1096         Duration p = Duration.ofSeconds(62, 3);
1097         LocalTime t = TEST_12_30_40_987654321.plus(p);
1098         assertEquals(t, LocalTime.of(12, 31, 42, 987654324));
1099     }
1100 
1101     @Test
1102     public void test_plus_adjuster_big() {
1103         Duration p = Duration.ofNanos(Long.MAX_VALUE);
1104         LocalTime t = TEST_12_30_40_987654321.plus(p);
1105         assertEquals(t, TEST_12_30_40_987654321.plusNanos(Long.MAX_VALUE));
1106     }
1107 
1108     @Test
1109     public void test_plus_adjuster_zero_equal() {
1110         LocalTime t = TEST_12_30_40_987654321.plus(Period.ZERO);
1111         assertEquals(t, TEST_12_30_40_987654321);
1112     }
1113 
1114     @Test
1115     public void test_plus_adjuster_wrap() {
1116         Duration p = Duration.ofHours(1);
1117         LocalTime t = LocalTime.of(23, 30).plus(p);
1118         assertEquals(t, LocalTime.of(0, 30));
1119     }
1120 
1121     @Test(expectedExceptions=NullPointerException.class)
1122     public void test_plus_adjuster_null() {
1123         TEST_12_30_40_987654321.plus((TemporalAmount) null);
1124     }
1125 
1126     //-----------------------------------------------------------------------
1127     // plusHours()
1128     //-----------------------------------------------------------------------
1129     @Test
1130     public void test_plusHours_one() {
1131         LocalTime t = LocalTime.MIDNIGHT;
1132         for (int i = 0; i < 50; i++) {
1133             t = t.plusHours(1);
1134             assertEquals(t.getHour(), (i + 1) % 24);
1135         }
1136     }
1137 
1138     @Test
1139     public void test_plusHours_fromZero() {
1140         LocalTime base = LocalTime.MIDNIGHT;
1141         for (int i = -50; i < 50; i++) {
1142             LocalTime t = base.plusHours(i);
1143             assertEquals(t.getHour(), (i + 72) % 24);
1144         }
1145     }
1146 
1147     @Test
1148     public void test_plusHours_fromOne() {
1149         LocalTime base = LocalTime.of(1, 0);
1150         for (int i = -50; i < 50; i++) {
1151             LocalTime t = base.plusHours(i);
1152             assertEquals(t.getHour(), (1 + i + 72) % 24);
1153         }
1154     }
1155 
1156     @Test
1157     public void test_plusHours_noChange_equal() {
1158         LocalTime t = TEST_12_30_40_987654321.plusHours(0);
1159         assertEquals(t, TEST_12_30_40_987654321);
1160     }
1161 
1162     @Test
1163     public void test_plusHours_toMidnight_equal() {
1164         LocalTime t = LocalTime.of(23, 0).plusHours(1);
1165         assertEquals(t, LocalTime.MIDNIGHT);
1166     }
1167 
1168     @Test
1169     public void test_plusHours_toMidday_equal() {
1170         LocalTime t = LocalTime.of(11, 0).plusHours(1);
1171         assertEquals(t, LocalTime.NOON);
1172     }
1173 
1174     @Test
1175     public void test_plusHours_big() {
1176         LocalTime t = LocalTime.of(2, 30).plusHours(Long.MAX_VALUE);
1177         int hours = (int) (Long.MAX_VALUE % 24L);
1178         assertEquals(t, LocalTime.of(2, 30).plusHours(hours));
1179     }
1180 
1181     //-----------------------------------------------------------------------
1182     // plusMinutes()
1183     //-----------------------------------------------------------------------
1184     @Test
1185     public void test_plusMinutes_one() {
1186         LocalTime t = LocalTime.MIDNIGHT;
1187         int hour = 0;
1188         int min = 0;
1189         for (int i = 0; i < 70; i++) {
1190             t = t.plusMinutes(1);
1191             min++;
1192             if (min == 60) {
1193                 hour++;
1194                 min = 0;
1195             }
1196             assertEquals(t.getHour(), hour);
1197             assertEquals(t.getMinute(), min);
1198         }
1199     }
1200 
1201     @Test
1202     public void test_plusMinutes_fromZero() {
1203         LocalTime base = LocalTime.MIDNIGHT;
1204         int hour;
1205         int min;
1206         for (int i = -70; i < 70; i++) {
1207             LocalTime t = base.plusMinutes(i);
1208             if (i < -60) {
1209                 hour = 22;
1210                 min = i + 120;
1211             } else if (i < 0) {
1212                 hour = 23;
1213                 min = i + 60;
1214             } else if (i >= 60) {
1215                 hour = 1;
1216                 min = i - 60;
1217             } else {
1218                 hour = 0;
1219                 min = i;
1220             }
1221             assertEquals(t.getHour(), hour);
1222             assertEquals(t.getMinute(), min);
1223         }
1224     }
1225 
1226     @Test
1227     public void test_plusMinutes_noChange_equal() {
1228         LocalTime t = TEST_12_30_40_987654321.plusMinutes(0);
1229         assertEquals(t, TEST_12_30_40_987654321);
1230     }
1231 
1232     @Test
1233     public void test_plusMinutes_noChange_oneDay_equal() {
1234         LocalTime t = TEST_12_30_40_987654321.plusMinutes(24 * 60);
1235         assertEquals(t, TEST_12_30_40_987654321);
1236     }
1237 
1238     @Test
1239     public void test_plusMinutes_toMidnight_equal() {
1240         LocalTime t = LocalTime.of(23, 59).plusMinutes(1);
1241         assertEquals(t, LocalTime.MIDNIGHT);
1242     }
1243 
1244     @Test
1245     public void test_plusMinutes_toMidday_equal() {
1246         LocalTime t = LocalTime.of(11, 59).plusMinutes(1);
1247         assertEquals(t, LocalTime.NOON);
1248     }
1249 
1250     @Test
1251     public void test_plusMinutes_big() {
1252         LocalTime t = LocalTime.of(2, 30).plusMinutes(Long.MAX_VALUE);
1253         int mins = (int) (Long.MAX_VALUE % (24L * 60L));
1254         assertEquals(t, LocalTime.of(2, 30).plusMinutes(mins));
1255     }
1256 
1257     //-----------------------------------------------------------------------
1258     // plusSeconds()
1259     //-----------------------------------------------------------------------
1260     @Test
1261     public void test_plusSeconds_one() {
1262         LocalTime t = LocalTime.MIDNIGHT;
1263         int hour = 0;
1264         int min = 0;
1265         int sec = 0;
1266         for (int i = 0; i < 3700; i++) {
1267             t = t.plusSeconds(1);
1268             sec++;
1269             if (sec == 60) {
1270                 min++;
1271                 sec = 0;
1272             }
1273             if (min == 60) {
1274                 hour++;
1275                 min = 0;
1276             }
1277             assertEquals(t.getHour(), hour);
1278             assertEquals(t.getMinute(), min);
1279             assertEquals(t.getSecond(), sec);
1280         }
1281     }
1282 
1283     @DataProvider(name="plusSeconds_fromZero")
1284     Iterator<Object[]> plusSeconds_fromZero() {
1285         return new Iterator<Object[]>() {
1286             int delta = 30;
1287             int i = -3660;
1288             int hour = 22;
1289             int min = 59;
1290             int sec = 0;
1291 
1292             public boolean hasNext() {
1293                 return i <= 3660;
1294             }
1295 
1296             public Object[] next() {
1297                 final Object[] ret = new Object[] {i, hour, min, sec};
1298                 i += delta;
1299                 sec += delta;
1300 
1301                 if (sec >= 60) {
1302                     min++;
1303                     sec -= 60;
1304 
1305                     if (min == 60) {
1306                         hour++;
1307                         min = 0;
1308 
1309                         if (hour == 24) {
1310                             hour = 0;
1311                         }
1312                     }
1313                 }
1314 
1315                 return ret;
1316             }
1317 
1318             public void remove() {
1319                 throw new UnsupportedOperationException();
1320             }
1321         };
1322     }
1323 
1324     @Test(dataProvider="plusSeconds_fromZero")
1325     public void test_plusSeconds_fromZero(int seconds, int hour, int min, int sec) {
1326         LocalTime base = LocalTime.MIDNIGHT;
1327         LocalTime t = base.plusSeconds(seconds);
1328 
1329         assertEquals(hour, t.getHour());
1330         assertEquals(min, t.getMinute());
1331         assertEquals(sec, t.getSecond());
1332     }
1333 
1334     @Test
1335     public void test_plusSeconds_noChange_equal() {
1336         LocalTime t = TEST_12_30_40_987654321.plusSeconds(0);
1337         assertEquals(t, TEST_12_30_40_987654321);
1338     }
1339 
1340     @Test
1341     public void test_plusSeconds_noChange_oneDay_equal() {
1342         LocalTime t = TEST_12_30_40_987654321.plusSeconds(24 * 60 * 60);
1343         assertEquals(t, TEST_12_30_40_987654321);
1344     }
1345 
1346     @Test
1347     public void test_plusSeconds_toMidnight_equal() {
1348         LocalTime t = LocalTime.of(23, 59, 59).plusSeconds(1);
1349         assertEquals(t, LocalTime.MIDNIGHT);
1350     }
1351 
1352     @Test
1353     public void test_plusSeconds_toMidday_equal() {
1354         LocalTime t = LocalTime.of(11, 59, 59).plusSeconds(1);
1355         assertEquals(t, LocalTime.NOON);
1356     }
1357 
1358     //-----------------------------------------------------------------------
1359     // plusNanos()
1360     //-----------------------------------------------------------------------
1361     @Test
1362     public void test_plusNanos_halfABillion() {
1363         LocalTime t = LocalTime.MIDNIGHT;
1364         int hour = 0;
1365         int min = 0;
1366         int sec = 0;
1367         int nanos = 0;
1368         for (long i = 0; i < 3700 * 1000000000L; i+= 500000000) {
1369             t = t.plusNanos(500000000);
1370             nanos += 500000000;
1371             if (nanos == 1000000000) {
1372                 sec++;
1373                 nanos = 0;
1374             }
1375             if (sec == 60) {
1376                 min++;
1377                 sec = 0;
1378             }
1379             if (min == 60) {
1380                 hour++;
1381                 min = 0;
1382             }
1383             assertEquals(t.getHour(), hour);
1384             assertEquals(t.getMinute(), min);
1385             assertEquals(t.getSecond(), sec);
1386             assertEquals(t.getNano(), nanos);
1387         }
1388     }
1389 
1390     @DataProvider(name="plusNanos_fromZero")
1391     Iterator<Object[]> plusNanos_fromZero() {
1392         return new Iterator<Object[]>() {
1393             long delta = 7500000000L;
1394             long i = -3660 * 1000000000L;
1395             int hour = 22;
1396             int min = 59;
1397             long sec = 0;
1398             long nanos = 0;
1399 
1400             public boolean hasNext() {
1401                 return i <= 3660 * 1000000000L;
1402             }
1403 
1404             public Object[] next() {
1405                 final Object[] ret = new Object[] {i, hour, min, sec, nanos};
1406                 i += delta;
1407                 nanos += delta;
1408 
1409                 if (nanos >= 1000000000L) {
1410                     sec += nanos / 1000000000L;
1411                     nanos %= 1000000000L;
1412 
1413                     if (sec >= 60) {
1414                         min++;
1415                         sec %= 60;
1416 
1417                         if (min == 60) {
1418                             hour++;
1419                             min = 0;
1420 
1421                             if (hour == 24) {
1422                                 hour = 0;
1423                             }
1424                         }
1425                     }
1426                 }
1427 
1428                 return ret;
1429             }
1430 
1431             public void remove() {
1432                 throw new UnsupportedOperationException();
1433             }
1434         };
1435     }
1436 
1437     @Test(dataProvider="plusNanos_fromZero")
1438     public void test_plusNanos_fromZero(long nanoseconds, int hour, int min, long sec, long nanos) {
1439         LocalTime base = LocalTime.MIDNIGHT;
1440         LocalTime t = base.plusNanos(nanoseconds);
1441 
1442         assertEquals(hour, t.getHour());
1443         assertEquals(min, t.getMinute());
1444         assertEquals(sec, t.getSecond());
1445         assertEquals(nanos, t.getNano());
1446     }
1447 
1448     @Test
1449     public void test_plusNanos_noChange_equal() {
1450         LocalTime t = TEST_12_30_40_987654321.plusNanos(0);
1451         assertEquals(t, TEST_12_30_40_987654321);
1452     }
1453 
1454     @Test
1455     public void test_plusNanos_noChange_oneDay_equal() {
1456         LocalTime t = TEST_12_30_40_987654321.plusNanos(24 * 60 * 60 * 1000000000L);
1457         assertEquals(t, TEST_12_30_40_987654321);
1458     }
1459 
1460     @Test
1461     public void test_plusNanos_toMidnight_equal() {
1462         LocalTime t = LocalTime.of(23, 59, 59, 999999999).plusNanos(1);
1463         assertEquals(t, LocalTime.MIDNIGHT);
1464     }
1465 
1466     @Test
1467     public void test_plusNanos_toMidday_equal() {
1468         LocalTime t = LocalTime.of(11, 59, 59, 999999999).plusNanos(1);
1469         assertEquals(t, LocalTime.NOON);
1470     }
1471 
1472     //-----------------------------------------------------------------------
1473     // minus(MinusAdjuster)
1474     //-----------------------------------------------------------------------
1475     @Test
1476     public void test_minus_Adjuster() {
1477         TemporalAmount p = Duration.ofSeconds(62, 3);
1478         LocalTime t = TEST_12_30_40_987654321.minus(p);
1479         assertEquals(t, LocalTime.of(12, 29, 38, 987654318));
1480     }
1481 
1482     @Test
1483     public void test_minus_Adjuster_positiveHours() {
1484         TemporalAmount period = MockSimplePeriod.of(7, ChronoUnit.HOURS);
1485         LocalTime t = TEST_12_30_40_987654321.minus(period);
1486         assertEquals(t, LocalTime.of(5, 30, 40, 987654321));
1487     }
1488 
1489     @Test
1490     public void test_minus_Adjuster_negativeMinutes() {
1491         TemporalAmount period = MockSimplePeriod.of(-25, ChronoUnit.MINUTES);
1492         LocalTime t = TEST_12_30_40_987654321.minus(period);
1493         assertEquals(t, LocalTime.of(12, 55, 40, 987654321));
1494     }
1495 
1496     @Test
1497     public void test_minus_Adjuster_big1() {
1498         TemporalAmount p = Duration.ofNanos(Long.MAX_VALUE);
1499         LocalTime t = TEST_12_30_40_987654321.minus(p);
1500         assertEquals(t, TEST_12_30_40_987654321.minusNanos(Long.MAX_VALUE));
1501     }
1502 
1503     @Test
1504     public void test_minus_Adjuster_zero() {
1505         TemporalAmount p = Period.ZERO;
1506         LocalTime t = TEST_12_30_40_987654321.minus(p);
1507         assertEquals(t, TEST_12_30_40_987654321);
1508     }
1509 
1510     @Test
1511     public void test_minus_Adjuster_wrap() {
1512         TemporalAmount p = Duration.ofHours(1);
1513         LocalTime t = LocalTime.of(0, 30).minus(p);
1514         assertEquals(t, LocalTime.of(23, 30));
1515     }
1516 
1517     @Test(expectedExceptions=DateTimeException.class)
1518     public void test_minus_Adjuster_dateNotAllowed() {
1519         TemporalAmount period = MockSimplePeriod.of(7, ChronoUnit.MONTHS);
1520         TEST_12_30_40_987654321.minus(period);
1521     }
1522 
1523     @Test(expectedExceptions=NullPointerException.class)
1524     public void test_minus_Adjuster_null() {
1525         TEST_12_30_40_987654321.minus((TemporalAmount) null);
1526     }
1527 
1528     //-----------------------------------------------------------------------
1529     // minus(long,PeriodUnit)
1530     //-----------------------------------------------------------------------
1531     @Test
1532     public void test_minus_longPeriodUnit_positiveHours() {
1533         LocalTime t = TEST_12_30_40_987654321.minus(7, ChronoUnit.HOURS);
1534         assertEquals(t, LocalTime.of(5, 30, 40, 987654321));
1535     }
1536 
1537     @Test
1538     public void test_minus_longPeriodUnit_negativeMinutes() {
1539         LocalTime t = TEST_12_30_40_987654321.minus(-25, ChronoUnit.MINUTES);
1540         assertEquals(t, LocalTime.of(12, 55, 40, 987654321));
1541     }
1542 
1543     @Test
1544     public void test_minus_longPeriodUnit_zero() {
1545         LocalTime t = TEST_12_30_40_987654321.minus(0, ChronoUnit.MINUTES);
1546         assertEquals(t, TEST_12_30_40_987654321);
1547     }
1548 
1549     @Test
1550     public void test_minus_long_unit_invalidUnit() {
1551         for (TemporalUnit unit : INVALID_UNITS) {
1552             try {
1553                 TEST_12_30_40_987654321.minus(1, unit);
1554                 fail("Unit should not be allowed " + unit);
1555             } catch (DateTimeException ex) {
1556                 // expected
1557             }
1558         }
1559     }
1560 
1561     @Test(expectedExceptions=UnsupportedTemporalTypeException.class)
1562     public void test_minus_long_multiples() {
1563         TEST_12_30_40_987654321.minus(0, DAYS);
1564     }
1565 
1566     @Test(expectedExceptions=NullPointerException.class)
1567     public void test_minus_longPeriodUnit_null() {
1568         TEST_12_30_40_987654321.minus(1, (TemporalUnit) null);
1569     }
1570 
1571     //-----------------------------------------------------------------------
1572     // minusHours()
1573     //-----------------------------------------------------------------------
1574     @Test
1575     public void test_minusHours_one() {
1576         LocalTime t = LocalTime.MIDNIGHT;
1577         for (int i = 0; i < 50; i++) {
1578             t = t.minusHours(1);
1579             assertEquals(t.getHour(), (((-i + 23) % 24) + 24) % 24, String.valueOf(i));
1580         }
1581     }
1582 
1583     @Test
1584     public void test_minusHours_fromZero() {
1585         LocalTime base = LocalTime.MIDNIGHT;
1586         for (int i = -50; i < 50; i++) {
1587             LocalTime t = base.minusHours(i);
1588             assertEquals(t.getHour(), ((-i % 24) + 24) % 24);
1589         }
1590     }
1591 
1592     @Test
1593     public void test_minusHours_fromOne() {
1594         LocalTime base = LocalTime.of(1, 0);
1595         for (int i = -50; i < 50; i++) {
1596             LocalTime t = base.minusHours(i);
1597             assertEquals(t.getHour(), (1 + (-i % 24) + 24) % 24);
1598         }
1599     }
1600 
1601     @Test
1602     public void test_minusHours_noChange_equal() {
1603         LocalTime t = TEST_12_30_40_987654321.minusHours(0);
1604         assertEquals(t, TEST_12_30_40_987654321);
1605     }
1606 
1607     @Test
1608     public void test_minusHours_toMidnight_equal() {
1609         LocalTime t = LocalTime.of(1, 0).minusHours(1);
1610         assertEquals(t, LocalTime.MIDNIGHT);
1611     }
1612 
1613     @Test
1614     public void test_minusHours_toMidday_equal() {
1615         LocalTime t = LocalTime.of(13, 0).minusHours(1);
1616         assertEquals(t, LocalTime.NOON);
1617     }
1618 
1619     @Test
1620     public void test_minusHours_big() {
1621         LocalTime t = LocalTime.of(2, 30).minusHours(Long.MAX_VALUE);
1622         int hours = (int) (Long.MAX_VALUE % 24L);
1623         assertEquals(t, LocalTime.of(2, 30).minusHours(hours));
1624     }
1625 
1626     //-----------------------------------------------------------------------
1627     // minusMinutes()
1628     //-----------------------------------------------------------------------
1629     @Test
1630     public void test_minusMinutes_one() {
1631         LocalTime t = LocalTime.MIDNIGHT;
1632         int hour = 0;
1633         int min = 0;
1634         for (int i = 0; i < 70; i++) {
1635             t = t.minusMinutes(1);
1636             min--;
1637             if (min == -1) {
1638                 hour--;
1639                 min = 59;
1640 
1641                 if (hour == -1) {
1642                     hour = 23;
1643                 }
1644             }
1645             assertEquals(t.getHour(), hour);
1646             assertEquals(t.getMinute(), min);
1647         }
1648     }
1649 
1650     @Test
1651     public void test_minusMinutes_fromZero() {
1652         LocalTime base = LocalTime.MIDNIGHT;
1653         int hour = 22;
1654         int min = 49;
1655         for (int i = 70; i > -70; i--) {
1656             LocalTime t = base.minusMinutes(i);
1657             min++;
1658 
1659             if (min == 60) {
1660                 hour++;
1661                 min = 0;
1662 
1663                 if (hour == 24) {
1664                     hour = 0;
1665                 }
1666             }
1667 
1668             assertEquals(t.getHour(), hour);
1669             assertEquals(t.getMinute(), min);
1670         }
1671     }
1672 
1673     @Test
1674     public void test_minusMinutes_noChange_equal() {
1675         LocalTime t = TEST_12_30_40_987654321.minusMinutes(0);
1676         assertEquals(t, TEST_12_30_40_987654321);
1677     }
1678 
1679     @Test
1680     public void test_minusMinutes_noChange_oneDay_equal() {
1681         LocalTime t = TEST_12_30_40_987654321.minusMinutes(24 * 60);
1682         assertEquals(t, TEST_12_30_40_987654321);
1683     }
1684 
1685     @Test
1686     public void test_minusMinutes_toMidnight_equal() {
1687         LocalTime t = LocalTime.of(0, 1).minusMinutes(1);
1688         assertEquals(t, LocalTime.MIDNIGHT);
1689     }
1690 
1691     @Test
1692     public void test_minusMinutes_toMidday_equals() {
1693         LocalTime t = LocalTime.of(12, 1).minusMinutes(1);
1694         assertEquals(t, LocalTime.NOON);
1695     }
1696 
1697     @Test
1698     public void test_minusMinutes_big() {
1699         LocalTime t = LocalTime.of(2, 30).minusMinutes(Long.MAX_VALUE);
1700         int mins = (int) (Long.MAX_VALUE % (24L * 60L));
1701         assertEquals(t, LocalTime.of(2, 30).minusMinutes(mins));
1702     }
1703 
1704     //-----------------------------------------------------------------------
1705     // minusSeconds()
1706     //-----------------------------------------------------------------------
1707     @Test
1708     public void test_minusSeconds_one() {
1709         LocalTime t = LocalTime.MIDNIGHT;
1710         int hour = 0;
1711         int min = 0;
1712         int sec = 0;
1713         for (int i = 0; i < 3700; i++) {
1714             t = t.minusSeconds(1);
1715             sec--;
1716             if (sec == -1) {
1717                 min--;
1718                 sec = 59;
1719 
1720                 if (min == -1) {
1721                     hour--;
1722                     min = 59;
1723 
1724                     if (hour == -1) {
1725                         hour = 23;
1726                     }
1727                 }
1728             }
1729             assertEquals(t.getHour(), hour);
1730             assertEquals(t.getMinute(), min);
1731             assertEquals(t.getSecond(), sec);
1732         }
1733     }
1734 
1735     @DataProvider(name="minusSeconds_fromZero")
1736     Iterator<Object[]> minusSeconds_fromZero() {
1737         return new Iterator<Object[]>() {
1738             int delta = 30;
1739             int i = 3660;
1740             int hour = 22;
1741             int min = 59;
1742             int sec = 0;
1743 
1744             public boolean hasNext() {
1745                 return i >= -3660;
1746             }
1747 
1748             public Object[] next() {
1749                 final Object[] ret = new Object[] {i, hour, min, sec};
1750                 i -= delta;
1751                 sec += delta;
1752 
1753                 if (sec >= 60) {
1754                     min++;
1755                     sec -= 60;
1756 
1757                     if (min == 60) {
1758                         hour++;
1759                         min = 0;
1760 
1761                         if (hour == 24) {
1762                             hour = 0;
1763                         }
1764                     }
1765                 }
1766 
1767                 return ret;
1768             }
1769 
1770             public void remove() {
1771                 throw new UnsupportedOperationException();
1772             }
1773         };
1774     }
1775 
1776     @Test(dataProvider="minusSeconds_fromZero")
1777     public void test_minusSeconds_fromZero(int seconds, int hour, int min, int sec) {
1778         LocalTime base = LocalTime.MIDNIGHT;
1779         LocalTime t = base.minusSeconds(seconds);
1780 
1781         assertEquals(t.getHour(), hour);
1782         assertEquals(t.getMinute(), min);
1783         assertEquals(t.getSecond(), sec);
1784     }
1785 
1786     @Test
1787     public void test_minusSeconds_noChange_equal() {
1788         LocalTime t = TEST_12_30_40_987654321.minusSeconds(0);
1789         assertEquals(t, TEST_12_30_40_987654321);
1790     }
1791 
1792     @Test
1793     public void test_minusSeconds_noChange_oneDay_equal() {
1794         LocalTime t = TEST_12_30_40_987654321.minusSeconds(24 * 60 * 60);
1795         assertEquals(t, TEST_12_30_40_987654321);
1796     }
1797 
1798     @Test
1799     public void test_minusSeconds_toMidnight_equal() {
1800         LocalTime t = LocalTime.of(0, 0, 1).minusSeconds(1);
1801         assertEquals(t, LocalTime.MIDNIGHT);
1802     }
1803 
1804     @Test
1805     public void test_minusSeconds_toMidday_equal() {
1806         LocalTime t = LocalTime.of(12, 0, 1).minusSeconds(1);
1807         assertEquals(t, LocalTime.NOON);
1808     }
1809 
1810     @Test
1811     public void test_minusSeconds_big() {
1812         LocalTime t = LocalTime.of(2, 30).minusSeconds(Long.MAX_VALUE);
1813         int secs = (int) (Long.MAX_VALUE % (24L * 60L * 60L));
1814         assertEquals(t, LocalTime.of(2, 30).minusSeconds(secs));
1815     }
1816 
1817     //-----------------------------------------------------------------------
1818     // minusNanos()
1819     //-----------------------------------------------------------------------
1820     @Test
1821     public void test_minusNanos_halfABillion() {
1822         LocalTime t = LocalTime.MIDNIGHT;
1823         int hour = 0;
1824         int min = 0;
1825         int sec = 0;
1826         int nanos = 0;
1827         for (long i = 0; i < 3700 * 1000000000L; i+= 500000000) {
1828             t = t.minusNanos(500000000);
1829             nanos -= 500000000;
1830 
1831             if (nanos < 0) {
1832                 sec--;
1833                 nanos += 1000000000;
1834 
1835                 if (sec == -1) {
1836                     min--;
1837                     sec += 60;
1838 
1839                     if (min == -1) {
1840                         hour--;
1841                         min += 60;
1842 
1843                         if (hour == -1) {
1844                             hour += 24;
1845                         }
1846                     }
1847                 }
1848             }
1849 
1850             assertEquals(t.getHour(), hour);
1851             assertEquals(t.getMinute(), min);
1852             assertEquals(t.getSecond(), sec);
1853             assertEquals(t.getNano(), nanos);
1854         }
1855     }
1856 
1857     @DataProvider(name="minusNanos_fromZero")
1858     Iterator<Object[]> minusNanos_fromZero() {
1859         return new Iterator<Object[]>() {
1860             long delta = 7500000000L;
1861             long i = 3660 * 1000000000L;
1862             int hour = 22;
1863             int min = 59;
1864             long sec = 0;
1865             long nanos = 0;
1866 
1867             public boolean hasNext() {
1868                 return i >= -3660 * 1000000000L;
1869             }
1870 
1871             public Object[] next() {
1872                 final Object[] ret = new Object[] {i, hour, min, sec, nanos};
1873                 i -= delta;
1874                 nanos += delta;
1875 
1876                 if (nanos >= 1000000000L) {
1877                     sec += nanos / 1000000000L;
1878                     nanos %= 1000000000L;
1879 
1880                     if (sec >= 60) {
1881                         min++;
1882                         sec %= 60;
1883 
1884                         if (min == 60) {
1885                             hour++;
1886                             min = 0;
1887 
1888                             if (hour == 24) {
1889                                 hour = 0;
1890                             }
1891                         }
1892                     }
1893                 }
1894 
1895                 return ret;
1896             }
1897 
1898             public void remove() {
1899                 throw new UnsupportedOperationException();
1900             }
1901         };
1902     }
1903 
1904     @Test(dataProvider="minusNanos_fromZero")
1905     public void test_minusNanos_fromZero(long nanoseconds, int hour, int min, long sec, long nanos) {
1906         LocalTime base = LocalTime.MIDNIGHT;
1907         LocalTime t = base.minusNanos(nanoseconds);
1908 
1909         assertEquals(hour, t.getHour());
1910         assertEquals(min, t.getMinute());
1911         assertEquals(sec, t.getSecond());
1912         assertEquals(nanos, t.getNano());
1913     }
1914 
1915     @Test
1916     public void test_minusNanos_noChange_equal() {
1917         LocalTime t = TEST_12_30_40_987654321.minusNanos(0);
1918         assertEquals(t, TEST_12_30_40_987654321);
1919     }
1920 
1921     @Test
1922     public void test_minusNanos_noChange_oneDay_equal() {
1923         LocalTime t = TEST_12_30_40_987654321.minusNanos(24 * 60 * 60 * 1000000000L);
1924         assertEquals(t, TEST_12_30_40_987654321);
1925     }
1926 
1927     @Test
1928     public void test_minusNanos_toMidnight_equal() {
1929         LocalTime t = LocalTime.of(0, 0, 0, 1).minusNanos(1);
1930         assertEquals(t, LocalTime.MIDNIGHT);
1931     }
1932 
1933     @Test
1934     public void test_minusNanos_toMidday_equal() {
1935         LocalTime t = LocalTime.of(12, 0, 0, 1).minusNanos(1);
1936         assertEquals(t, LocalTime.NOON);
1937     }
1938 
1939     //-----------------------------------------------------------------------
1940     // until()
1941     //-----------------------------------------------------------------------
1942     @DataProvider(name="until")
1943     Object[][] provider_until() {
1944         return new Object[][]{
1945                 {"00:00", "00:00", NANOS, 0},
1946                 {"00:00", "00:00", MICROS, 0},
1947                 {"00:00", "00:00", MILLIS, 0},
1948                 {"00:00", "00:00", SECONDS, 0},
1949                 {"00:00", "00:00", MINUTES, 0},
1950                 {"00:00", "00:00", HOURS, 0},
1951                 {"00:00", "00:00", HALF_DAYS, 0},
1952 
1953                 {"00:00", "00:00:01", NANOS, 1000000000},
1954                 {"00:00", "00:00:01", MICROS, 1000000},
1955                 {"00:00", "00:00:01", MILLIS, 1000},
1956                 {"00:00", "00:00:01", SECONDS, 1},
1957                 {"00:00", "00:00:01", MINUTES, 0},
1958                 {"00:00", "00:00:01", HOURS, 0},
1959                 {"00:00", "00:00:01", HALF_DAYS, 0},
1960 
1961                 {"00:00", "00:01", NANOS, 60000000000L},
1962                 {"00:00", "00:01", MICROS, 60000000},
1963                 {"00:00", "00:01", MILLIS, 60000},
1964                 {"00:00", "00:01", SECONDS, 60},
1965                 {"00:00", "00:01", MINUTES, 1},
1966                 {"00:00", "00:01", HOURS, 0},
1967                 {"00:00", "00:01", HALF_DAYS, 0},
1968         };
1969     }
1970 
1971     @Test(dataProvider = "until")
1972     public void test_until(String startStr, String endStr, TemporalUnit unit, long expected) {
1973         LocalTime start = LocalTime.parse(startStr);
1974         LocalTime end = LocalTime.parse(endStr);
1975         assertEquals(start.until(end, unit), expected);
1976         assertEquals(end.until(start, unit), -expected);
1977     }
1978 
1979     //-----------------------------------------------------------------------
1980     // atDate()
1981     //-----------------------------------------------------------------------
1982     @Test
1983     public void test_atDate() {
1984         LocalTime t = LocalTime.of(11, 30);
1985         assertEquals(t.atDate(LocalDate.of(2012, 6, 30)), LocalDateTime.of(2012, 6, 30, 11, 30));
1986     }
1987 
1988     @Test(expectedExceptions=NullPointerException.class)
1989     public void test_atDate_nullDate() {
1990         TEST_12_30_40_987654321.atDate((LocalDate) null);
1991     }
1992 
1993     //-----------------------------------------------------------------------
1994     // toSecondOfDay()
1995     //-----------------------------------------------------------------------
1996     @Test
1997     public void test_toSecondOfDay() {
1998         LocalTime t = LocalTime.of(0, 0);
1999         for (int i = 0; i < 24 * 60 * 60; i++) {
2000             assertEquals(t.toSecondOfDay(), i);
2001             t = t.plusSeconds(1);
2002         }
2003     }
2004 
2005     @Test
2006     public void test_toSecondOfDay_fromNanoOfDay_symmetry() {
2007         LocalTime t = LocalTime.of(0, 0);
2008         for (int i = 0; i < 24 * 60 * 60; i++) {
2009             assertEquals(LocalTime.ofSecondOfDay(t.toSecondOfDay()), t);
2010             t = t.plusSeconds(1);
2011         }
2012     }
2013 
2014     //-----------------------------------------------------------------------
2015     // toNanoOfDay()
2016     //-----------------------------------------------------------------------
2017     @Test
2018     public void test_toNanoOfDay() {
2019         LocalTime t = LocalTime.of(0, 0);
2020         for (int i = 0; i < 1000000; i++) {
2021             assertEquals(t.toNanoOfDay(), i);
2022             t = t.plusNanos(1);
2023         }
2024         t = LocalTime.of(0, 0);
2025         for (int i = 1; i <= 1000000; i++) {
2026             t = t.minusNanos(1);
2027             assertEquals(t.toNanoOfDay(), 24 * 60 * 60 * 1000000000L - i);
2028         }
2029     }
2030 
2031     @Test
2032     public void test_toNanoOfDay_fromNanoOfDay_symmetry() {
2033         LocalTime t = LocalTime.of(0, 0);
2034         for (int i = 0; i < 1000000; i++) {
2035             assertEquals(LocalTime.ofNanoOfDay(t.toNanoOfDay()), t);
2036             t = t.plusNanos(1);
2037         }
2038         t = LocalTime.of(0, 0);
2039         for (int i = 1; i <= 1000000; i++) {
2040             t = t.minusNanos(1);
2041             assertEquals(LocalTime.ofNanoOfDay(t.toNanoOfDay()), t);
2042         }
2043     }
2044 
2045     //-----------------------------------------------------------------------
2046     // compareTo()
2047     //-----------------------------------------------------------------------
2048     @Test
2049     public void test_comparisons() {
2050         doTest_comparisons_LocalTime(
2051             LocalTime.MIDNIGHT,
2052             LocalTime.of(0, 0, 0, 999999999),
2053             LocalTime.of(0, 0, 59, 0),
2054             LocalTime.of(0, 0, 59, 999999999),
2055             LocalTime.of(0, 59, 0, 0),
2056             LocalTime.of(0, 59, 0, 999999999),
2057             LocalTime.of(0, 59, 59, 0),
2058             LocalTime.of(0, 59, 59, 999999999),
2059             LocalTime.NOON,
2060             LocalTime.of(12, 0, 0, 999999999),
2061             LocalTime.of(12, 0, 59, 0),
2062             LocalTime.of(12, 0, 59, 999999999),
2063             LocalTime.of(12, 59, 0, 0),
2064             LocalTime.of(12, 59, 0, 999999999),
2065             LocalTime.of(12, 59, 59, 0),
2066             LocalTime.of(12, 59, 59, 999999999),
2067             LocalTime.of(23, 0, 0, 0),
2068             LocalTime.of(23, 0, 0, 999999999),
2069             LocalTime.of(23, 0, 59, 0),
2070             LocalTime.of(23, 0, 59, 999999999),
2071             LocalTime.of(23, 59, 0, 0),
2072             LocalTime.of(23, 59, 0, 999999999),
2073             LocalTime.of(23, 59, 59, 0),
2074             LocalTime.of(23, 59, 59, 999999999)
2075         );
2076     }
2077 
2078     void doTest_comparisons_LocalTime(LocalTime... localTimes) {
2079         for (int i = 0; i < localTimes.length; i++) {
2080             LocalTime a = localTimes[i];
2081             for (int j = 0; j < localTimes.length; j++) {
2082                 LocalTime b = localTimes[j];
2083                 if (i < j) {
2084                     assertTrue(a.compareTo(b) < 0, a + " <=> " + b);
2085                     assertEquals(a.isBefore(b), true, a + " <=> " + b);
2086                     assertEquals(a.isAfter(b), false, a + " <=> " + b);
2087                     assertEquals(a.equals(b), false, a + " <=> " + b);
2088                 } else if (i > j) {
2089                     assertTrue(a.compareTo(b) > 0, a + " <=> " + b);
2090                     assertEquals(a.isBefore(b), false, a + " <=> " + b);
2091                     assertEquals(a.isAfter(b), true, a + " <=> " + b);
2092                     assertEquals(a.equals(b), false, a + " <=> " + b);
2093                 } else {
2094                     assertEquals(a.compareTo(b), 0, a + " <=> " + b);
2095                     assertEquals(a.isBefore(b), false, a + " <=> " + b);
2096                     assertEquals(a.isAfter(b), false, a + " <=> " + b);
2097                     assertEquals(a.equals(b), true, a + " <=> " + b);
2098                 }
2099             }
2100         }
2101     }
2102 
2103     @Test(expectedExceptions=NullPointerException.class)
2104     public void test_compareTo_ObjectNull() {
2105         TEST_12_30_40_987654321.compareTo(null);
2106     }
2107 
2108     @Test(expectedExceptions=NullPointerException.class)
2109     public void test_isBefore_ObjectNull() {
2110         TEST_12_30_40_987654321.isBefore(null);
2111     }
2112 
2113     @Test(expectedExceptions=NullPointerException.class)
2114     public void test_isAfter_ObjectNull() {
2115         TEST_12_30_40_987654321.isAfter(null);
2116     }
2117 
2118     @Test(expectedExceptions=ClassCastException.class)
2119     @SuppressWarnings({"unchecked", "rawtypes"})
2120     public void compareToNonLocalTime() {
2121        Comparable c = TEST_12_30_40_987654321;
2122        c.compareTo(new Object());
2123     }
2124 
2125     //-----------------------------------------------------------------------
2126     // equals()
2127     //-----------------------------------------------------------------------
2128     @Test(dataProvider="sampleTimes")
2129     public void test_equals_true(int h, int m, int s, int n) {
2130         LocalTime a = LocalTime.of(h, m, s, n);
2131         LocalTime b = LocalTime.of(h, m, s, n);
2132         assertEquals(a.equals(b), true);
2133     }
2134     @Test(dataProvider="sampleTimes")
2135     public void test_equals_false_hour_differs(int h, int m, int s, int n) {
2136         LocalTime a = LocalTime.of(h, m, s, n);
2137         LocalTime b = LocalTime.of(h + 1, m, s, n);
2138         assertEquals(a.equals(b), false);
2139     }
2140     @Test(dataProvider="sampleTimes")
2141     public void test_equals_false_minute_differs(int h, int m, int s, int n) {
2142         LocalTime a = LocalTime.of(h, m, s, n);
2143         LocalTime b = LocalTime.of(h, m + 1, s, n);
2144         assertEquals(a.equals(b), false);
2145     }
2146     @Test(dataProvider="sampleTimes")
2147     public void test_equals_false_second_differs(int h, int m, int s, int n) {
2148         LocalTime a = LocalTime.of(h, m, s, n);
2149         LocalTime b = LocalTime.of(h, m, s + 1, n);
2150         assertEquals(a.equals(b), false);
2151     }
2152     @Test(dataProvider="sampleTimes")
2153     public void test_equals_false_nano_differs(int h, int m, int s, int n) {
2154         LocalTime a = LocalTime.of(h, m, s, n);
2155         LocalTime b = LocalTime.of(h, m, s, n + 1);
2156         assertEquals(a.equals(b), false);
2157     }
2158 
2159     @Test
2160     public void test_equals_itself_true() {
2161         assertEquals(TEST_12_30_40_987654321.equals(TEST_12_30_40_987654321), true);
2162     }
2163 
2164     @Test
2165     public void test_equals_string_false() {
2166         assertEquals(TEST_12_30_40_987654321.equals("2007-07-15"), false);
2167     }
2168 
2169     @Test
2170     public void test_equals_null_false() {
2171         assertEquals(TEST_12_30_40_987654321.equals(null), false);
2172     }
2173 
2174     //-----------------------------------------------------------------------
2175     // hashCode()
2176     //-----------------------------------------------------------------------
2177     @Test(dataProvider="sampleTimes")
2178     public void test_hashCode_same(int h, int m, int s, int n) {
2179         LocalTime a = LocalTime.of(h, m, s, n);
2180         LocalTime b = LocalTime.of(h, m, s, n);
2181         assertEquals(a.hashCode(), b.hashCode());
2182     }
2183 
2184     @Test(dataProvider="sampleTimes")
2185     public void test_hashCode_hour_differs(int h, int m, int s, int n) {
2186         LocalTime a = LocalTime.of(h, m, s, n);
2187         LocalTime b = LocalTime.of(h + 1, m, s, n);
2188         assertEquals(a.hashCode() == b.hashCode(), false);
2189     }
2190 
2191     @Test(dataProvider="sampleTimes")
2192     public void test_hashCode_minute_differs(int h, int m, int s, int n) {
2193         LocalTime a = LocalTime.of(h, m, s, n);
2194         LocalTime b = LocalTime.of(h, m + 1, s, n);
2195         assertEquals(a.hashCode() == b.hashCode(), false);
2196     }
2197 
2198     @Test(dataProvider="sampleTimes")
2199     public void test_hashCode_second_differs(int h, int m, int s, int n) {
2200         LocalTime a = LocalTime.of(h, m, s, n);
2201         LocalTime b = LocalTime.of(h, m, s + 1, n);
2202         assertEquals(a.hashCode() == b.hashCode(), false);
2203     }
2204 
2205     @Test(dataProvider="sampleTimes")
2206     public void test_hashCode_nano_differs(int h, int m, int s, int n) {
2207         LocalTime a = LocalTime.of(h, m, s, n);
2208         LocalTime b = LocalTime.of(h, m, s, n + 1);
2209         assertEquals(a.hashCode() == b.hashCode(), false);
2210     }
2211 
2212     //-----------------------------------------------------------------------
2213     // toString()
2214     //-----------------------------------------------------------------------
2215     @DataProvider(name="sampleToString")
2216     Object[][] provider_sampleToString() {
2217         return new Object[][] {
2218             {0, 0, 0, 0, "00:00"},
2219             {1, 0, 0, 0, "01:00"},
2220             {23, 0, 0, 0, "23:00"},
2221             {0, 1, 0, 0, "00:01"},
2222             {12, 30, 0, 0, "12:30"},
2223             {23, 59, 0, 0, "23:59"},
2224             {0, 0, 1, 0, "00:00:01"},
2225             {0, 0, 59, 0, "00:00:59"},
2226             {0, 0, 0, 100000000, "00:00:00.100"},
2227             {0, 0, 0, 10000000, "00:00:00.010"},
2228             {0, 0, 0, 1000000, "00:00:00.001"},
2229             {0, 0, 0, 100000, "00:00:00.000100"},
2230             {0, 0, 0, 10000, "00:00:00.000010"},
2231             {0, 0, 0, 1000, "00:00:00.000001"},
2232             {0, 0, 0, 100, "00:00:00.000000100"},
2233             {0, 0, 0, 10, "00:00:00.000000010"},
2234             {0, 0, 0, 1, "00:00:00.000000001"},
2235             {0, 0, 0, 999999999, "00:00:00.999999999"},
2236             {0, 0, 0, 99999999, "00:00:00.099999999"},
2237             {0, 0, 0, 9999999, "00:00:00.009999999"},
2238             {0, 0, 0, 999999, "00:00:00.000999999"},
2239             {0, 0, 0, 99999, "00:00:00.000099999"},
2240             {0, 0, 0, 9999, "00:00:00.000009999"},
2241             {0, 0, 0, 999, "00:00:00.000000999"},
2242             {0, 0, 0, 99, "00:00:00.000000099"},
2243             {0, 0, 0, 9, "00:00:00.000000009"},
2244         };
2245     }
2246 
2247     @Test(dataProvider="sampleToString")
2248     public void test_toString(int h, int m, int s, int n, String expected) {
2249         LocalTime t = LocalTime.of(h, m, s, n);
2250         String str = t.toString();
2251         assertEquals(str, expected);
2252     }
2253 
2254     //-----------------------------------------------------------------------
2255     // format(DateTimeFormatter)
2256     //-----------------------------------------------------------------------
2257     @Test
2258     public void test_format_formatter() {
2259         DateTimeFormatter f = DateTimeFormatter.ofPattern("H m s");
2260         String t = LocalTime.of(11, 30, 45).format(f);
2261         assertEquals(t, "11 30 45");
2262     }
2263 
2264     @Test(expectedExceptions=NullPointerException.class)
2265     public void test_format_formatter_null() {
2266         LocalTime.of(11, 30, 45).format(null);
2267     }
2268 
2269 }
2270