/* ******************************************************************************* * Copyright (C) 2008, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.dev.test.localespi; import java.text.DateFormatSymbols; import java.util.Locale; import com.ibm.icu.dev.test.TestFmwk; public class DateFormatSymbolsTest extends TestFmwk { public static void main(String[] args) throws Exception { new DateFormatSymbolsTest().run(args); } /* * Check if getInstance returns the ICU implementation. */ public void TestGetInstance() { for (Locale loc : DateFormatSymbols.getAvailableLocales()) { if (TestUtil.isProblematicIBMLocale(loc)) { logln("Skipped " + loc); continue; } DateFormatSymbols dfs = DateFormatSymbols.getInstance(loc); boolean isIcuImpl = (dfs instanceof com.ibm.icu.impl.jdkadapter.DateFormatSymbolsICU); if (TestUtil.isICUExtendedLocale(loc)) { if (!isIcuImpl) { errln("FAIL: getInstance returned JDK DateFormatSymbols for locale " + loc); } } else { if (isIcuImpl) { logln("INFO: getInstance returned ICU DateFormatSymbols for locale " + loc); } Locale iculoc = TestUtil.toICUExtendedLocale(loc); DateFormatSymbols dfsIcu = DateFormatSymbols.getInstance(iculoc); if (isIcuImpl) { if (!dfs.equals(dfsIcu)) { errln("FAIL: getInstance returned ICU DateFormatSymbols for locale " + loc + ", but different from the one for locale " + iculoc); } } else { if (!(dfsIcu instanceof com.ibm.icu.impl.jdkadapter.DateFormatSymbolsICU)) { errln("FAIL: getInstance returned JDK DateFormatSymbols for locale " + iculoc); } } } } } /* * Testing the contents of DateFormatSymbols between ICU instance and its * equivalent created via the Locale SPI framework. */ public void TestICUEquivalent() { Locale[] TEST_LOCALES = { new Locale("en", "US"), new Locale("es", "ES"), new Locale("ja", "JP", "JP"), new Locale("th", "TH"), }; for (Locale loc : TEST_LOCALES) { Locale iculoc = TestUtil.toICUExtendedLocale(loc); DateFormatSymbols jdkDfs = DateFormatSymbols.getInstance(iculoc); com.ibm.icu.text.DateFormatSymbols icuDfs = com.ibm.icu.text.DateFormatSymbols.getInstance(loc); compareArrays(jdkDfs.getAmPmStrings(), icuDfs.getAmPmStrings(), loc, "getAmPmStrings"); compareArrays(jdkDfs.getEras(), icuDfs.getEras(), loc, "getEras"); compareArrays(jdkDfs.getMonths(), icuDfs.getMonths(), loc, "getMonths"); compareArrays(jdkDfs.getShortMonths(), icuDfs.getShortMonths(), loc, "getShortMonths"); compareArrays(jdkDfs.getShortWeekdays(), icuDfs.getShortWeekdays(), loc, "getShortWeekdays"); compareArrays(jdkDfs.getWeekdays(), icuDfs.getWeekdays(), loc, "getWeekdays"); compareArrays(jdkDfs.getZoneStrings(), icuDfs.getZoneStrings(), loc, "getZoneStrings"); } } /* * Testing setters */ public void TestSetSymbols() { // ICU's JDK DateFormatSymbols implementation for ja_JP locale DateFormatSymbols dfs = DateFormatSymbols.getInstance(new Locale("ja", "JP", "ICU")); // en_US is supported by JDK, so this is the JDK's own DateFormatSymbols Locale loc = new Locale("en", "US"); DateFormatSymbols dfsEnUS = DateFormatSymbols.getInstance(loc); // Copying over all symbols dfs.setAmPmStrings(dfsEnUS.getAmPmStrings()); dfs.setEras(dfsEnUS.getEras()); dfs.setMonths(dfsEnUS.getMonths()); dfs.setShortMonths(dfsEnUS.getShortMonths()); dfs.setShortWeekdays(dfsEnUS.getShortWeekdays()); dfs.setWeekdays(dfsEnUS.getWeekdays()); dfs.setZoneStrings(dfsEnUS.getZoneStrings()); compareArrays(dfs.getAmPmStrings(), dfsEnUS.getAmPmStrings(), loc, "getAmPmStrings"); compareArrays(dfs.getEras(), dfsEnUS.getEras(), loc, "getEras"); compareArrays(dfs.getMonths(), dfsEnUS.getMonths(), loc, "getMonths"); compareArrays(dfs.getShortMonths(), dfsEnUS.getShortMonths(), loc, "getShortMonths"); compareArrays(dfs.getShortWeekdays(), dfsEnUS.getShortWeekdays(), loc, "getShortWeekdays"); compareArrays(dfs.getWeekdays(), dfsEnUS.getWeekdays(), loc, "getWeekdays"); compareArrays(dfs.getZoneStrings(), dfsEnUS.getZoneStrings(), loc, "getZoneStrings"); } private void compareArrays(Object jarray, Object iarray, Locale loc, String method) { if (jarray instanceof String[][]) { String[][] jaa = (String[][])jarray; String[][] iaa = (String[][])iarray; if (jaa.length != iaa.length || jaa[0].length != iaa[0].length) { errln("FAIL: Different array size returned by " + method + "for locale " + loc + "(jdksize=" + jaa.length + "x" + jaa[0].length + ",icusize=" + iaa.length + "x" + iaa[0].length + ")"); } for (int i = 0; i < jaa.length; i++) { for (int j = 0; j < jaa[i].length; j++) { if (!TestUtil.equals(jaa[i][j], iaa[i][j])) { errln("FAIL: Different symbols returned by " + method + "for locale " + loc + " at index " + i + "," + j + " (jdk=" + jaa[i][j] + ",icu=" + iaa[i][j] + ")"); } } } } else { String[] ja = (String[])jarray; String[] ia = (String[])iarray; if (ja.length != ia.length) { errln("FAIL: Different array size returned by " + method + "for locale " + loc + "(jdksize=" + ja.length + ",icusize=" + ia.length + ")"); } else { for (int i = 0; i < ja.length; i++) { if (!TestUtil.equals(ja[i], ia[i])) { errln("FAIL: Different symbols returned by " + method + "for locale " + loc + " at index " + i + " (jdk=" + ja[i] + ",icu=" + ia[i] + ")"); } } } } } /* * Testing Nynorsk locales */ public void TestNynorsk() { Locale nnNO = new Locale("nn", "NO"); Locale noNONY = new Locale("no", "NO", "NY"); DateFormatSymbols dfs_nnNO = DateFormatSymbols.getInstance(nnNO); DateFormatSymbols dfs_nnNO_ICU = DateFormatSymbols.getInstance(TestUtil.toICUExtendedLocale(nnNO)); DateFormatSymbols dfs_noNONY_ICU = DateFormatSymbols.getInstance(TestUtil.toICUExtendedLocale(noNONY)); // Weekday names should be identical for these three. // If data is taken from no/nb, then this check will fail. String[] dow_nnNO = dfs_nnNO.getWeekdays(); String[] dow_nnNO_ICU = dfs_nnNO_ICU.getWeekdays(); String[] dow_noNONY_ICU = dfs_noNONY_ICU.getWeekdays(); for (int i = 1; i < dow_nnNO.length; i++) { if (!dow_nnNO[i].equals(dow_nnNO_ICU[i])) { errln("FAIL: Different weekday name - index=" + i + ", nn_NO:" + dow_nnNO[i] + ", nn_NO_ICU:" + dow_nnNO_ICU[i]); } } for (int i = 1; i < dow_nnNO.length; i++) { if (!dow_nnNO[i].equals(dow_noNONY_ICU[i])) { errln("FAIL: Different weekday name - index=" + i + ", nn_NO:" + dow_nnNO[i] + ", no_NO_NY_ICU:" + dow_nnNO_ICU[i]); } } } }