1 /*
2  * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * This file is available under and governed by the GNU General Public
26  * License version 2 only, as published by the Free Software Foundation.
27  * However, the following notice accompanied the original version of this
28  * file:
29  *
30  * Copyright (c) 2008-2012, Stephen Colebourne & Michael Nascimento Santos
31  *
32  * All rights reserved.
33  *
34  * Redistribution and use in source and binary forms, with or without
35  * modification, are permitted provided that the following conditions are met:
36  *
37  *  * Redistributions of source code must retain the above copyright notice,
38  *    this list of conditions and the following disclaimer.
39  *
40  *  * Redistributions in binary form must reproduce the above copyright notice,
41  *    this list of conditions and the following disclaimer in the documentation
42  *    and/or other materials provided with the distribution.
43  *
44  *  * Neither the name of JSR-310 nor the names of its contributors
45  *    may be used to endorse or promote products derived from this software
46  *    without specific prior written permission.
47  *
48  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
51  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
52  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
53  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
54  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
55  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
56  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
57  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
58  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59  */
60 package tck.java.time;
61 
62 import static java.time.temporal.ChronoField.ERA;
63 import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
64 import static java.time.temporal.ChronoField.PROLEPTIC_MONTH;
65 import static java.time.temporal.ChronoField.YEAR;
66 import static java.time.temporal.ChronoField.YEAR_OF_ERA;
67 import static java.time.temporal.ChronoUnit.CENTURIES;
68 import static java.time.temporal.ChronoUnit.DAYS;
69 import static java.time.temporal.ChronoUnit.DECADES;
70 import static java.time.temporal.ChronoUnit.HOURS;
71 import static java.time.temporal.ChronoUnit.MILLENNIA;
72 import static java.time.temporal.ChronoUnit.MONTHS;
73 import static java.time.temporal.ChronoUnit.YEARS;
74 import static org.testng.Assert.assertEquals;
75 import static org.testng.Assert.assertTrue;
76 import static org.testng.Assert.fail;
77 
78 import java.io.ByteArrayOutputStream;
79 import java.io.DataOutputStream;
80 import java.io.IOException;
81 import java.time.Clock;
82 import java.time.DateTimeException;
83 import java.time.Duration;
84 import java.time.Instant;
85 import java.time.LocalDate;
86 import java.time.LocalDateTime;
87 import java.time.LocalTime;
88 import java.time.Month;
89 import java.time.Period;
90 import java.time.Year;
91 import java.time.YearMonth;
92 import java.time.ZoneId;
93 import java.time.ZoneOffset;
94 import java.time.chrono.IsoChronology;
95 import java.time.format.DateTimeFormatter;
96 import java.time.format.DateTimeParseException;
97 import java.time.temporal.ChronoField;
98 import java.time.temporal.ChronoUnit;
99 import java.time.temporal.JulianFields;
100 import java.time.temporal.TemporalAccessor;
101 import java.time.temporal.TemporalAmount;
102 import java.time.temporal.TemporalField;
103 import java.time.temporal.TemporalQueries;
104 import java.time.temporal.TemporalQuery;
105 import java.time.temporal.TemporalUnit;
106 import java.time.temporal.UnsupportedTemporalTypeException;
107 import java.util.ArrayList;
108 import java.util.Arrays;
109 import java.util.HashSet;
110 import java.util.List;
111 import java.util.Set;
112 
113 import org.testng.annotations.BeforeClass;
114 import org.testng.annotations.DataProvider;
115 import org.testng.annotations.Test;
116 
117 /**
118  * Test YearMonth.
119  */
120 @Test
121 public class TCKYearMonth extends AbstractDateTimeTest {
122 
123     // Android-changed: This was originally non-static and initialized in @BeforeMethod,
124     // but @BeforeMethod is run after @DataProvider methods are run, so it only worked by accident,
125     // since multiple test methods were run and the first one did not require this value.
126     private static YearMonth TEST_2008_06;
127 
128     @BeforeClass
setUp()129     public static void setUp() {
130         TEST_2008_06 = YearMonth.of(2008, 6);
131     }
132 
133     //-----------------------------------------------------------------------
134     @Override
samples()135     protected List<TemporalAccessor> samples() {
136         TemporalAccessor[] array = {TEST_2008_06, };
137         return Arrays.asList(array);
138     }
139 
140     @Override
validFields()141     protected List<TemporalField> validFields() {
142         TemporalField[] array = {
143             MONTH_OF_YEAR,
144             PROLEPTIC_MONTH,
145             YEAR_OF_ERA,
146             YEAR,
147             ERA,
148         };
149         return Arrays.asList(array);
150     }
151 
152     @Override
invalidFields()153     protected List<TemporalField> invalidFields() {
154         List<TemporalField> list = new ArrayList<>(Arrays.<TemporalField>asList(ChronoField.values()));
155         list.removeAll(validFields());
156         list.add(JulianFields.JULIAN_DAY);
157         list.add(JulianFields.MODIFIED_JULIAN_DAY);
158         list.add(JulianFields.RATA_DIE);
159         return list;
160     }
161 
162     //-----------------------------------------------------------------------
check(YearMonth test, int y, int m)163     void check(YearMonth test, int y, int m) {
164         assertEquals(test.getYear(), y);
165         assertEquals(test.getMonth().getValue(), m);
166     }
167 
168     //-----------------------------------------------------------------------
169     // now()
170     //-----------------------------------------------------------------------
171     @Test
now()172     public void now() {
173         YearMonth expected = YearMonth.now(Clock.systemDefaultZone());
174         YearMonth test = YearMonth.now();
175         for (int i = 0; i < 100; i++) {
176             if (expected.equals(test)) {
177                 return;
178             }
179             expected = YearMonth.now(Clock.systemDefaultZone());
180             test = YearMonth.now();
181         }
182         assertEquals(test, expected);
183     }
184 
185     //-----------------------------------------------------------------------
186     // now(ZoneId)
187     //-----------------------------------------------------------------------
188     @Test(expectedExceptions=NullPointerException.class)
now_ZoneId_nullZoneId()189     public void now_ZoneId_nullZoneId() {
190         YearMonth.now((ZoneId) null);
191     }
192 
193     @Test
now_ZoneId()194     public void now_ZoneId() {
195         ZoneId zone = ZoneId.of("UTC+01:02:03");
196         YearMonth expected = YearMonth.now(Clock.system(zone));
197         YearMonth test = YearMonth.now(zone);
198         for (int i = 0; i < 100; i++) {
199             if (expected.equals(test)) {
200                 return;
201             }
202             expected = YearMonth.now(Clock.system(zone));
203             test = YearMonth.now(zone);
204         }
205         assertEquals(test, expected);
206     }
207 
208     //-----------------------------------------------------------------------
209     // now(Clock)
210     //-----------------------------------------------------------------------
211     @Test
now_Clock()212     public void now_Clock() {
213         Instant instant = LocalDateTime.of(2010, 12, 31, 0, 0).toInstant(ZoneOffset.UTC);
214         Clock clock = Clock.fixed(instant, ZoneOffset.UTC);
215         YearMonth test = YearMonth.now(clock);
216         assertEquals(test.getYear(), 2010);
217         assertEquals(test.getMonth(), Month.DECEMBER);
218     }
219 
220     @Test(expectedExceptions=NullPointerException.class)
now_Clock_nullClock()221     public void now_Clock_nullClock() {
222         YearMonth.now((Clock) null);
223     }
224 
225     //-----------------------------------------------------------------------
226     @Test
factory_intsMonth()227     public void factory_intsMonth() {
228         YearMonth test = YearMonth.of(2008, Month.FEBRUARY);
229         check(test, 2008, 2);
230     }
231 
232     @Test(expectedExceptions=DateTimeException.class)
test_factory_intsMonth_yearTooLow()233     public void test_factory_intsMonth_yearTooLow() {
234         YearMonth.of(Year.MIN_VALUE - 1, Month.JANUARY);
235     }
236 
237     @Test(expectedExceptions=DateTimeException.class)
test_factory_intsMonth_dayTooHigh()238     public void test_factory_intsMonth_dayTooHigh() {
239         YearMonth.of(Year.MAX_VALUE + 1, Month.JANUARY);
240     }
241 
242     @Test(expectedExceptions=NullPointerException.class)
factory_intsMonth_nullMonth()243     public void factory_intsMonth_nullMonth() {
244         YearMonth.of(2008, null);
245     }
246 
247     //-----------------------------------------------------------------------
248     @Test
factory_ints()249     public void factory_ints() {
250         YearMonth test = YearMonth.of(2008, 2);
251         check(test, 2008, 2);
252     }
253 
254     @Test(expectedExceptions=DateTimeException.class)
test_factory_ints_yearTooLow()255     public void test_factory_ints_yearTooLow() {
256         YearMonth.of(Year.MIN_VALUE - 1, 2);
257     }
258 
259     @Test(expectedExceptions=DateTimeException.class)
test_factory_ints_dayTooHigh()260     public void test_factory_ints_dayTooHigh() {
261         YearMonth.of(Year.MAX_VALUE + 1, 2);
262     }
263 
264     @Test(expectedExceptions=DateTimeException.class)
test_factory_ints_monthTooLow()265     public void test_factory_ints_monthTooLow() {
266         YearMonth.of(2008, 0);
267     }
268 
269     @Test(expectedExceptions=DateTimeException.class)
test_factory_ints_monthTooHigh()270     public void test_factory_ints_monthTooHigh() {
271         YearMonth.of(2008, 13);
272     }
273 
274     //-----------------------------------------------------------------------
275     @Test
test_from_TemporalAccessor()276     public void test_from_TemporalAccessor() {
277         assertEquals(YearMonth.from(LocalDate.of(2007, 7, 15)), YearMonth.of(2007, 7));
278     }
279 
280     @Test(expectedExceptions=DateTimeException.class)
test_from_TemporalAccessor_invalid_noDerive()281     public void test_from_TemporalAccessor_invalid_noDerive() {
282         YearMonth.from(LocalTime.of(12, 30));
283     }
284 
285     @Test(expectedExceptions=NullPointerException.class)
test_from_TemporalAccessor_null()286     public void test_from_TemporalAccessor_null() {
287         YearMonth.from((TemporalAccessor) null);
288     }
289 
290     //-----------------------------------------------------------------------
291     // parse()
292     //-----------------------------------------------------------------------
293     @DataProvider(name="goodParseData")
provider_goodParseData()294     Object[][] provider_goodParseData() {
295         return new Object[][] {
296                 {"0000-01", YearMonth.of(0, 1)},
297                 {"0000-12", YearMonth.of(0, 12)},
298                 {"9999-12", YearMonth.of(9999, 12)},
299                 {"2000-01", YearMonth.of(2000, 1)},
300                 {"2000-02", YearMonth.of(2000, 2)},
301                 {"2000-03", YearMonth.of(2000, 3)},
302                 {"2000-04", YearMonth.of(2000, 4)},
303                 {"2000-05", YearMonth.of(2000, 5)},
304                 {"2000-06", YearMonth.of(2000, 6)},
305                 {"2000-07", YearMonth.of(2000, 7)},
306                 {"2000-08", YearMonth.of(2000, 8)},
307                 {"2000-09", YearMonth.of(2000, 9)},
308                 {"2000-10", YearMonth.of(2000, 10)},
309                 {"2000-11", YearMonth.of(2000, 11)},
310                 {"2000-12", YearMonth.of(2000, 12)},
311 
312                 {"+12345678-03", YearMonth.of(12345678, 3)},
313                 {"+123456-03", YearMonth.of(123456, 3)},
314                 {"0000-03", YearMonth.of(0, 3)},
315                 {"-1234-03", YearMonth.of(-1234, 3)},
316                 {"-12345678-03", YearMonth.of(-12345678, 3)},
317 
318                 {"+" + Year.MAX_VALUE + "-03", YearMonth.of(Year.MAX_VALUE, 3)},
319                 {Year.MIN_VALUE + "-03", YearMonth.of(Year.MIN_VALUE, 3)},
320         };
321     }
322 
323     @Test(dataProvider="goodParseData")
factory_parse_success(String text, YearMonth expected)324     public void factory_parse_success(String text, YearMonth expected) {
325         YearMonth yearMonth = YearMonth.parse(text);
326         assertEquals(yearMonth, expected);
327     }
328 
329     //-----------------------------------------------------------------------
330     @DataProvider(name="badParseData")
provider_badParseData()331     Object[][] provider_badParseData() {
332         return new Object[][] {
333                 {"", 0},
334                 {"-00", 1},
335                 {"--01-0", 1},
336                 {"A01-3", 0},
337                 {"200-01", 0},
338                 {"2009/12", 4},
339 
340                 {"-0000-10", 0},
341                 {"-12345678901-10", 11},
342                 {"+1-10", 1},
343                 {"+12-10", 1},
344                 {"+123-10", 1},
345                 {"+1234-10", 0},
346                 {"12345-10", 0},
347                 {"+12345678901-10", 11},
348         };
349     }
350 
351     @Test(dataProvider="badParseData", expectedExceptions=DateTimeParseException.class)
factory_parse_fail(String text, int pos)352     public void factory_parse_fail(String text, int pos) {
353         try {
354             YearMonth.parse(text);
355             fail(String.format("Parse should have failed for %s at position %d", text, pos));
356         } catch (DateTimeParseException ex) {
357             assertEquals(ex.getParsedString(), text);
358             assertEquals(ex.getErrorIndex(), pos);
359             throw ex;
360         }
361     }
362 
363     //-----------------------------------------------------------------------
364     @Test(expectedExceptions=DateTimeParseException.class)
factory_parse_illegalValue_Month()365     public void factory_parse_illegalValue_Month() {
366         YearMonth.parse("2008-13");
367     }
368 
369     @Test(expectedExceptions=NullPointerException.class)
factory_parse_nullText()370     public void factory_parse_nullText() {
371         YearMonth.parse(null);
372     }
373 
374     //-----------------------------------------------------------------------
375     // parse(DateTimeFormatter)
376     //-----------------------------------------------------------------------
377     @Test
factory_parse_formatter()378     public void factory_parse_formatter() {
379         DateTimeFormatter f = DateTimeFormatter.ofPattern("y M");
380         YearMonth test = YearMonth.parse("2010 12", f);
381         assertEquals(test, YearMonth.of(2010, 12));
382     }
383 
384     @Test(expectedExceptions=NullPointerException.class)
factory_parse_formatter_nullText()385     public void factory_parse_formatter_nullText() {
386         DateTimeFormatter f = DateTimeFormatter.ofPattern("y M");
387         YearMonth.parse((String) null, f);
388     }
389 
390     @Test(expectedExceptions=NullPointerException.class)
factory_parse_formatter_nullFormatter()391     public void factory_parse_formatter_nullFormatter() {
392         YearMonth.parse("ANY", null);
393     }
394 
395     //-----------------------------------------------------------------------
396     // isSupported(TemporalField)
397     //-----------------------------------------------------------------------
398     @Test
test_isSupported_TemporalField()399     public void test_isSupported_TemporalField() {
400         assertEquals(TEST_2008_06.isSupported((TemporalField) null), false);
401         assertEquals(TEST_2008_06.isSupported(ChronoField.NANO_OF_SECOND), false);
402         assertEquals(TEST_2008_06.isSupported(ChronoField.NANO_OF_DAY), false);
403         assertEquals(TEST_2008_06.isSupported(ChronoField.MICRO_OF_SECOND), false);
404         assertEquals(TEST_2008_06.isSupported(ChronoField.MICRO_OF_DAY), false);
405         assertEquals(TEST_2008_06.isSupported(ChronoField.MILLI_OF_SECOND), false);
406         assertEquals(TEST_2008_06.isSupported(ChronoField.MILLI_OF_DAY), false);
407         assertEquals(TEST_2008_06.isSupported(ChronoField.SECOND_OF_MINUTE), false);
408         assertEquals(TEST_2008_06.isSupported(ChronoField.SECOND_OF_DAY), false);
409         assertEquals(TEST_2008_06.isSupported(ChronoField.MINUTE_OF_HOUR), false);
410         assertEquals(TEST_2008_06.isSupported(ChronoField.MINUTE_OF_DAY), false);
411         assertEquals(TEST_2008_06.isSupported(ChronoField.HOUR_OF_AMPM), false);
412         assertEquals(TEST_2008_06.isSupported(ChronoField.CLOCK_HOUR_OF_AMPM), false);
413         assertEquals(TEST_2008_06.isSupported(ChronoField.HOUR_OF_DAY), false);
414         assertEquals(TEST_2008_06.isSupported(ChronoField.CLOCK_HOUR_OF_DAY), false);
415         assertEquals(TEST_2008_06.isSupported(ChronoField.AMPM_OF_DAY), false);
416         assertEquals(TEST_2008_06.isSupported(ChronoField.DAY_OF_WEEK), false);
417         assertEquals(TEST_2008_06.isSupported(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH), false);
418         assertEquals(TEST_2008_06.isSupported(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR), false);
419         assertEquals(TEST_2008_06.isSupported(ChronoField.DAY_OF_MONTH), false);
420         assertEquals(TEST_2008_06.isSupported(ChronoField.DAY_OF_YEAR), false);
421         assertEquals(TEST_2008_06.isSupported(ChronoField.EPOCH_DAY), false);
422         assertEquals(TEST_2008_06.isSupported(ChronoField.ALIGNED_WEEK_OF_MONTH), false);
423         assertEquals(TEST_2008_06.isSupported(ChronoField.ALIGNED_WEEK_OF_YEAR), false);
424         assertEquals(TEST_2008_06.isSupported(ChronoField.MONTH_OF_YEAR), true);
425         assertEquals(TEST_2008_06.isSupported(ChronoField.PROLEPTIC_MONTH), true);
426         assertEquals(TEST_2008_06.isSupported(ChronoField.YEAR), true);
427         assertEquals(TEST_2008_06.isSupported(ChronoField.YEAR_OF_ERA), true);
428         assertEquals(TEST_2008_06.isSupported(ChronoField.ERA), true);
429         assertEquals(TEST_2008_06.isSupported(ChronoField.INSTANT_SECONDS), false);
430         assertEquals(TEST_2008_06.isSupported(ChronoField.OFFSET_SECONDS), false);
431     }
432 
433     //-----------------------------------------------------------------------
434     // isSupported(TemporalUnit)
435     //-----------------------------------------------------------------------
436     @Test
test_isSupported_TemporalUnit()437     public void test_isSupported_TemporalUnit() {
438         assertEquals(TEST_2008_06.isSupported((TemporalUnit) null), false);
439         assertEquals(TEST_2008_06.isSupported(ChronoUnit.NANOS), false);
440         assertEquals(TEST_2008_06.isSupported(ChronoUnit.MICROS), false);
441         assertEquals(TEST_2008_06.isSupported(ChronoUnit.MILLIS), false);
442         assertEquals(TEST_2008_06.isSupported(ChronoUnit.SECONDS), false);
443         assertEquals(TEST_2008_06.isSupported(ChronoUnit.MINUTES), false);
444         assertEquals(TEST_2008_06.isSupported(ChronoUnit.HOURS), false);
445         assertEquals(TEST_2008_06.isSupported(ChronoUnit.HALF_DAYS), false);
446         assertEquals(TEST_2008_06.isSupported(ChronoUnit.DAYS), false);
447         assertEquals(TEST_2008_06.isSupported(ChronoUnit.WEEKS), false);
448         assertEquals(TEST_2008_06.isSupported(ChronoUnit.MONTHS), true);
449         assertEquals(TEST_2008_06.isSupported(ChronoUnit.YEARS), true);
450         assertEquals(TEST_2008_06.isSupported(ChronoUnit.DECADES), true);
451         assertEquals(TEST_2008_06.isSupported(ChronoUnit.CENTURIES), true);
452         assertEquals(TEST_2008_06.isSupported(ChronoUnit.MILLENNIA), true);
453         assertEquals(TEST_2008_06.isSupported(ChronoUnit.ERAS), true);
454         assertEquals(TEST_2008_06.isSupported(ChronoUnit.FOREVER), false);
455     }
456 
457     //-----------------------------------------------------------------------
458     // get(TemporalField)
459     //-----------------------------------------------------------------------
460     @Test
test_get_TemporalField()461     public void test_get_TemporalField() {
462         assertEquals(TEST_2008_06.get(YEAR), 2008);
463         assertEquals(TEST_2008_06.get(MONTH_OF_YEAR), 6);
464         assertEquals(TEST_2008_06.get(YEAR_OF_ERA), 2008);
465         assertEquals(TEST_2008_06.get(ERA), 1);
466     }
467 
468     @Test
test_getLong_TemporalField()469     public void test_getLong_TemporalField() {
470         assertEquals(TEST_2008_06.getLong(YEAR), 2008);
471         assertEquals(TEST_2008_06.getLong(MONTH_OF_YEAR), 6);
472         assertEquals(TEST_2008_06.getLong(YEAR_OF_ERA), 2008);
473         assertEquals(TEST_2008_06.getLong(ERA), 1);
474         assertEquals(TEST_2008_06.getLong(PROLEPTIC_MONTH), 2008 * 12 + 6 - 1);
475     }
476 
477     //-----------------------------------------------------------------------
478     // query(TemporalQuery)
479     //-----------------------------------------------------------------------
480     @DataProvider(name="query")
data_query()481     Object[][] data_query() {
482         return new Object[][] {
483                 {TEST_2008_06, TemporalQueries.chronology(), IsoChronology.INSTANCE},
484                 {TEST_2008_06, TemporalQueries.zoneId(), null},
485                 {TEST_2008_06, TemporalQueries.precision(), ChronoUnit.MONTHS},
486                 {TEST_2008_06, TemporalQueries.zone(), null},
487                 {TEST_2008_06, TemporalQueries.offset(), null},
488                 {TEST_2008_06, TemporalQueries.localDate(), null},
489                 {TEST_2008_06, TemporalQueries.localTime(), null},
490         };
491     }
492 
493     @Test(dataProvider="query")
test_query(TemporalAccessor temporal, TemporalQuery<T> query, T expected)494     public <T> void test_query(TemporalAccessor temporal, TemporalQuery<T> query, T expected) {
495         assertEquals(temporal.query(query), expected);
496     }
497 
498     @Test(dataProvider="query")
test_queryFrom(TemporalAccessor temporal, TemporalQuery<T> query, T expected)499     public <T> void test_queryFrom(TemporalAccessor temporal, TemporalQuery<T> query, T expected) {
500         assertEquals(query.queryFrom(temporal), expected);
501     }
502 
503     @Test(expectedExceptions=NullPointerException.class)
test_query_null()504     public void test_query_null() {
505         TEST_2008_06.query(null);
506     }
507 
508     //-----------------------------------------------------------------------
509     // get*()
510     //-----------------------------------------------------------------------
511     @DataProvider(name="sampleDates")
provider_sampleDates()512     Object[][] provider_sampleDates() {
513         return new Object[][] {
514             {2008, 1},
515             {2008, 2},
516             {-1, 3},
517             {0, 12},
518         };
519     }
520 
521     @Test(dataProvider="sampleDates")
test_get(int y, int m)522     public void test_get(int y, int m) {
523         YearMonth a = YearMonth.of(y, m);
524         assertEquals(a.getYear(), y);
525         assertEquals(a.getMonth(), Month.of(m));
526         assertEquals(a.getMonthValue(), m);
527     }
528 
529     //-----------------------------------------------------------------------
530     // with(Year)
531     //-----------------------------------------------------------------------
532     @Test
test_with_Year()533     public void test_with_Year() {
534         YearMonth test = YearMonth.of(2008, 6);
535         assertEquals(test.with(Year.of(2000)), YearMonth.of(2000, 6));
536     }
537 
538     @Test
test_with_Year_noChange_equal()539     public void test_with_Year_noChange_equal() {
540         YearMonth test = YearMonth.of(2008, 6);
541         assertEquals(test.with(Year.of(2008)), test);
542     }
543 
544     @Test(expectedExceptions=NullPointerException.class)
test_with_Year_null()545     public void test_with_Year_null() {
546         YearMonth test = YearMonth.of(2008, 6);
547         test.with((Year) null);
548     }
549 
550     //-----------------------------------------------------------------------
551     // with(Month)
552     //-----------------------------------------------------------------------
553     @Test
test_with_Month()554     public void test_with_Month() {
555         YearMonth test = YearMonth.of(2008, 6);
556         assertEquals(test.with(Month.JANUARY), YearMonth.of(2008, 1));
557     }
558 
559     @Test
test_with_Month_noChange_equal()560     public void test_with_Month_noChange_equal() {
561         YearMonth test = YearMonth.of(2008, 6);
562         assertEquals(test.with(Month.JUNE), test);
563     }
564 
565     @Test(expectedExceptions=NullPointerException.class)
test_with_Month_null()566     public void test_with_Month_null() {
567         YearMonth test = YearMonth.of(2008, 6);
568         test.with((Month) null);
569     }
570 
571     //-----------------------------------------------------------------------
572     // withYear()
573     //-----------------------------------------------------------------------
574     @Test
test_withYear()575     public void test_withYear() {
576         YearMonth test = YearMonth.of(2008, 6);
577         assertEquals(test.withYear(1999), YearMonth.of(1999, 6));
578     }
579 
580     @Test
test_withYear_int_noChange_equal()581     public void test_withYear_int_noChange_equal() {
582         YearMonth test = YearMonth.of(2008, 6);
583         assertEquals(test.withYear(2008), test);
584     }
585 
586     @Test(expectedExceptions=DateTimeException.class)
test_withYear_tooLow()587     public void test_withYear_tooLow() {
588         YearMonth test = YearMonth.of(2008, 6);
589         test.withYear(Year.MIN_VALUE - 1);
590     }
591 
592     @Test(expectedExceptions=DateTimeException.class)
test_withYear_tooHigh()593     public void test_withYear_tooHigh() {
594         YearMonth test = YearMonth.of(2008, 6);
595         test.withYear(Year.MAX_VALUE + 1);
596     }
597 
598     //-----------------------------------------------------------------------
599     // withMonth()
600     //-----------------------------------------------------------------------
601     @Test
test_withMonth()602     public void test_withMonth() {
603         YearMonth test = YearMonth.of(2008, 6);
604         assertEquals(test.withMonth(1), YearMonth.of(2008, 1));
605     }
606 
607     @Test
test_withMonth_int_noChange_equal()608     public void test_withMonth_int_noChange_equal() {
609         YearMonth test = YearMonth.of(2008, 6);
610         assertEquals(test.withMonth(6), test);
611     }
612 
613     @Test(expectedExceptions=DateTimeException.class)
test_withMonth_tooLow()614     public void test_withMonth_tooLow() {
615         YearMonth test = YearMonth.of(2008, 6);
616         test.withMonth(0);
617     }
618 
619     @Test(expectedExceptions=DateTimeException.class)
test_withMonth_tooHigh()620     public void test_withMonth_tooHigh() {
621         YearMonth test = YearMonth.of(2008, 6);
622         test.withMonth(13);
623     }
624 
625     //-----------------------------------------------------------------------
626     // plusYears()
627     //-----------------------------------------------------------------------
628     @Test
test_plusYears_long()629     public void test_plusYears_long() {
630         YearMonth test = YearMonth.of(2008, 6);
631         assertEquals(test.plusYears(1), YearMonth.of(2009, 6));
632     }
633 
634     @Test
test_plusYears_long_noChange_equal()635     public void test_plusYears_long_noChange_equal() {
636         YearMonth test = YearMonth.of(2008, 6);
637         assertEquals(test.plusYears(0), test);
638     }
639 
640     @Test
test_plusYears_long_negative()641     public void test_plusYears_long_negative() {
642         YearMonth test = YearMonth.of(2008, 6);
643         assertEquals(test.plusYears(-1), YearMonth.of(2007, 6));
644     }
645 
646     @Test
test_plusYears_long_big()647     public void test_plusYears_long_big() {
648         YearMonth test = YearMonth.of(-40, 6);
649         assertEquals(test.plusYears(20L + Year.MAX_VALUE), YearMonth.of((int) (-40L + 20L + Year.MAX_VALUE), 6));
650     }
651 
652     @Test(expectedExceptions=DateTimeException.class)
test_plusYears_long_invalidTooLarge()653     public void test_plusYears_long_invalidTooLarge() {
654         YearMonth test = YearMonth.of(Year.MAX_VALUE, 6);
655         test.plusYears(1);
656     }
657 
658     @Test(expectedExceptions=DateTimeException.class)
test_plusYears_long_invalidTooLargeMaxAddMax()659     public void test_plusYears_long_invalidTooLargeMaxAddMax() {
660         YearMonth test = YearMonth.of(Year.MAX_VALUE, 12);
661         test.plusYears(Long.MAX_VALUE);
662     }
663 
664     @Test(expectedExceptions=DateTimeException.class)
test_plusYears_long_invalidTooLargeMaxAddMin()665     public void test_plusYears_long_invalidTooLargeMaxAddMin() {
666         YearMonth test = YearMonth.of(Year.MAX_VALUE, 12);
667         test.plusYears(Long.MIN_VALUE);
668     }
669 
670     @Test(expectedExceptions=DateTimeException.class)
test_plusYears_long_invalidTooSmall()671     public void test_plusYears_long_invalidTooSmall() {
672         YearMonth test = YearMonth.of(Year.MIN_VALUE, 6);
673         test.plusYears(-1);
674     }
675 
676     //-----------------------------------------------------------------------
677     // plusMonths()
678     //-----------------------------------------------------------------------
679     @Test
test_plusMonths_long()680     public void test_plusMonths_long() {
681         YearMonth test = YearMonth.of(2008, 6);
682         assertEquals(test.plusMonths(1), YearMonth.of(2008, 7));
683     }
684 
685     @Test
test_plusMonths_long_noChange_equal()686     public void test_plusMonths_long_noChange_equal() {
687         YearMonth test = YearMonth.of(2008, 6);
688         assertEquals(test.plusMonths(0), test);
689     }
690 
691     @Test
test_plusMonths_long_overYears()692     public void test_plusMonths_long_overYears() {
693         YearMonth test = YearMonth.of(2008, 6);
694         assertEquals(test.plusMonths(7), YearMonth.of(2009, 1));
695     }
696 
697     @Test
test_plusMonths_long_negative()698     public void test_plusMonths_long_negative() {
699         YearMonth test = YearMonth.of(2008, 6);
700         assertEquals(test.plusMonths(-1), YearMonth.of(2008, 5));
701     }
702 
703     @Test
test_plusMonths_long_negativeOverYear()704     public void test_plusMonths_long_negativeOverYear() {
705         YearMonth test = YearMonth.of(2008, 6);
706         assertEquals(test.plusMonths(-6), YearMonth.of(2007, 12));
707     }
708 
709     @Test
test_plusMonths_long_big()710     public void test_plusMonths_long_big() {
711         YearMonth test = YearMonth.of(-40, 6);
712         long months = 20L + Integer.MAX_VALUE;
713         assertEquals(test.plusMonths(months), YearMonth.of((int) (-40L + months / 12), 6 + (int) (months % 12)));
714     }
715 
716     @Test(expectedExceptions={DateTimeException.class})
test_plusMonths_long_invalidTooLarge()717     public void test_plusMonths_long_invalidTooLarge() {
718         YearMonth test = YearMonth.of(Year.MAX_VALUE, 12);
719         test.plusMonths(1);
720     }
721 
722     @Test(expectedExceptions=DateTimeException.class)
test_plusMonths_long_invalidTooLargeMaxAddMax()723     public void test_plusMonths_long_invalidTooLargeMaxAddMax() {
724         YearMonth test = YearMonth.of(Year.MAX_VALUE, 12);
725         test.plusMonths(Long.MAX_VALUE);
726     }
727 
728     @Test(expectedExceptions=DateTimeException.class)
test_plusMonths_long_invalidTooLargeMaxAddMin()729     public void test_plusMonths_long_invalidTooLargeMaxAddMin() {
730         YearMonth test = YearMonth.of(Year.MAX_VALUE, 12);
731         test.plusMonths(Long.MIN_VALUE);
732     }
733 
734     @Test(expectedExceptions={DateTimeException.class})
test_plusMonths_long_invalidTooSmall()735     public void test_plusMonths_long_invalidTooSmall() {
736         YearMonth test = YearMonth.of(Year.MIN_VALUE, 1);
737         test.plusMonths(-1);
738     }
739 
740     //-----------------------------------------------------------------------
741     // plus(long, TemporalUnit)
742     //-----------------------------------------------------------------------
743     @DataProvider(name="plus_long_TemporalUnit")
data_plus_long_TemporalUnit()744     Object[][] data_plus_long_TemporalUnit() {
745         return new Object[][] {
746             {YearMonth.of(1, 10), 1, ChronoUnit.YEARS, YearMonth.of(2, 10), null},
747             {YearMonth.of(1, 10), -12, ChronoUnit.YEARS, YearMonth.of(-11, 10), null},
748             {YearMonth.of(1, 10), 0, ChronoUnit.YEARS, YearMonth.of(1, 10), null},
749             {YearMonth.of(999999999, 12), 0, ChronoUnit.YEARS, YearMonth.of(999999999, 12), null},
750             {YearMonth.of(-999999999, 1), 0, ChronoUnit.YEARS, YearMonth.of(-999999999, 1), null},
751             {YearMonth.of(0, 1), -999999999, ChronoUnit.YEARS, YearMonth.of(-999999999, 1), null},
752             {YearMonth.of(0, 12), 999999999, ChronoUnit.YEARS, YearMonth.of(999999999, 12), null},
753 
754             {YearMonth.of(1, 10), 1, ChronoUnit.MONTHS, YearMonth.of(1, 11), null},
755             {YearMonth.of(1, 10), -12, ChronoUnit.MONTHS, YearMonth.of(0, 10), null},
756             {YearMonth.of(1, 10), 0, ChronoUnit.MONTHS, YearMonth.of(1, 10), null},
757             {YearMonth.of(999999999, 12), 0, ChronoUnit.MONTHS, YearMonth.of(999999999, 12), null},
758             {YearMonth.of(-999999999, 1), 0, ChronoUnit.MONTHS, YearMonth.of(-999999999, 1), null},
759             {YearMonth.of(-999999999, 2), -1, ChronoUnit.MONTHS, YearMonth.of(-999999999, 1), null},
760             {YearMonth.of(999999999, 3), 9, ChronoUnit.MONTHS, YearMonth.of(999999999, 12), null},
761 
762             {YearMonth.of(-1, 10), 1, ChronoUnit.ERAS, YearMonth.of(2, 10), null},
763             {YearMonth.of(5, 10), 1, ChronoUnit.CENTURIES, YearMonth.of(105, 10), null},
764             {YearMonth.of(5, 10), 1, ChronoUnit.DECADES, YearMonth.of(15, 10), null},
765 
766             {YearMonth.of(999999999, 12), 1, ChronoUnit.MONTHS, null, DateTimeException.class},
767             {YearMonth.of(-999999999, 1), -1, ChronoUnit.MONTHS, null, DateTimeException.class},
768 
769             {YearMonth.of(1, 1), 0, ChronoUnit.DAYS, null, DateTimeException.class},
770             {YearMonth.of(1, 1), 0, ChronoUnit.WEEKS, null, DateTimeException.class},
771         };
772     }
773 
774     @Test(dataProvider="plus_long_TemporalUnit")
test_plus_long_TemporalUnit(YearMonth base, long amount, TemporalUnit unit, YearMonth expectedYearMonth, Class<?> expectedEx)775     public void test_plus_long_TemporalUnit(YearMonth base, long amount, TemporalUnit unit, YearMonth expectedYearMonth, Class<?> expectedEx) {
776         if (expectedEx == null) {
777             assertEquals(base.plus(amount, unit), expectedYearMonth);
778         } else {
779             try {
780                 YearMonth result = base.plus(amount, unit);
781                 fail();
782             } catch (Exception ex) {
783                 assertTrue(expectedEx.isInstance(ex));
784             }
785         }
786     }
787 
788     //-----------------------------------------------------------------------
789     // plus(TemporalAmount)
790     //-----------------------------------------------------------------------
791     @DataProvider(name="plus_TemporalAmount")
data_plus_TemporalAmount()792     Object[][] data_plus_TemporalAmount() {
793         return new Object[][] {
794             {YearMonth.of(1, 1), Period.ofYears(1), YearMonth.of(2, 1), null},
795             {YearMonth.of(1, 1), Period.ofYears(-12), YearMonth.of(-11, 1), null},
796             {YearMonth.of(1, 1), Period.ofYears(0), YearMonth.of(1, 1), null},
797             {YearMonth.of(999999999, 12), Period.ofYears(0), YearMonth.of(999999999, 12), null},
798             {YearMonth.of(-999999999, 1), Period.ofYears(0), YearMonth.of(-999999999, 1), null},
799             {YearMonth.of(0, 1), Period.ofYears(-999999999), YearMonth.of(-999999999, 1), null},
800             {YearMonth.of(0, 12), Period.ofYears(999999999), YearMonth.of(999999999, 12), null},
801 
802             {YearMonth.of(1, 1), Period.ofMonths(1), YearMonth.of(1, 2), null},
803             {YearMonth.of(1, 1), Period.ofMonths(-12), YearMonth.of(0, 1), null},
804             {YearMonth.of(1, 1), Period.ofMonths(121), YearMonth.of(11, 2), null},
805             {YearMonth.of(1, 1), Period.ofMonths(0), YearMonth.of(1, 1), null},
806             {YearMonth.of(999999999, 12), Period.ofMonths(0), YearMonth.of(999999999, 12), null},
807             {YearMonth.of(-999999999, 1), Period.ofMonths(0), YearMonth.of(-999999999, 1), null},
808             {YearMonth.of(-999999999, 2), Period.ofMonths(-1), YearMonth.of(-999999999, 1), null},
809             {YearMonth.of(999999999, 11), Period.ofMonths(1), YearMonth.of(999999999, 12), null},
810 
811             {YearMonth.of(1, 1), Period.ofYears(1).withMonths(2), YearMonth.of(2, 3), null},
812             {YearMonth.of(1, 1), Period.ofYears(-12).withMonths(-1), YearMonth.of(-12, 12), null},
813 
814             {YearMonth.of(1, 1), Period.ofMonths(2).withYears(1), YearMonth.of(2, 3), null},
815             {YearMonth.of(1, 1), Period.ofMonths(-1).withYears(-12), YearMonth.of(-12, 12), null},
816 
817             {YearMonth.of(1, 1), Period.ofDays(365), null, DateTimeException.class},
818             {YearMonth.of(1, 1), Duration.ofDays(365), null, DateTimeException.class},
819             {YearMonth.of(1, 1), Duration.ofHours(365*24), null, DateTimeException.class},
820             {YearMonth.of(1, 1), Duration.ofMinutes(365*24*60), null, DateTimeException.class},
821             {YearMonth.of(1, 1), Duration.ofSeconds(365*24*3600), null, DateTimeException.class},
822             {YearMonth.of(1, 1), Duration.ofNanos(365*24*3600*1000000000), null, DateTimeException.class},
823         };
824     }
825 
826     @Test(dataProvider="plus_TemporalAmount")
test_plus_TemporalAmount(YearMonth base, TemporalAmount temporalAmount, YearMonth expectedYearMonth, Class<?> expectedEx)827     public void test_plus_TemporalAmount(YearMonth base, TemporalAmount temporalAmount, YearMonth expectedYearMonth, Class<?> expectedEx) {
828         if (expectedEx == null) {
829             assertEquals(base.plus(temporalAmount), expectedYearMonth);
830         } else {
831             try {
832                 YearMonth result = base.plus(temporalAmount);
833                 fail();
834             } catch (Exception ex) {
835                 assertTrue(expectedEx.isInstance(ex));
836             }
837         }
838     }
839 
840     //-----------------------------------------------------------------------
841     // minusYears()
842     //-----------------------------------------------------------------------
843     @Test
test_minusYears_long()844     public void test_minusYears_long() {
845         YearMonth test = YearMonth.of(2008, 6);
846         assertEquals(test.minusYears(1), YearMonth.of(2007, 6));
847     }
848 
849     @Test
test_minusYears_long_noChange_equal()850     public void test_minusYears_long_noChange_equal() {
851         YearMonth test = YearMonth.of(2008, 6);
852         assertEquals(test.minusYears(0), test);
853     }
854 
855     @Test
test_minusYears_long_negative()856     public void test_minusYears_long_negative() {
857         YearMonth test = YearMonth.of(2008, 6);
858         assertEquals(test.minusYears(-1), YearMonth.of(2009, 6));
859     }
860 
861     @Test
test_minusYears_long_big()862     public void test_minusYears_long_big() {
863         YearMonth test = YearMonth.of(40, 6);
864         assertEquals(test.minusYears(20L + Year.MAX_VALUE), YearMonth.of((int) (40L - 20L - Year.MAX_VALUE), 6));
865     }
866 
867     @Test(expectedExceptions=DateTimeException.class)
test_minusYears_long_invalidTooLarge()868     public void test_minusYears_long_invalidTooLarge() {
869         YearMonth test = YearMonth.of(Year.MAX_VALUE, 6);
870         test.minusYears(-1);
871     }
872 
873     @Test(expectedExceptions=DateTimeException.class)
test_minusYears_long_invalidTooLargeMaxSubtractMax()874     public void test_minusYears_long_invalidTooLargeMaxSubtractMax() {
875         YearMonth test = YearMonth.of(Year.MIN_VALUE, 12);
876         test.minusYears(Long.MAX_VALUE);
877     }
878 
879     @Test(expectedExceptions=DateTimeException.class)
test_minusYears_long_invalidTooLargeMaxSubtractMin()880     public void test_minusYears_long_invalidTooLargeMaxSubtractMin() {
881         YearMonth test = YearMonth.of(Year.MIN_VALUE, 12);
882         test.minusYears(Long.MIN_VALUE);
883     }
884 
885     @Test(expectedExceptions=DateTimeException.class)
test_minusYears_long_invalidTooSmall()886     public void test_minusYears_long_invalidTooSmall() {
887         YearMonth test = YearMonth.of(Year.MIN_VALUE, 6);
888         test.minusYears(1);
889     }
890 
891     //-----------------------------------------------------------------------
892     // minusMonths()
893     //-----------------------------------------------------------------------
894     @Test
test_minusMonths_long()895     public void test_minusMonths_long() {
896         YearMonth test = YearMonth.of(2008, 6);
897         assertEquals(test.minusMonths(1), YearMonth.of(2008, 5));
898     }
899 
900     @Test
test_minusMonths_long_noChange_equal()901     public void test_minusMonths_long_noChange_equal() {
902         YearMonth test = YearMonth.of(2008, 6);
903         assertEquals(test.minusMonths(0), test);
904     }
905 
906     @Test
test_minusMonths_long_overYears()907     public void test_minusMonths_long_overYears() {
908         YearMonth test = YearMonth.of(2008, 6);
909         assertEquals(test.minusMonths(6), YearMonth.of(2007, 12));
910     }
911 
912     @Test
test_minusMonths_long_negative()913     public void test_minusMonths_long_negative() {
914         YearMonth test = YearMonth.of(2008, 6);
915         assertEquals(test.minusMonths(-1), YearMonth.of(2008, 7));
916     }
917 
918     @Test
test_minusMonths_long_negativeOverYear()919     public void test_minusMonths_long_negativeOverYear() {
920         YearMonth test = YearMonth.of(2008, 6);
921         assertEquals(test.minusMonths(-7), YearMonth.of(2009, 1));
922     }
923 
924     @Test
test_minusMonths_long_big()925     public void test_minusMonths_long_big() {
926         YearMonth test = YearMonth.of(40, 6);
927         long months = 20L + Integer.MAX_VALUE;
928         assertEquals(test.minusMonths(months), YearMonth.of((int) (40L - months / 12), 6 - (int) (months % 12)));
929     }
930 
931     @Test(expectedExceptions={DateTimeException.class})
test_minusMonths_long_invalidTooLarge()932     public void test_minusMonths_long_invalidTooLarge() {
933         YearMonth test = YearMonth.of(Year.MAX_VALUE, 12);
934         test.minusMonths(-1);
935     }
936 
937     @Test(expectedExceptions=DateTimeException.class)
test_minusMonths_long_invalidTooLargeMaxSubtractMax()938     public void test_minusMonths_long_invalidTooLargeMaxSubtractMax() {
939         YearMonth test = YearMonth.of(Year.MAX_VALUE, 12);
940         test.minusMonths(Long.MAX_VALUE);
941     }
942 
943     @Test(expectedExceptions=DateTimeException.class)
test_minusMonths_long_invalidTooLargeMaxSubtractMin()944     public void test_minusMonths_long_invalidTooLargeMaxSubtractMin() {
945         YearMonth test = YearMonth.of(Year.MAX_VALUE, 12);
946         test.minusMonths(Long.MIN_VALUE);
947     }
948 
949     @Test(expectedExceptions={DateTimeException.class})
test_minusMonths_long_invalidTooSmall()950     public void test_minusMonths_long_invalidTooSmall() {
951         YearMonth test = YearMonth.of(Year.MIN_VALUE, 1);
952         test.minusMonths(1);
953     }
954 
955     //-----------------------------------------------------------------------
956     // minus(long, TemporalUnit)
957     //-----------------------------------------------------------------------
958     @DataProvider(name="minus_long_TemporalUnit")
data_minus_long_TemporalUnit()959     Object[][] data_minus_long_TemporalUnit() {
960         return new Object[][] {
961             {YearMonth.of(1, 10), 1, ChronoUnit.YEARS, YearMonth.of(0, 10), null},
962             {YearMonth.of(1, 10), 12, ChronoUnit.YEARS, YearMonth.of(-11, 10), null},
963             {YearMonth.of(1, 10), 0, ChronoUnit.YEARS, YearMonth.of(1, 10), null},
964             {YearMonth.of(999999999, 12), 0, ChronoUnit.YEARS, YearMonth.of(999999999, 12), null},
965             {YearMonth.of(-999999999, 1), 0, ChronoUnit.YEARS, YearMonth.of(-999999999, 1), null},
966             {YearMonth.of(0, 1), 999999999, ChronoUnit.YEARS, YearMonth.of(-999999999, 1), null},
967             {YearMonth.of(0, 12), -999999999, ChronoUnit.YEARS, YearMonth.of(999999999, 12), null},
968 
969             {YearMonth.of(1, 10), 1, ChronoUnit.MONTHS, YearMonth.of(1, 9), null},
970             {YearMonth.of(1, 10), 12, ChronoUnit.MONTHS, YearMonth.of(0, 10), null},
971             {YearMonth.of(1, 10), 0, ChronoUnit.MONTHS, YearMonth.of(1, 10), null},
972             {YearMonth.of(999999999, 12), 0, ChronoUnit.MONTHS, YearMonth.of(999999999, 12), null},
973             {YearMonth.of(-999999999, 1), 0, ChronoUnit.MONTHS, YearMonth.of(-999999999, 1), null},
974             {YearMonth.of(-999999999, 2), 1, ChronoUnit.MONTHS, YearMonth.of(-999999999, 1), null},
975             {YearMonth.of(999999999, 11), -1, ChronoUnit.MONTHS, YearMonth.of(999999999, 12), null},
976 
977             {YearMonth.of(1, 10), 1, ChronoUnit.ERAS, YearMonth.of(0, 10), null},
978             {YearMonth.of(5, 10), 1, ChronoUnit.CENTURIES, YearMonth.of(-95, 10), null},
979             {YearMonth.of(5, 10), 1, ChronoUnit.DECADES, YearMonth.of(-5, 10), null},
980 
981             {YearMonth.of(999999999, 12), -1, ChronoUnit.MONTHS, null, DateTimeException.class},
982             {YearMonth.of(-999999999, 1), 1, ChronoUnit.MONTHS, null, DateTimeException.class},
983 
984             {YearMonth.of(1, 1), 0, ChronoUnit.DAYS, null, DateTimeException.class},
985             {YearMonth.of(1, 1), 0, ChronoUnit.WEEKS, null, DateTimeException.class},
986         };
987     }
988 
989     @Test(dataProvider="minus_long_TemporalUnit")
test_minus_long_TemporalUnit(YearMonth base, long amount, TemporalUnit unit, YearMonth expectedYearMonth, Class<?> expectedEx)990     public void test_minus_long_TemporalUnit(YearMonth base, long amount, TemporalUnit unit, YearMonth expectedYearMonth, Class<?> expectedEx) {
991         if (expectedEx == null) {
992             assertEquals(base.minus(amount, unit), expectedYearMonth);
993         } else {
994             try {
995                 YearMonth result = base.minus(amount, unit);
996                 fail();
997             } catch (Exception ex) {
998                 assertTrue(expectedEx.isInstance(ex));
999             }
1000         }
1001     }
1002 
1003     //-----------------------------------------------------------------------
1004     // minus(TemporalAmount)
1005     //-----------------------------------------------------------------------
1006     @DataProvider(name="minus_TemporalAmount")
data_minus_TemporalAmount()1007     Object[][] data_minus_TemporalAmount() {
1008         return new Object[][] {
1009             {YearMonth.of(1, 1), Period.ofYears(1), YearMonth.of(0, 1), null},
1010             {YearMonth.of(1, 1), Period.ofYears(-12), YearMonth.of(13, 1), null},
1011             {YearMonth.of(1, 1), Period.ofYears(0), YearMonth.of(1, 1), null},
1012             {YearMonth.of(999999999, 12), Period.ofYears(0), YearMonth.of(999999999, 12), null},
1013             {YearMonth.of(-999999999, 1), Period.ofYears(0), YearMonth.of(-999999999, 1), null},
1014             {YearMonth.of(0, 1), Period.ofYears(999999999), YearMonth.of(-999999999, 1), null},
1015             {YearMonth.of(0, 12), Period.ofYears(-999999999), YearMonth.of(999999999, 12), null},
1016 
1017             {YearMonth.of(1, 1), Period.ofMonths(1), YearMonth.of(0, 12), null},
1018             {YearMonth.of(1, 1), Period.ofMonths(-12), YearMonth.of(2, 1), null},
1019             {YearMonth.of(1, 1), Period.ofMonths(121), YearMonth.of(-10, 12), null},
1020             {YearMonth.of(1, 1), Period.ofMonths(0), YearMonth.of(1, 1), null},
1021             {YearMonth.of(999999999, 12), Period.ofMonths(0), YearMonth.of(999999999, 12), null},
1022             {YearMonth.of(-999999999, 1), Period.ofMonths(0), YearMonth.of(-999999999, 1), null},
1023             {YearMonth.of(-999999999, 2), Period.ofMonths(1), YearMonth.of(-999999999, 1), null},
1024             {YearMonth.of(999999999, 11), Period.ofMonths(-1), YearMonth.of(999999999, 12), null},
1025 
1026             {YearMonth.of(1, 1), Period.ofYears(1).withMonths(2), YearMonth.of(-1, 11), null},
1027             {YearMonth.of(1, 1), Period.ofYears(-12).withMonths(-1), YearMonth.of(13, 2), null},
1028 
1029             {YearMonth.of(1, 1), Period.ofMonths(2).withYears(1), YearMonth.of(-1, 11), null},
1030             {YearMonth.of(1, 1), Period.ofMonths(-1).withYears(-12), YearMonth.of(13, 2), null},
1031 
1032             {YearMonth.of(1, 1), Period.ofDays(365), null, DateTimeException.class},
1033             {YearMonth.of(1, 1), Duration.ofDays(365), null, DateTimeException.class},
1034             {YearMonth.of(1, 1), Duration.ofHours(365*24), null, DateTimeException.class},
1035             {YearMonth.of(1, 1), Duration.ofMinutes(365*24*60), null, DateTimeException.class},
1036             {YearMonth.of(1, 1), Duration.ofSeconds(365*24*3600), null, DateTimeException.class},
1037             {YearMonth.of(1, 1), Duration.ofNanos(365*24*3600*1000000000), null, DateTimeException.class},
1038         };
1039     }
1040 
1041     @Test(dataProvider="minus_TemporalAmount")
test_minus_TemporalAmount(YearMonth base, TemporalAmount temporalAmount, YearMonth expectedYearMonth, Class<?> expectedEx)1042     public void test_minus_TemporalAmount(YearMonth base, TemporalAmount temporalAmount, YearMonth expectedYearMonth, Class<?> expectedEx) {
1043         if (expectedEx == null) {
1044             assertEquals(base.minus(temporalAmount), expectedYearMonth);
1045         } else {
1046             try {
1047                 YearMonth result = base.minus(temporalAmount);
1048                 fail();
1049             } catch (Exception ex) {
1050                 assertTrue(expectedEx.isInstance(ex));
1051             }
1052         }
1053     }
1054 
1055     //-----------------------------------------------------------------------
1056     // adjustInto()
1057     //-----------------------------------------------------------------------
1058     @Test
test_adjustDate()1059     public void test_adjustDate() {
1060         YearMonth test = YearMonth.of(2008, 6);
1061         LocalDate date = LocalDate.of(2007, 1, 1);
1062         assertEquals(test.adjustInto(date), LocalDate.of(2008, 6, 1));
1063     }
1064 
1065     @Test
test_adjustDate_preserveDoM()1066     public void test_adjustDate_preserveDoM() {
1067         YearMonth test = YearMonth.of(2011, 3);
1068         LocalDate date = LocalDate.of(2008, 2, 29);
1069         assertEquals(test.adjustInto(date), LocalDate.of(2011, 3, 29));
1070     }
1071 
1072     @Test
test_adjustDate_resolve()1073     public void test_adjustDate_resolve() {
1074         YearMonth test = YearMonth.of(2007, 2);
1075         LocalDate date = LocalDate.of(2008, 3, 31);
1076         assertEquals(test.adjustInto(date), LocalDate.of(2007, 2, 28));
1077     }
1078 
1079     @Test
test_adjustDate_equal()1080     public void test_adjustDate_equal() {
1081         YearMonth test = YearMonth.of(2008, 6);
1082         LocalDate date = LocalDate.of(2008, 6, 30);
1083         assertEquals(test.adjustInto(date), date);
1084     }
1085 
1086     @Test(expectedExceptions=NullPointerException.class)
test_adjustDate_null()1087     public void test_adjustDate_null() {
1088         TEST_2008_06.adjustInto((LocalDate) null);
1089     }
1090 
1091     //-----------------------------------------------------------------------
1092     // isLeapYear()
1093     //-----------------------------------------------------------------------
1094     @Test
test_isLeapYear()1095     public void test_isLeapYear() {
1096         assertEquals(YearMonth.of(2007, 6).isLeapYear(), false);
1097         assertEquals(YearMonth.of(2008, 6).isLeapYear(), true);
1098     }
1099 
1100     //-----------------------------------------------------------------------
1101     // lengthOfMonth()
1102     //-----------------------------------------------------------------------
1103     @Test
test_lengthOfMonth_june()1104     public void test_lengthOfMonth_june() {
1105         YearMonth test = YearMonth.of(2007, 6);
1106         assertEquals(test.lengthOfMonth(), 30);
1107     }
1108 
1109     @Test
test_lengthOfMonth_febNonLeap()1110     public void test_lengthOfMonth_febNonLeap() {
1111         YearMonth test = YearMonth.of(2007, 2);
1112         assertEquals(test.lengthOfMonth(), 28);
1113     }
1114 
1115     @Test
test_lengthOfMonth_febLeap()1116     public void test_lengthOfMonth_febLeap() {
1117         YearMonth test = YearMonth.of(2008, 2);
1118         assertEquals(test.lengthOfMonth(), 29);
1119     }
1120 
1121     //-----------------------------------------------------------------------
1122     // lengthOfYear()
1123     //-----------------------------------------------------------------------
1124     @Test
test_lengthOfYear()1125     public void test_lengthOfYear() {
1126         assertEquals(YearMonth.of(2007, 6).lengthOfYear(), 365);
1127         assertEquals(YearMonth.of(2008, 6).lengthOfYear(), 366);
1128     }
1129 
1130     //-----------------------------------------------------------------------
1131     // isValidDay(int)
1132     //-----------------------------------------------------------------------
1133     @Test
test_isValidDay_int_june()1134     public void test_isValidDay_int_june() {
1135         YearMonth test = YearMonth.of(2007, 6);
1136         assertEquals(test.isValidDay(1), true);
1137         assertEquals(test.isValidDay(30), true);
1138 
1139         assertEquals(test.isValidDay(-1), false);
1140         assertEquals(test.isValidDay(0), false);
1141         assertEquals(test.isValidDay(31), false);
1142         assertEquals(test.isValidDay(32), false);
1143     }
1144 
1145     @Test
test_isValidDay_int_febNonLeap()1146     public void test_isValidDay_int_febNonLeap() {
1147         YearMonth test = YearMonth.of(2007, 2);
1148         assertEquals(test.isValidDay(1), true);
1149         assertEquals(test.isValidDay(28), true);
1150 
1151         assertEquals(test.isValidDay(-1), false);
1152         assertEquals(test.isValidDay(0), false);
1153         assertEquals(test.isValidDay(29), false);
1154         assertEquals(test.isValidDay(32), false);
1155     }
1156 
1157     @Test
test_isValidDay_int_febLeap()1158     public void test_isValidDay_int_febLeap() {
1159         YearMonth test = YearMonth.of(2008, 2);
1160         assertEquals(test.isValidDay(1), true);
1161         assertEquals(test.isValidDay(29), true);
1162 
1163         assertEquals(test.isValidDay(-1), false);
1164         assertEquals(test.isValidDay(0), false);
1165         assertEquals(test.isValidDay(30), false);
1166         assertEquals(test.isValidDay(32), false);
1167     }
1168 
1169     //-----------------------------------------------------------------------
1170     // until(Temporal, TemporalUnit)
1171     //-----------------------------------------------------------------------
1172     @DataProvider(name="periodUntilUnit")
data_periodUntilUnit()1173     Object[][] data_periodUntilUnit() {
1174         return new Object[][] {
1175                 {ym(2000, 1), ym(-1, 12), MONTHS, -2000 * 12 - 1},
1176                 {ym(2000, 1), ym(0, 1), MONTHS, -2000 * 12},
1177                 {ym(2000, 1), ym(0, 12), MONTHS, -1999 * 12 - 1},
1178                 {ym(2000, 1), ym(1, 1), MONTHS, -1999 * 12},
1179                 {ym(2000, 1), ym(1999, 12), MONTHS, -1},
1180                 {ym(2000, 1), ym(2000, 1), MONTHS, 0},
1181                 {ym(2000, 1), ym(2000, 2), MONTHS, 1},
1182                 {ym(2000, 1), ym(2000, 3), MONTHS, 2},
1183                 {ym(2000, 1), ym(2000, 12), MONTHS, 11},
1184                 {ym(2000, 1), ym(2001, 1), MONTHS, 12},
1185                 {ym(2000, 1), ym(2246, 5), MONTHS, 246 * 12 + 4},
1186 
1187                 {ym(2000, 1), ym(-1, 12), YEARS, -2000},
1188                 {ym(2000, 1), ym(0, 1), YEARS, -2000},
1189                 {ym(2000, 1), ym(0, 12), YEARS, -1999},
1190                 {ym(2000, 1), ym(1, 1), YEARS, -1999},
1191                 {ym(2000, 1), ym(1998, 12), YEARS, -1},
1192                 {ym(2000, 1), ym(1999, 1), YEARS, -1},
1193                 {ym(2000, 1), ym(1999, 2), YEARS, 0},
1194                 {ym(2000, 1), ym(1999, 12), YEARS, 0},
1195                 {ym(2000, 1), ym(2000, 1), YEARS, 0},
1196                 {ym(2000, 1), ym(2000, 2), YEARS, 0},
1197                 {ym(2000, 1), ym(2000, 12), YEARS, 0},
1198                 {ym(2000, 1), ym(2001, 1), YEARS, 1},
1199                 {ym(2000, 1), ym(2246, 5), YEARS, 246},
1200 
1201                 {ym(2000, 5), ym(-1, 5), DECADES, -200},
1202                 {ym(2000, 5), ym(0, 4), DECADES, -200},
1203                 {ym(2000, 5), ym(0, 5), DECADES, -200},
1204                 {ym(2000, 5), ym(0, 6), DECADES, -199},
1205                 {ym(2000, 5), ym(1, 5), DECADES, -199},
1206                 {ym(2000, 5), ym(1990, 4), DECADES, -1},
1207                 {ym(2000, 5), ym(1990, 5), DECADES, -1},
1208                 {ym(2000, 5), ym(1990, 6), DECADES, 0},
1209                 {ym(2000, 5), ym(2000, 4), DECADES, 0},
1210                 {ym(2000, 5), ym(2000, 5), DECADES, 0},
1211                 {ym(2000, 5), ym(2000, 6), DECADES, 0},
1212                 {ym(2000, 5), ym(2010, 4), DECADES, 0},
1213                 {ym(2000, 5), ym(2010, 5), DECADES, 1},
1214                 {ym(2000, 5), ym(2010, 6), DECADES, 1},
1215 
1216                 {ym(2000, 5), ym(-1, 5), CENTURIES, -20},
1217                 {ym(2000, 5), ym(0, 4), CENTURIES, -20},
1218                 {ym(2000, 5), ym(0, 5), CENTURIES, -20},
1219                 {ym(2000, 5), ym(0, 6), CENTURIES, -19},
1220                 {ym(2000, 5), ym(1, 5), CENTURIES, -19},
1221                 {ym(2000, 5), ym(1900, 4), CENTURIES, -1},
1222                 {ym(2000, 5), ym(1900, 5), CENTURIES, -1},
1223                 {ym(2000, 5), ym(1900, 6), CENTURIES, 0},
1224                 {ym(2000, 5), ym(2000, 4), CENTURIES, 0},
1225                 {ym(2000, 5), ym(2000, 5), CENTURIES, 0},
1226                 {ym(2000, 5), ym(2000, 6), CENTURIES, 0},
1227                 {ym(2000, 5), ym(2100, 4), CENTURIES, 0},
1228                 {ym(2000, 5), ym(2100, 5), CENTURIES, 1},
1229                 {ym(2000, 5), ym(2100, 6), CENTURIES, 1},
1230 
1231                 {ym(2000, 5), ym(-1, 5), MILLENNIA, -2},
1232                 {ym(2000, 5), ym(0, 4), MILLENNIA, -2},
1233                 {ym(2000, 5), ym(0, 5), MILLENNIA, -2},
1234                 {ym(2000, 5), ym(0, 6), MILLENNIA, -1},
1235                 {ym(2000, 5), ym(1, 5), MILLENNIA, -1},
1236                 {ym(2000, 5), ym(1000, 4), MILLENNIA, -1},
1237                 {ym(2000, 5), ym(1000, 5), MILLENNIA, -1},
1238                 {ym(2000, 5), ym(1000, 6), MILLENNIA, 0},
1239                 {ym(2000, 5), ym(2000, 4), MILLENNIA, 0},
1240                 {ym(2000, 5), ym(2000, 5), MILLENNIA, 0},
1241                 {ym(2000, 5), ym(2000, 6), MILLENNIA, 0},
1242                 {ym(2000, 5), ym(3000, 4), MILLENNIA, 0},
1243                 {ym(2000, 5), ym(3000, 5), MILLENNIA, 1},
1244                 {ym(2000, 5), ym(3000, 5), MILLENNIA, 1},
1245         };
1246     }
1247 
1248     @Test(dataProvider="periodUntilUnit")
test_until_TemporalUnit(YearMonth ym1, YearMonth ym2, TemporalUnit unit, long expected)1249     public void test_until_TemporalUnit(YearMonth ym1, YearMonth ym2, TemporalUnit unit, long expected) {
1250         long amount = ym1.until(ym2, unit);
1251         assertEquals(amount, expected);
1252     }
1253 
1254     @Test(dataProvider="periodUntilUnit")
test_until_TemporalUnit_negated(YearMonth ym1, YearMonth ym2, TemporalUnit unit, long expected)1255     public void test_until_TemporalUnit_negated(YearMonth ym1, YearMonth ym2, TemporalUnit unit, long expected) {
1256         long amount = ym2.until(ym1, unit);
1257         assertEquals(amount, -expected);
1258     }
1259 
1260     @Test(dataProvider="periodUntilUnit")
test_until_TemporalUnit_between(YearMonth ym1, YearMonth ym2, TemporalUnit unit, long expected)1261     public void test_until_TemporalUnit_between(YearMonth ym1, YearMonth ym2, TemporalUnit unit, long expected) {
1262         long amount = unit.between(ym1, ym2);
1263         assertEquals(amount, expected);
1264     }
1265 
1266     @Test
test_until_convertedType()1267     public void test_until_convertedType() {
1268         YearMonth start = YearMonth.of(2010, 6);
1269         LocalDate end = start.plusMonths(2).atDay(12);
1270         assertEquals(start.until(end, MONTHS), 2);
1271     }
1272 
1273     @Test(expectedExceptions=DateTimeException.class)
test_until_invalidType()1274     public void test_until_invalidType() {
1275         YearMonth start = YearMonth.of(2010, 6);
1276         start.until(LocalTime.of(11, 30), MONTHS);
1277     }
1278 
1279     @Test(expectedExceptions = UnsupportedTemporalTypeException.class)
test_until_TemporalUnit_unsupportedUnit()1280     public void test_until_TemporalUnit_unsupportedUnit() {
1281         TEST_2008_06.until(TEST_2008_06, HOURS);
1282     }
1283 
1284     @Test(expectedExceptions = NullPointerException.class)
test_until_TemporalUnit_nullEnd()1285     public void test_until_TemporalUnit_nullEnd() {
1286         TEST_2008_06.until(null, DAYS);
1287     }
1288 
1289     @Test(expectedExceptions = NullPointerException.class)
test_until_TemporalUnit_nullUnit()1290     public void test_until_TemporalUnit_nullUnit() {
1291         TEST_2008_06.until(TEST_2008_06, null);
1292     }
1293 
1294     //-----------------------------------------------------------------------
1295     // format(DateTimeFormatter)
1296     //-----------------------------------------------------------------------
1297     @Test
test_format_formatter()1298     public void test_format_formatter() {
1299         DateTimeFormatter f = DateTimeFormatter.ofPattern("y M");
1300         String t = YearMonth.of(2010, 12).format(f);
1301         assertEquals(t, "2010 12");
1302     }
1303 
1304     @Test(expectedExceptions=NullPointerException.class)
test_format_formatter_null()1305     public void test_format_formatter_null() {
1306         YearMonth.of(2010, 12).format(null);
1307     }
1308 
1309     //-----------------------------------------------------------------------
1310     // atDay(int)
1311     //-----------------------------------------------------------------------
1312     @DataProvider(name="atDay")
data_atDay()1313     Object[][] data_atDay() {
1314         return new Object[][] {
1315                 {YearMonth.of(2008, 6), 8, LocalDate.of(2008, 6, 8)},
1316 
1317                 {YearMonth.of(2008, 1), 31, LocalDate.of(2008, 1, 31)},
1318                 {YearMonth.of(2008, 2), 29, LocalDate.of(2008, 2, 29)},
1319                 {YearMonth.of(2008, 3), 31, LocalDate.of(2008, 3, 31)},
1320                 {YearMonth.of(2008, 4), 30, LocalDate.of(2008, 4, 30)},
1321 
1322                 {YearMonth.of(2009, 1), 32, null},
1323                 {YearMonth.of(2009, 1), 0, null},
1324                 {YearMonth.of(2009, 2), 29, null},
1325                 {YearMonth.of(2009, 2), 30, null},
1326                 {YearMonth.of(2009, 2), 31, null},
1327                 {YearMonth.of(2009, 4), 31, null},
1328         };
1329     }
1330 
1331     @Test(dataProvider="atDay")
test_atDay(YearMonth test, int day, LocalDate expected)1332     public void test_atDay(YearMonth test, int day, LocalDate expected) {
1333         if (expected != null) {
1334             assertEquals(test.atDay(day), expected);
1335         } else {
1336             try {
1337                 test.atDay(day);
1338                 fail();
1339             } catch (DateTimeException ex) {
1340                 // expected
1341             }
1342         }
1343     }
1344 
1345     //-----------------------------------------------------------------------
1346     // atEndOfMonth()
1347     //-----------------------------------------------------------------------
1348     @DataProvider(name="atEndOfMonth")
data_atEndOfMonth()1349     Object[][] data_atEndOfMonth() {
1350         return new Object[][] {
1351                 {YearMonth.of(2008, 1), LocalDate.of(2008, 1, 31)},
1352                 {YearMonth.of(2008, 2), LocalDate.of(2008, 2, 29)},
1353                 {YearMonth.of(2008, 3), LocalDate.of(2008, 3, 31)},
1354                 {YearMonth.of(2008, 4), LocalDate.of(2008, 4, 30)},
1355                 {YearMonth.of(2008, 5), LocalDate.of(2008, 5, 31)},
1356                 {YearMonth.of(2008, 6), LocalDate.of(2008, 6, 30)},
1357                 {YearMonth.of(2008, 12), LocalDate.of(2008, 12, 31)},
1358 
1359                 {YearMonth.of(2009, 1), LocalDate.of(2009, 1, 31)},
1360                 {YearMonth.of(2009, 2), LocalDate.of(2009, 2, 28)},
1361                 {YearMonth.of(2009, 3), LocalDate.of(2009, 3, 31)},
1362                 {YearMonth.of(2009, 4), LocalDate.of(2009, 4, 30)},
1363                 {YearMonth.of(2009, 5), LocalDate.of(2009, 5, 31)},
1364                 {YearMonth.of(2009, 6), LocalDate.of(2009, 6, 30)},
1365                 {YearMonth.of(2009, 12), LocalDate.of(2009, 12, 31)},
1366         };
1367     }
1368 
1369     @Test(dataProvider="atEndOfMonth")
test_atEndOfMonth(YearMonth test, LocalDate expected)1370     public void test_atEndOfMonth(YearMonth test, LocalDate expected) {
1371         assertEquals(test.atEndOfMonth(), expected);
1372     }
1373 
1374     //-----------------------------------------------------------------------
1375     // compareTo()
1376     //-----------------------------------------------------------------------
1377     @Test
test_comparisons()1378     public void test_comparisons() {
1379         doTest_comparisons_YearMonth(
1380             YearMonth.of(-1, 1),
1381             YearMonth.of(0, 1),
1382             YearMonth.of(0, 12),
1383             YearMonth.of(1, 1),
1384             YearMonth.of(1, 2),
1385             YearMonth.of(1, 12),
1386             YearMonth.of(2008, 1),
1387             YearMonth.of(2008, 6),
1388             YearMonth.of(2008, 12)
1389         );
1390     }
1391 
doTest_comparisons_YearMonth(YearMonth... localDates)1392     void doTest_comparisons_YearMonth(YearMonth... localDates) {
1393         for (int i = 0; i < localDates.length; i++) {
1394             YearMonth a = localDates[i];
1395             for (int j = 0; j < localDates.length; j++) {
1396                 YearMonth b = localDates[j];
1397                 if (i < j) {
1398                     assertTrue(a.compareTo(b) < 0, a + " <=> " + b);
1399                     assertEquals(a.isBefore(b), true, a + " <=> " + b);
1400                     assertEquals(a.isAfter(b), false, a + " <=> " + b);
1401                     assertEquals(a.equals(b), false, a + " <=> " + b);
1402                 } else if (i > j) {
1403                     assertTrue(a.compareTo(b) > 0, a + " <=> " + b);
1404                     assertEquals(a.isBefore(b), false, a + " <=> " + b);
1405                     assertEquals(a.isAfter(b), true, a + " <=> " + b);
1406                     assertEquals(a.equals(b), false, a + " <=> " + b);
1407                 } else {
1408                     assertEquals(a.compareTo(b), 0, a + " <=> " + b);
1409                     assertEquals(a.isBefore(b), false, a + " <=> " + b);
1410                     assertEquals(a.isAfter(b), false, a + " <=> " + b);
1411                     assertEquals(a.equals(b), true, a + " <=> " + b);
1412                 }
1413             }
1414         }
1415     }
1416 
1417     @Test(expectedExceptions=NullPointerException.class)
test_compareTo_ObjectNull()1418     public void test_compareTo_ObjectNull() {
1419         TEST_2008_06.compareTo(null);
1420     }
1421 
1422     @Test(expectedExceptions=NullPointerException.class)
test_isBefore_ObjectNull()1423     public void test_isBefore_ObjectNull() {
1424         TEST_2008_06.isBefore(null);
1425     }
1426 
1427     @Test(expectedExceptions=NullPointerException.class)
test_isAfter_ObjectNull()1428     public void test_isAfter_ObjectNull() {
1429         TEST_2008_06.isAfter(null);
1430     }
1431 
1432     //-----------------------------------------------------------------------
1433     // equals()
1434     //-----------------------------------------------------------------------
1435     @Test
test_equals()1436     public void test_equals() {
1437         YearMonth a = YearMonth.of(2008, 6);
1438         YearMonth b = YearMonth.of(2008, 6);
1439         YearMonth c = YearMonth.of(2007, 6);
1440         YearMonth d = YearMonth.of(2008, 5);
1441 
1442         assertEquals(a.equals(a), true);
1443         assertEquals(a.equals(b), true);
1444         assertEquals(a.equals(c), false);
1445         assertEquals(a.equals(d), false);
1446 
1447         assertEquals(b.equals(a), true);
1448         assertEquals(b.equals(b), true);
1449         assertEquals(b.equals(c), false);
1450         assertEquals(b.equals(d), false);
1451 
1452         assertEquals(c.equals(a), false);
1453         assertEquals(c.equals(b), false);
1454         assertEquals(c.equals(c), true);
1455         assertEquals(c.equals(d), false);
1456 
1457         assertEquals(d.equals(a), false);
1458         assertEquals(d.equals(b), false);
1459         assertEquals(d.equals(c), false);
1460         assertEquals(d.equals(d), true);
1461     }
1462 
1463     @Test
test_equals_itself_true()1464     public void test_equals_itself_true() {
1465         assertEquals(TEST_2008_06.equals(TEST_2008_06), true);
1466     }
1467 
1468     @Test
test_equals_string_false()1469     public void test_equals_string_false() {
1470         assertEquals(TEST_2008_06.equals("2007-07-15"), false);
1471     }
1472 
1473     @Test
test_equals_null_false()1474     public void test_equals_null_false() {
1475         assertEquals(TEST_2008_06.equals(null), false);
1476     }
1477 
1478     //-----------------------------------------------------------------------
1479     // hashCode()
1480     //-----------------------------------------------------------------------
1481     @Test(dataProvider="sampleDates")
test_hashCode(int y, int m)1482     public void test_hashCode(int y, int m) {
1483         YearMonth a = YearMonth.of(y, m);
1484         assertEquals(a.hashCode(), a.hashCode());
1485         YearMonth b = YearMonth.of(y, m);
1486         assertEquals(a.hashCode(), b.hashCode());
1487     }
1488 
1489     @Test
test_hashCode_unique()1490     public void test_hashCode_unique() {
1491         Set<Integer> uniques = new HashSet<Integer>(201 * 12);
1492         for (int i = 1900; i <= 2100; i++) {
1493             for (int j = 1; j <= 12; j++) {
1494                 assertTrue(uniques.add(YearMonth.of(i, j).hashCode()));
1495             }
1496         }
1497     }
1498 
1499     //-----------------------------------------------------------------------
1500     // toString()
1501     //-----------------------------------------------------------------------
1502     @DataProvider(name="sampleToString")
provider_sampleToString()1503     Object[][] provider_sampleToString() {
1504         return new Object[][] {
1505             {2008, 1, "2008-01"},
1506             {2008, 12, "2008-12"},
1507             {7, 5, "0007-05"},
1508             {0, 5, "0000-05"},
1509             {-1, 1, "-0001-01"},
1510         };
1511     }
1512 
1513     @Test(dataProvider="sampleToString")
test_toString(int y, int m, String expected)1514     public void test_toString(int y, int m, String expected) {
1515         YearMonth test = YearMonth.of(y, m);
1516         String str = test.toString();
1517         assertEquals(str, expected);
1518     }
1519 
ym(int year, int month)1520     private YearMonth ym(int year, int month) {
1521         return YearMonth.of(year, month);
1522     }
1523 
1524 }
1525