]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/cintltst/cmsgtst.c
ICU-57163.0.1.tar.gz
[apple/icu.git] / icuSources / test / cintltst / cmsgtst.c
index 2ff3fbd486b564d469725a9e02323b257dc5d673..e11fa656fff6184805e256a74e4b2bc11939ac95 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2011, International Business Machines Corporation and
+ * Copyright (c) 1997-2016, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************
  *
@@ -27,6 +27,7 @@
 #include "cintltst.h"
 #include "cmsgtst.h"
 #include "cformtst.h"
+#include "cmemory.h"
 
 static const char* const txt_testCasePatterns[] = {
    "Quotes '', '{', a {0,number,integer} '{'0}",
@@ -87,6 +88,9 @@ static void FreeStrings( void )
     strings_initialized = FALSE;
 }
 
+#if (U_PLATFORM == U_PF_LINUX) /* add platforms here .. */
+/* Keep the #if above in sync with the one below that has the same "add platforms here .." comment. */
+#else
 /* Platform dependent test to detect if this type will return NULL when interpreted as a pointer. */
 static UBool returnsNullForType(int firstParam, ...) {
     UBool isNULL;
@@ -96,6 +100,7 @@ static UBool returnsNullForType(int firstParam, ...) {
     va_end(marker);
     return isNULL;
 }
+#endif
 
 /* Test u_formatMessage() with various test patterns() */
 static void MessageFormatTest( void ) 
@@ -219,7 +224,7 @@ static void MessageFormatTest( void )
                         austrdup(result), austrdup(testResultStrings[i]) );
                 }
 
-#if U_PLATFORM_IS_DARWIN_BASED || (U_PLATFORM == U_PF_LINUX) /* add platforms here .. */
+#if (U_PLATFORM == U_PF_LINUX) /* add platforms here .. */
                 log_verbose("Skipping potentially crashing test for mismatched varargs.\n");
 #else
                 log_verbose("Note: the next is a platform dependent test. If it crashes, add an exclusion for your platform near %s:%d\n", __FILE__, __LINE__); 
@@ -995,6 +1000,7 @@ static void TestJ904(void) {
                              result, 256, &status,
                              string, 1/7.0,
                              789.0+1000*(56+60*(34+60*12)));
+    (void)length;   /* Suppress set but not used warning. */
 
     u_austrncpy(cresult, result, sizeof(cresult));
 
@@ -1025,7 +1031,7 @@ static void OpenMessageFormatTest(void)
     int32_t length=0;
     UErrorCode status = U_ZERO_ERROR;
 
-    u_uastrncpy(pattern, PAT, sizeof(pattern)/sizeof(pattern[0]));
+    u_uastrncpy(pattern, PAT, UPRV_LENGTHOF(pattern));
 
     /* Test umsg_open                   */
     f1 = umsg_open(pattern,length,NULL,NULL,&status);
@@ -1098,10 +1104,10 @@ static void MessageLength(void)
     UChar result[128] = {0};
     UChar expected[sizeof(expectedChars)];
 
-    u_uastrncpy(pattern, patChars, sizeof(pattern)/sizeof(pattern[0]));
-    u_uastrncpy(expected, expectedChars, sizeof(expected)/sizeof(expected[0]));
+    u_uastrncpy(pattern, patChars, UPRV_LENGTHOF(pattern));
+    u_uastrncpy(expected, expectedChars, UPRV_LENGTHOF(expected));
 
-    u_formatMessage("en_US", pattern, 6, result, sizeof(result)/sizeof(result[0]), &status, arg);
+    u_formatMessage("en_US", pattern, 6, result, UPRV_LENGTHOF(result), &status, arg);
     if (U_FAILURE(status)) {
         log_err("u_formatMessage method failed. Error: %s \n",u_errorName(status));
     }
@@ -1110,6 +1116,24 @@ static void MessageLength(void)
     }
 }
 
+static void TestMessageWithUnusedArgNumber() {
+    UErrorCode errorCode = U_ZERO_ERROR;
+    U_STRING_DECL(pattern, "abc {1} def", 11);
+    UChar x[2] = { 0x78, 0 };  // "x"
+    UChar y[2] = { 0x79, 0 };  // "y"
+    U_STRING_DECL(expected, "abc y def", 9);
+    UChar result[20];
+    int32_t length;
+
+    U_STRING_INIT(pattern, "abc {1} def", 11);
+    U_STRING_INIT(expected, "abc y def", 9);
+    length = u_formatMessage("en", pattern, -1, result, UPRV_LENGTHOF(result), &errorCode, x, y);
+    if (U_FAILURE(errorCode) || length != u_strlen(expected) || u_strcmp(result, expected) != 0) {
+        log_err("u_formatMessage(pattern with only {1}, 2 args) failed: result length %d, UErrorCode %s \n",
+                (int)length, u_errorName(errorCode));
+    }
+}
+
 static void TestErrorChaining(void) {
     UErrorCode status = U_USELESS_COLLATOR_ERROR;
 
@@ -1164,6 +1188,7 @@ void addMsgForTest(TestNode** root)
     addTest(root, &TestParseMessageWithValist, "tsformat/cmsgtst/TestParseMessageWithValist");
     addTest(root, &TestJ904, "tsformat/cmsgtst/TestJ904");
     addTest(root, &MessageLength, "tsformat/cmsgtst/MessageLength");
+    addTest(root, &TestMessageWithUnusedArgNumber, "tsformat/cmsgtst/TestMessageWithUnusedArgNumber");
     addTest(root, &TestErrorChaining, "tsformat/cmsgtst/TestErrorChaining");
     addTest(root, &TestMsgFormatSelect, "tsformat/cmsgtst/TestMsgFormatSelect");
 }