Skip to content

Instantly share code, notes, and snippets.

@jodastephen
Created June 24, 2013 09:29
Show Gist options
  • Save jodastephen/5848884 to your computer and use it in GitHub Desktop.
Save jodastephen/5848884 to your computer and use it in GitHub Desktop.
ThreeTen318
# HG changeset patch
# User scolebourne
# Date 1371832843 -3600
# Node ID f7573f51e6f97ad8f3610797215c45a37ced541c
# Parent ab19cc860f048b2cc5f67b63c506860bc981fe1b
Additional tests and fixes for strict/smart/lenient resolving
Issue #318
diff --git a/src/share/classes/java/time/chrono/Chronology.java b/src/share/classes/java/time/chrono/Chronology.java
--- a/src/share/classes/java/time/chrono/Chronology.java
+++ b/src/share/classes/java/time/chrono/Chronology.java
@@ -1122,9 +1122,10 @@
ValueRange domRange = range(DAY_OF_MONTH);
int dom = domRange.checkValidIntValue(fieldValues.remove(DAY_OF_MONTH), DAY_OF_MONTH);
if (resolverStyle == ResolverStyle.SMART) { // previous valid
- if (dom > domRange.getSmallestMaximum()) {
- dom = (int) domRange.getSmallestMaximum();
- return date(y, moy, dom).with(TemporalAdjuster.lastDayOfMonth());
+ try {
+ return date(y, moy, dom);
+ } catch (DateTimeException ex) {
+ return date(y, moy, 1).with(TemporalAdjuster.lastDayOfMonth());
}
}
return date(y, moy, dom);
diff --git a/src/share/classes/java/time/chrono/HijrahChronology.java b/src/share/classes/java/time/chrono/HijrahChronology.java
--- a/src/share/classes/java/time/chrono/HijrahChronology.java
+++ b/src/share/classes/java/time/chrono/HijrahChronology.java
@@ -71,8 +71,10 @@
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
+import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalField;
import java.time.temporal.ValueRange;
import java.util.Arrays;
import java.util.HashMap;
@@ -550,7 +552,7 @@
}
@Override
- public Era eraOf(int eraValue) {
+ public HijrahEra eraOf(int eraValue) {
switch (eraValue) {
case 1:
return HijrahEra.AH;
@@ -580,6 +582,8 @@
case YEAR:
case YEAR_OF_ERA:
return ValueRange.of(getMinimumYear(), getMaximumYear());
+ case ERA:
+ return ValueRange.of(1, 1);
default:
return field.range();
}
@@ -587,6 +591,13 @@
return field.range();
}
+ //-----------------------------------------------------------------------
+ @Override // override for return type
+ public HijrahDate resolveDate(Map<TemporalField, Long> fieldValues, ResolverStyle resolverStyle) {
+ return (HijrahDate) super.resolveDate(fieldValues, resolverStyle);
+ }
+
+ //-----------------------------------------------------------------------
/**
* Check the validity of a year.
*
diff --git a/src/share/classes/java/time/chrono/IsoChronology.java b/src/share/classes/java/time/chrono/IsoChronology.java
--- a/src/share/classes/java/time/chrono/IsoChronology.java
+++ b/src/share/classes/java/time/chrono/IsoChronology.java
@@ -389,7 +389,7 @@
}
@Override
- public Era eraOf(int eraValue) {
+ public IsoEra eraOf(int eraValue) {
return IsoEra.of(eraValue);
}
diff --git a/src/share/classes/java/time/chrono/JapaneseChronology.java b/src/share/classes/java/time/chrono/JapaneseChronology.java
--- a/src/share/classes/java/time/chrono/JapaneseChronology.java
+++ b/src/share/classes/java/time/chrono/JapaneseChronology.java
@@ -63,13 +63,16 @@
import java.time.LocalDate;
import java.time.Year;
import java.time.ZoneId;
+import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalField;
import java.time.temporal.ValueRange;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import sun.util.calendar.CalendarSystem;
import sun.util.calendar.LocalGregorianCalendar;
@@ -327,7 +330,7 @@
* @throws DateTimeException if {@code eraValue} is invalid
*/
@Override
- public Era eraOf(int eraValue) {
+ public JapaneseEra eraOf(int eraValue) {
return JapaneseEra.of(eraValue);
}
@@ -391,4 +394,10 @@
jcal.getLeastMaximum(fieldIndex), jcal.getMaximum(fieldIndex));
}
+ //-----------------------------------------------------------------------
+ @Override // override for return type
+ public JapaneseDate resolveDate(Map<TemporalField, Long> fieldValues, ResolverStyle resolverStyle) {
+ return (JapaneseDate) super.resolveDate(fieldValues, resolverStyle);
+ }
+
}
diff --git a/src/share/classes/java/time/chrono/MinguoChronology.java b/src/share/classes/java/time/chrono/MinguoChronology.java
--- a/src/share/classes/java/time/chrono/MinguoChronology.java
+++ b/src/share/classes/java/time/chrono/MinguoChronology.java
@@ -65,12 +65,15 @@
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
+import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalField;
import java.time.temporal.ValueRange;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
/**
* The Minguo calendar system.
@@ -292,7 +295,7 @@
}
@Override
- public Era eraOf(int eraValue) {
+ public MinguoEra eraOf(int eraValue) {
return MinguoEra.of(eraValue);
}
@@ -321,4 +324,10 @@
return field.range();
}
+ //-----------------------------------------------------------------------
+ @Override // override for return type
+ public MinguoDate resolveDate(Map<TemporalField, Long> fieldValues, ResolverStyle resolverStyle) {
+ return (MinguoDate) super.resolveDate(fieldValues, resolverStyle);
+ }
+
}
diff --git a/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java b/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java
--- a/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java
+++ b/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java
@@ -65,13 +65,16 @@
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
+import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalField;
import java.time.temporal.ValueRange;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
/**
* The Thai Buddhist calendar system.
@@ -328,7 +331,7 @@
}
@Override
- public Era eraOf(int eraValue) {
+ public ThaiBuddhistEra eraOf(int eraValue) {
return ThaiBuddhistEra.of(eraValue);
}
@@ -357,4 +360,10 @@
return field.range();
}
+ //-----------------------------------------------------------------------
+ @Override // override for return type
+ public ThaiBuddhistDate resolveDate(Map<TemporalField, Long> fieldValues, ResolverStyle resolverStyle) {
+ return (ThaiBuddhistDate) super.resolveDate(fieldValues, resolverStyle);
+ }
+
}
diff --git a/test/java/time/tck/java/time/chrono/TCKHijrahChronology.java b/test/java/time/tck/java/time/chrono/TCKHijrahChronology.java
--- a/test/java/time/tck/java/time/chrono/TCKHijrahChronology.java
+++ b/test/java/time/tck/java/time/chrono/TCKHijrahChronology.java
@@ -81,9 +81,16 @@
import java.time.chrono.IsoChronology;
import java.time.chrono.MinguoChronology;
import java.time.chrono.MinguoDate;
+import java.time.chrono.ThaiBuddhistChronology;
+import java.time.chrono.ThaiBuddhistDate;
+import java.time.format.ResolverStyle;
+import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
+import java.time.temporal.TemporalField;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
@@ -397,4 +404,98 @@
assertFalse(HijrahChronology.INSTANCE.equals(IsoChronology.INSTANCE));
}
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_yearOfEra")
+ Object[][] data_resolve_yearOfEra() {
+ return new Object[][] {
+ // era only
+ {ResolverStyle.STRICT, -1, null, null, null, null},
+ {ResolverStyle.SMART, -1, null, null, null, null},
+ {ResolverStyle.LENIENT, -1, null, null, null, null},
+
+ {ResolverStyle.STRICT, 0, null, null, null, null},
+ {ResolverStyle.SMART, 0, null, null, null, null},
+ {ResolverStyle.LENIENT, 0, null, null, null, null},
+
+ {ResolverStyle.STRICT, 1, null, null, ChronoField.ERA, 1},
+ {ResolverStyle.SMART, 1, null, null, ChronoField.ERA, 1},
+ {ResolverStyle.LENIENT, 1, null, null, ChronoField.ERA, 1},
+
+ {ResolverStyle.STRICT, 2, null, null, null, null},
+ {ResolverStyle.SMART, 2, null, null, null, null},
+ {ResolverStyle.LENIENT, 2, null, null, null, null},
+
+ // era and year-of-era
+ {ResolverStyle.STRICT, -1, 1434, null, null, null},
+ {ResolverStyle.SMART, -1, 1434, null, null, null},
+ {ResolverStyle.LENIENT, -1, 1434, null, null, null},
+
+ {ResolverStyle.STRICT, 0, 1434, null, null, null},
+ {ResolverStyle.SMART, 0, 1434, null, null, null},
+ {ResolverStyle.LENIENT, 0, 1434, null, null, null},
+
+ {ResolverStyle.STRICT, 1, 1434, null, ChronoField.YEAR, 1434},
+ {ResolverStyle.SMART, 1, 1434, null, ChronoField.YEAR, 1434},
+ {ResolverStyle.LENIENT, 1, 1434, null, ChronoField.YEAR, 1434},
+
+ {ResolverStyle.STRICT, 2, 1434, null, null, null},
+ {ResolverStyle.SMART, 2, 1434, null, null, null},
+ {ResolverStyle.LENIENT, 2, 1434, null, null, null},
+
+ // year-of-era only
+ {ResolverStyle.STRICT, null, 1434, null, ChronoField.YEAR_OF_ERA, 1434},
+ {ResolverStyle.SMART, null, 1434, null, ChronoField.YEAR, 1434},
+ {ResolverStyle.LENIENT, null, 1434, null, ChronoField.YEAR, 1434},
+
+ {ResolverStyle.STRICT, null, Integer.MAX_VALUE, null, null, null},
+ {ResolverStyle.SMART, null, Integer.MAX_VALUE, null, null, null},
+ {ResolverStyle.LENIENT, null, Integer.MAX_VALUE, null, ChronoField.YEAR, Integer.MAX_VALUE},
+
+ // year-of-era and year
+ {ResolverStyle.STRICT, null, 1434, 1434, ChronoField.YEAR, 1434},
+ {ResolverStyle.SMART, null, 1434, 1434, ChronoField.YEAR, 1434},
+ {ResolverStyle.LENIENT, null, 1434, 1434, ChronoField.YEAR, 1434},
+
+ {ResolverStyle.STRICT, null, 1434, -1433, null, null},
+ {ResolverStyle.SMART, null, 1434, -1433, null, null},
+ {ResolverStyle.LENIENT, null, 1434, -1433, null, null},
+
+ {ResolverStyle.STRICT, null, 1434, 1435, null, null},
+ {ResolverStyle.SMART, null, 1434, 1435, null, null},
+ {ResolverStyle.LENIENT, null, 1434, 1435, null, null},
+
+ {ResolverStyle.STRICT, null, 1434, -1435, null, null},
+ {ResolverStyle.SMART, null, 1434, -1435, null, null},
+ {ResolverStyle.LENIENT, null, 1434, -1435, null, null},
+ };
+ }
+
+ @Test(dataProvider = "resolve_yearOfEra")
+ public void test_resolve_yearOfEra(ResolverStyle style, Integer e, Integer yoe, Integer y, ChronoField field, Integer expected) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ if (e != null) {
+ fieldValues.put(ChronoField.ERA, (long) e);
+ }
+ if (yoe != null) {
+ fieldValues.put(ChronoField.YEAR_OF_ERA, (long) yoe);
+ }
+ if (y != null) {
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ }
+ if (field != null) {
+ HijrahDate date = HijrahChronology.INSTANCE.resolveDate(fieldValues, style);
+ assertEquals(date, null);
+ assertEquals(fieldValues.get(field), (Long) expected.longValue());
+ assertEquals(fieldValues.size(), 1);
+ } else {
+ try {
+ HijrahChronology.INSTANCE.resolveDate(fieldValues, style);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
}
diff --git a/test/java/time/tck/java/time/chrono/TCKIsoChronology.java b/test/java/time/tck/java/time/chrono/TCKIsoChronology.java
--- a/test/java/time/tck/java/time/chrono/TCKIsoChronology.java
+++ b/test/java/time/tck/java/time/chrono/TCKIsoChronology.java
@@ -378,6 +378,11 @@
{2012, 1, -30, date(2011, 12, 1), false, false},
{2012, 1, -12, date(2011, 12, 19), false, false},
{2012, 1, 1, date(2012, 1, 1), true, true},
+ {2012, 1, 27, date(2012, 1, 27), true, true},
+ {2012, 1, 28, date(2012, 1, 28), true, true},
+ {2012, 1, 29, date(2012, 1, 29), true, true},
+ {2012, 1, 30, date(2012, 1, 30), true, true},
+ {2012, 1, 31, date(2012, 1, 31), true, true},
{2012, 1, 59, date(2012, 2, 28), false, false},
{2012, 1, 60, date(2012, 2, 29), false, false},
{2012, 1, 61, date(2012, 3, 1), false, false},
diff --git a/test/java/time/tck/java/time/chrono/TCKMinguoChronology.java b/test/java/time/tck/java/time/chrono/TCKMinguoChronology.java
--- a/test/java/time/tck/java/time/chrono/TCKMinguoChronology.java
+++ b/test/java/time/tck/java/time/chrono/TCKMinguoChronology.java
@@ -84,13 +84,19 @@
import java.time.chrono.MinguoChronology;
import java.time.chrono.MinguoDate;
import java.time.chrono.MinguoEra;
+import java.time.chrono.MinguoChronology;
+import java.time.chrono.MinguoDate;
import java.time.chrono.ThaiBuddhistChronology;
import java.time.chrono.ThaiBuddhistDate;
+import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalAdjuster;
+import java.time.temporal.TemporalField;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
@@ -546,4 +552,409 @@
assertFalse(MinguoChronology.INSTANCE.equals(IsoChronology.INSTANCE));
}
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_yearOfEra")
+ Object[][] data_resolve_yearOfEra() {
+ return new Object[][] {
+ // era only
+ {ResolverStyle.STRICT, -1, null, null, null, null},
+ {ResolverStyle.SMART, -1, null, null, null, null},
+ {ResolverStyle.LENIENT, -1, null, null, null, null},
+
+ {ResolverStyle.STRICT, 0, null, null, ChronoField.ERA, 0},
+ {ResolverStyle.SMART, 0, null, null, ChronoField.ERA, 0},
+ {ResolverStyle.LENIENT, 0, null, null, ChronoField.ERA, 0},
+
+ {ResolverStyle.STRICT, 1, null, null, ChronoField.ERA, 1},
+ {ResolverStyle.SMART, 1, null, null, ChronoField.ERA, 1},
+ {ResolverStyle.LENIENT, 1, null, null, ChronoField.ERA, 1},
+
+ {ResolverStyle.STRICT, 2, null, null, null, null},
+ {ResolverStyle.SMART, 2, null, null, null, null},
+ {ResolverStyle.LENIENT, 2, null, null, null, null},
+
+ // era and year-of-era
+ {ResolverStyle.STRICT, -1, 2012, null, null, null},
+ {ResolverStyle.SMART, -1, 2012, null, null, null},
+ {ResolverStyle.LENIENT, -1, 2012, null, null, null},
+
+ {ResolverStyle.STRICT, 0, 2012, null, ChronoField.YEAR, -2011},
+ {ResolverStyle.SMART, 0, 2012, null, ChronoField.YEAR, -2011},
+ {ResolverStyle.LENIENT, 0, 2012, null, ChronoField.YEAR, -2011},
+
+ {ResolverStyle.STRICT, 1, 2012, null, ChronoField.YEAR, 2012},
+ {ResolverStyle.SMART, 1, 2012, null, ChronoField.YEAR, 2012},
+ {ResolverStyle.LENIENT, 1, 2012, null, ChronoField.YEAR, 2012},
+
+ {ResolverStyle.STRICT, 2, 2012, null, null, null},
+ {ResolverStyle.SMART, 2, 2012, null, null, null},
+ {ResolverStyle.LENIENT, 2, 2012, null, null, null},
+
+ // year-of-era only
+ {ResolverStyle.STRICT, null, 2012, null, ChronoField.YEAR_OF_ERA, 2012},
+ {ResolverStyle.SMART, null, 2012, null, ChronoField.YEAR, 2012},
+ {ResolverStyle.LENIENT, null, 2012, null, ChronoField.YEAR, 2012},
+
+ {ResolverStyle.STRICT, null, Integer.MAX_VALUE, null, null, null},
+ {ResolverStyle.SMART, null, Integer.MAX_VALUE, null, null, null},
+ {ResolverStyle.LENIENT, null, Integer.MAX_VALUE, null, ChronoField.YEAR, Integer.MAX_VALUE},
+
+ // year-of-era and year
+ {ResolverStyle.STRICT, null, 2012, 2012, ChronoField.YEAR, 2012},
+ {ResolverStyle.SMART, null, 2012, 2012, ChronoField.YEAR, 2012},
+ {ResolverStyle.LENIENT, null, 2012, 2012, ChronoField.YEAR, 2012},
+
+ {ResolverStyle.STRICT, null, 2012, -2011, ChronoField.YEAR, -2011},
+ {ResolverStyle.SMART, null, 2012, -2011, ChronoField.YEAR, -2011},
+ {ResolverStyle.LENIENT, null, 2012, -2011, ChronoField.YEAR, -2011},
+
+ {ResolverStyle.STRICT, null, 2012, 2013, null, null},
+ {ResolverStyle.SMART, null, 2012, 2013, null, null},
+ {ResolverStyle.LENIENT, null, 2012, 2013, null, null},
+
+ {ResolverStyle.STRICT, null, 2012, -2013, null, null},
+ {ResolverStyle.SMART, null, 2012, -2013, null, null},
+ {ResolverStyle.LENIENT, null, 2012, -2013, null, null},
+ };
+ }
+
+ @Test(dataProvider = "resolve_yearOfEra")
+ public void test_resolve_yearOfEra(ResolverStyle style, Integer e, Integer yoe, Integer y, ChronoField field, Integer expected) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ if (e != null) {
+ fieldValues.put(ChronoField.ERA, (long) e);
+ }
+ if (yoe != null) {
+ fieldValues.put(ChronoField.YEAR_OF_ERA, (long) yoe);
+ }
+ if (y != null) {
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ }
+ if (field != null) {
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, style);
+ assertEquals(date, null);
+ assertEquals(fieldValues.get(field), (Long) expected.longValue());
+ assertEquals(fieldValues.size(), 1);
+ } else {
+ try {
+ MinguoChronology.INSTANCE.resolveDate(fieldValues, style);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_ymd")
+ Object[][] data_resolve_ymd() {
+ return new Object[][] {
+ {2012 - YDIFF, 1, -365, date(2010 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, 1, -364, date(2011 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, 1, -31, date(2011 - YDIFF, 11, 30), false, false},
+ {2012 - YDIFF, 1, -30, date(2011 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, 1, -12, date(2011 - YDIFF, 12, 19), false, false},
+ {2012 - YDIFF, 1, 1, date(2012 - YDIFF, 1, 1), true, true},
+ {2012 - YDIFF, 1, 27, date(2012 - YDIFF, 1, 27), true, true},
+ {2012 - YDIFF, 1, 28, date(2012 - YDIFF, 1, 28), true, true},
+ {2012 - YDIFF, 1, 29, date(2012 - YDIFF, 1, 29), true, true},
+ {2012 - YDIFF, 1, 30, date(2012 - YDIFF, 1, 30), true, true},
+ {2012 - YDIFF, 1, 31, date(2012 - YDIFF, 1, 31), true, true},
+ {2012 - YDIFF, 1, 59, date(2012 - YDIFF, 2, 28), false, false},
+ {2012 - YDIFF, 1, 60, date(2012 - YDIFF, 2, 29), false, false},
+ {2012 - YDIFF, 1, 61, date(2012 - YDIFF, 3, 1), false, false},
+ {2012 - YDIFF, 1, 365, date(2012 - YDIFF, 12, 30), false, false},
+ {2012 - YDIFF, 1, 366, date(2012 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, 1, 367, date(2013 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, 1, 367 + 364, date(2013 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, 1, 367 + 365, date(2014 - YDIFF, 1, 1), false, false},
+
+ {2012 - YDIFF, 2, 1, date(2012 - YDIFF, 2, 1), true, true},
+ {2012 - YDIFF, 2, 28, date(2012 - YDIFF, 2, 28), true, true},
+ {2012 - YDIFF, 2, 29, date(2012 - YDIFF, 2, 29), true, true},
+ {2012 - YDIFF, 2, 30, date(2012 - YDIFF, 3, 1), date(2012 - YDIFF, 2, 29), false},
+ {2012 - YDIFF, 2, 31, date(2012 - YDIFF, 3, 2), date(2012 - YDIFF, 2, 29), false},
+ {2012 - YDIFF, 2, 32, date(2012 - YDIFF, 3, 3), false, false},
+
+ {2012 - YDIFF, -12, 1, date(2010 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, -11, 1, date(2011 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, -1, 1, date(2011 - YDIFF, 11, 1), false, false},
+ {2012 - YDIFF, 0, 1, date(2011 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, 1, 1, date(2012 - YDIFF, 1, 1), true, true},
+ {2012 - YDIFF, 12, 1, date(2012 - YDIFF, 12, 1), true, true},
+ {2012 - YDIFF, 13, 1, date(2013 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, 24, 1, date(2013 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, 25, 1, date(2014 - YDIFF, 1, 1), false, false},
+
+ {2012 - YDIFF, 6, -31, date(2012 - YDIFF, 4, 30), false, false},
+ {2012 - YDIFF, 6, -30, date(2012 - YDIFF, 5, 1), false, false},
+ {2012 - YDIFF, 6, -1, date(2012 - YDIFF, 5, 30), false, false},
+ {2012 - YDIFF, 6, 0, date(2012 - YDIFF, 5, 31), false, false},
+ {2012 - YDIFF, 6, 1, date(2012 - YDIFF, 6, 1), true, true},
+ {2012 - YDIFF, 6, 30, date(2012 - YDIFF, 6, 30), true, true},
+ {2012 - YDIFF, 6, 31, date(2012 - YDIFF, 7, 1), date(2012 - YDIFF, 6, 30), false},
+ {2012 - YDIFF, 6, 61, date(2012 - YDIFF, 7, 31), false, false},
+ {2012 - YDIFF, 6, 62, date(2012 - YDIFF, 8, 1), false, false},
+
+ {2011 - YDIFF, 2, 1, date(2011 - YDIFF, 2, 1), true, true},
+ {2011 - YDIFF, 2, 28, date(2011 - YDIFF, 2, 28), true, true},
+ {2011 - YDIFF, 2, 29, date(2011 - YDIFF, 3, 1), date(2011 - YDIFF, 2, 28), false},
+ {2011 - YDIFF, 2, 30, date(2011 - YDIFF, 3, 2), date(2011 - YDIFF, 2, 28), false},
+ {2011 - YDIFF, 2, 31, date(2011 - YDIFF, 3, 3), date(2011 - YDIFF, 2, 28), false},
+ {2011 - YDIFF, 2, 32, date(2011 - YDIFF, 3, 4), false, false},
+ };
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_lenient(int y, int m, int d, MinguoDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_smart(int y, int m, int d, MinguoDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ if (Boolean.TRUE.equals(smart)) {
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else if (smart instanceof MinguoDate) {
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, smart);
+ } else {
+ try {
+ MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_strict(int y, int m, int d, MinguoDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ if (strict) {
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_yd")
+ Object[][] data_resolve_yd() {
+ return new Object[][] {
+ {2012 - YDIFF, -365, date(2010 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, -364, date(2011 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, -31, date(2011 - YDIFF, 11, 30), false, false},
+ {2012 - YDIFF, -30, date(2011 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, -12, date(2011 - YDIFF, 12, 19), false, false},
+ {2012 - YDIFF, -1, date(2011 - YDIFF, 12, 30), false, false},
+ {2012 - YDIFF, 0, date(2011 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, 1, date(2012 - YDIFF, 1, 1), true, true},
+ {2012 - YDIFF, 2, date(2012 - YDIFF, 1, 2), true, true},
+ {2012 - YDIFF, 31, date(2012 - YDIFF, 1, 31), true, true},
+ {2012 - YDIFF, 32, date(2012 - YDIFF, 2, 1), true, true},
+ {2012 - YDIFF, 59, date(2012 - YDIFF, 2, 28), true, true},
+ {2012 - YDIFF, 60, date(2012 - YDIFF, 2, 29), true, true},
+ {2012 - YDIFF, 61, date(2012 - YDIFF, 3, 1), true, true},
+ {2012 - YDIFF, 365, date(2012 - YDIFF, 12, 30), true, true},
+ {2012 - YDIFF, 366, date(2012 - YDIFF, 12, 31), true, true},
+ {2012 - YDIFF, 367, date(2013 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, 367 + 364, date(2013 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, 367 + 365, date(2014 - YDIFF, 1, 1), false, false},
+
+ {2011 - YDIFF, 59, date(2011 - YDIFF, 2, 28), true, true},
+ {2011 - YDIFF, 60, date(2011 - YDIFF, 3, 1), true, true},
+ };
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_lenient(int y, int d, MinguoDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_smart(int y, int d, MinguoDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ if (smart) {
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_strict(int y, int d, MinguoDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ if (strict) {
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_ymaa")
+ Object[][] data_resolve_ymaa() {
+ return new Object[][] {
+ {2012 - YDIFF, 1, 1, -365, date(2010 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, 1, 1, -364, date(2011 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, 1, 1, -31, date(2011 - YDIFF, 11, 30), false, false},
+ {2012 - YDIFF, 1, 1, -30, date(2011 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, 1, 1, -12, date(2011 - YDIFF, 12, 19), false, false},
+ {2012 - YDIFF, 1, 1, 1, date(2012 - YDIFF, 1, 1), true, true},
+ {2012 - YDIFF, 1, 1, 59, date(2012 - YDIFF, 2, 28), false, false},
+ {2012 - YDIFF, 1, 1, 60, date(2012 - YDIFF, 2, 29), false, false},
+ {2012 - YDIFF, 1, 1, 61, date(2012 - YDIFF, 3, 1), false, false},
+ {2012 - YDIFF, 1, 1, 365, date(2012 - YDIFF, 12, 30), false, false},
+ {2012 - YDIFF, 1, 1, 366, date(2012 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, 1, 1, 367, date(2013 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, 1, 1, 367 + 364, date(2013 - YDIFF, 12, 31), false, false},
+ {2012 - YDIFF, 1, 1, 367 + 365, date(2014 - YDIFF, 1, 1), false, false},
+
+ {2012 - YDIFF, 2, 0, 1, date(2012 - YDIFF, 1, 25), false, false},
+ {2012 - YDIFF, 2, 0, 7, date(2012 - YDIFF, 1, 31), false, false},
+ {2012 - YDIFF, 2, 1, 1, date(2012 - YDIFF, 2, 1), true, true},
+ {2012 - YDIFF, 2, 1, 7, date(2012 - YDIFF, 2, 7), true, true},
+ {2012 - YDIFF, 2, 2, 1, date(2012 - YDIFF, 2, 8), true, true},
+ {2012 - YDIFF, 2, 2, 7, date(2012 - YDIFF, 2, 14), true, true},
+ {2012 - YDIFF, 2, 3, 1, date(2012 - YDIFF, 2, 15), true, true},
+ {2012 - YDIFF, 2, 3, 7, date(2012 - YDIFF, 2, 21), true, true},
+ {2012 - YDIFF, 2, 4, 1, date(2012 - YDIFF, 2, 22), true, true},
+ {2012 - YDIFF, 2, 4, 7, date(2012 - YDIFF, 2, 28), true, true},
+ {2012 - YDIFF, 2, 5, 1, date(2012 - YDIFF, 2, 29), true, true},
+ {2012 - YDIFF, 2, 5, 2, date(2012 - YDIFF, 3, 1), true, false},
+ {2012 - YDIFF, 2, 5, 7, date(2012 - YDIFF, 3, 6), true, false},
+ {2012 - YDIFF, 2, 6, 1, date(2012 - YDIFF, 3, 7), false, false},
+ {2012 - YDIFF, 2, 6, 7, date(2012 - YDIFF, 3, 13), false, false},
+
+ {2012 - YDIFF, 12, 1, 1, date(2012 - YDIFF, 12, 1), true, true},
+ {2012 - YDIFF, 12, 5, 1, date(2012 - YDIFF, 12, 29), true, true},
+ {2012 - YDIFF, 12, 5, 2, date(2012 - YDIFF, 12, 30), true, true},
+ {2012 - YDIFF, 12, 5, 3, date(2012 - YDIFF, 12, 31), true, true},
+ {2012 - YDIFF, 12, 5, 4, date(2013 - YDIFF, 1, 1), true, false},
+ {2012 - YDIFF, 12, 5, 7, date(2013 - YDIFF, 1, 4), true, false},
+
+ {2012 - YDIFF, -12, 1, 1, date(2010 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, -11, 1, 1, date(2011 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, -1, 1, 1, date(2011 - YDIFF, 11, 1), false, false},
+ {2012 - YDIFF, 0, 1, 1, date(2011 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, 1, 1, 1, date(2012 - YDIFF, 1, 1), true, true},
+ {2012 - YDIFF, 12, 1, 1, date(2012 - YDIFF, 12, 1), true, true},
+ {2012 - YDIFF, 13, 1, 1, date(2013 - YDIFF, 1, 1), false, false},
+ {2012 - YDIFF, 24, 1, 1, date(2013 - YDIFF, 12, 1), false, false},
+ {2012 - YDIFF, 25, 1, 1, date(2014 - YDIFF, 1, 1), false, false},
+
+ {2011 - YDIFF, 2, 1, 1, date(2011 - YDIFF, 2, 1), true, true},
+ {2011 - YDIFF, 2, 4, 7, date(2011 - YDIFF, 2, 28), true, true},
+ {2011 - YDIFF, 2, 5, 1, date(2011 - YDIFF, 3, 1), true, false},
+ };
+ }
+
+ @Test(dataProvider = "resolve_ymaa")
+ public void test_resolve_ymaa_lenient(int y, int m, int w, int d, MinguoDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
+ fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ }
+
+ @Test(dataProvider = "resolve_ymaa")
+ public void test_resolve_ymaa_smart(int y, int m, int w, int d, MinguoDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
+ fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
+ if (smart) {
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ @Test(dataProvider = "resolve_ymaa")
+ public void test_resolve_ymaa_strict(int y, int m, int w, int d, MinguoDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
+ fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
+ if (strict) {
+ MinguoDate date = MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ MinguoChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ private static MinguoDate date(int y, int m, int d) {
+ return MinguoDate.of(y, m, d);
+ }
+
}
diff --git a/test/java/time/tck/java/time/chrono/TCKThaiBuddhistChronology.java b/test/java/time/tck/java/time/chrono/TCKThaiBuddhistChronology.java
--- a/test/java/time/tck/java/time/chrono/TCKThaiBuddhistChronology.java
+++ b/test/java/time/tck/java/time/chrono/TCKThaiBuddhistChronology.java
@@ -85,12 +85,16 @@
import java.time.chrono.ThaiBuddhistChronology;
import java.time.chrono.ThaiBuddhistDate;
import java.time.chrono.ThaiBuddhistEra;
+import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
+import java.time.temporal.TemporalField;
import java.time.temporal.ValueRange;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
@@ -522,4 +526,409 @@
assertFalse(ThaiBuddhistChronology.INSTANCE.equals(IsoChronology.INSTANCE));
}
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_yearOfEra")
+ Object[][] data_resolve_yearOfEra() {
+ return new Object[][] {
+ // era only
+ {ResolverStyle.STRICT, -1, null, null, null, null},
+ {ResolverStyle.SMART, -1, null, null, null, null},
+ {ResolverStyle.LENIENT, -1, null, null, null, null},
+
+ {ResolverStyle.STRICT, 0, null, null, ChronoField.ERA, 0},
+ {ResolverStyle.SMART, 0, null, null, ChronoField.ERA, 0},
+ {ResolverStyle.LENIENT, 0, null, null, ChronoField.ERA, 0},
+
+ {ResolverStyle.STRICT, 1, null, null, ChronoField.ERA, 1},
+ {ResolverStyle.SMART, 1, null, null, ChronoField.ERA, 1},
+ {ResolverStyle.LENIENT, 1, null, null, ChronoField.ERA, 1},
+
+ {ResolverStyle.STRICT, 2, null, null, null, null},
+ {ResolverStyle.SMART, 2, null, null, null, null},
+ {ResolverStyle.LENIENT, 2, null, null, null, null},
+
+ // era and year-of-era
+ {ResolverStyle.STRICT, -1, 2012, null, null, null},
+ {ResolverStyle.SMART, -1, 2012, null, null, null},
+ {ResolverStyle.LENIENT, -1, 2012, null, null, null},
+
+ {ResolverStyle.STRICT, 0, 2012, null, ChronoField.YEAR, -2011},
+ {ResolverStyle.SMART, 0, 2012, null, ChronoField.YEAR, -2011},
+ {ResolverStyle.LENIENT, 0, 2012, null, ChronoField.YEAR, -2011},
+
+ {ResolverStyle.STRICT, 1, 2012, null, ChronoField.YEAR, 2012},
+ {ResolverStyle.SMART, 1, 2012, null, ChronoField.YEAR, 2012},
+ {ResolverStyle.LENIENT, 1, 2012, null, ChronoField.YEAR, 2012},
+
+ {ResolverStyle.STRICT, 2, 2012, null, null, null},
+ {ResolverStyle.SMART, 2, 2012, null, null, null},
+ {ResolverStyle.LENIENT, 2, 2012, null, null, null},
+
+ // year-of-era only
+ {ResolverStyle.STRICT, null, 2012, null, ChronoField.YEAR_OF_ERA, 2012},
+ {ResolverStyle.SMART, null, 2012, null, ChronoField.YEAR, 2012},
+ {ResolverStyle.LENIENT, null, 2012, null, ChronoField.YEAR, 2012},
+
+ {ResolverStyle.STRICT, null, Integer.MAX_VALUE, null, null, null},
+ {ResolverStyle.SMART, null, Integer.MAX_VALUE, null, null, null},
+ {ResolverStyle.LENIENT, null, Integer.MAX_VALUE, null, ChronoField.YEAR, Integer.MAX_VALUE},
+
+ // year-of-era and year
+ {ResolverStyle.STRICT, null, 2012, 2012, ChronoField.YEAR, 2012},
+ {ResolverStyle.SMART, null, 2012, 2012, ChronoField.YEAR, 2012},
+ {ResolverStyle.LENIENT, null, 2012, 2012, ChronoField.YEAR, 2012},
+
+ {ResolverStyle.STRICT, null, 2012, -2011, ChronoField.YEAR, -2011},
+ {ResolverStyle.SMART, null, 2012, -2011, ChronoField.YEAR, -2011},
+ {ResolverStyle.LENIENT, null, 2012, -2011, ChronoField.YEAR, -2011},
+
+ {ResolverStyle.STRICT, null, 2012, 2013, null, null},
+ {ResolverStyle.SMART, null, 2012, 2013, null, null},
+ {ResolverStyle.LENIENT, null, 2012, 2013, null, null},
+
+ {ResolverStyle.STRICT, null, 2012, -2013, null, null},
+ {ResolverStyle.SMART, null, 2012, -2013, null, null},
+ {ResolverStyle.LENIENT, null, 2012, -2013, null, null},
+ };
+ }
+
+ @Test(dataProvider = "resolve_yearOfEra")
+ public void test_resolve_yearOfEra(ResolverStyle style, Integer e, Integer yoe, Integer y, ChronoField field, Integer expected) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ if (e != null) {
+ fieldValues.put(ChronoField.ERA, (long) e);
+ }
+ if (yoe != null) {
+ fieldValues.put(ChronoField.YEAR_OF_ERA, (long) yoe);
+ }
+ if (y != null) {
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ }
+ if (field != null) {
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, style);
+ assertEquals(date, null);
+ assertEquals(fieldValues.get(field), (Long) expected.longValue());
+ assertEquals(fieldValues.size(), 1);
+ } else {
+ try {
+ ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, style);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_ymd")
+ Object[][] data_resolve_ymd() {
+ return new Object[][] {
+ {YDIFF + 2012, 1, -365, date(YDIFF + 2010, 12, 31), false, false},
+ {YDIFF + 2012, 1, -364, date(YDIFF + 2011, 1, 1), false, false},
+ {YDIFF + 2012, 1, -31, date(YDIFF + 2011, 11, 30), false, false},
+ {YDIFF + 2012, 1, -30, date(YDIFF + 2011, 12, 1), false, false},
+ {YDIFF + 2012, 1, -12, date(YDIFF + 2011, 12, 19), false, false},
+ {YDIFF + 2012, 1, 1, date(YDIFF + 2012, 1, 1), true, true},
+ {YDIFF + 2012, 1, 27, date(YDIFF + 2012, 1, 27), true, true},
+ {YDIFF + 2012, 1, 28, date(YDIFF + 2012, 1, 28), true, true},
+ {YDIFF + 2012, 1, 29, date(YDIFF + 2012, 1, 29), true, true},
+ {YDIFF + 2012, 1, 30, date(YDIFF + 2012, 1, 30), true, true},
+ {YDIFF + 2012, 1, 31, date(YDIFF + 2012, 1, 31), true, true},
+ {YDIFF + 2012, 1, 59, date(YDIFF + 2012, 2, 28), false, false},
+ {YDIFF + 2012, 1, 60, date(YDIFF + 2012, 2, 29), false, false},
+ {YDIFF + 2012, 1, 61, date(YDIFF + 2012, 3, 1), false, false},
+ {YDIFF + 2012, 1, 365, date(YDIFF + 2012, 12, 30), false, false},
+ {YDIFF + 2012, 1, 366, date(YDIFF + 2012, 12, 31), false, false},
+ {YDIFF + 2012, 1, 367, date(YDIFF + 2013, 1, 1), false, false},
+ {YDIFF + 2012, 1, 367 + 364, date(YDIFF + 2013, 12, 31), false, false},
+ {YDIFF + 2012, 1, 367 + 365, date(YDIFF + 2014, 1, 1), false, false},
+
+ {YDIFF + 2012, 2, 1, date(YDIFF + 2012, 2, 1), true, true},
+ {YDIFF + 2012, 2, 28, date(YDIFF + 2012, 2, 28), true, true},
+ {YDIFF + 2012, 2, 29, date(YDIFF + 2012, 2, 29), true, true},
+ {YDIFF + 2012, 2, 30, date(YDIFF + 2012, 3, 1), date(YDIFF + 2012, 2, 29), false},
+ {YDIFF + 2012, 2, 31, date(YDIFF + 2012, 3, 2), date(YDIFF + 2012, 2, 29), false},
+ {YDIFF + 2012, 2, 32, date(YDIFF + 2012, 3, 3), false, false},
+
+ {YDIFF + 2012, -12, 1, date(YDIFF + 2010, 12, 1), false, false},
+ {YDIFF + 2012, -11, 1, date(YDIFF + 2011, 1, 1), false, false},
+ {YDIFF + 2012, -1, 1, date(YDIFF + 2011, 11, 1), false, false},
+ {YDIFF + 2012, 0, 1, date(YDIFF + 2011, 12, 1), false, false},
+ {YDIFF + 2012, 1, 1, date(YDIFF + 2012, 1, 1), true, true},
+ {YDIFF + 2012, 12, 1, date(YDIFF + 2012, 12, 1), true, true},
+ {YDIFF + 2012, 13, 1, date(YDIFF + 2013, 1, 1), false, false},
+ {YDIFF + 2012, 24, 1, date(YDIFF + 2013, 12, 1), false, false},
+ {YDIFF + 2012, 25, 1, date(YDIFF + 2014, 1, 1), false, false},
+
+ {YDIFF + 2012, 6, -31, date(YDIFF + 2012, 4, 30), false, false},
+ {YDIFF + 2012, 6, -30, date(YDIFF + 2012, 5, 1), false, false},
+ {YDIFF + 2012, 6, -1, date(YDIFF + 2012, 5, 30), false, false},
+ {YDIFF + 2012, 6, 0, date(YDIFF + 2012, 5, 31), false, false},
+ {YDIFF + 2012, 6, 1, date(YDIFF + 2012, 6, 1), true, true},
+ {YDIFF + 2012, 6, 30, date(YDIFF + 2012, 6, 30), true, true},
+ {YDIFF + 2012, 6, 31, date(YDIFF + 2012, 7, 1), date(YDIFF + 2012, 6, 30), false},
+ {YDIFF + 2012, 6, 61, date(YDIFF + 2012, 7, 31), false, false},
+ {YDIFF + 2012, 6, 62, date(YDIFF + 2012, 8, 1), false, false},
+
+ {YDIFF + 2011, 2, 1, date(YDIFF + 2011, 2, 1), true, true},
+ {YDIFF + 2011, 2, 28, date(YDIFF + 2011, 2, 28), true, true},
+ {YDIFF + 2011, 2, 29, date(YDIFF + 2011, 3, 1), date(YDIFF + 2011, 2, 28), false},
+ {YDIFF + 2011, 2, 30, date(YDIFF + 2011, 3, 2), date(YDIFF + 2011, 2, 28), false},
+ {YDIFF + 2011, 2, 31, date(YDIFF + 2011, 3, 3), date(YDIFF + 2011, 2, 28), false},
+ {YDIFF + 2011, 2, 32, date(YDIFF + 2011, 3, 4), false, false},
+ };
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_lenient(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_smart(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ if (Boolean.TRUE.equals(smart)) {
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else if (smart instanceof ThaiBuddhistDate) {
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, smart);
+ } else {
+ try {
+ ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_strict(int y, int m, int d, ThaiBuddhistDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ if (strict) {
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_yd")
+ Object[][] data_resolve_yd() {
+ return new Object[][] {
+ {YDIFF + 2012, -365, date(YDIFF + 2010, 12, 31), false, false},
+ {YDIFF + 2012, -364, date(YDIFF + 2011, 1, 1), false, false},
+ {YDIFF + 2012, -31, date(YDIFF + 2011, 11, 30), false, false},
+ {YDIFF + 2012, -30, date(YDIFF + 2011, 12, 1), false, false},
+ {YDIFF + 2012, -12, date(YDIFF + 2011, 12, 19), false, false},
+ {YDIFF + 2012, -1, date(YDIFF + 2011, 12, 30), false, false},
+ {YDIFF + 2012, 0, date(YDIFF + 2011, 12, 31), false, false},
+ {YDIFF + 2012, 1, date(YDIFF + 2012, 1, 1), true, true},
+ {YDIFF + 2012, 2, date(YDIFF + 2012, 1, 2), true, true},
+ {YDIFF + 2012, 31, date(YDIFF + 2012, 1, 31), true, true},
+ {YDIFF + 2012, 32, date(YDIFF + 2012, 2, 1), true, true},
+ {YDIFF + 2012, 59, date(YDIFF + 2012, 2, 28), true, true},
+ {YDIFF + 2012, 60, date(YDIFF + 2012, 2, 29), true, true},
+ {YDIFF + 2012, 61, date(YDIFF + 2012, 3, 1), true, true},
+ {YDIFF + 2012, 365, date(YDIFF + 2012, 12, 30), true, true},
+ {YDIFF + 2012, 366, date(YDIFF + 2012, 12, 31), true, true},
+ {YDIFF + 2012, 367, date(YDIFF + 2013, 1, 1), false, false},
+ {YDIFF + 2012, 367 + 364, date(YDIFF + 2013, 12, 31), false, false},
+ {YDIFF + 2012, 367 + 365, date(YDIFF + 2014, 1, 1), false, false},
+
+ {YDIFF + 2011, 59, date(YDIFF + 2011, 2, 28), true, true},
+ {YDIFF + 2011, 60, date(YDIFF + 2011, 3, 1), true, true},
+ };
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_lenient(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_smart(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ if (smart) {
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_strict(int y, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ if (strict) {
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_ymaa")
+ Object[][] data_resolve_ymaa() {
+ return new Object[][] {
+ {YDIFF + 2012, 1, 1, -365, date(YDIFF + 2010, 12, 31), false, false},
+ {YDIFF + 2012, 1, 1, -364, date(YDIFF + 2011, 1, 1), false, false},
+ {YDIFF + 2012, 1, 1, -31, date(YDIFF + 2011, 11, 30), false, false},
+ {YDIFF + 2012, 1, 1, -30, date(YDIFF + 2011, 12, 1), false, false},
+ {YDIFF + 2012, 1, 1, -12, date(YDIFF + 2011, 12, 19), false, false},
+ {YDIFF + 2012, 1, 1, 1, date(YDIFF + 2012, 1, 1), true, true},
+ {YDIFF + 2012, 1, 1, 59, date(YDIFF + 2012, 2, 28), false, false},
+ {YDIFF + 2012, 1, 1, 60, date(YDIFF + 2012, 2, 29), false, false},
+ {YDIFF + 2012, 1, 1, 61, date(YDIFF + 2012, 3, 1), false, false},
+ {YDIFF + 2012, 1, 1, 365, date(YDIFF + 2012, 12, 30), false, false},
+ {YDIFF + 2012, 1, 1, 366, date(YDIFF + 2012, 12, 31), false, false},
+ {YDIFF + 2012, 1, 1, 367, date(YDIFF + 2013, 1, 1), false, false},
+ {YDIFF + 2012, 1, 1, 367 + 364, date(YDIFF + 2013, 12, 31), false, false},
+ {YDIFF + 2012, 1, 1, 367 + 365, date(YDIFF + 2014, 1, 1), false, false},
+
+ {YDIFF + 2012, 2, 0, 1, date(YDIFF + 2012, 1, 25), false, false},
+ {YDIFF + 2012, 2, 0, 7, date(YDIFF + 2012, 1, 31), false, false},
+ {YDIFF + 2012, 2, 1, 1, date(YDIFF + 2012, 2, 1), true, true},
+ {YDIFF + 2012, 2, 1, 7, date(YDIFF + 2012, 2, 7), true, true},
+ {YDIFF + 2012, 2, 2, 1, date(YDIFF + 2012, 2, 8), true, true},
+ {YDIFF + 2012, 2, 2, 7, date(YDIFF + 2012, 2, 14), true, true},
+ {YDIFF + 2012, 2, 3, 1, date(YDIFF + 2012, 2, 15), true, true},
+ {YDIFF + 2012, 2, 3, 7, date(YDIFF + 2012, 2, 21), true, true},
+ {YDIFF + 2012, 2, 4, 1, date(YDIFF + 2012, 2, 22), true, true},
+ {YDIFF + 2012, 2, 4, 7, date(YDIFF + 2012, 2, 28), true, true},
+ {YDIFF + 2012, 2, 5, 1, date(YDIFF + 2012, 2, 29), true, true},
+ {YDIFF + 2012, 2, 5, 2, date(YDIFF + 2012, 3, 1), true, false},
+ {YDIFF + 2012, 2, 5, 7, date(YDIFF + 2012, 3, 6), true, false},
+ {YDIFF + 2012, 2, 6, 1, date(YDIFF + 2012, 3, 7), false, false},
+ {YDIFF + 2012, 2, 6, 7, date(YDIFF + 2012, 3, 13), false, false},
+
+ {YDIFF + 2012, 12, 1, 1, date(YDIFF + 2012, 12, 1), true, true},
+ {YDIFF + 2012, 12, 5, 1, date(YDIFF + 2012, 12, 29), true, true},
+ {YDIFF + 2012, 12, 5, 2, date(YDIFF + 2012, 12, 30), true, true},
+ {YDIFF + 2012, 12, 5, 3, date(YDIFF + 2012, 12, 31), true, true},
+ {YDIFF + 2012, 12, 5, 4, date(YDIFF + 2013, 1, 1), true, false},
+ {YDIFF + 2012, 12, 5, 7, date(YDIFF + 2013, 1, 4), true, false},
+
+ {YDIFF + 2012, -12, 1, 1, date(YDIFF + 2010, 12, 1), false, false},
+ {YDIFF + 2012, -11, 1, 1, date(YDIFF + 2011, 1, 1), false, false},
+ {YDIFF + 2012, -1, 1, 1, date(YDIFF + 2011, 11, 1), false, false},
+ {YDIFF + 2012, 0, 1, 1, date(YDIFF + 2011, 12, 1), false, false},
+ {YDIFF + 2012, 1, 1, 1, date(YDIFF + 2012, 1, 1), true, true},
+ {YDIFF + 2012, 12, 1, 1, date(YDIFF + 2012, 12, 1), true, true},
+ {YDIFF + 2012, 13, 1, 1, date(YDIFF + 2013, 1, 1), false, false},
+ {YDIFF + 2012, 24, 1, 1, date(YDIFF + 2013, 12, 1), false, false},
+ {YDIFF + 2012, 25, 1, 1, date(YDIFF + 2014, 1, 1), false, false},
+
+ {YDIFF + 2011, 2, 1, 1, date(YDIFF + 2011, 2, 1), true, true},
+ {YDIFF + 2011, 2, 4, 7, date(YDIFF + 2011, 2, 28), true, true},
+ {YDIFF + 2011, 2, 5, 1, date(YDIFF + 2011, 3, 1), true, false},
+ };
+ }
+
+ @Test(dataProvider = "resolve_ymaa")
+ public void test_resolve_ymaa_lenient(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
+ fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ }
+
+ @Test(dataProvider = "resolve_ymaa")
+ public void test_resolve_ymaa_smart(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
+ fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
+ if (smart) {
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ @Test(dataProvider = "resolve_ymaa")
+ public void test_resolve_ymaa_strict(int y, int m, int w, int d, ThaiBuddhistDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.ALIGNED_WEEK_OF_MONTH, (long) w);
+ fieldValues.put(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH, (long) d);
+ if (strict) {
+ ThaiBuddhistDate date = ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ ThaiBuddhistChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ private static ThaiBuddhistDate date(int y, int m, int d) {
+ return ThaiBuddhistDate.of(y, m, d);
+ }
+
}
diff --git a/test/java/time/test/java/time/chrono/TestUmmAlQuraChronology.java b/test/java/time/test/java/time/chrono/TestUmmAlQuraChronology.java
--- a/test/java/time/test/java/time/chrono/TestUmmAlQuraChronology.java
+++ b/test/java/time/test/java/time/chrono/TestUmmAlQuraChronology.java
@@ -36,9 +36,13 @@
import java.time.chrono.Chronology;
import java.time.chrono.HijrahChronology;
import java.time.chrono.HijrahDate;
+import java.time.format.ResolverStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalField;
import java.time.temporal.ValueRange;
+import java.util.HashMap;
+import java.util.Map;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -222,4 +226,152 @@
void printRange(ValueRange range, Object obj, ChronoField field) {
System.err.printf(" range: min: %d, max: %d; of: %s, field: %s%n", range.getMinimum(), range.getMaximum(), obj.toString(), field.toString());
}
+
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_ymd")
+ Object[][] data_resolve_ymd() {
+ return new Object[][] {
+ {1434, 1, -355, date(1432, 12, 29), false, false},
+ {1434, 1, -354, date(1433, 1, 1), false, false},
+ {1434, 1, -29, date(1433, 11, 30), false, false},
+ {1434, 1, -28, date(1433, 12, 1), false, false},
+ {1434, 1, -12, date(1433, 12, 17), false, false},
+ {1434, 1, -1, date(1433, 12, 28), false, false},
+ {1434, 1, 0, date(1433, 12, 29), false, false},
+ {1434, 1, 1, date(1434, 1, 1), true, true},
+ {1434, 1, 2, date(1434, 1, 2), true, true},
+ {1434, 1, 29, date(1434, 1, 29), true, true},
+ {1434, 1, 30, date(1434, 2, 1), date(1434, 1, 29), false},
+ {1434, 1, 31, date(1434, 2, 2), false, false},
+ };
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_lenient(int y, int m, int d, HijrahDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ HijrahDate date = HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_smart(int y, int m, int d, HijrahDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ if (Boolean.TRUE.equals(smart)) {
+ HijrahDate date = HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else if (smart instanceof HijrahDate) {
+ HijrahDate date = HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, smart);
+ } else {
+ try {
+ HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ @Test(dataProvider = "resolve_ymd")
+ public void test_resolve_ymd_strict(int y, int m, int d, HijrahDate expected, Object smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.MONTH_OF_YEAR, (long) m);
+ fieldValues.put(ChronoField.DAY_OF_MONTH, (long) d);
+ if (strict) {
+ HijrahDate date = HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "resolve_yd")
+ Object[][] data_resolve_yd() {
+ return new Object[][] {
+ {1434, -355, date(1432, 12, 29), false, false},
+ {1434, -354, date(1433, 1, 1), false, false},
+ {1434, -29, date(1433, 11, 30), false, false},
+ {1434, -28, date(1433, 12, 1), false, false},
+ {1434, -12, date(1433, 12, 17), false, false},
+ {1434, -1, date(1433, 12, 28), false, false},
+ {1434, 0, date(1433, 12, 29), false, false},
+ {1434, 1, date(1434, 1, 1), true, true},
+ {1434, 2, date(1434, 1, 2), true, true},
+ {1434, 29, date(1434, 1, 29), true, true},
+ {1434, 30, date(1434, 2, 1), true, true},
+ {1434, 59, date(1434, 2, 30), true, true},
+ };
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_lenient(int y, int d, HijrahDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ HijrahDate date = HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.LENIENT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_smart(int y, int d, HijrahDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ if (smart) {
+ HijrahDate date = HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.SMART);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ @Test(dataProvider = "resolve_yd")
+ public void test_resolve_yd_strict(int y, int d, HijrahDate expected, boolean smart, boolean strict) {
+ Map<TemporalField, Long> fieldValues = new HashMap<>();
+ fieldValues.put(ChronoField.YEAR, (long) y);
+ fieldValues.put(ChronoField.DAY_OF_YEAR, (long) d);
+ if (strict) {
+ HijrahDate date = HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ assertEquals(date, expected);
+ assertEquals(fieldValues.size(), 0);
+ } else {
+ try {
+ HijrahChronology.INSTANCE.resolveDate(fieldValues, ResolverStyle.STRICT);
+ fail("Should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
+ }
+
+ //-----------------------------------------------------------------------
+ private static HijrahDate date(int y, int m, int d) {
+ return HijrahDate.of(y, m, d);
+ }
+
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment