package net.time4j.i18n; import net.time4j.Meridiem; import net.time4j.Month; import net.time4j.PlainDate; import net.time4j.PlainTime; import net.time4j.Quarter; import net.time4j.Weekday; import net.time4j.base.ResourceLoader; import net.time4j.engine.AttributeQuery; import net.time4j.engine.Chronology; import net.time4j.format.Attributes; import net.time4j.format.CalendarText; import net.time4j.format.Leniency; import net.time4j.format.OutputContext; import net.time4j.format.TextProvider; import net.time4j.format.TextWidth; import net.time4j.format.expert.ChronoFormatter; import net.time4j.format.expert.PatternType; import net.time4j.history.HistoricEra; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.text.DateFormatSymbols; import java.text.ParseException; import java.text.ParsePosition; import java.util.Calendar; import java.util.Locale; import java.util.MissingResourceException; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class CalendricalNamesTest { @Test public void getInstance_Chronology_Locale() { Chronology<PlainTime> chronology = Chronology.lookup(PlainTime.class); Locale locale = Locale.GERMAN; CalendarText expResult = CalendarText.getInstance("iso8601", locale); CalendarText result = CalendarText.getInstance(chronology, locale); assertThat(result, is(expResult)); } @Test public void getInstance_String_Locale() { Locale locale = Locale.US; CalendarText result = CalendarText.getInstance("iso8601", locale); TextProvider p = null; for (TextProvider tmp : ResourceLoader.getInstance().services(TextProvider.class)) { if ( isCalendarTypeSupported(tmp, "iso8601") && isLocaleSupported(tmp, locale) ) { p = tmp; break; } } if (p != null) { assertThat(result.toString(), is(p.toString())); } result = CalendarText.getInstance("xyz", locale); assertThat(result.toString(), is("FallbackProvider")); } @Test public void printMonthsDE() { TextWidth textWidth = TextWidth.NARROW; CalendarText instance = CalendarText.getInstance("iso8601", Locale.GERMAN); String result = instance.getStdMonths(textWidth, OutputContext.FORMAT) .print(Month.MARCH); assertThat(result, is("M")); textWidth = TextWidth.WIDE; result = instance.getStdMonths(textWidth, OutputContext.FORMAT) .print(Month.MARCH); assertThat(result, is("März")); textWidth = TextWidth.WIDE; result = instance.getStdMonths(textWidth, OutputContext.STANDALONE) .print(Month.MARCH); assertThat(result, is("März")); textWidth = TextWidth.SHORT; result = instance.getStdMonths(textWidth, OutputContext.FORMAT) .print(Month.SEPTEMBER); assertThat(result, is("Sep.")); textWidth = TextWidth.ABBREVIATED; result = instance.getStdMonths(textWidth, OutputContext.FORMAT) .print(Month.SEPTEMBER); assertThat(result, is("Sep.")); } @Test public void printMonthsRU() { OutputContext oc = OutputContext.FORMAT; TextWidth textWidth = TextWidth.NARROW; CalendarText instance = CalendarText.getInstance("iso8601", new Locale("ru")); String result = instance.getStdMonths(textWidth, oc).print(Month.FEBRUARY); assertThat(result, is("Ф")); textWidth = TextWidth.WIDE; result = instance.getStdMonths(textWidth, oc) .print(Month.MARCH); assertThat(result, is("марта")); textWidth = TextWidth.WIDE; result = instance.getStdMonths(textWidth, OutputContext.STANDALONE) .print(Month.MARCH); assertThat(result, is("март")); } @Test public void printMonthsZH() { TextWidth textWidth = TextWidth.NARROW; CalendarText instance = CalendarText.getInstance("iso8601", Locale.SIMPLIFIED_CHINESE); String result = instance.getStdMonths(textWidth, OutputContext.FORMAT) .print(Month.MARCH); assertThat(result, is("3")); textWidth = TextWidth.WIDE; result = instance.getStdMonths(textWidth, OutputContext.FORMAT) .print(Month.MARCH); assertThat(result, is("三月")); textWidth = TextWidth.ABBREVIATED; result = instance.getStdMonths(textWidth, OutputContext.FORMAT) .print(Month.MARCH); assertThat(result, is("3月")); } @Test public void parseMonths() { CalendarText instance = CalendarText.getInstance("iso8601", Locale.GERMAN); OutputContext outputContext = OutputContext.FORMAT; ParsePosition status = new ParsePosition(0); Month value = instance.getStdMonths(TextWidth.ABBREVIATED, outputContext) .parse("Sep.", status, Month.class); assertThat(value, is(Month.SEPTEMBER)); status.setIndex(0); value = instance.getStdMonths(TextWidth.WIDE, outputContext) .parse("MÄR", status, Month.class, toAttributes(true, true)); assertThat(value, is(Month.MARCH)); status.setIndex(0); value = instance.getStdMonths(TextWidth.WIDE, outputContext) .parse("MÄRz", status, Month.class, toAttributes(true, false)); assertThat(value, is(Month.MARCH)); status.setIndex(0); value = instance.getStdMonths(TextWidth.SHORT, outputContext) .parse("MÄ", status, Month.class, toAttributes(true, true)); assertThat(value, is(Month.MARCH)); status.setIndex(0); value = instance.getStdMonths(TextWidth.SHORT, outputContext) .parse("Sep.", status, Month.class); assertThat(value, is(Month.SEPTEMBER)); status.setIndex(0); value = instance.getStdMonths(TextWidth.NARROW, outputContext) .parse("m", status, Month.class, toAttributes(true, false)); assertThat(value, nullValue()); // ambivalent - March or May status.setIndex(0); value = instance.getStdMonths(TextWidth.NARROW, outputContext) .parse("d", status, Month.class, toAttributes(true, false)); assertThat(value, is(Month.DECEMBER)); status.setIndex(0); value = instance.getStdMonths(TextWidth.WIDE, outputContext) .parse("ju", status, Month.class, toAttributes(true, true)); assertThat(value, nullValue()); // ambivalent - June or July status.setIndex(0); value = instance.getStdMonths(TextWidth.WIDE, outputContext) .parse("jul", status, Month.class, toAttributes(true, true)); assertThat(value, is(Month.JULY)); Locale locale = Locale.JAPAN; DateFormatSymbols dfs = DateFormatSymbols.getInstance(locale); instance = CalendarText.getInstance("iso8601", locale); status.setIndex(0); value = instance.getStdMonths(TextWidth.NARROW, outputContext) .parse( dfs.getShortMonths()[Calendar.MARCH], status, Month.class); assertThat(value, is(Month.MARCH)); } @Test public void printQuartersEN() { TextWidth textWidth = TextWidth.NARROW; OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", Locale.ENGLISH); String result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q3); assertThat(result, is("3")); textWidth = TextWidth.ABBREVIATED; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q3); assertThat(result, is("Q3")); textWidth = TextWidth.WIDE; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q3); assertThat(result, is("3rd quarter")); } @Test public void printQuartersDE() { OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", Locale.GERMAN); TextWidth textWidth = TextWidth.NARROW; String result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q1); assertThat(result, is("1")); textWidth = TextWidth.ABBREVIATED; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q1); assertThat(result, is("Q1")); textWidth = TextWidth.WIDE; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q1); assertThat(result, is("1. Quartal")); } @Test public void printQuartersZH() { OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", Locale.SIMPLIFIED_CHINESE); TextWidth textWidth = TextWidth.NARROW; String result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q1); assertThat(result, is("1")); textWidth = TextWidth.ABBREVIATED; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q1); assertThat(result, is("1季度")); textWidth = TextWidth.WIDE; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q1); assertThat(result, is("第一季度")); } @Test public void printQuartersAR() { OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", new Locale("ar")); TextWidth textWidth = TextWidth.NARROW; String result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q4); assertThat(result, is("٤")); textWidth = TextWidth.ABBREVIATED; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q1); assertThat(result, is("الربع الأول")); textWidth = TextWidth.WIDE; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q2); assertThat(result, is("الربع الثاني")); } @Test public void printQuartersRU() { OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", new Locale("ru")); TextWidth textWidth = TextWidth.ABBREVIATED; String result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q4); assertThat(result, is("4-й кв.")); textWidth = TextWidth.WIDE; result = instance.getQuarters(textWidth, outputContext) .print(Quarter.Q2); assertThat(result, is("2-й квартал")); } @Test public void parseQuarters() { TextWidth textWidth = TextWidth.SHORT; OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", Locale.GERMAN); Quarter result = instance.getQuarters(textWidth, outputContext) .parse("Q3", new ParsePosition(0), Quarter.class); assertThat(result, is(Quarter.Q3)); } @Test public void printWeekdaysEN() { OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", Locale.ENGLISH); TextWidth textWidth; String result; textWidth = TextWidth.NARROW; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.FRIDAY); assertThat(result, is("F")); textWidth = TextWidth.SHORT; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.FRIDAY); assertThat(result, is("Fr")); textWidth = TextWidth.ABBREVIATED; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.FRIDAY); assertThat(result, is("Fri")); textWidth = TextWidth.WIDE; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.FRIDAY); assertThat(result, is("Friday")); } @Test public void printWeekdaysES() { TextWidth textWidth = TextWidth.WIDE; OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", new Locale("es")); String result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.SATURDAY); assertThat(result, is("sábado")); textWidth = TextWidth.NARROW; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.SATURDAY); assertThat(result, is("S")); textWidth = TextWidth.WIDE; outputContext = OutputContext.STANDALONE; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.SATURDAY); assertThat(result, is("sábado")); } @Test public void printWeekdaysZH() { TextWidth textWidth = TextWidth.ABBREVIATED; OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", Locale.SIMPLIFIED_CHINESE); String result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.SUNDAY); assertThat(result, is("周日")); } @Test public void printWeekdaysZH_TW() { TextWidth textWidth = TextWidth.ABBREVIATED; OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", Locale.TRADITIONAL_CHINESE); String result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.SUNDAY); assertThat(result, is("週日")); } @Test public void printWeekdaysDE() { OutputContext outputContext = OutputContext.FORMAT; CalendarText instance = CalendarText.getInstance("iso8601", Locale.GERMAN); TextWidth textWidth = TextWidth.NARROW; String result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.FRIDAY); assertThat(result, is("F")); textWidth = TextWidth.SHORT; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.FRIDAY); assertThat(result, is("Fr.")); textWidth = TextWidth.ABBREVIATED; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.FRIDAY); assertThat(result, is("Fr.")); textWidth = TextWidth.WIDE; result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.FRIDAY); assertThat(result, is("Freitag")); } @Test public void parseCzechWithMultipleContextInSmartMode() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern("d. MMMM uuuu", PatternType.CLDR, new Locale("cs")); PlainDate expected = PlainDate.of(2016, 1, 1); assertThat( f.parse("1. leden 2016"), is(expected)); assertThat( f.parse("1. ledna 2016"), is(expected)); } @Test(expected=ParseException.class) public void parseCzechWithMultipleContextInStrictMode1() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern("d. MMMM uuuu", PatternType.CLDR, new Locale("cs")).with(Leniency.STRICT); f.parse("1. leden 2016"); // standalone but parser expects embedded format mode (symbol M) } @Test(expected=ParseException.class) public void parseCzechWithMultipleContextInStrictMode2() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern("d. LLLL uuuu", PatternType.CLDR, new Locale("cs")).with(Leniency.STRICT); f.parse("1. ledna 2016"); // embedded format but parser expects standalone mode (symbol L) } @Test public void parseWeekdays() { CalendarText instance = CalendarText.getInstance("iso8601", Locale.GERMAN); Weekday w = instance.getWeekdays(TextWidth.WIDE, OutputContext.FORMAT) .parse("FRE", new ParsePosition(0), Weekday.class, toAttributes(true, true)); assertThat(w, is(Weekday.FRIDAY)); instance = CalendarText.getInstance("iso8601", Locale.ENGLISH); Weekday w2 = instance.getWeekdays(TextWidth.WIDE, OutputContext.FORMAT) .parse("FRI", new ParsePosition(0), Weekday.class, toAttributes(true, true)); assertThat(w2, is(Weekday.FRIDAY)); } @Test public void eras() throws ClassNotFoundException { assertThat( Chronology.lookup(PlainDate.class) .getCalendarSystem() .getEras() .isEmpty(), is(true)); TextWidth textWidth = TextWidth.WIDE; CalendarText instance = CalendarText.getInstance("iso8601", Locale.GERMAN); String result = instance.getEras(textWidth).print(HistoricEra.AD); assertThat(result, is("n. Chr.")); } @Test public void printMeridiems() { TextWidth textWidth = TextWidth.WIDE; CalendarText instance = CalendarText.getInstance("iso8601", Locale.ENGLISH); assertThat(instance.getMeridiems(textWidth, OutputContext.FORMAT).print(Meridiem.PM), is("pm")); assertThat(instance.getMeridiems(textWidth, OutputContext.STANDALONE).print(Meridiem.PM), is("PM")); } @Test public void parseMeridiems() { TextWidth textWidth = TextWidth.WIDE; CalendarText instance = CalendarText.getInstance("iso8601", Locale.ENGLISH); Meridiem result1 = instance.getMeridiems(textWidth, OutputContext.FORMAT).parse( "pm", new ParsePosition(0), Meridiem.class, Leniency.STRICT); assertThat(result1, is(Meridiem.PM)); Meridiem result2 = instance.getMeridiems(textWidth, OutputContext.STANDALONE).parse( "PM", new ParsePosition(0), Meridiem.class, Leniency.STRICT); assertThat(result2, is(Meridiem.PM)); } @Test public void textFormsDelegate() { CalendarText instance = CalendarText.getInstance("iso8601", Locale.ENGLISH); assertThat( instance.getTextForms(PlainTime.AM_PM_OF_DAY).print(Meridiem.PM), is("PM")); } @Test(expected=MissingResourceException.class) public void textFormsException() { CalendarText instance = CalendarText.getInstance("xyz", Locale.ENGLISH); instance.getTextForms(PlainTime.AM_PM_OF_DAY); } @Test public void printQuartersVietnam() { TextWidth textWidth = TextWidth.WIDE; OutputContext outputContext = OutputContext.STANDALONE; CalendarText instance = CalendarText.getInstance("iso8601", new Locale("vi")); String result = instance.getWeekdays(textWidth, outputContext) .print(Weekday.MONDAY); // test for switching from standalone to format context assertThat(result, is("Thứ Hai")); } private static boolean isCalendarTypeSupported( TextProvider p, String calendarType ) { for (String c : p.getSupportedCalendarTypes()) { if (c.equals(calendarType)) { return true; } } return false; } private static boolean isLocaleSupported( TextProvider p, Locale locale ) { for (Locale l : p.getAvailableLocales()) { String lang = locale.getLanguage(); String country = locale.getCountry(); if ( lang.equals(l.getLanguage()) && (country.isEmpty() || country.equals(l.getCountry())) ) { return true; } } return false; } private static AttributeQuery toAttributes( boolean caseInsensitive, boolean partialCompare ) { return new Attributes.Builder() .set(Attributes.PARSE_CASE_INSENSITIVE, caseInsensitive) .set(Attributes.PARSE_PARTIAL_COMPARE, partialCompare) .build(); } }