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