]> granicus.if.org Git - icu/commitdiff
ICU-11985 Handle 'j' and 'J' in date time pattern skeletons.
authorFredrik Roubert <roubert@google.com>
Wed, 18 Nov 2015 12:29:17 +0000 (12:29 +0000)
committerFredrik Roubert <roubert@google.com>
Wed, 18 Nov 2015 12:29:17 +0000 (12:29 +0000)
R=mark.edward.davis@gmail.com, markus.icu@gmail.com, pedberg@apple.com

Review URL: https://codereview.appspot.com/279780043 .

X-SVN-Rev: 38089

icu4c/source/i18n/dtptngen.cpp
icu4c/source/test/intltest/dtfmttst.cpp
icu4c/source/test/intltest/dtfmttst.h
icu4c/source/test/intltest/dtifmtts.cpp
icu4c/source/test/intltest/dtifmtts.h
icu4c/source/test/intltest/dtptngts.cpp
icu4c/source/test/intltest/dtptngts.h

index 0a7d4b3833bab732f2e306cd6878284fc969ea52..e8287985a51d15139891f2bc1defa6a27ee21a3e 100644 (file)
@@ -202,6 +202,8 @@ static const dtTypeElem dtTypes[] = {
     {LOW_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0},
     {LOW_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0},
     {LOW_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0},
+    {LOW_J, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12/24 hour
+    {CAP_J, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12/24 hour no AM/PM
     {0, UDATPG_FIELD_COUNT, 0, 0, 0} , // last row of dtTypes[]
  };
 
index 1329e952fa5d6d7d04d8bddfd27e299150d4232b..2d8da5f56e4b2a7a814712793ae0c67fafaac929 100644 (file)
@@ -113,6 +113,8 @@ void DateFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &nam
     TESTCASE_AUTO(TestDFSCreateForLocaleWithCalendarInLocale);
     TESTCASE_AUTO(TestChangeCalendar);
 
+    TESTCASE_AUTO(TestPatternFromSkeleton);
+
     TESTCASE_AUTO_END;
 }
 
@@ -4835,6 +4837,33 @@ void DateFormatTest::TestChangeCalendar() {
     assertEquals("format yMMMd", "Iyar 29, 5758", result);
 }
 
+void DateFormatTest::TestPatternFromSkeleton() {
+    static const struct {
+        const Locale& locale;
+        const char* const skeleton;
+        const char* const pattern;
+    } TESTDATA[] = {
+        // Ticket #11985
+        {Locale::getEnglish(), "jjmm", "h:mm a"},
+        {Locale::getEnglish(), "JJmm", "hh:mm"},
+        {Locale::getGerman(), "jjmm", "HH:mm"},
+        {Locale::getGerman(), "JJmm", "HH:mm"}
+    };
+
+    for (size_t i = 0; i < sizeof TESTDATA / sizeof *TESTDATA; i++) {
+        UErrorCode status = U_ZERO_ERROR;
+        LocalPointer<DateFormat> fmt(
+                DateFormat::createInstanceForSkeleton(
+                        TESTDATA[i].skeleton, TESTDATA[i].locale, status));
+        if (!assertSuccess("createInstanceForSkeleton", status)) {
+            return;
+        }
+        UnicodeString pattern;
+        static_cast<const SimpleDateFormat*>(fmt.getAlias())->toPattern(pattern);
+        assertEquals("Format pattern", TESTDATA[i].pattern, pattern);
+    }
+}
+
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
 
index 19d7c0cb64de49fe0abbcdc655e6136503a8da4f..f8b97820930ee4d38943162e31503046cb26b982 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2014, International Business Machines Corporation and
+ * Copyright (c) 1997-2015, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
@@ -250,6 +250,8 @@ public:
     void TestDFSCreateForLocaleWithCalendarInLocale();
     void TestChangeCalendar();
 
+    void TestPatternFromSkeleton();
+
 private:
     UBool showParse(DateFormat &format, const UnicodeString &formattedString);
 
index 0777fa78c7027129a39db5649ad575f6d960462d..02b1f05c79a4c7dfc61cbd98afd5407ed61e2bc7 100644 (file)
@@ -50,6 +50,7 @@ void DateIntervalFormatTest::runIndexedTest( int32_t index, UBool exec, const ch
         TESTCASE(4, testYearFormats);
         TESTCASE(5, testStress);
         TESTCASE(6, testTicket11583_2);
+        TESTCASE(7, testTicket11985);
         default: name = ""; break;
     }
 }
@@ -1530,4 +1531,17 @@ void DateIntervalFormatTest::testTicket11583_2() {
     }
 }
 
+
+void DateIntervalFormatTest::testTicket11985() {
+    UErrorCode status = U_ZERO_ERROR;
+    LocalPointer<DateIntervalFormat> fmt(
+            DateIntervalFormat::createInstance(UDAT_HOUR_MINUTE, Locale::getEnglish(), status));
+    if (!assertSuccess("createInstance", status)) {
+        return;
+    }
+    UnicodeString pattern;
+    static_cast<const SimpleDateFormat*>(fmt->getDateFormat())->toPattern(pattern);
+    assertEquals("Format pattern", "h:mm a", pattern);
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
index 3d50f72e6a37a85b316b511e54043ec98a9141fc..af4318c5fd852f615139aa09e185790450dc6f85 100644 (file)
@@ -54,6 +54,8 @@ public:
 
     void testTicket11583_2();
 
+    void testTicket11985();
+
 private:
     /**
      * Test formatting against expected result
index 47b3e2a601da9fa757f607da47043f27653fb5d6..03ca9d4b91e4404a3d1616a2ab2a675cf7fc61ee 100644 (file)
@@ -30,6 +30,7 @@ void IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index, UBool e
         TESTCASE(0, testAPI);
         TESTCASE(1, testOptions);
         TESTCASE(2, testAllFieldPatterns);
+        TESTCASE(3, testStaticGetSkeleton);
         default: name = ""; break;
     }
 }
@@ -1057,4 +1058,24 @@ void IntlTestDateTimePatternGeneratorAPI::testAllFieldPatterns(/*char *par*/)
         }
     }
 }
+
+void IntlTestDateTimePatternGeneratorAPI::testStaticGetSkeleton(/*char *par*/)
+{
+    // Verify that staticGetSkeleton() doesn't mangle skeletons. (Ticket #11985)
+    static const char* const testData[] = {
+        "jmm",
+        "jjmm",
+        "Jmm",
+        "JJmm"
+    };
+
+    for (size_t i = 0; i < sizeof testData / sizeof *testData; i++) {
+        UErrorCode status = U_ZERO_ERROR;
+        UnicodeString skeleton = DateTimePatternGenerator::staticGetSkeleton(testData[i], status);
+        if (!assertSuccess("staticGetSkeleton", status)) {
+            return;
+        }
+        assertEquals("Skeleton", testData[i], skeleton);
+    }
+}
 #endif /* #if !UCONFIG_NO_FORMATTING */
index 40c24d7869fb4eff1dee8db174becc4d5a862b82..dd368457ba155271cee3266d318224ca8127a24e 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2001,2009,2013, International Business Machines Corporation and
+ * Copyright (c) 1997-2001,2009,2013,2015 International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
@@ -26,6 +26,7 @@ private:
     void testAPI(/* char* par */);
     void testOptions(/* char* par */);
     void testAllFieldPatterns(/* char* par */);
+    void testStaticGetSkeleton(/* char* par */);
 };
 
 #endif /* #if !UCONFIG_NO_FORMATTING */