| /* |
| ******************************************************************************* |
| * Copyright (C) 2008, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.dev.test.localespi; |
| |
| import java.text.DateFormat; |
| import java.text.ParseException; |
| import java.util.Date; |
| import java.util.Locale; |
| |
| import com.ibm.icu.dev.test.TestFmwk; |
| |
| public class DateFormatTest extends TestFmwk { |
| |
| public static void main(String[] args) throws Exception { |
| new DateFormatTest().run(args); |
| } |
| |
| /* |
| * Check if getInstance returns the ICU implementation. |
| */ |
| public void TestGetInstance() { |
| for (Locale loc : DateFormat.getAvailableLocales()) { |
| if (TestUtil.isProblematicIBMLocale(loc)) { |
| logln("Skipped " + loc); |
| continue; |
| } |
| checkGetInstance(DateFormat.FULL, DateFormat.LONG, loc); |
| checkGetInstance(DateFormat.MEDIUM, -1, loc); |
| checkGetInstance(1, DateFormat.SHORT, loc); |
| } |
| } |
| |
| private void checkGetInstance(int dstyle, int tstyle, Locale loc) { |
| String method[] = new String[1]; |
| DateFormat df = getJDKInstance(dstyle, tstyle, loc, method); |
| |
| boolean isIcuImpl = (df instanceof com.ibm.icu.impl.jdkadapter.SimpleDateFormatICU); |
| |
| if (TestUtil.isICUExtendedLocale(loc)) { |
| if (!isIcuImpl) { |
| errln("FAIL: " + method[0] + " returned JDK DateFormat for locale " + loc); |
| } |
| } else { |
| if (isIcuImpl) { |
| logln("INFO: " + method[0] + " returned ICU DateFormat for locale " + loc); |
| } |
| Locale iculoc = TestUtil.toICUExtendedLocale(loc); |
| DateFormat dfIcu = getJDKInstance(dstyle, tstyle, iculoc, null); |
| if (isIcuImpl) { |
| if (!df.equals(dfIcu)) { |
| errln("FAIL: " + method[0] + " returned ICU DateFormat for locale " + loc |
| + ", but different from the one for locale " + iculoc); |
| } |
| } else { |
| if (!(dfIcu instanceof com.ibm.icu.impl.jdkadapter.SimpleDateFormatICU)) { |
| errln("FAIL: " + method[0] + " returned JDK DateFormat for locale " + iculoc); |
| } |
| } |
| } |
| } |
| |
| private DateFormat getJDKInstance(int dstyle, int tstyle, Locale loc, String[] methodName) { |
| DateFormat df; |
| String method; |
| if (dstyle < 0) { |
| df = DateFormat.getTimeInstance(tstyle, loc); |
| method = "getTimeInstance"; |
| } else if (tstyle < 0) { |
| df = DateFormat.getDateInstance(dstyle, loc); |
| method = "getDateInstance"; |
| } else { |
| df = DateFormat.getDateTimeInstance(dstyle, tstyle, loc); |
| method = "getDateTimeInstance"; |
| } |
| if (methodName != null) { |
| methodName[0] = method; |
| } |
| return df; |
| } |
| |
| private com.ibm.icu.text.DateFormat getICUInstance(int dstyle, int tstyle, Locale loc, String[] methodName) { |
| com.ibm.icu.text.DateFormat icudf; |
| String method; |
| if (dstyle < 0) { |
| icudf = com.ibm.icu.text.DateFormat.getTimeInstance(tstyle, loc); |
| method = "getTimeInstance"; |
| } else if (tstyle < 0) { |
| icudf = com.ibm.icu.text.DateFormat.getDateInstance(dstyle, loc); |
| method = "getDateInstance"; |
| } else { |
| icudf = com.ibm.icu.text.DateFormat.getDateTimeInstance(dstyle, tstyle, loc); |
| method = "getDateTimeInstance"; |
| } |
| if (methodName != null) { |
| methodName[0] = method; |
| } |
| return icudf; |
| } |
| |
| /* |
| * Testing the behavior of date format between ICU instance and its |
| * equivalent created via the Locale SPI framework. |
| */ |
| public void TestICUEquivalent() { |
| Locale[] TEST_LOCALES = { |
| new Locale("en", "US"), |
| new Locale("it", "IT"), |
| new Locale("iw", "IL"), |
| new Locale("ja", "JP", "JP"), |
| new Locale("th", "TH"), |
| new Locale("zh", "TW"), |
| }; |
| |
| long[] TEST_DATES = { |
| 1199499330543L, // 2008-01-05T02:15:30.543Z |
| 1217001308085L, // 2008-07-25T15:55:08.085Z |
| }; |
| |
| for (Locale loc : TEST_LOCALES) { |
| for (int dstyle = -1; dstyle <= 3; dstyle++) { |
| for (int tstyle = -1; tstyle <= 3; tstyle++) { |
| if (tstyle == -1 && dstyle == -1) { |
| continue; |
| } |
| Locale iculoc = TestUtil.toICUExtendedLocale(loc); |
| DateFormat df = getJDKInstance(dstyle, tstyle, iculoc, null); |
| com.ibm.icu.text.DateFormat icudf = getICUInstance(dstyle, tstyle, loc, null); |
| |
| for (long t : TEST_DATES) { |
| // Format |
| Date d = new Date(t); |
| String dstr1 = df.format(d); |
| String dstr2 = icudf.format(d); |
| |
| if (!dstr1.equals(dstr2)) { |
| errln("FAIL: Different format results for locale " + loc + " (dstyle=" + dstyle |
| + ",tstyle=" + tstyle + ") at time " + t + " - JDK:" + dstr1 |
| + " ICU:" + dstr2); |
| continue; |
| } |
| |
| // Parse |
| Date d1, d2; |
| try { |
| d1 = df.parse(dstr1); |
| } catch (ParseException e) { |
| errln("FAIL: ParseException thrown for JDK DateFormat for string " |
| + dstr1 + "(locale=" + iculoc + ",dstyle=" + dstyle + ",tstyle=" + tstyle + ")"); |
| continue; |
| } |
| try { |
| d2 = icudf.parse(dstr1); |
| } catch (ParseException e) { |
| errln("FAIL: ParseException thrown for ICU DateFormat for string " |
| + dstr1 + "(locale=" + loc + ",dstyle=" + dstyle + ",tstyle=" + tstyle + ")"); |
| continue; |
| } |
| if (!d1.equals(d2)) { |
| errln("FAIL: Different parse results for locale " + loc |
| + " for date string " + dstr1 + " (dstyle=" + dstyle |
| + ",tstyle=" + tstyle + ") at time " + t + " - JDK:" + dstr1 |
| + " ICU:" + dstr2); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| /* |
| * Check if ICU DateFormatProvider uses Thai native digit for Locale |
| * th_TH_TH. |
| */ |
| public void TestThaiDigit() { |
| Locale thTHTH = new Locale("th", "TH", "TH"); |
| String pattern = "yyyy-MM-dd"; |
| |
| DateFormat dfmt = DateFormat.getDateInstance(DateFormat.FULL, thTHTH); |
| DateFormat dfmtIcu = DateFormat.getDateInstance(DateFormat.FULL, TestUtil.toICUExtendedLocale(thTHTH)); |
| |
| ((java.text.SimpleDateFormat)dfmt).applyPattern(pattern); |
| ((java.text.SimpleDateFormat)dfmtIcu).applyPattern(pattern); |
| |
| Date d = new Date(); |
| String str1 = dfmt.format(d); |
| String str2 = dfmtIcu.format(d); |
| |
| if (!str1.equals(str2)) { |
| errln("FAIL: ICU DateFormat returned a result different from JDK for th_TH_TH"); |
| } |
| } |
| } |