]> source.dussan.org Git - vaadin-framework.git/commitdiff
Remove invalid trailing comma from Thai date format (#8311)
authorArtur <artur@vaadin.com>
Tue, 24 Jan 2017 07:15:49 +0000 (09:15 +0200)
committerDenis <denis@vaadin.com>
Tue, 24 Jan 2017 07:15:49 +0000 (09:15 +0200)
* Remove invalid trailing comma from Thai date format

Fixes #8303

server/src/main/java/com/vaadin/server/LocaleService.java
server/src/test/java/com/vaadin/server/LocaleServiceTest.java [new file with mode: 0644]

index 6435a08cdd6f943d479510ed7a19fdde3c792453..b5fd545bc29e104dcf5ba527a300dacb1cb7747e 100644 (file)
@@ -158,57 +158,31 @@ public class LocaleService implements Serializable {
         /*
          * Date formatting (MM/DD/YYYY etc.)
          */
-
-        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT,
-                DateFormat.SHORT, locale);
+        DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT,
+                locale);
+        DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT,
+                locale);
         if (!(dateFormat instanceof SimpleDateFormat)) {
             getLogger().warning("Unable to get default date pattern for locale "
                     + locale.toString());
             dateFormat = new SimpleDateFormat();
         }
-        final String df = ((SimpleDateFormat) dateFormat).toPattern();
-
-        int timeStart = df.indexOf("H");
-        if (timeStart < 0) {
-            timeStart = df.indexOf("h");
-        }
-        final int ampm_first = df.indexOf("a");
-        // E.g. in Korean locale AM/PM is before h:mm
-        // TODO should take that into consideration on client-side as well,
-        // now always h:mm a
-        if (ampm_first > 0 && ampm_first < timeStart) {
-            timeStart = ampm_first;
-        }
-        // Hebrew locale has time before the date
-        final boolean timeFirst = timeStart == 0;
-        String dateformat;
-        if (timeFirst) {
-            int dateStart = df.indexOf(' ');
-            if (ampm_first > dateStart) {
-                dateStart = df.indexOf(' ', ampm_first);
-            }
-            dateformat = df.substring(dateStart + 1);
-        } else {
-            dateformat = df.substring(0, timeStart - 1);
+        if (!(timeFormat instanceof SimpleDateFormat)) {
+            getLogger().warning("Unable to get default time pattern for locale "
+                    + locale.toString());
+            timeFormat = new SimpleDateFormat();
         }
+        final String datePattern = ((SimpleDateFormat) dateFormat).toPattern();
+        final String timePattern = ((SimpleDateFormat) timeFormat).toPattern();
 
-        localeData.dateFormat = dateformat.trim();
+        localeData.dateFormat = datePattern.trim();
 
-        /*
-         * Time formatting (24 or 12 hour clock and AM/PM suffixes)
-         */
-        final String timeformat = df.substring(timeStart, df.length());
-        /*
-         * Doesn't return second or milliseconds.
-         *
-         * We use timeformat to determine 12/24-hour clock
-         */
-        final boolean twelve_hour_clock = timeformat.indexOf("a") > -1;
+        final boolean twelve_hour_clock = timePattern.indexOf("a") > -1;
         // TODO there are other possibilities as well, like 'h' in french
         // (ignore them, too complicated)
-        final String hour_min_delimiter = timeformat.indexOf(".") > -1 ? "."
+        final String hour_min_delimiter = timePattern.indexOf(".") > -1 ? "."
                 : ":";
-        // outWriter.print("\"tf\":\"" + timeformat + "\",");
+
         localeData.twelveHourClock = twelve_hour_clock;
         localeData.hourMinuteDelimiter = hour_min_delimiter;
         if (twelve_hour_clock) {
diff --git a/server/src/test/java/com/vaadin/server/LocaleServiceTest.java b/server/src/test/java/com/vaadin/server/LocaleServiceTest.java
new file mode 100644 (file)
index 0000000..adb4d55
--- /dev/null
@@ -0,0 +1,1026 @@
+package com.vaadin.server;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import com.vaadin.shared.ui.ui.UIState.LocaleData;
+import com.vaadin.shared.ui.ui.UIState.LocaleServiceState;
+import com.vaadin.ui.UI;
+
+public class LocaleServiceTest {
+
+    private static Set<String> JAVA8_SUPPORTED_LOCALES = new HashSet<String>();
+    static {
+        // From
+        // http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html
+        JAVA8_SUPPORTED_LOCALES.add("sq-AL");
+        JAVA8_SUPPORTED_LOCALES.add("ar-DZ");
+        JAVA8_SUPPORTED_LOCALES.add("ar-BH");
+        JAVA8_SUPPORTED_LOCALES.add("ar-EG");
+        JAVA8_SUPPORTED_LOCALES.add("ar-IQ");
+        JAVA8_SUPPORTED_LOCALES.add("ar-JO");
+        JAVA8_SUPPORTED_LOCALES.add("ar-KW");
+        JAVA8_SUPPORTED_LOCALES.add("ar-LB");
+        JAVA8_SUPPORTED_LOCALES.add("ar-LY");
+        JAVA8_SUPPORTED_LOCALES.add("ar-MA");
+        JAVA8_SUPPORTED_LOCALES.add("ar-OM");
+        JAVA8_SUPPORTED_LOCALES.add("ar-QA");
+        JAVA8_SUPPORTED_LOCALES.add("ar-SA");
+        JAVA8_SUPPORTED_LOCALES.add("ar-SD");
+        JAVA8_SUPPORTED_LOCALES.add("ar-SY");
+        JAVA8_SUPPORTED_LOCALES.add("ar-TN");
+        JAVA8_SUPPORTED_LOCALES.add("ar-AE");
+        JAVA8_SUPPORTED_LOCALES.add("ar-YE");
+        JAVA8_SUPPORTED_LOCALES.add("be-BY");
+        JAVA8_SUPPORTED_LOCALES.add("bg-BG");
+        JAVA8_SUPPORTED_LOCALES.add("ca-ES");
+        JAVA8_SUPPORTED_LOCALES.add("zh-CN");
+        JAVA8_SUPPORTED_LOCALES.add("zh-SG");
+        JAVA8_SUPPORTED_LOCALES.add("zh-HK");
+        JAVA8_SUPPORTED_LOCALES.add("zh-TW");
+        JAVA8_SUPPORTED_LOCALES.add("hr-HR");
+        JAVA8_SUPPORTED_LOCALES.add("cs-CZ");
+        JAVA8_SUPPORTED_LOCALES.add("da-DK");
+        JAVA8_SUPPORTED_LOCALES.add("nl-BE");
+        JAVA8_SUPPORTED_LOCALES.add("nl-NL");
+        JAVA8_SUPPORTED_LOCALES.add("en-AU");
+        JAVA8_SUPPORTED_LOCALES.add("en-CA");
+        JAVA8_SUPPORTED_LOCALES.add("en-IN");
+        JAVA8_SUPPORTED_LOCALES.add("en-IE");
+        JAVA8_SUPPORTED_LOCALES.add("en-MT");
+        JAVA8_SUPPORTED_LOCALES.add("en-NZ");
+        JAVA8_SUPPORTED_LOCALES.add("en-PH");
+        JAVA8_SUPPORTED_LOCALES.add("en-SG");
+        JAVA8_SUPPORTED_LOCALES.add("en-ZA");
+        JAVA8_SUPPORTED_LOCALES.add("en-GB");
+        JAVA8_SUPPORTED_LOCALES.add("en-US");
+        JAVA8_SUPPORTED_LOCALES.add("et-EE");
+        JAVA8_SUPPORTED_LOCALES.add("fi-FI");
+        JAVA8_SUPPORTED_LOCALES.add("fr-BE");
+        JAVA8_SUPPORTED_LOCALES.add("fr-CA");
+        JAVA8_SUPPORTED_LOCALES.add("fr-FR");
+        JAVA8_SUPPORTED_LOCALES.add("fr-LU");
+        JAVA8_SUPPORTED_LOCALES.add("fr-CH");
+        JAVA8_SUPPORTED_LOCALES.add("de-AT");
+        JAVA8_SUPPORTED_LOCALES.add("de-DE");
+        JAVA8_SUPPORTED_LOCALES.add("de-LU");
+        JAVA8_SUPPORTED_LOCALES.add("de-CH");
+        JAVA8_SUPPORTED_LOCALES.add("el-CY");
+        JAVA8_SUPPORTED_LOCALES.add("el-GR");
+        JAVA8_SUPPORTED_LOCALES.add("iw-IL");
+        JAVA8_SUPPORTED_LOCALES.add("hi-IN");
+        JAVA8_SUPPORTED_LOCALES.add("hu-HU");
+        JAVA8_SUPPORTED_LOCALES.add("is-IS");
+        JAVA8_SUPPORTED_LOCALES.add("in-ID");
+        JAVA8_SUPPORTED_LOCALES.add("ga-IE");
+        JAVA8_SUPPORTED_LOCALES.add("it-IT");
+        JAVA8_SUPPORTED_LOCALES.add("it-CH");
+        JAVA8_SUPPORTED_LOCALES.add("ja-JP");
+        JAVA8_SUPPORTED_LOCALES.add("ja-JP-u-ca-japanese");
+        JAVA8_SUPPORTED_LOCALES.add("ja-JP-x-lvariant-JP");
+        JAVA8_SUPPORTED_LOCALES.add("ko-KR");
+        JAVA8_SUPPORTED_LOCALES.add("lv-LV");
+        JAVA8_SUPPORTED_LOCALES.add("lt-LT");
+        JAVA8_SUPPORTED_LOCALES.add("mk-MK");
+        JAVA8_SUPPORTED_LOCALES.add("ms-MY");
+        JAVA8_SUPPORTED_LOCALES.add("mt-MT");
+        JAVA8_SUPPORTED_LOCALES.add("no-NO");
+        JAVA8_SUPPORTED_LOCALES.add("nb-NO");
+        JAVA8_SUPPORTED_LOCALES.add("nn-NO");
+        JAVA8_SUPPORTED_LOCALES.add("no-NO-x-lvariant-NY");
+        JAVA8_SUPPORTED_LOCALES.add("pl-PL");
+        JAVA8_SUPPORTED_LOCALES.add("pt-BR");
+        JAVA8_SUPPORTED_LOCALES.add("pt-PT");
+        JAVA8_SUPPORTED_LOCALES.add("ro-RO");
+        JAVA8_SUPPORTED_LOCALES.add("ru-RU");
+        JAVA8_SUPPORTED_LOCALES.add("sr-BA");
+        JAVA8_SUPPORTED_LOCALES.add("sr-ME");
+        JAVA8_SUPPORTED_LOCALES.add("sr-RS");
+        JAVA8_SUPPORTED_LOCALES.add("sr-Latn-BA");
+        JAVA8_SUPPORTED_LOCALES.add("sr-Latn-ME");
+        JAVA8_SUPPORTED_LOCALES.add("sr-Latn-RS");
+        JAVA8_SUPPORTED_LOCALES.add("sk-SK");
+        JAVA8_SUPPORTED_LOCALES.add("sl-SI");
+        JAVA8_SUPPORTED_LOCALES.add("es-AR");
+        JAVA8_SUPPORTED_LOCALES.add("es-BO");
+        JAVA8_SUPPORTED_LOCALES.add("es-CL");
+        JAVA8_SUPPORTED_LOCALES.add("es-CO");
+        JAVA8_SUPPORTED_LOCALES.add("es-CR");
+        JAVA8_SUPPORTED_LOCALES.add("es-DO");
+        JAVA8_SUPPORTED_LOCALES.add("es-EC");
+        JAVA8_SUPPORTED_LOCALES.add("es-SV");
+        JAVA8_SUPPORTED_LOCALES.add("es-GT");
+        JAVA8_SUPPORTED_LOCALES.add("es-HN");
+        JAVA8_SUPPORTED_LOCALES.add("es-MX");
+        JAVA8_SUPPORTED_LOCALES.add("es-NI");
+        JAVA8_SUPPORTED_LOCALES.add("es-PA");
+        JAVA8_SUPPORTED_LOCALES.add("es-PY");
+        JAVA8_SUPPORTED_LOCALES.add("es-PE");
+        JAVA8_SUPPORTED_LOCALES.add("es-PR");
+        JAVA8_SUPPORTED_LOCALES.add("es-ES");
+        JAVA8_SUPPORTED_LOCALES.add("es-US");
+        JAVA8_SUPPORTED_LOCALES.add("es-UY");
+        JAVA8_SUPPORTED_LOCALES.add("es-VE");
+        JAVA8_SUPPORTED_LOCALES.add("sv-SE");
+        JAVA8_SUPPORTED_LOCALES.add("th-TH");
+        JAVA8_SUPPORTED_LOCALES.add("th-TH-u-ca-buddhist");
+        JAVA8_SUPPORTED_LOCALES.add("th-TH-u-ca-buddhist-nu-thai");
+        JAVA8_SUPPORTED_LOCALES.add("th-TH-x-lvariant-TH");
+        JAVA8_SUPPORTED_LOCALES.add("tr-TR");
+        JAVA8_SUPPORTED_LOCALES.add("uk-UA");
+        JAVA8_SUPPORTED_LOCALES.add("vi-VN");
+    }
+    private static Map<Locale, LocaleData> expectedLocaleData = new HashMap<Locale, LocaleData>();
+
+    static {
+
+        LocaleData en_IE = new LocaleData();
+        en_IE.dateFormat = "dd/MM/yy";
+        en_IE.twelveHourClock = false;
+        en_IE.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("en", "IE"), en_IE);
+
+        LocaleData ar_KW = new LocaleData();
+        ar_KW.dateFormat = "dd/MM/yy";
+        ar_KW.twelveHourClock = true;
+        ar_KW.hourMinuteDelimiter = ":";
+        ar_KW.am = "ص";
+        ar_KW.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "KW"), ar_KW);
+
+        LocaleData ms_MY = new LocaleData();
+        ms_MY.dateFormat = "dd/MM/yyyy";
+        ms_MY.twelveHourClock = false;
+        ms_MY.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("ms", "MY"), ms_MY);
+
+        LocaleData en_IN = new LocaleData();
+        en_IN.dateFormat = "d/M/yy";
+        en_IN.twelveHourClock = true;
+        en_IN.hourMinuteDelimiter = ":";
+        en_IN.am = "AM";
+        en_IN.pm = "PM";
+        expectedLocaleData.put(new Locale("en", "IN"), en_IN);
+
+        LocaleData es_BO = new LocaleData();
+        es_BO.dateFormat = "dd-MM-yy";
+        es_BO.twelveHourClock = true;
+        es_BO.hourMinuteDelimiter = ":";
+        es_BO.am = "AM";
+        es_BO.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "BO"), es_BO);
+
+        LocaleData ar_SY = new LocaleData();
+        ar_SY.dateFormat = "dd/MM/yy";
+        ar_SY.twelveHourClock = true;
+        ar_SY.hourMinuteDelimiter = ":";
+        ar_SY.am = "ص";
+        ar_SY.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "SY"), ar_SY);
+
+        LocaleData en_ZA = new LocaleData();
+        en_ZA.dateFormat = "yyyy/MM/dd";
+        en_ZA.twelveHourClock = true;
+        en_ZA.hourMinuteDelimiter = ":";
+        en_ZA.am = "AM";
+        en_ZA.pm = "PM";
+        expectedLocaleData.put(new Locale("en", "ZA"), en_ZA);
+
+        LocaleData no_NO = new LocaleData();
+        no_NO.dateFormat = "dd.MM.yy";
+        no_NO.twelveHourClock = false;
+        no_NO.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("no", "NO"), no_NO);
+
+        LocaleData sr_LATN_BA = new LocaleData();
+        sr_LATN_BA.dateFormat = "d.M.yy.";
+        sr_LATN_BA.twelveHourClock = false;
+        sr_LATN_BA.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("sr", "LATN", "BA"), sr_LATN_BA);
+
+        LocaleData el_GR = new LocaleData();
+        el_GR.dateFormat = "d/M/yyyy";
+        el_GR.twelveHourClock = true;
+        el_GR.hourMinuteDelimiter = ":";
+        el_GR.am = "πμ";
+        el_GR.pm = "μμ";
+        expectedLocaleData.put(new Locale("el", "GR"), el_GR);
+
+        LocaleData sr_LATN_RS = new LocaleData();
+        sr_LATN_RS.dateFormat = "d.M.yy.";
+        sr_LATN_RS.twelveHourClock = false;
+        sr_LATN_RS.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("sr", "LATN", "RS"), sr_LATN_RS);
+
+        LocaleData nl_NL = new LocaleData();
+        nl_NL.dateFormat = "d-M-yy";
+        nl_NL.twelveHourClock = false;
+        nl_NL.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("nl", "NL"), nl_NL);
+
+        LocaleData ar_LB = new LocaleData();
+        ar_LB.dateFormat = "dd/MM/yy";
+        ar_LB.twelveHourClock = true;
+        ar_LB.hourMinuteDelimiter = ":";
+        ar_LB.am = "ص";
+        ar_LB.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "LB"), ar_LB);
+
+        LocaleData en_AU = new LocaleData();
+        en_AU.dateFormat = "d/MM/yy";
+        en_AU.twelveHourClock = true;
+        en_AU.hourMinuteDelimiter = ":";
+        en_AU.am = "AM";
+        en_AU.pm = "PM";
+        expectedLocaleData.put(new Locale("en", "AU"), en_AU);
+
+        LocaleData mk_MK = new LocaleData();
+        mk_MK.dateFormat = "d.M.yy";
+        mk_MK.twelveHourClock = false;
+        mk_MK.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("mk", "MK"), mk_MK);
+
+        LocaleData ar_TN = new LocaleData();
+        ar_TN.dateFormat = "dd/MM/yy";
+        ar_TN.twelveHourClock = true;
+        ar_TN.hourMinuteDelimiter = ":";
+        ar_TN.am = "ص";
+        ar_TN.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "TN"), ar_TN);
+
+        LocaleData ar_LY = new LocaleData();
+        ar_LY.dateFormat = "dd/MM/yy";
+        ar_LY.twelveHourClock = true;
+        ar_LY.hourMinuteDelimiter = ":";
+        ar_LY.am = "ص";
+        ar_LY.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "LY"), ar_LY);
+
+        LocaleData hu_HU = new LocaleData();
+        hu_HU.dateFormat = "yyyy.MM.dd.";
+        hu_HU.twelveHourClock = false;
+        hu_HU.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("hu", "HU"), hu_HU);
+
+        LocaleData es_SV = new LocaleData();
+        es_SV.dateFormat = "MM-dd-yy";
+        es_SV.twelveHourClock = true;
+        es_SV.hourMinuteDelimiter = ":";
+        es_SV.am = "AM";
+        es_SV.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "SV"), es_SV);
+
+        LocaleData es_CR = new LocaleData();
+        es_CR.dateFormat = "dd/MM/yy";
+        es_CR.twelveHourClock = true;
+        es_CR.hourMinuteDelimiter = ":";
+        es_CR.am = "AM";
+        es_CR.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "CR"), es_CR);
+
+        LocaleData es_CL = new LocaleData();
+        es_CL.dateFormat = "dd-MM-yy";
+        es_CL.twelveHourClock = false;
+        es_CL.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("es", "CL"), es_CL);
+
+        LocaleData fr_CA = new LocaleData();
+        fr_CA.dateFormat = "yy-MM-dd";
+        fr_CA.twelveHourClock = false;
+        fr_CA.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("fr", "CA"), fr_CA);
+
+        LocaleData es_CO = new LocaleData();
+        es_CO.dateFormat = "d/MM/yy";
+        es_CO.twelveHourClock = true;
+        es_CO.hourMinuteDelimiter = ":";
+        es_CO.am = "AM";
+        es_CO.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "CO"), es_CO);
+
+        LocaleData pl_PL = new LocaleData();
+        pl_PL.dateFormat = "dd.MM.yy";
+        pl_PL.twelveHourClock = false;
+        pl_PL.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("pl", "PL"), pl_PL);
+
+        LocaleData pt_PT = new LocaleData();
+        pt_PT.dateFormat = "dd-MM-yyyy";
+        pt_PT.twelveHourClock = false;
+        pt_PT.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("pt", "PT"), pt_PT);
+
+        LocaleData ar_EG = new LocaleData();
+        ar_EG.dateFormat = "dd/MM/yy";
+        ar_EG.twelveHourClock = true;
+        ar_EG.hourMinuteDelimiter = ":";
+        ar_EG.am = "ص";
+        ar_EG.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "EG"), ar_EG);
+
+        LocaleData fr_BE = new LocaleData();
+        fr_BE.dateFormat = "d/MM/yy";
+        fr_BE.twelveHourClock = false;
+        fr_BE.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("fr", "BE"), fr_BE);
+
+        LocaleData ga_IE = new LocaleData();
+        ga_IE.dateFormat = "dd/MM/yyyy";
+        ga_IE.twelveHourClock = false;
+        ga_IE.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("ga", "IE"), ga_IE);
+
+        LocaleData ar_DZ = new LocaleData();
+        ar_DZ.dateFormat = "dd/MM/yy";
+        ar_DZ.twelveHourClock = true;
+        ar_DZ.hourMinuteDelimiter = ":";
+        ar_DZ.am = "ص";
+        ar_DZ.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "DZ"), ar_DZ);
+
+        LocaleData en_SG = new LocaleData();
+        en_SG.dateFormat = "d/M/yy";
+        en_SG.twelveHourClock = true;
+        en_SG.hourMinuteDelimiter = ":";
+        en_SG.am = "AM";
+        en_SG.pm = "PM";
+        expectedLocaleData.put(new Locale("en", "SG"), en_SG);
+
+        LocaleData in_ID = new LocaleData();
+        in_ID.dateFormat = "dd/MM/yy";
+        in_ID.twelveHourClock = false;
+        in_ID.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("in", "ID"), in_ID);
+
+        LocaleData ar_MA = new LocaleData();
+        ar_MA.dateFormat = "dd/MM/yy";
+        ar_MA.twelveHourClock = true;
+        ar_MA.hourMinuteDelimiter = ":";
+        ar_MA.am = "ص";
+        ar_MA.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "MA"), ar_MA);
+
+        LocaleData th_TH_u_ca_buddhist_nu_thai = new LocaleData();
+        th_TH_u_ca_buddhist_nu_thai.dateFormat = "d/M/yyyy";
+        th_TH_u_ca_buddhist_nu_thai.twelveHourClock = false;
+        th_TH_u_ca_buddhist_nu_thai.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("th", "TH", "u-ca-buddhist-nu-thai"),
+                th_TH_u_ca_buddhist_nu_thai);
+
+        LocaleData nb_NO = new LocaleData();
+        nb_NO.dateFormat = "dd.MM.yy";
+        nb_NO.twelveHourClock = false;
+        nb_NO.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("nb", "NO"), nb_NO);
+
+        LocaleData es_HN = new LocaleData();
+        es_HN.dateFormat = "MM-dd-yy";
+        es_HN.twelveHourClock = true;
+        es_HN.hourMinuteDelimiter = ":";
+        es_HN.am = "AM";
+        es_HN.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "HN"), es_HN);
+
+        LocaleData hr_HR = new LocaleData();
+        hr_HR.dateFormat = "dd.MM.yy.";
+        hr_HR.twelveHourClock = false;
+        hr_HR.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("hr", "HR"), hr_HR);
+
+        LocaleData es_PR = new LocaleData();
+        es_PR.dateFormat = "MM-dd-yy";
+        es_PR.twelveHourClock = true;
+        es_PR.hourMinuteDelimiter = ":";
+        es_PR.am = "AM";
+        es_PR.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "PR"), es_PR);
+
+        LocaleData es_PY = new LocaleData();
+        es_PY.dateFormat = "dd/MM/yy";
+        es_PY.twelveHourClock = true;
+        es_PY.hourMinuteDelimiter = ":";
+        es_PY.am = "AM";
+        es_PY.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "PY"), es_PY);
+
+        LocaleData sr_ME = new LocaleData();
+        sr_ME.dateFormat = "d.M.yy.";
+        sr_ME.twelveHourClock = false;
+        sr_ME.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("sr", "ME"), sr_ME);
+
+        LocaleData de_AT = new LocaleData();
+        de_AT.dateFormat = "dd.MM.yy";
+        de_AT.twelveHourClock = false;
+        de_AT.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("de", "AT"), de_AT);
+
+        LocaleData is_IS = new LocaleData();
+        is_IS.dateFormat = "d.M.yyyy";
+        is_IS.twelveHourClock = false;
+        is_IS.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("is", "IS"), is_IS);
+
+        LocaleData bg_BG = new LocaleData();
+        bg_BG.dateFormat = "dd.MM.yy";
+        bg_BG.twelveHourClock = false;
+        bg_BG.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("bg", "BG"), bg_BG);
+
+        LocaleData cs_CZ = new LocaleData();
+        cs_CZ.dateFormat = "d.M.yy";
+        cs_CZ.twelveHourClock = false;
+        cs_CZ.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("cs", "CZ"), cs_CZ);
+
+        LocaleData en_PH = new LocaleData();
+        en_PH.dateFormat = "M/d/yy";
+        en_PH.twelveHourClock = true;
+        en_PH.hourMinuteDelimiter = ":";
+        en_PH.am = "AM";
+        en_PH.pm = "PM";
+        expectedLocaleData.put(new Locale("en", "PH"), en_PH);
+
+        LocaleData zh_TW = new LocaleData();
+        zh_TW.dateFormat = "yyyy/M/d";
+        zh_TW.twelveHourClock = true;
+        zh_TW.hourMinuteDelimiter = ":";
+        zh_TW.am = "上午";
+        zh_TW.pm = "下午";
+        expectedLocaleData.put(new Locale("zh", "TW"), zh_TW);
+
+        LocaleData ko_KR = new LocaleData();
+        ko_KR.dateFormat = "yy. M. d";
+        ko_KR.twelveHourClock = true;
+        ko_KR.hourMinuteDelimiter = ":";
+        ko_KR.am = "오전";
+        ko_KR.pm = "오후";
+        expectedLocaleData.put(new Locale("ko", "KR"), ko_KR);
+
+        LocaleData sk_SK = new LocaleData();
+        sk_SK.dateFormat = "d.M.yyyy";
+        sk_SK.twelveHourClock = false;
+        sk_SK.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("sk", "SK"), sk_SK);
+
+        LocaleData sr_LATN_ME = new LocaleData();
+        sr_LATN_ME.dateFormat = "d.M.yy.";
+        sr_LATN_ME.twelveHourClock = false;
+        sr_LATN_ME.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("sr", "LATN", "ME"), sr_LATN_ME);
+
+        LocaleData ar_OM = new LocaleData();
+        ar_OM.dateFormat = "dd/MM/yy";
+        ar_OM.twelveHourClock = true;
+        ar_OM.hourMinuteDelimiter = ":";
+        ar_OM.am = "ص";
+        ar_OM.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "OM"), ar_OM);
+
+        LocaleData ru_RU = new LocaleData();
+        ru_RU.dateFormat = "dd.MM.yy";
+        ru_RU.twelveHourClock = false;
+        ru_RU.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("ru", "RU"), ru_RU);
+
+        LocaleData sq_AL = new LocaleData();
+        sq_AL.dateFormat = "yy-MM-dd";
+        sq_AL.twelveHourClock = true;
+        sq_AL.hourMinuteDelimiter = ".";
+        sq_AL.am = "PD";
+        sq_AL.pm = "MD";
+        expectedLocaleData.put(new Locale("sq", "AL"), sq_AL);
+
+        LocaleData es_AR = new LocaleData();
+        es_AR.dateFormat = "dd/MM/yy";
+        es_AR.twelveHourClock = false;
+        es_AR.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("es", "AR"), es_AR);
+
+        LocaleData sv_SE = new LocaleData();
+        sv_SE.dateFormat = "yyyy-MM-dd";
+        sv_SE.twelveHourClock = false;
+        sv_SE.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("sv", "SE"), sv_SE);
+
+        LocaleData ja_JP_x_lvariant_JP = new LocaleData();
+        ja_JP_x_lvariant_JP.dateFormat = "yy/MM/dd";
+        ja_JP_x_lvariant_JP.twelveHourClock = false;
+        ja_JP_x_lvariant_JP.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("ja", "JP", "x-lvariant-JP"),
+                ja_JP_x_lvariant_JP);
+
+        LocaleData da_DK = new LocaleData();
+        da_DK.dateFormat = "dd-MM-yy";
+        da_DK.twelveHourClock = false;
+        da_DK.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("da", "DK"), da_DK);
+
+        LocaleData uk_UA = new LocaleData();
+        uk_UA.dateFormat = "dd.MM.yy";
+        uk_UA.twelveHourClock = false;
+        uk_UA.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("uk", "UA"), uk_UA);
+
+        LocaleData th_TH_u_ca_buddhist = new LocaleData();
+        th_TH_u_ca_buddhist.dateFormat = "d/M/yyyy";
+        th_TH_u_ca_buddhist.twelveHourClock = false;
+        th_TH_u_ca_buddhist.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("th", "TH", "u-ca-buddhist"),
+                th_TH_u_ca_buddhist);
+
+        LocaleData en_US = new LocaleData();
+        en_US.dateFormat = "M/d/yy";
+        en_US.twelveHourClock = true;
+        en_US.hourMinuteDelimiter = ":";
+        en_US.am = "AM";
+        en_US.pm = "PM";
+        expectedLocaleData.put(new Locale("en", "US"), en_US);
+
+        LocaleData lv_LV = new LocaleData();
+        lv_LV.dateFormat = "yy.d.M";
+        lv_LV.twelveHourClock = false;
+        lv_LV.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("lv", "LV"), lv_LV);
+
+        LocaleData ja_JP_u_ca_japanese = new LocaleData();
+        ja_JP_u_ca_japanese.dateFormat = "yy/MM/dd";
+        ja_JP_u_ca_japanese.twelveHourClock = false;
+        ja_JP_u_ca_japanese.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("ja", "JP", "u-ca-japanese"),
+                ja_JP_u_ca_japanese);
+
+        LocaleData en_MT = new LocaleData();
+        en_MT.dateFormat = "dd/MM/yyyy";
+        en_MT.twelveHourClock = false;
+        en_MT.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("en", "MT"), en_MT);
+
+        LocaleData zh_CN = new LocaleData();
+        zh_CN.dateFormat = "yy-M-d";
+        zh_CN.twelveHourClock = true;
+        zh_CN.hourMinuteDelimiter = ":";
+        zh_CN.am = "上午";
+        zh_CN.pm = "下午";
+        expectedLocaleData.put(new Locale("zh", "CN"), zh_CN);
+
+        LocaleData nl_BE = new LocaleData();
+        nl_BE.dateFormat = "d/MM/yy";
+        nl_BE.twelveHourClock = false;
+        nl_BE.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("nl", "BE"), nl_BE);
+
+        LocaleData hi_IN = new LocaleData();
+        hi_IN.dateFormat = "d/M/yy";
+        hi_IN.twelveHourClock = true;
+        hi_IN.hourMinuteDelimiter = ":";
+        hi_IN.am = "पूर्वाह्न";
+        hi_IN.pm = "अपराह्न";
+        expectedLocaleData.put(new Locale("hi", "IN"), hi_IN);
+
+        LocaleData el_CY = new LocaleData();
+        el_CY.dateFormat = "dd/MM/yyyy";
+        el_CY.twelveHourClock = true;
+        el_CY.hourMinuteDelimiter = ":";
+        el_CY.am = "ΠΜ";
+        el_CY.pm = "ΜΜ";
+        expectedLocaleData.put(new Locale("el", "CY"), el_CY);
+
+        LocaleData de_CH = new LocaleData();
+        de_CH.dateFormat = "dd.MM.yy";
+        de_CH.twelveHourClock = false;
+        de_CH.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("de", "CH"), de_CH);
+
+        LocaleData ja_JP = new LocaleData();
+        ja_JP.dateFormat = "yy/MM/dd";
+        ja_JP.twelveHourClock = false;
+        ja_JP.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("ja", "JP"), ja_JP);
+
+        LocaleData ar_YE = new LocaleData();
+        ar_YE.dateFormat = "dd/MM/yy";
+        ar_YE.twelveHourClock = true;
+        ar_YE.hourMinuteDelimiter = ":";
+        ar_YE.am = "ص";
+        ar_YE.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "YE"), ar_YE);
+
+        LocaleData ar_QA = new LocaleData();
+        ar_QA.dateFormat = "dd/MM/yy";
+        ar_QA.twelveHourClock = true;
+        ar_QA.hourMinuteDelimiter = ":";
+        ar_QA.am = "ص";
+        ar_QA.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "QA"), ar_QA);
+
+        LocaleData es_GT = new LocaleData();
+        es_GT.dateFormat = "d/MM/yy";
+        es_GT.twelveHourClock = true;
+        es_GT.hourMinuteDelimiter = ":";
+        es_GT.am = "AM";
+        es_GT.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "GT"), es_GT);
+
+        LocaleData nn_NO = new LocaleData();
+        nn_NO.dateFormat = "dd.MM.yy";
+        nn_NO.twelveHourClock = false;
+        nn_NO.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("nn", "NO"), nn_NO);
+
+        LocaleData es_PE = new LocaleData();
+        es_PE.dateFormat = "dd/MM/yy";
+        es_PE.twelveHourClock = true;
+        es_PE.hourMinuteDelimiter = ":";
+        es_PE.am = "AM";
+        es_PE.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "PE"), es_PE);
+
+        LocaleData en_NZ = new LocaleData();
+        en_NZ.dateFormat = "d/MM/yy";
+        en_NZ.twelveHourClock = true;
+        en_NZ.hourMinuteDelimiter = ":";
+        en_NZ.am = "AM";
+        en_NZ.pm = "PM";
+        expectedLocaleData.put(new Locale("en", "NZ"), en_NZ);
+
+        LocaleData be_BY = new LocaleData();
+        be_BY.dateFormat = "d.M.yy";
+        be_BY.twelveHourClock = false;
+        be_BY.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("be", "BY"), be_BY);
+
+        LocaleData zh_SG = new LocaleData();
+        zh_SG.dateFormat = "dd/MM/yy";
+        zh_SG.twelveHourClock = true;
+        zh_SG.hourMinuteDelimiter = ":";
+        zh_SG.am = "上午";
+        zh_SG.pm = "下午";
+        expectedLocaleData.put(new Locale("zh", "SG"), zh_SG);
+
+        LocaleData ro_RO = new LocaleData();
+        ro_RO.dateFormat = "dd.MM.yyyy";
+        ro_RO.twelveHourClock = false;
+        ro_RO.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("ro", "RO"), ro_RO);
+
+        LocaleData es_PA = new LocaleData();
+        es_PA.dateFormat = "MM/dd/yy";
+        es_PA.twelveHourClock = true;
+        es_PA.hourMinuteDelimiter = ":";
+        es_PA.am = "AM";
+        es_PA.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "PA"), es_PA);
+
+        LocaleData mt_MT = new LocaleData();
+        mt_MT.dateFormat = "dd/MM/yyyy";
+        mt_MT.twelveHourClock = false;
+        mt_MT.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("mt", "MT"), mt_MT);
+
+        LocaleData et_EE = new LocaleData();
+        et_EE.dateFormat = "d.MM.yy";
+        et_EE.twelveHourClock = false;
+        et_EE.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("et", "EE"), et_EE);
+
+        LocaleData it_CH = new LocaleData();
+        it_CH.dateFormat = "dd.MM.yy";
+        it_CH.twelveHourClock = false;
+        it_CH.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("it", "CH"), it_CH);
+
+        LocaleData th_TH_x_lvariant_TH = new LocaleData();
+        th_TH_x_lvariant_TH.dateFormat = "d/M/yyyy";
+        th_TH_x_lvariant_TH.twelveHourClock = false;
+        th_TH_x_lvariant_TH.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("th", "TH", "x-lvariant-TH"),
+                th_TH_x_lvariant_TH);
+
+        LocaleData tr_TR = new LocaleData();
+        tr_TR.dateFormat = "dd.MM.yyyy";
+        tr_TR.twelveHourClock = false;
+        tr_TR.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("tr", "TR"), tr_TR);
+
+        LocaleData fr_FR = new LocaleData();
+        fr_FR.dateFormat = "dd/MM/yy";
+        fr_FR.twelveHourClock = false;
+        fr_FR.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("fr", "FR"), fr_FR);
+
+        LocaleData vi_VN = new LocaleData();
+        vi_VN.dateFormat = "dd/MM/yyyy";
+        vi_VN.twelveHourClock = false;
+        vi_VN.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("vi", "VN"), vi_VN);
+
+        LocaleData en_GB = new LocaleData();
+        en_GB.dateFormat = "dd/MM/yy";
+        en_GB.twelveHourClock = false;
+        en_GB.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("en", "GB"), en_GB);
+
+        LocaleData fi_FI = new LocaleData();
+        fi_FI.dateFormat = "d.M.yyyy";
+        fi_FI.twelveHourClock = false;
+        fi_FI.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("fi", "FI"), fi_FI);
+
+        LocaleData en_CA = new LocaleData();
+        en_CA.dateFormat = "dd/MM/yy";
+        en_CA.twelveHourClock = true;
+        en_CA.hourMinuteDelimiter = ":";
+        en_CA.am = "AM";
+        en_CA.pm = "PM";
+        expectedLocaleData.put(new Locale("en", "CA"), en_CA);
+
+        LocaleData lt_LT = new LocaleData();
+        lt_LT.dateFormat = "yy.M.d";
+        lt_LT.twelveHourClock = false;
+        lt_LT.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("lt", "LT"), lt_LT);
+
+        LocaleData ar_AE = new LocaleData();
+        ar_AE.dateFormat = "dd/MM/yy";
+        ar_AE.twelveHourClock = true;
+        ar_AE.hourMinuteDelimiter = ":";
+        ar_AE.am = "ص";
+        ar_AE.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "AE"), ar_AE);
+
+        LocaleData sl_SI = new LocaleData();
+        sl_SI.dateFormat = "d.M.y";
+        sl_SI.twelveHourClock = false;
+        sl_SI.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("sl", "SI"), sl_SI);
+
+        LocaleData es_DO = new LocaleData();
+        es_DO.dateFormat = "dd/MM/yy";
+        es_DO.twelveHourClock = true;
+        es_DO.hourMinuteDelimiter = ":";
+        es_DO.am = "AM";
+        es_DO.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "DO"), es_DO);
+
+        LocaleData ar_IQ = new LocaleData();
+        ar_IQ.dateFormat = "dd/MM/yy";
+        ar_IQ.twelveHourClock = true;
+        ar_IQ.hourMinuteDelimiter = ":";
+        ar_IQ.am = "ص";
+        ar_IQ.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "IQ"), ar_IQ);
+
+        LocaleData fr_CH = new LocaleData();
+        fr_CH.dateFormat = "dd.MM.yy";
+        fr_CH.twelveHourClock = false;
+        fr_CH.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("fr", "CH"), fr_CH);
+
+        LocaleData es_EC = new LocaleData();
+        es_EC.dateFormat = "dd/MM/yy";
+        es_EC.twelveHourClock = false;
+        es_EC.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("es", "EC"), es_EC);
+
+        LocaleData es_US = new LocaleData();
+        es_US.dateFormat = "M/d/yy";
+        es_US.twelveHourClock = true;
+        es_US.hourMinuteDelimiter = ":";
+        es_US.am = "a.m.";
+        es_US.pm = "p.m.";
+        expectedLocaleData.put(new Locale("es", "US"), es_US);
+
+        LocaleData iw_IL = new LocaleData();
+        iw_IL.dateFormat = "dd/MM/yy";
+        iw_IL.twelveHourClock = false;
+        iw_IL.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("iw", "IL"), iw_IL);
+
+        LocaleData ar_SA = new LocaleData();
+        ar_SA.dateFormat = "dd/MM/yy";
+        ar_SA.twelveHourClock = true;
+        ar_SA.hourMinuteDelimiter = ":";
+        ar_SA.am = "ص";
+        ar_SA.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "SA"), ar_SA);
+
+        LocaleData ca_ES = new LocaleData();
+        ca_ES.dateFormat = "dd/MM/yy";
+        ca_ES.twelveHourClock = false;
+        ca_ES.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("ca", "ES"), ca_ES);
+
+        LocaleData de_DE = new LocaleData();
+        de_DE.dateFormat = "dd.MM.yy";
+        de_DE.twelveHourClock = false;
+        de_DE.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("de", "DE"), de_DE);
+
+        LocaleData sr_BA = new LocaleData();
+        sr_BA.dateFormat = "yy-MM-dd";
+        sr_BA.twelveHourClock = false;
+        sr_BA.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("sr", "BA"), sr_BA);
+
+        LocaleData zh_HK = new LocaleData();
+        zh_HK.dateFormat = "yy'年'M'月'd'日'";
+        zh_HK.twelveHourClock = true;
+        zh_HK.hourMinuteDelimiter = ":";
+        zh_HK.am = "上午";
+        zh_HK.pm = "下午";
+        expectedLocaleData.put(new Locale("zh", "HK"), zh_HK);
+
+        LocaleData ar_SD = new LocaleData();
+        ar_SD.dateFormat = "dd/MM/yy";
+        ar_SD.twelveHourClock = true;
+        ar_SD.hourMinuteDelimiter = ":";
+        ar_SD.am = "ص";
+        ar_SD.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "SD"), ar_SD);
+
+        LocaleData pt_BR = new LocaleData();
+        pt_BR.dateFormat = "dd/MM/yy";
+        pt_BR.twelveHourClock = false;
+        pt_BR.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("pt", "BR"), pt_BR);
+
+        LocaleData sr_RS = new LocaleData();
+        sr_RS.dateFormat = "d.M.yy.";
+        sr_RS.twelveHourClock = false;
+        sr_RS.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("sr", "RS"), sr_RS);
+
+        LocaleData es_UY = new LocaleData();
+        es_UY.dateFormat = "dd/MM/yy";
+        es_UY.twelveHourClock = true;
+        es_UY.hourMinuteDelimiter = ":";
+        es_UY.am = "AM";
+        es_UY.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "UY"), es_UY);
+
+        LocaleData ar_BH = new LocaleData();
+        ar_BH.dateFormat = "dd/MM/yy";
+        ar_BH.twelveHourClock = true;
+        ar_BH.hourMinuteDelimiter = ":";
+        ar_BH.am = "ص";
+        ar_BH.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "BH"), ar_BH);
+
+        LocaleData es_ES = new LocaleData();
+        es_ES.dateFormat = "d/MM/yy";
+        es_ES.twelveHourClock = false;
+        es_ES.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("es", "ES"), es_ES);
+
+        LocaleData ar_JO = new LocaleData();
+        ar_JO.dateFormat = "dd/MM/yy";
+        ar_JO.twelveHourClock = true;
+        ar_JO.hourMinuteDelimiter = ":";
+        ar_JO.am = "ص";
+        ar_JO.pm = "م";
+        expectedLocaleData.put(new Locale("ar", "JO"), ar_JO);
+
+        LocaleData es_VE = new LocaleData();
+        es_VE.dateFormat = "dd/MM/yy";
+        es_VE.twelveHourClock = true;
+        es_VE.hourMinuteDelimiter = ":";
+        es_VE.am = "AM";
+        es_VE.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "VE"), es_VE);
+
+        LocaleData es_MX = new LocaleData();
+        es_MX.dateFormat = "d/MM/yy";
+        es_MX.twelveHourClock = true;
+        es_MX.hourMinuteDelimiter = ":";
+        es_MX.am = "AM";
+        es_MX.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "MX"), es_MX);
+
+        LocaleData it_IT = new LocaleData();
+        it_IT.dateFormat = "dd/MM/yy";
+        it_IT.twelveHourClock = false;
+        it_IT.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("it", "IT"), it_IT);
+
+        LocaleData no_NO_x_lvariant_NY = new LocaleData();
+        no_NO_x_lvariant_NY.dateFormat = "dd.MM.yy";
+        no_NO_x_lvariant_NY.twelveHourClock = false;
+        no_NO_x_lvariant_NY.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("no", "NO", "x-lvariant-NY"),
+                no_NO_x_lvariant_NY);
+
+        LocaleData de_LU = new LocaleData();
+        de_LU.dateFormat = "dd.MM.yy";
+        de_LU.twelveHourClock = false;
+        de_LU.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("de", "LU"), de_LU);
+
+        LocaleData fr_LU = new LocaleData();
+        fr_LU.dateFormat = "dd/MM/yy";
+        fr_LU.twelveHourClock = false;
+        fr_LU.hourMinuteDelimiter = ":";
+        expectedLocaleData.put(new Locale("fr", "LU"), fr_LU);
+
+        LocaleData es_NI = new LocaleData();
+        es_NI.dateFormat = "MM-dd-yy";
+        es_NI.twelveHourClock = true;
+        es_NI.hourMinuteDelimiter = ":";
+        es_NI.am = "AM";
+        es_NI.pm = "PM";
+        expectedLocaleData.put(new Locale("es", "NI"), es_NI);
+
+        LocaleData th_TH = new LocaleData();
+        th_TH.dateFormat = "d/M/yyyy";
+        th_TH.twelveHourClock = false;
+        th_TH.hourMinuteDelimiter = ".";
+        expectedLocaleData.put(new Locale("th", "TH"), th_TH);
+    }
+
+    private LocaleService localeService;
+
+    @Before
+    public void setup() {
+        localeService = new LocaleService(Mockito.mock(UI.class),
+                new LocaleServiceState());
+    }
+
+    @Test
+    public void localeDateTimeFormat() {
+        for (Locale l : expectedLocaleData.keySet()) {
+            Assert.assertEquals("Error verifying locale " + l,
+                    expectedLocaleData.get(l).dateFormat,
+                    localeService.createLocaleData(l).dateFormat);
+            Assert.assertEquals("Error verifying locale " + l,
+                    expectedLocaleData.get(l).twelveHourClock,
+                    localeService.createLocaleData(l).twelveHourClock);
+            Assert.assertEquals("Error verifying locale " + l,
+                    expectedLocaleData.get(l).am,
+                    localeService.createLocaleData(l).am);
+            Assert.assertEquals("Error verifying locale " + l,
+                    expectedLocaleData.get(l).pm,
+                    localeService.createLocaleData(l).pm);
+        }
+    }
+
+    public static void main(String[] args) {
+        for (String s : JAVA8_SUPPORTED_LOCALES) {
+            String[] parts = s.split("-", 3);
+            Locale l;
+            if (parts.length == 1) {
+                l = new Locale(parts[0]);
+            } else if (parts.length == 2) {
+                l = new Locale(parts[0], parts[1]);
+            } else if (parts.length == 3) {
+                l = new Locale(parts[0], parts[1], parts[2]);
+            } else {
+                throw new RuntimeException("Unexpected locale: " + s);
+            }
+            generateData(l);
+        }
+    }
+
+    /**
+     * Helper method for generating the above data using LocaleService.
+     * 
+     * @param locale
+     *            the locale to generate data for
+     */
+    private static void generateData(Locale locale) {
+        System.out.println();
+        String id = locale.getLanguage();
+        if (!locale.getCountry().equals("")) {
+            id += "_" + locale.getCountry();
+            if (!locale.getVariant().equals("")) {
+                id += "_" + locale.getVariant();
+            }
+        }
+
+        String field = id.replace('-', '_');
+        LocaleService localeService = new LocaleService(Mockito.mock(UI.class),
+                new LocaleServiceState());
+        LocaleData localeData = localeService.createLocaleData(locale);
+        System.out.println("LocaleData " + field + " = new LocaleData();");
+        System.out.println(
+                field + ".dateFormat = \"" + localeData.dateFormat + "\";");
+        System.out.println(field + ".twelveHourClock = "
+                + localeData.twelveHourClock + ";");
+        System.out.println(field + ".hourMinuteDelimiter = \""
+                + localeData.hourMinuteDelimiter + "\";");
+        if (localeData.twelveHourClock) {
+            System.out.println(field + ".am = \"" + localeData.am + "\";");
+            System.out.println(field + ".pm = \"" + localeData.pm + "\";");
+        }
+        System.out.println("expectedLocaleData.put(new Locale(\""
+                + id.replaceAll("_", "\",\"") + "\"), " + field + ");");
+    }
+
+}