]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/cintltst/cdattst.c
ICU-491.11.1.tar.gz
[apple/icu.git] / icuSources / test / cintltst / cdattst.c
index bfd55a6e62cd96158df930894f4da0bb4a65d750..edc3afb19158f38827a3470d9a4a179def75dec1 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2010, International Business Machines Corporation and
+ * Copyright (c) 1997-2012, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 /********************************************************************************
@@ -21,6 +21,7 @@
 
 #include "unicode/uloc.h"
 #include "unicode/udat.h"
+#include "unicode/udatpg.h"
 #include "unicode/ucal.h"
 #include "unicode/unum.h"
 #include "unicode/ustring.h"
@@ -34,6 +35,7 @@
 static void TestExtremeDates(void);
 static void TestAllLocales(void);
 static void TestRelativeCrash(void);
+static void TestContext(void);
 
 #define LEN(a) (sizeof(a)/sizeof(a[0]))
 
@@ -50,6 +52,7 @@ void addDateForTest(TestNode** root)
     TESTCASE(TestExtremeDates);
     TESTCASE(TestAllLocales);
     TESTCASE(TestRelativeCrash);
+    TESTCASE(TestContext);
 }
 /* Testing the DateFormat API */
 static void TestDateFormat()
@@ -620,7 +623,7 @@ static void TestSymbols()
     VerifygetSymbols(def, UDAT_QUARTERS, 3, "4th quarter");
     VerifygetSymbols(fr, UDAT_SHORT_QUARTERS, 1, "T2");
     VerifygetSymbols(def, UDAT_SHORT_QUARTERS, 2, "Q3");
-    VerifygetSymbols(def,UDAT_LOCALIZED_CHARS, 0, "GyMdkHmsSEDFwWahKzYeugAZvcLQqV");
+    VerifygetSymbols(def,UDAT_LOCALIZED_CHARS, 0, "GyMdkHmsSEDFwWahKzYeugAZvcLQqVU");
 
 
     if(result != NULL) {
@@ -1233,4 +1236,91 @@ static void TestRelativeCrash(void) {
     }
 }
 
+static const UChar skeleton_yMMMM[] = { 0x79,0x4D,0x4D,0x4D,0x4D,0 }; /* "yMMMM"; fr maps to "MMMM y", cs maps to "LLLL y" */
+static const UChar july2008_frDefault[] = { 0x6A,0x75,0x69,0x6C,0x6C,0x65,0x74,0x20,0x32,0x30,0x30,0x38,0 }; /* "juillet 2008" */
+static const UChar july2008_frTitle[] = { 0x4A,0x75,0x69,0x6C,0x6C,0x65,0x74,0x20,0x32,0x30,0x30,0x38,0 };  /* "Juillet 2008" sentence-begin, standalone */
+static const UChar july2008_csDefault[] = { 0x10D,0x65,0x72,0x76,0x65,0x6E,0x65,0x63,0x20,0x32,0x30,0x30,0x38,0 }; /* "c(hacek)ervenec 2008" */
+static const UChar july2008_csTitle[] = { 0x10C,0x65,0x72,0x76,0x65,0x6E,0x65,0x63,0x20,0x32,0x30,0x30,0x38,0 }; /* "C(hacek)ervenec 2008" sentence-begin, uiListOrMenu */
+
+typedef struct {
+    const char * locale;
+    const UChar * skeleton;
+    UDateFormatContextValue capitalizationContext;
+    const UChar * expectedFormat;
+} TestContextItem;
+
+static const TestContextItem textContextItems[] = {
+    { "fr", skeleton_yMMMM, UDAT_CONTEXT_UNKNOWN,          july2008_frDefault },
+#if !UCONFIG_NO_BREAK_ITERATION
+    { "fr", skeleton_yMMMM, UDAT_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, july2008_frDefault },
+    { "fr", skeleton_yMMMM, UDAT_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, july2008_frTitle },
+    { "fr", skeleton_yMMMM, UDAT_CAPITALIZATION_FOR_UI_LIST_OR_MENU,  july2008_frDefault },
+    { "fr", skeleton_yMMMM, UDAT_CAPITALIZATION_FOR_STANDALONE,       july2008_frTitle },
+#endif
+    { "cs", skeleton_yMMMM, UDAT_CONTEXT_UNKNOWN,          july2008_csDefault },
+#if !UCONFIG_NO_BREAK_ITERATION
+    { "cs", skeleton_yMMMM, UDAT_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, july2008_csDefault },
+    { "cs", skeleton_yMMMM, UDAT_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, july2008_csTitle },
+    { "cs", skeleton_yMMMM, UDAT_CAPITALIZATION_FOR_UI_LIST_OR_MENU,  july2008_csTitle },
+    { "cs", skeleton_yMMMM, UDAT_CAPITALIZATION_FOR_STANDALONE,       july2008_csDefault },
+#endif
+    { NULL, NULL, 0, NULL }
+};
+
+static const UDate july022008 = 1215000001979.0;
+enum { kUbufMax = 64, kBbufMax = 3*kUbufMax };
+
+static void TestContext(void) {
+    const TestContextItem* textContextItemPtr = textContextItems;
+    for (; textContextItemPtr->locale != NULL; ++textContextItemPtr) {
+        UErrorCode status = U_ZERO_ERROR;
+        UDateFormat* udfmt = udat_open(UDAT_NONE, UDAT_MEDIUM, textContextItemPtr->locale, NULL, 0, NULL, 0, &status);
+        if ( U_FAILURE(status) ) {
+            log_data_err("FAIL: udat_open for locale %s, status %s\n", textContextItemPtr->locale, u_errorName(status) );
+        } else {
+            UDateTimePatternGenerator* udtpg = udatpg_open(textContextItemPtr->locale, &status);
+            if ( U_FAILURE(status) ) {
+                log_err("FAIL: udatpg_open for locale %s, status %s\n", textContextItemPtr->locale, u_errorName(status) );
+            } else {
+                UChar ubuf[kUbufMax];
+                int32_t len = udatpg_getBestPattern(udtpg, textContextItemPtr->skeleton, -1, ubuf, kUbufMax, &status);
+                if ( U_FAILURE(status) ) {
+                    log_err("FAIL: udatpg_getBestPattern for locale %s, status %s\n", textContextItemPtr->locale, u_errorName(status) );
+                } else {
+                    udat_applyPattern(udfmt, FALSE, ubuf, len);
+                    udat_setDefaultContext(udfmt, UDAT_CAPITALIZATION, textContextItemPtr->capitalizationContext, &status);
+                    if ( U_FAILURE(status) ) {
+                        log_err("FAIL: udat_setDefaultContext for locale %s, capitalizationContext %d, status %s\n",
+                                textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext, u_errorName(status) );
+                    } else {
+                        int32_t getContext;
+                        len = udat_format(udfmt, july022008, ubuf, kUbufMax, NULL, &status);
+                        if ( U_FAILURE(status) ) {
+                            log_err("FAIL: udat_format for locale %s, capitalizationContext %d, status %s\n",
+                                    textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext, u_errorName(status) );
+                            status = U_ZERO_ERROR;
+                        } else if (u_strncmp(ubuf, textContextItemPtr->expectedFormat, kUbufMax) != 0) {
+                            char bbuf1[kBbufMax];
+                            char bbuf2[kBbufMax];
+                            log_err("FAIL: udat_format for locale %s, capitalizationContext %d, expected %s, got %s\n",
+                                    textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext,
+                                    u_austrncpy(bbuf1,textContextItemPtr->expectedFormat,kUbufMax), u_austrncpy(bbuf2,ubuf,kUbufMax) );
+                        }
+                        getContext = udat_getDefaultContext(udfmt, UDAT_CAPITALIZATION, &status);
+                        if ( U_FAILURE(status) ) {
+                            log_err("FAIL: udat_getDefaultContext for locale %s, capitalizationContext %d, status %s\n",
+                                    textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext, u_errorName(status) );
+                        } else if (getContext != (int)textContextItemPtr->capitalizationContext) {
+                            log_err("FAIL: udat_getDefaultContext for locale %s, capitalizationContext %d, got context %d\n",
+                                    textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext, getContext );
+                        }
+                    }
+                }
+                udatpg_close(udtpg);
+            }
+            udat_close(udfmt);
+        }
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */