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.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 /*
27  * Copyright (c) 2008-2012, Stephen Colebourne & Michael Nascimento Santos
28  *
29  * All rights reserved.
30  *
31  * Redistribution and use in source and binary forms, with or without
32  * modification, are permitted provided that the following conditions are met:
33  *
34  *  * Redistributions of source code must retain the above copyright notice,
35  *    this list of conditions and the following disclaimer.
36  *
37  *  * Redistributions in binary form must reproduce the above copyright notice,
38  *    this list of conditions and the following disclaimer in the documentation
39  *    and/or other materials provided with the distribution.
40  *
41  *  * Neither the name of JSR-310 nor the names of its contributors
42  *    may be used to endorse or promote products derived from this software
43  *    without specific prior written permission.
44  *
45  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
46  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
47  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
48  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
49  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
50  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
51  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
52  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
53  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
54  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
55  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56  */
57 package tck.java.time.chrono;
58 
59 import static java.time.temporal.ChronoField.DAY_OF_MONTH;
60 import static java.time.temporal.ChronoField.DAY_OF_YEAR;
61 import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
62 import static java.time.temporal.ChronoField.YEAR;
63 import static java.time.temporal.ChronoField.YEAR_OF_ERA;
64 import static org.testng.Assert.assertEquals;
65 import static org.testng.Assert.assertFalse;
66 import static org.testng.Assert.assertNotEquals;
67 import static org.testng.Assert.assertTrue;
68 import static org.testng.Assert.fail;
69 
70 import java.time.Clock;
71 import java.time.DateTimeException;
72 import java.time.LocalDate;
73 import java.time.LocalDateTime;
74 import java.time.Month;
75 import java.time.Year;
76 import java.time.ZoneId;
77 import java.time.ZoneOffset;
78 import java.time.chrono.ChronoLocalDate;
79 import java.time.chrono.ChronoPeriod;
80 import java.time.chrono.Chronology;
81 import java.time.chrono.Era;
82 import java.time.chrono.IsoChronology;
83 import java.time.chrono.MinguoChronology;
84 import java.time.chrono.MinguoDate;
85 import java.time.chrono.ThaiBuddhistChronology;
86 import java.time.chrono.ThaiBuddhistDate;
87 import java.time.chrono.ThaiBuddhistEra;
88 import java.time.format.ResolverStyle;
89 import java.time.temporal.ChronoField;
90 import java.time.temporal.ChronoUnit;
91 import java.time.temporal.TemporalAdjusters;
92 import java.time.temporal.TemporalField;
93 import java.time.temporal.ValueRange;
94 import java.util.HashMap;
95 import java.util.List;
96 import java.util.Locale;
97 import java.util.Map;
98 
99 import org.testng.Assert;
100 import org.testng.annotations.DataProvider;
101 import org.testng.annotations.Test;
102 
103 /**
104  * Test.
105  */
106 @Test
107 public class TCKThaiBuddhistChronology {
108 
109     private static final int YDIFF = 543;
110 
111     //-----------------------------------------------------------------------
112     // Chronology.of(String)
113     //-----------------------------------------------------------------------
114     @Test
test_chrono_byName()115     public void test_chrono_byName() {
116         Chronology c = ThaiBuddhistChronology.INSTANCE;
117         Chronology test = Chronology.of("ThaiBuddhist");
118         Assert.assertNotNull(test, "The ThaiBuddhist calendar could not be found byName");
119         Assert.assertEquals(test.getId(), "ThaiBuddhist", "ID mismatch");
120         Assert.assertEquals(test.getCalendarType(), "buddhist", "Type mismatch");
121         Assert.assertEquals(test, c);
122     }
123 
124     //-----------------------------------------------------------------------
125     // Chronology.ofLocale(Locale)
126     //-----------------------------------------------------------------------
127     @Test
test_chrono_byLocale_fullTag_thaiCalendarFromThai()128     public void test_chrono_byLocale_fullTag_thaiCalendarFromThai() {
129         Chronology test = Chronology.ofLocale(Locale.forLanguageTag("th-TH-u-ca-buddhist"));
130         Assert.assertEquals(test.getId(), "ThaiBuddhist");
131         Assert.assertEquals(test, ThaiBuddhistChronology.INSTANCE);
132     }
133 
134     @Test
test_chrono_byLocale_fullTag_thaiCalendarFromElsewhere()135     public void test_chrono_byLocale_fullTag_thaiCalendarFromElsewhere() {
136         Chronology test = Chronology.ofLocale(Locale.forLanguageTag("en-US-u-ca-buddhist"));
137         Assert.assertEquals(test.getId(), "ThaiBuddhist");
138         Assert.assertEquals(test, ThaiBuddhistChronology.INSTANCE);
139     }
140 
141     @Test
test_chrono_byLocale_oldTH_noVariant()142     public void test_chrono_byLocale_oldTH_noVariant() {  // deliberately different to Calendar
143         Chronology test = Chronology.ofLocale(new Locale("th", "TH"));
144         Assert.assertEquals(test.getId(), "ISO");
145         Assert.assertEquals(test, IsoChronology.INSTANCE);
146     }
147 
148     @Test
test_chrono_byLocale_oldTH_variant()149     public void test_chrono_byLocale_oldTH_variant() {
150         Chronology test = Chronology.ofLocale(new Locale("th", "TH", "TH"));
151         Assert.assertEquals(test.getId(), "ISO");
152         Assert.assertEquals(test, IsoChronology.INSTANCE);
153     }
154 
155     @Test
test_chrono_byLocale_iso()156     public void test_chrono_byLocale_iso() {
157         Assert.assertEquals(Chronology.ofLocale(new Locale("th", "TH")).getId(), "ISO");
158         Assert.assertEquals(Chronology.ofLocale(Locale.forLanguageTag("th-TH")).getId(), "ISO");
159         Assert.assertEquals(Chronology.ofLocale(Locale.forLanguageTag("th-TH-TH")).getId(), "ISO");
160     }
161 
162     //-----------------------------------------------------------------------
163     // creation, toLocalDate()
164     //-----------------------------------------------------------------------
165     @DataProvider(name="samples")
data_samples()166     Object[][] data_samples() {
167         return new Object[][] {
168             {ThaiBuddhistChronology.INSTANCE.date(1 + YDIFF, 1, 1), LocalDate.of(1, 1, 1)},
169             {ThaiBuddhistChronology.INSTANCE.date(1 + YDIFF, 1, 2), LocalDate.of(1, 1, 2)},
170             {ThaiBuddhistChronology.INSTANCE.date(1 + YDIFF, 1, 3), LocalDate.of(1, 1, 3)},
171 
172             {ThaiBuddhistChronology.INSTANCE.date(2 + YDIFF, 1, 1), LocalDate.of(2, 1, 1)},
173             {ThaiBuddhistChronology.INSTANCE.date(3 + YDIFF, 1, 1), LocalDate.of(3, 1, 1)},
174             {ThaiBuddhistChronology.INSTANCE.date(3 + YDIFF, 12, 6), LocalDate.of(3, 12, 6)},
175             {ThaiBuddhistChronology.INSTANCE.date(4 + YDIFF, 1, 1), LocalDate.of(4, 1, 1)},
176             {ThaiBuddhistChronology.INSTANCE.date(4 + YDIFF, 7, 3), LocalDate.of(4, 7, 3)},
177             {ThaiBuddhistChronology.INSTANCE.date(4 + YDIFF, 7, 4), LocalDate.of(4, 7, 4)},
178             {ThaiBuddhistChronology.INSTANCE.date(5 + YDIFF, 1, 1), LocalDate.of(5, 1, 1)},
179             {ThaiBuddhistChronology.INSTANCE.date(1662 + YDIFF, 3, 3), LocalDate.of(1662, 3, 3)},
180             {ThaiBuddhistChronology.INSTANCE.date(1728 + YDIFF, 10, 28), LocalDate.of(1728, 10, 28)},
181             {ThaiBuddhistChronology.INSTANCE.date(1728 + YDIFF, 10, 29), LocalDate.of(1728, 10, 29)},
182             {ThaiBuddhistChronology.INSTANCE.date(2555, 8, 29), LocalDate.of(2012, 8, 29)},
183 
184             {ThaiBuddhistChronology.INSTANCE.dateYearDay(4 + YDIFF, 60), LocalDate.of(4, 2, 29)},
185             {ThaiBuddhistChronology.INSTANCE.dateYearDay(400 + YDIFF, 60), LocalDate.of(400, 2, 29)},
186             {ThaiBuddhistChronology.INSTANCE.dateYearDay(2000 + YDIFF, 60), LocalDate.of(2000, 2, 29)},
187 
188             {ThaiBuddhistChronology.INSTANCE.dateYearDay(ThaiBuddhistEra.BE, 1916 + YDIFF, 60), LocalDate.of(1916, 2, 29)},
189             {ThaiBuddhistChronology.INSTANCE.dateYearDay(ThaiBuddhistEra.BEFORE_BE, -1907 - YDIFF, 60), LocalDate.of(1908, 2, 29)},
190             {ThaiBuddhistChronology.INSTANCE.dateYearDay(ThaiBuddhistEra.BE, 2000 + YDIFF, 60), LocalDate.of(2000, 2, 29)},
191             {ThaiBuddhistChronology.INSTANCE.dateYearDay(ThaiBuddhistEra.BE, 2400 + YDIFF, 60), LocalDate.of(2400, 2, 29)},
192 
193             {ThaiBuddhistChronology.INSTANCE.date(ThaiBuddhistEra.BE, 1916 + YDIFF, 2, 29 ), LocalDate.of(1916, 2, 29)},
194             {ThaiBuddhistChronology.INSTANCE.date(ThaiBuddhistEra.BEFORE_BE, -1907 - YDIFF, 2, 29), LocalDate.of(1908, 2, 29)},
195             {ThaiBuddhistChronology.INSTANCE.date(ThaiBuddhistEra.BE, 2000 + YDIFF, 2, 29), LocalDate.of(2000, 2, 29)},
196             {ThaiBuddhistChronology.INSTANCE.date(ThaiBuddhistEra.BE, 2400 + YDIFF, 2, 29), LocalDate.of(2400, 2, 29)},
197         };
198     }
199 
200     @Test(dataProvider="samples")
test_toLocalDate(ThaiBuddhistDate jdate, LocalDate iso)201     public void test_toLocalDate(ThaiBuddhistDate jdate, LocalDate iso) {
202         assertEquals(LocalDate.from(jdate), iso);
203     }
204 
205     @Test(dataProvider="samples")
test_fromCalendrical(ThaiBuddhistDate jdate, LocalDate iso)206     public void test_fromCalendrical(ThaiBuddhistDate jdate, LocalDate iso) {
207         assertEquals(ThaiBuddhistChronology.INSTANCE.date(iso), jdate);
208         assertEquals(ThaiBuddhistDate.from(iso), jdate);
209     }
210 
211     @Test(dataProvider="samples")
test_isEqual(ThaiBuddhistDate jdate, LocalDate iso)212     public void test_isEqual(ThaiBuddhistDate jdate, LocalDate iso) {
213         assertTrue(jdate.isEqual(iso));
214     }
215 
216     @Test(dataProvider="samples")
test_date_equals(ThaiBuddhistDate jdate, LocalDate iso)217     public void test_date_equals(ThaiBuddhistDate jdate, LocalDate iso) {
218         assertFalse(jdate.equals(iso));
219         assertNotEquals(jdate.hashCode(), iso.hashCode());
220     }
221 
222     @Test
test_dateNow()223     public void test_dateNow(){
224         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(), ThaiBuddhistDate.now()) ;
225         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(), ThaiBuddhistDate.now(ZoneId.systemDefault())) ;
226         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(), ThaiBuddhistDate.now(Clock.systemDefaultZone())) ;
227         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(), ThaiBuddhistDate.now(Clock.systemDefaultZone().getZone())) ;
228 
229         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(), ThaiBuddhistChronology.INSTANCE.dateNow(ZoneId.systemDefault())) ;
230         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(), ThaiBuddhistChronology.INSTANCE.dateNow(Clock.systemDefaultZone())) ;
231         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(), ThaiBuddhistChronology.INSTANCE.dateNow(Clock.systemDefaultZone().getZone())) ;
232 
233         ZoneId zoneId = ZoneId.of("Europe/Paris");
234         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(zoneId), ThaiBuddhistChronology.INSTANCE.dateNow(Clock.system(zoneId))) ;
235         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(zoneId), ThaiBuddhistChronology.INSTANCE.dateNow(Clock.system(zoneId).getZone())) ;
236         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(zoneId), ThaiBuddhistDate.now(Clock.system(zoneId))) ;
237         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(zoneId), ThaiBuddhistDate.now(Clock.system(zoneId).getZone())) ;
238 
239         assertEquals(ThaiBuddhistChronology.INSTANCE.dateNow(ZoneId.of(ZoneOffset.UTC.getId())), ThaiBuddhistChronology.INSTANCE.dateNow(Clock.systemUTC())) ;
240     }
241 
242     @DataProvider(name="badDates")
data_badDates()243     Object[][] data_badDates() {
244         return new Object[][] {
245             {1728, 0, 0},
246 
247             {1728, -1, 1},
248             {1728, 0, 1},
249             {1728, 14, 1},
250             {1728, 15, 1},
251 
252             {1728, 1, -1},
253             {1728, 1, 0},
254             {1728, 1, 32},
255 
256             {1728, 12, -1},
257             {1728, 12, 0},
258             {1728, 12, 32},
259 
260             {3 + YDIFF, 2, 29},
261             {600 + YDIFF, 2, 29},
262             {1501 + YDIFF, 2, 29},
263         };
264     }
265 
266     @Test(dataProvider="badDates", expectedExceptions=DateTimeException.class)
test_badDates(int year, int month, int dom)267     public void test_badDates(int year, int month, int dom) {
268         ThaiBuddhistChronology.INSTANCE.date(year, month, dom);
269     }
270 
271     //-----------------------------------------------------------------------
272     // prolepticYear() and is LeapYear()
273     //-----------------------------------------------------------------------
274     @DataProvider(name="prolepticYear")
data_prolepticYear()275     Object[][] data_prolepticYear() {
276         return new Object[][] {
277             {1, ThaiBuddhistEra.BE, 4 + YDIFF, 4 + YDIFF, true},
278             {1, ThaiBuddhistEra.BE, 7 + YDIFF, 7 + YDIFF, false},
279             {1, ThaiBuddhistEra.BE, 8 + YDIFF, 8 + YDIFF, true},
280             {1, ThaiBuddhistEra.BE, 1000 + YDIFF, 1000 + YDIFF, false},
281             {1, ThaiBuddhistEra.BE, 2000 + YDIFF, 2000 + YDIFF, true},
282             {1, ThaiBuddhistEra.BE, 0, 0, false},
283             {1, ThaiBuddhistEra.BE, -4 + YDIFF, -4 + YDIFF, true},
284             {1, ThaiBuddhistEra.BE, -7 + YDIFF, -7 + YDIFF, false},
285             {1, ThaiBuddhistEra.BE, -100 + YDIFF, -100 + YDIFF, false},
286             {1, ThaiBuddhistEra.BE, -800 + YDIFF, -800 + YDIFF, true},
287 
288             {0, ThaiBuddhistEra.BEFORE_BE, -3 - YDIFF, 4 + YDIFF, true},
289             {0, ThaiBuddhistEra.BEFORE_BE, -6 - YDIFF, 7 + YDIFF, false},
290             {0, ThaiBuddhistEra.BEFORE_BE, -7 - YDIFF, 8 + YDIFF, true},
291             {0, ThaiBuddhistEra.BEFORE_BE, -999 - YDIFF, 1000 + YDIFF, false},
292             {0, ThaiBuddhistEra.BEFORE_BE, -1999 - YDIFF, 2000 + YDIFF, true},
293             {0, ThaiBuddhistEra.BEFORE_BE, 1, 0, false},
294             {0, ThaiBuddhistEra.BEFORE_BE, 5 - YDIFF, -4 + YDIFF, true},
295             {0, ThaiBuddhistEra.BEFORE_BE, 8 - YDIFF, -7 + YDIFF, false},
296             {0, ThaiBuddhistEra.BEFORE_BE, 101 - YDIFF, -100 + YDIFF, false},
297             {0, ThaiBuddhistEra.BEFORE_BE, 801 - YDIFF, -800 + YDIFF, true},
298 
299         };
300     }
301 
302     @Test(dataProvider="prolepticYear")
test_prolepticYear(int eraValue, Era era, int yearOfEra, int expectedProlepticYear, boolean isLeapYear)303     public void test_prolepticYear(int eraValue, Era  era, int yearOfEra, int expectedProlepticYear, boolean isLeapYear) {
304         Era eraObj = ThaiBuddhistChronology.INSTANCE.eraOf(eraValue);
305         assertTrue(ThaiBuddhistChronology.INSTANCE.eras().contains(eraObj));
306         assertEquals(eraObj, era);
307         assertEquals(ThaiBuddhistChronology.INSTANCE.prolepticYear(era, yearOfEra), expectedProlepticYear);
308     }
309 
310     @Test(dataProvider="prolepticYear")
test_isLeapYear(int eraValue, Era era, int yearOfEra, int expectedProlepticYear, boolean isLeapYear)311     public void test_isLeapYear(int eraValue, Era  era, int yearOfEra, int expectedProlepticYear, boolean isLeapYear) {
312         assertEquals(ThaiBuddhistChronology.INSTANCE.isLeapYear(expectedProlepticYear), isLeapYear) ;
313         assertEquals(ThaiBuddhistChronology.INSTANCE.isLeapYear(expectedProlepticYear), Year.of(expectedProlepticYear - YDIFF).isLeap());
314 
315         ThaiBuddhistDate jdate = ThaiBuddhistDate.now();
316         jdate = jdate.with(ChronoField.YEAR, expectedProlepticYear).with(ChronoField.MONTH_OF_YEAR, 2);
317         if (isLeapYear) {
318             assertEquals(jdate.lengthOfMonth(), 29);
319         } else {
320             assertEquals(jdate.lengthOfMonth(), 28);
321         }
322     }
323 
324     //-----------------------------------------------------------------------
325     // Bad Era for Chronology.date(era,...) and Chronology.prolepticYear(Era,...)
326     //-----------------------------------------------------------------------
327     @Test
test_InvalidEras()328     public void test_InvalidEras() {
329         // Verify that the eras from every other Chronology are invalid
330         for (Chronology chrono : Chronology.getAvailableChronologies()) {
331             if (chrono instanceof ThaiBuddhistChronology) {
332                 continue;
333             }
334             List<Era> eras = chrono.eras();
335             for (Era era : eras) {
336                 try {
337                     ChronoLocalDate date = ThaiBuddhistChronology.INSTANCE.date(era, 1, 1, 1);
338                     fail("ThaiBuddhistChronology.date did not throw ClassCastException for Era: " + era);
339                 } catch (ClassCastException cex) {
340                     ; // ignore expected exception
341                 }
342 
343                 /* TODO: Test for missing ThaiBuddhistDate.of(Era, y, m, d) method.
344                 try {
345                     @SuppressWarnings("unused")
346                     ThaiBuddhistDate jdate = ThaiBuddhistDate.of(era, 1, 1, 1);
347                     fail("ThaiBuddhistDate.of did not throw ClassCastException for Era: " + era);
348                 } catch (ClassCastException cex) {
349                     ; // ignore expected exception
350                 }
351                 */
352 
353                 try {
354                     @SuppressWarnings("unused")
355                     int year = ThaiBuddhistChronology.INSTANCE.prolepticYear(era, 1);
356                     fail("ThaiBuddhistChronology.prolepticYear did not throw ClassCastException for Era: " + era);
357                 } catch (ClassCastException cex) {
358                     ; // ignore expected exception
359                 }            }
360         }
361     }
362 
363     //-----------------------------------------------------------------------
364     // with(WithAdjuster)
365     //-----------------------------------------------------------------------
366     @Test
test_adjust1()367     public void test_adjust1() {
368         ThaiBuddhistDate base = ThaiBuddhistChronology.INSTANCE.date(1728, 10, 29);
369         ThaiBuddhistDate test = base.with(TemporalAdjusters.lastDayOfMonth());
370         assertEquals(test, ThaiBuddhistChronology.INSTANCE.date(1728, 10, 31));
371     }
372 
373     @Test
test_adjust2()374     public void test_adjust2() {
375         ThaiBuddhistDate base = ThaiBuddhistChronology.INSTANCE.date(1728, 12, 2);
376         ThaiBuddhistDate test = base.with(TemporalAdjusters.lastDayOfMonth());
377         assertEquals(test, ThaiBuddhistChronology.INSTANCE.date(1728, 12, 31));
378     }
379 
380     //-----------------------------------------------------------------------
381     // withYear()
382     //-----------------------------------------------------------------------
383     @Test
test_withYear_BE()384     public void test_withYear_BE() {
385         ThaiBuddhistDate base = ThaiBuddhistChronology.INSTANCE.date(2555, 8, 29);
386         ThaiBuddhistDate test = base.with(YEAR, 2554);
387         assertEquals(test, ThaiBuddhistChronology.INSTANCE.date(2554, 8, 29));
388     }
389 
390     @Test
test_withYear_BBE()391     public void test_withYear_BBE() {
392         ThaiBuddhistDate base = ThaiBuddhistChronology.INSTANCE.date(-2554, 8, 29);
393         ThaiBuddhistDate test = base.with(YEAR_OF_ERA, 2554);
394         assertEquals(test, ThaiBuddhistChronology.INSTANCE.date(-2553, 8, 29));
395     }
396 
397     //-----------------------------------------------------------------------
398     // withEra()
399     //-----------------------------------------------------------------------
400     @Test
test_withEra_BE()401     public void test_withEra_BE() {
402         ThaiBuddhistDate base = ThaiBuddhistChronology.INSTANCE.date(2555, 8, 29);
403         ThaiBuddhistDate test = base.with(ChronoField.ERA, ThaiBuddhistEra.BE.getValue());
404         assertEquals(test, ThaiBuddhistChronology.INSTANCE.date(2555, 8, 29));
405     }
406 
407     @Test
test_withEra_BBE()408     public void test_withEra_BBE() {
409         ThaiBuddhistDate base = ThaiBuddhistChronology.INSTANCE.date(-2554, 8, 29);
410         ThaiBuddhistDate test = base.with(ChronoField.ERA, ThaiBuddhistEra.BEFORE_BE.getValue());
411         assertEquals(test, ThaiBuddhistChronology.INSTANCE.date(-2554, 8, 29));
412     }
413 
414     @Test
test_withEra_swap()415     public void test_withEra_swap() {
416         ThaiBuddhistDate base = ThaiBuddhistChronology.INSTANCE.date(-2554, 8, 29);
417         ThaiBuddhistDate test = base.with(ChronoField.ERA, ThaiBuddhistEra.BE.getValue());
418         assertEquals(test, ThaiBuddhistChronology.INSTANCE.date(2555, 8, 29));
419     }
420 
421     //-----------------------------------------------------------------------
422     // BuddhistDate.with(Local*)
423     //-----------------------------------------------------------------------
424     @Test
test_adjust_toLocalDate()425     public void test_adjust_toLocalDate() {
426         ThaiBuddhistDate jdate = ThaiBuddhistChronology.INSTANCE.date(1726, 1, 4);
427         ThaiBuddhistDate test = jdate.with(LocalDate.of(2012, 7, 6));
428         assertEquals(test, ThaiBuddhistChronology.INSTANCE.date(2555, 7, 6));
429     }
430 
431     @Test(expectedExceptions=DateTimeException.class)
test_adjust_toMonth()432     public void test_adjust_toMonth() {
433         ThaiBuddhistDate jdate = ThaiBuddhistChronology.INSTANCE.date(1726, 1, 4);
434         jdate.with(Month.APRIL);
435     }
436 
437     //-----------------------------------------------------------------------
438     // LocalDate.with(BuddhistDate)
439     //-----------------------------------------------------------------------
440     @Test
test_LocalDate_adjustToBuddhistDate()441     public void test_LocalDate_adjustToBuddhistDate() {
442         ThaiBuddhistDate jdate = ThaiBuddhistChronology.INSTANCE.date(2555, 10, 29);
443         LocalDate test = LocalDate.MIN.with(jdate);
444         assertEquals(test, LocalDate.of(2012, 10, 29));
445     }
446 
447     @Test
test_LocalDateTime_adjustToBuddhistDate()448     public void test_LocalDateTime_adjustToBuddhistDate() {
449         ThaiBuddhistDate jdate = ThaiBuddhistChronology.INSTANCE.date(2555, 10, 29);
450         LocalDateTime test = LocalDateTime.MIN.with(jdate);
451         assertEquals(test, LocalDateTime.of(2012, 10, 29, 0, 0));
452     }
453 
454     //-----------------------------------------------------------------------
455     // PeriodUntil()
456     //-----------------------------------------------------------------------
457     @Test
test_periodUntilDate()458     public void test_periodUntilDate() {
459         ThaiBuddhistDate mdate1 = ThaiBuddhistDate.of(1, 1, 1);
460         ThaiBuddhistDate mdate2 = ThaiBuddhistDate.of(2, 2, 2);
461         ChronoPeriod period = mdate1.until(mdate2);
462         assertEquals(period, ThaiBuddhistChronology.INSTANCE.period(1, 1, 1));
463     }
464 
465     @Test
test_periodUntilUnit()466     public void test_periodUntilUnit() {
467         ThaiBuddhistDate mdate1 = ThaiBuddhistDate.of(1, 1, 1);
468         ThaiBuddhistDate mdate2 = ThaiBuddhistDate.of(2, 2, 2);
469         long months = mdate1.until(mdate2, ChronoUnit.MONTHS);
470         assertEquals(months, 13);
471     }
472 
473     @Test
test_periodUntilDiffChrono()474     public void test_periodUntilDiffChrono() {
475         ThaiBuddhistDate mdate1 = ThaiBuddhistDate.of(1, 1, 1);
476         ThaiBuddhistDate mdate2 = ThaiBuddhistDate.of(2, 2, 2);
477         MinguoDate ldate2 = MinguoChronology.INSTANCE.date(mdate2);
478         ChronoPeriod period = mdate1.until(ldate2);
479         assertEquals(period, ThaiBuddhistChronology.INSTANCE.period(1, 1, 1));
480     }
481 
482     //-----------------------------------------------------------------------
483     // toString()
484     //-----------------------------------------------------------------------
485     @DataProvider(name="toString")
data_toString()486     Object[][] data_toString() {
487         return new Object[][] {
488             {ThaiBuddhistChronology.INSTANCE.date(544, 1, 1), "ThaiBuddhist BE 544-01-01"},
489             {ThaiBuddhistChronology.INSTANCE.date(2271, 10, 28), "ThaiBuddhist BE 2271-10-28"},
490             {ThaiBuddhistChronology.INSTANCE.date(2271, 10, 29), "ThaiBuddhist BE 2271-10-29"},
491             {ThaiBuddhistChronology.INSTANCE.date(2270, 12, 5), "ThaiBuddhist BE 2270-12-05"},
492             {ThaiBuddhistChronology.INSTANCE.date(2270, 12, 6), "ThaiBuddhist BE 2270-12-06"},
493         };
494     }
495 
496     @Test(dataProvider="toString")
test_toString(ThaiBuddhistDate jdate, String expected)497     public void test_toString(ThaiBuddhistDate jdate, String expected) {
498         assertEquals(jdate.toString(), expected);
499     }
500 
501     //-----------------------------------------------------------------------
502     // chronology range(ChronoField)
503     //-----------------------------------------------------------------------
504     @Test
test_Chrono_range()505     public void test_Chrono_range() {
506         long minYear = LocalDate.MIN.getYear() + YDIFF;
507         long maxYear = LocalDate.MAX.getYear() + YDIFF;
508         assertEquals(ThaiBuddhistChronology.INSTANCE.range(YEAR), ValueRange.of(minYear, maxYear));
509         assertEquals(ThaiBuddhistChronology.INSTANCE.range(YEAR_OF_ERA), ValueRange.of(1, -minYear + 1, maxYear));
510 
511         assertEquals(ThaiBuddhistChronology.INSTANCE.range(DAY_OF_MONTH), DAY_OF_MONTH.range());
512         assertEquals(ThaiBuddhistChronology.INSTANCE.range(DAY_OF_YEAR), DAY_OF_YEAR.range());
513         assertEquals(ThaiBuddhistChronology.INSTANCE.range(MONTH_OF_YEAR), MONTH_OF_YEAR.range());
514     }
515 
516     //-----------------------------------------------------------------------
517     // equals()
518     //-----------------------------------------------------------------------
519     @Test
test_equals_true()520     public void test_equals_true() {
521         assertTrue(ThaiBuddhistChronology.INSTANCE.equals(ThaiBuddhistChronology.INSTANCE));
522     }
523 
524     @Test
test_equals_false()525     public void test_equals_false() {
526         assertFalse(ThaiBuddhistChronology.INSTANCE.equals(IsoChronology.INSTANCE));
527     }
528 
529     //-----------------------------------------------------------------------
530     //-----------------------------------------------------------------------
531     @DataProvider(name = "resolve_yearOfEra")
data_resolve_yearOfEra()532     Object[][] data_resolve_yearOfEra() {
533         return new Object[][] {
534                 // era only
535                 {ResolverStyle.STRICT, -1, null, null, null, null},
536                 {ResolverStyle.SMART, -1, null, null, null, null},
537                 {ResolverStyle.LENIENT, -1, null, null, null, null},
538 
539                 {ResolverStyle.STRICT, 0, null, null, ChronoField.ERA, 0},
540                 {ResolverStyle.SMART, 0, null, null, ChronoField.ERA, 0},
541                 {ResolverStyle.LENIENT, 0, null, null, ChronoField.ERA, 0},
542 
543                 {ResolverStyle.STRICT, 1, null, null, ChronoField.ERA, 1},
544                 {ResolverStyle.SMART, 1, null, null, ChronoField.ERA, 1},
545                 {ResolverStyle.LENIENT, 1, null, null, ChronoField.ERA, 1},
546 
547                 {ResolverStyle.STRICT, 2, null, null, null, null},
548                 {ResolverStyle.SMART, 2, null, null, null, null},
549                 {ResolverStyle.LENIENT, 2, null, null, null, null},
550 
551                 // era and year-of-era
552                 {ResolverStyle.STRICT, -1, 2012, null, null, null},
553                 {ResolverStyle.SMART, -1, 2012, null, null, null},
554                 {ResolverStyle.LENIENT, -1, 2012, null, null, null},
555 
556                 {ResolverStyle.STRICT, 0, 2012, null, ChronoField.YEAR, -2011},
557                 {ResolverStyle.SMART, 0, 2012, null, ChronoField.YEAR, -2011},
558                 {ResolverStyle.LENIENT, 0, 2012, null, ChronoField.YEAR, -2011},
559 
560                 {ResolverStyle.STRICT, 1, 2012, null, ChronoField.YEAR, 2012},
561                 {ResolverStyle.SMART, 1, 2012, null, ChronoField.YEAR, 2012},
562                 {ResolverStyle.LENIENT, 1, 2012, null, ChronoField.YEAR, 2012},
563 
564                 {ResolverStyle.STRICT, 2, 2012, null, null, null},
565                 {ResolverStyle.SMART, 2, 2012, null, null, null},
566                 {ResolverStyle.LENIENT, 2, 2012, null, null, null},
567 
568                 // year-of-era only
569                 {ResolverStyle.STRICT, null, 2012, null, ChronoField.YEAR_OF_ERA, 2012},
570                 {ResolverStyle.SMART, null, 2012, null, ChronoField.YEAR, 2012},
571                 {ResolverStyle.LENIENT, null, 2012, null, ChronoField.YEAR, 2012},
572 
573                 {ResolverStyle.STRICT, null, Integer.MAX_VALUE, null, null, null},
574                 {ResolverStyle.SMART, null, Integer.MAX_VALUE, null, null, null},
575                 {ResolverStyle.LENIENT, null, Integer.MAX_VALUE, null, ChronoField.YEAR, Integer.MAX_VALUE},
576 
577                 // year-of-era and year
578                 {ResolverStyle.STRICT, null, 2012, 2012, ChronoField.YEAR, 2012},
579                 {ResolverStyle.SMART, null, 2012, 2012, ChronoField.YEAR, 2012},
580                 {ResolverStyle.LENIENT, null, 2012, 2012, ChronoField.YEAR, 2012},
581 
582                 {ResolverStyle.STRICT, null, 2012, -2011, ChronoField.YEAR, -2011},
583                 {ResolverStyle.SMART, null, 2012, -2011, ChronoField.YEAR, -2011},
584                 {ResolverStyle.LENIENT, null, 2012, -2011, ChronoField.YEAR, -2011},
585 
586                 {ResolverStyle.STRICT, null, 2012, 2013, null, null},
587                 {ResolverStyle.SMART, null, 2012, 2013, null, null},
588                 {ResolverStyle.LENIENT, null, 2012, 2013, null, null},
589 
590                 {ResolverStyle.STRICT, null, 2012, -2013, null, null},
591                 {ResolverStyle.SMART, null, 2012, -2013, null, null},
592                 {ResolverStyle.LENIENT, null, 2012, -2013, null, null},
593         };
594     }
595 
596     @Test(dataProvider = "resolve_yearOfEra")
test_resolve_yearOfEra(ResolverStyle style, Integer e, Integer yoe, Integer y, ChronoField field, Integer expected)597     public void test_resolve_yearOfEra(ResolverStyle style, Integer e, Integer yoe, Integer y, ChronoField field, Integer expected) {
598         Map<TemporalField, Long> fieldValues = new HashMap<>();
599         if (e != null) {
600             fieldValues.put(ChronoField.ERA, (long) e);
601         }
602         if (yoe != null) {
603             fieldValues.put(ChronoField.YEAR_OF_ERA, (long) yoe);
604         }
605         if (y != null) {
606             fieldValues.put(ChronoField.YEAR, (long) y);
607         }
608         if (field != null) {
609             ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, style);
610             assertEquals(date, null);
611             assertEquals(fieldValues.get(field), (Long) expected.longValue());
612             assertEquals(fieldValues.size(), 1);
613         } else {
614             try {
615                 ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, style);
616                 fail("Should have failed");
617             } catch (DateTimeException ex) {
618                 // expected
619             }
620         }
621     }
622 
623     //-----------------------------------------------------------------------
624     //-----------------------------------------------------------------------
625     @DataProvider(name = "resolve_ymd")
data_resolve_ymd()626     Object[][] data_resolve_ymd() {
627         return new Object[][] {
628                 {YDIFF + 2012, 1, -365, date(YDIFF + 2010, 12, 31), false, false},
629                 {YDIFF + 2012, 1, -364, date(YDIFF + 2011, 1, 1), false, false},
630                 {YDIFF + 2012, 1, -31, date(YDIFF + 2011, 11, 30), false, false},
631                 {YDIFF + 2012, 1, -30, date(YDIFF + 2011, 12, 1), false, false},
632                 {YDIFF + 2012, 1, -12, date(YDIFF + 2011, 12, 19), false, false},
633                 {YDIFF + 2012, 1, 1, date(YDIFF + 2012, 1, 1), true, true},
634                 {YDIFF + 2012, 1, 27, date(YDIFF + 2012, 1, 27), true, true},
635                 {YDIFF + 2012, 1, 28, date(YDIFF + 2012, 1, 28), true, true},
636                 {YDIFF + 2012, 1, 29, date(YDIFF + 2012, 1, 29), true, true},
637                 {YDIFF + 2012, 1, 30, date(YDIFF + 2012, 1, 30), true, true},
638                 {YDIFF + 2012, 1, 31, date(YDIFF + 2012, 1, 31), true, true},
639                 {YDIFF + 2012, 1, 59, date(YDIFF + 2012, 2, 28), false, false},
640                 {YDIFF + 2012, 1, 60, date(YDIFF + 2012, 2, 29), false, false},
641                 {YDIFF + 2012, 1, 61, date(YDIFF + 2012, 3, 1), false, false},
642                 {YDIFF + 2012, 1, 365, date(YDIFF + 2012, 12, 30), false, false},
643                 {YDIFF + 2012, 1, 366, date(YDIFF + 2012, 12, 31), false, false},
644                 {YDIFF + 2012, 1, 367, date(YDIFF + 2013, 1, 1), false, false},
645                 {YDIFF + 2012, 1, 367 + 364, date(YDIFF + 2013, 12, 31), false, false},
646                 {YDIFF + 2012, 1, 367 + 365, date(YDIFF + 2014, 1, 1), false, false},
647 
648                 {YDIFF + 2012, 2, 1, date(YDIFF + 2012, 2, 1), true, true},
649                 {YDIFF + 2012, 2, 28, date(YDIFF + 2012, 2, 28), true, true},
650                 {YDIFF + 2012, 2, 29, date(YDIFF + 2012, 2, 29), true, true},
651                 {YDIFF + 2012, 2, 30, date(YDIFF + 2012, 3, 1), date(YDIFF + 2012, 2, 29), false},
652                 {YDIFF + 2012, 2, 31, date(YDIFF + 2012, 3, 2), date(YDIFF + 2012, 2, 29), false},
653                 {YDIFF + 2012, 2, 32, date(YDIFF + 2012, 3, 3), false, false},
654 
655                 {YDIFF + 2012, -12, 1, date(YDIFF + 2010, 12, 1), false, false},
656                 {YDIFF + 2012, -11, 1, date(YDIFF + 2011, 1, 1), false, false},
657                 {YDIFF + 2012, -1, 1, date(YDIFF + 2011, 11, 1), false, false},
658                 {YDIFF + 2012, 0, 1, date(YDIFF + 2011, 12, 1), false, false},
659                 {YDIFF + 2012, 1, 1, date(YDIFF + 2012, 1, 1), true, true},
660                 {YDIFF + 2012, 12, 1, date(YDIFF + 2012, 12, 1), true, true},
661                 {YDIFF + 2012, 13, 1, date(YDIFF + 2013, 1, 1), false, false},
662                 {YDIFF + 2012, 24, 1, date(YDIFF + 2013, 12, 1), false, false},
663                 {YDIFF + 2012, 25, 1, date(YDIFF + 2014, 1, 1), false, false},
664 
665                 {YDIFF + 2012, 6, -31, date(YDIFF + 2012, 4, 30), false, false},
666                 {YDIFF + 2012, 6, -30, date(YDIFF + 2012, 5, 1), false, false},
667                 {YDIFF + 2012, 6, -1, date(YDIFF + 2012, 5, 30), false, false},
668                 {YDIFF + 2012, 6, 0, date(YDIFF + 2012, 5, 31), false, false},
669                 {YDIFF + 2012, 6, 1, date(YDIFF + 2012, 6, 1), true, true},
670                 {YDIFF + 2012, 6, 30, date(YDIFF + 2012, 6, 30), true, true},
671                 {YDIFF + 2012, 6, 31, date(YDIFF + 2012, 7, 1), date(YDIFF + 2012, 6, 30), false},
672                 {YDIFF + 2012, 6, 61, date(YDIFF + 2012, 7, 31), false, false},
673                 {YDIFF + 2012, 6, 62, date(YDIFF + 2012, 8, 1), false, false},
674 
675                 {YDIFF + 2011, 2, 1, date(YDIFF + 2011, 2, 1), true, true},
676                 {YDIFF + 2011, 2, 28, date(YDIFF + 2011, 2, 28), true, true},
677                 {YDIFF + 2011, 2, 29, date(YDIFF + 2011, 3, 1), date(YDIFF + 2011, 2, 28), false},
678                 {YDIFF + 2011, 2, 30, date(YDIFF + 2011, 3, 2), date(YDIFF + 2011, 2, 28), false},
679                 {YDIFF + 2011, 2, 31, date(YDIFF + 2011, 3, 3), date(YDIFF + 2011, 2, 28), false},
680                 {YDIFF + 2011, 2, 32, date(YDIFF + 2011, 3, 4), false, false},
681         };
682     }
683 
684     @Test(dataProvider = "resolve_ymd")
test_resolve_ymd_lenient(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict)685     public void test_resolve_ymd_lenient(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict) {
686         Map<TemporalField, Long> fieldValues = new HashMap<>();
687         fieldValues.put(ChronoField.YEAR, (long) y);
688         fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
689         fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
690         ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
691         assertEquals(date, expected);
692         assertEquals(fieldValues.size(), 0);
693     }
694 
695     @Test(dataProvider = "resolve_ymd")
test_resolve_ymd_smart(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict)696     public void test_resolve_ymd_smart(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict) {
697         Map<TemporalField, Long> fieldValues = new HashMap<>();
698         fieldValues.put(ChronoField.YEAR, (long) y);
699         fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
700         fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
701         if (Boolean.TRUE.equals(smart)) {
702             ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
703             assertEquals(date, expected);
704             assertEquals(fieldValues.size(), 0);
705         } else if (smart instanceof ThaiBuddhistDate) {
706             ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
707             assertEquals(date, smart);
708         } else {
709             try {
710                 ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
711                 fail("Should have failed");
712             } catch (DateTimeException ex) {
713                 // expected
714             }
715         }
716     }
717 
718     @Test(dataProvider = "resolve_ymd")
test_resolve_ymd_strict(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict)719     public void test_resolve_ymd_strict(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict) {
720         Map<TemporalField, Long> fieldValues = new HashMap<>();
721         fieldValues.put(ChronoField.YEAR, (long) y);
722         fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
723         fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
724         if (strict) {
725             ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
726             assertEquals(date, expected);
727             assertEquals(fieldValues.size(), 0);
728         } else {
729             try {
730                 ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
731                 fail("Should have failed");
732             } catch (DateTimeException ex) {
733                 // expected
734             }
735         }
736     }
737 
738     //-----------------------------------------------------------------------
739     //-----------------------------------------------------------------------
740     @DataProvider(name = "resolve_yd")
data_resolve_yd()741     Object[][] data_resolve_yd() {
742         return new Object[][] {
743                 {YDIFF + 2012, -365, date(YDIFF + 2010, 12, 31), false, false},
744                 {YDIFF + 2012, -364, date(YDIFF + 2011, 1, 1), false, false},
745                 {YDIFF + 2012, -31, date(YDIFF + 2011, 11, 30), false, false},
746                 {YDIFF + 2012, -30, date(YDIFF + 2011, 12, 1), false, false},
747                 {YDIFF + 2012, -12, date(YDIFF + 2011, 12, 19), false, false},
748                 {YDIFF + 2012, -1, date(YDIFF + 2011, 12, 30), false, false},
749                 {YDIFF + 2012, 0, date(YDIFF + 2011, 12, 31), false, false},
750                 {YDIFF + 2012, 1, date(YDIFF + 2012, 1, 1), true, true},
751                 {YDIFF + 2012, 2, date(YDIFF + 2012, 1, 2), true, true},
752                 {YDIFF + 2012, 31, date(YDIFF + 2012, 1, 31), true, true},
753                 {YDIFF + 2012, 32, date(YDIFF + 2012, 2, 1), true, true},
754                 {YDIFF + 2012, 59, date(YDIFF + 2012, 2, 28), true, true},
755                 {YDIFF + 2012, 60, date(YDIFF + 2012, 2, 29), true, true},
756                 {YDIFF + 2012, 61, date(YDIFF + 2012, 3, 1), true, true},
757                 {YDIFF + 2012, 365, date(YDIFF + 2012, 12, 30), true, true},
758                 {YDIFF + 2012, 366, date(YDIFF + 2012, 12, 31), true, true},
759                 {YDIFF + 2012, 367, date(YDIFF + 2013, 1, 1), false, false},
760                 {YDIFF + 2012, 367 + 364, date(YDIFF + 2013, 12, 31), false, false},
761                 {YDIFF + 2012, 367 + 365, date(YDIFF + 2014, 1, 1), false, false},
762 
763                 {YDIFF + 2011, 59, date(YDIFF + 2011, 2, 28), true, true},
764                 {YDIFF + 2011, 60, date(YDIFF + 2011, 3, 1), true, true},
765         };
766     }
767 
768     @Test(dataProvider = "resolve_yd")
test_resolve_yd_lenient(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict)769     public void test_resolve_yd_lenient(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
770         Map<TemporalField, Long> fieldValues = new HashMap<>();
771         fieldValues.put(ChronoField.YEAR, (long) y);
772         fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
773         ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
774         assertEquals(date, expected);
775         assertEquals(fieldValues.size(), 0);
776     }
777 
778     @Test(dataProvider = "resolve_yd")
test_resolve_yd_smart(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict)779     public void test_resolve_yd_smart(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
780         Map<TemporalField, Long> fieldValues = new HashMap<>();
781         fieldValues.put(ChronoField.YEAR, (long) y);
782         fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
783         if (smart) {
784             ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
785             assertEquals(date, expected);
786             assertEquals(fieldValues.size(), 0);
787         } else {
788             try {
789                 ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
790                 fail("Should have failed");
791             } catch (DateTimeException ex) {
792                 // expected
793             }
794         }
795     }
796 
797     @Test(dataProvider = "resolve_yd")
test_resolve_yd_strict(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict)798     public void test_resolve_yd_strict(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
799         Map<TemporalField, Long> fieldValues = new HashMap<>();
800         fieldValues.put(ChronoField.YEAR, (long) y);
801         fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
802         if (strict) {
803             ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
804             assertEquals(date, expected);
805             assertEquals(fieldValues.size(), 0);
806         } else {
807             try {
808                 ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
809                 fail("Should have failed");
810             } catch (DateTimeException ex) {
811                 // expected
812             }
813         }
814     }
815 
816     //-----------------------------------------------------------------------
817     //-----------------------------------------------------------------------
818     @DataProvider(name = "resolve_ymaa")
data_resolve_ymaa()819     Object[][] data_resolve_ymaa() {
820         return new Object[][] {
821                 {YDIFF + 2012, 1, 1, -365, date(YDIFF + 2010, 12, 31), false, false},
822                 {YDIFF + 2012, 1, 1, -364, date(YDIFF + 2011, 1, 1), false, false},
823                 {YDIFF + 2012, 1, 1, -31, date(YDIFF + 2011, 11, 30), false, false},
824                 {YDIFF + 2012, 1, 1, -30, date(YDIFF + 2011, 12, 1), false, false},
825                 {YDIFF + 2012, 1, 1, -12, date(YDIFF + 2011, 12, 19), false, false},
826                 {YDIFF + 2012, 1, 1, 1, date(YDIFF + 2012, 1, 1), true, true},
827                 {YDIFF + 2012, 1, 1, 59, date(YDIFF + 2012, 2, 28), false, false},
828                 {YDIFF + 2012, 1, 1, 60, date(YDIFF + 2012, 2, 29), false, false},
829                 {YDIFF + 2012, 1, 1, 61, date(YDIFF + 2012, 3, 1), false, false},
830                 {YDIFF + 2012, 1, 1, 365, date(YDIFF + 2012, 12, 30), false, false},
831                 {YDIFF + 2012, 1, 1, 366, date(YDIFF + 2012, 12, 31), false, false},
832                 {YDIFF + 2012, 1, 1, 367, date(YDIFF + 2013, 1, 1), false, false},
833                 {YDIFF + 2012, 1, 1, 367 + 364, date(YDIFF + 2013, 12, 31), false, false},
834                 {YDIFF + 2012, 1, 1, 367 + 365, date(YDIFF + 2014, 1, 1), false, false},
835 
836                 {YDIFF + 2012, 2, 0, 1, date(YDIFF + 2012, 1, 25), false, false},
837                 {YDIFF + 2012, 2, 0, 7, date(YDIFF + 2012, 1, 31), false, false},
838                 {YDIFF + 2012, 2, 1, 1, date(YDIFF + 2012, 2, 1), true, true},
839                 {YDIFF + 2012, 2, 1, 7, date(YDIFF + 2012, 2, 7), true, true},
840                 {YDIFF + 2012, 2, 2, 1, date(YDIFF + 2012, 2, 8), true, true},
841                 {YDIFF + 2012, 2, 2, 7, date(YDIFF + 2012, 2, 14), true, true},
842                 {YDIFF + 2012, 2, 3, 1, date(YDIFF + 2012, 2, 15), true, true},
843                 {YDIFF + 2012, 2, 3, 7, date(YDIFF + 2012, 2, 21), true, true},
844                 {YDIFF + 2012, 2, 4, 1, date(YDIFF + 2012, 2, 22), true, true},
845                 {YDIFF + 2012, 2, 4, 7, date(YDIFF + 2012, 2, 28), true, true},
846                 {YDIFF + 2012, 2, 5, 1, date(YDIFF + 2012, 2, 29), true, true},
847                 {YDIFF + 2012, 2, 5, 2, date(YDIFF + 2012, 3, 1), true, false},
848                 {YDIFF + 2012, 2, 5, 7, date(YDIFF + 2012, 3, 6), true, false},
849                 {YDIFF + 2012, 2, 6, 1, date(YDIFF + 2012, 3, 7), false, false},
850                 {YDIFF + 2012, 2, 6, 7, date(YDIFF + 2012, 3, 13), false, false},
851 
852                 {YDIFF + 2012, 12, 1, 1, date(YDIFF + 2012, 12, 1), true, true},
853                 {YDIFF + 2012, 12, 5, 1, date(YDIFF + 2012, 12, 29), true, true},
854                 {YDIFF + 2012, 12, 5, 2, date(YDIFF + 2012, 12, 30), true, true},
855                 {YDIFF + 2012, 12, 5, 3, date(YDIFF + 2012, 12, 31), true, true},
856                 {YDIFF + 2012, 12, 5, 4, date(YDIFF + 2013, 1, 1), true, false},
857                 {YDIFF + 2012, 12, 5, 7, date(YDIFF + 2013, 1, 4), true, false},
858 
859                 {YDIFF + 2012, -12, 1, 1, date(YDIFF + 2010, 12, 1), false, false},
860                 {YDIFF + 2012, -11, 1, 1, date(YDIFF + 2011, 1, 1), false, false},
861                 {YDIFF + 2012, -1, 1, 1, date(YDIFF + 2011, 11, 1), false, false},
862                 {YDIFF + 2012, 0, 1, 1, date(YDIFF + 2011, 12, 1), false, false},
863                 {YDIFF + 2012, 1, 1, 1, date(YDIFF + 2012, 1, 1), true, true},
864                 {YDIFF + 2012, 12, 1, 1, date(YDIFF + 2012, 12, 1), true, true},
865                 {YDIFF + 2012, 13, 1, 1, date(YDIFF + 2013, 1, 1), false, false},
866                 {YDIFF + 2012, 24, 1, 1, date(YDIFF + 2013, 12, 1), false, false},
867                 {YDIFF + 2012, 25, 1, 1, date(YDIFF + 2014, 1, 1), false, false},
868 
869                 {YDIFF + 2011, 2, 1, 1, date(YDIFF + 2011, 2, 1), true, true},
870                 {YDIFF + 2011, 2, 4, 7, date(YDIFF + 2011, 2, 28), true, true},
871                 {YDIFF + 2011, 2, 5, 1, date(YDIFF + 2011, 3, 1), true, false},
872         };
873     }
874 
875     @Test(dataProvider = "resolve_ymaa")
test_resolve_ymaa_lenient(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict)876     public void test_resolve_ymaa_lenient(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
877         Map<TemporalField, Long> fieldValues = new HashMap<>();
878         fieldValues.put(ChronoField.YEAR, (long) y);
879         fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
880         fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
881         fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
882         ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
883         assertEquals(date, expected);
884         assertEquals(fieldValues.size(), 0);
885     }
886 
887     @Test(dataProvider = "resolve_ymaa")
test_resolve_ymaa_smart(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict)888     public void test_resolve_ymaa_smart(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
889         Map<TemporalField, Long> fieldValues = new HashMap<>();
890         fieldValues.put(ChronoField.YEAR, (long) y);
891         fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
892         fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
893         fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
894         if (smart) {
895             ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
896             assertEquals(date, expected);
897             assertEquals(fieldValues.size(), 0);
898         } else {
899             try {
900                 ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
901                 fail("Should have failed");
902             } catch (DateTimeException ex) {
903                 // expected
904             }
905         }
906     }
907 
908     @Test(dataProvider = "resolve_ymaa")
test_resolve_ymaa_strict(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict)909     public void test_resolve_ymaa_strict(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
910         Map<TemporalField, Long> fieldValues = new HashMap<>();
911         fieldValues.put(ChronoField.YEAR, (long) y);
912         fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
913         fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
914         fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
915         if (strict) {
916             ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
917             assertEquals(date, expected);
918             assertEquals(fieldValues.size(), 0);
919         } else {
920             try {
921                 ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
922                 fail("Should have failed");
923             } catch (DateTimeException ex) {
924                 // expected
925             }
926         }
927     }
928 
929     //-----------------------------------------------------------------------
date(int y, int m, int d)930     private static ThaiBuddhistDate date(int y, int m, int d) {
931         return ThaiBuddhistDate.of(y, m, d);
932     }
933 
934 }
935