]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/dcfmtest.cpp
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / intltest / dcfmtest.cpp
index 39bb5ac5e75fa72d763bc07a5f0df12cdaf1caf4..0f4c943bf035eed55f7474948a35f136997da1c4 100644 (file)
@@ -1,6 +1,8 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 2002-2011, International Business Machines Corporation and
+ * Copyright (c) 2002-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
 #include <string.h>
 #include <stdio.h>
 
+#if defined(__GLIBCXX__)
+namespace std { class type_info; } // WORKAROUND: http://llvm.org/bugs/show_bug.cgi?id=13364
+#endif
+
 #include <string>
 #include <iostream>
 
@@ -73,21 +79,41 @@ void DecimalFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &
 //   Error Checking / Reporting macros used in all of the tests.
 //
 //---------------------------------------------------------------------------
-#define DF_CHECK_STATUS {if (U_FAILURE(status)) \
-    {dataerrln("DecimalFormatTest failure at line %d.  status=%s", \
-    __LINE__, u_errorName(status)); return 0;}}
-
-#define DF_ASSERT(expr) {if ((expr)==FALSE) {errln("DecimalFormatTest failure at line %d.\n", __LINE__);};}
-
-#define DF_ASSERT_FAIL(expr, errcode) {UErrorCode status=U_ZERO_ERROR; (expr);\
-if (status!=errcode) {dataerrln("DecimalFormatTest failure at line %d.  Expected status=%s, got %s", \
-    __LINE__, u_errorName(errcode), u_errorName(status));};}
-
-#define DF_CHECK_STATUS_L(line) {if (U_FAILURE(status)) {errln( \
-    "DecimalFormatTest failure at line %d, from %d.  status=%d\n",__LINE__, (line), status); }}
-
-#define DF_ASSERT_L(expr, line) {if ((expr)==FALSE) { \
-    errln("DecimalFormatTest failure at line %d, from %d.", __LINE__, (line)); return;}}
+#define DF_CHECK_STATUS UPRV_BLOCK_MACRO_BEGIN { \
+    if (U_FAILURE(status)) { \
+        dataerrln("DecimalFormatTest failure at line %d.  status=%s", \
+                  __LINE__, u_errorName(status)); \
+        return 0; \
+    } \
+} UPRV_BLOCK_MACRO_END
+
+#define DF_ASSERT(expr) UPRV_BLOCK_MACRO_BEGIN { \
+    if ((expr)==FALSE) { \
+        errln("DecimalFormatTest failure at line %d.\n", __LINE__); \
+    } \
+} UPRV_BLOCK_MACRO_END
+
+#define DF_ASSERT_FAIL(expr, errcode) UPRV_BLOCK_MACRO_BEGIN { \
+    UErrorCode status=U_ZERO_ERROR; \
+    (expr); \
+    if (status!=errcode) { \
+        dataerrln("DecimalFormatTest failure at line %d.  Expected status=%s, got %s", \
+                  __LINE__, u_errorName(errcode), u_errorName(status)); \
+    } \
+} UPRV_BLOCK_MACRO_END
+
+#define DF_CHECK_STATUS_L(line) UPRV_BLOCK_MACRO_BEGIN { \
+    if (U_FAILURE(status)) { \
+        errln("DecimalFormatTest failure at line %d, from %d.  status=%d\n",__LINE__, (line), status); \
+    } \
+} UPRV_BLOCK_MACRO_END
+
+#define DF_ASSERT_L(expr, line) UPRV_BLOCK_MACRO_BEGIN { \
+    if ((expr)==FALSE) { \
+        errln("DecimalFormatTest failure at line %d, from %d.", __LINE__, (line)); \
+        return; \
+    } \
+} UPRV_BLOCK_MACRO_END
 
 
 
@@ -100,7 +126,7 @@ if (status!=errcode) {dataerrln("DecimalFormatTest failure at line %d.  Expected
 class InvariantStringPiece: public StringPiece {
   public:
     InvariantStringPiece(const UnicodeString &s);
-    ~InvariantStringPiece() {};
+    ~InvariantStringPiece() {}
   private:
     MaybeStackArray<char, 20>  buf;
 };
@@ -112,7 +138,7 @@ InvariantStringPiece::InvariantStringPiece(const UnicodeString &s) {
     }
     // Buffer size is len+1 so that s.extract() will nul-terminate the string.
     s.extract(0, len, buf.getAlias(), len+1, US_INV);
-    this->set(buf, len);
+    this->set(buf.getAlias(), len);
 }
 
 
@@ -124,7 +150,7 @@ InvariantStringPiece::InvariantStringPiece(const UnicodeString &s) {
 class UnicodeStringPiece: public StringPiece {
   public:
     UnicodeStringPiece(const UnicodeString &s);
-    ~UnicodeStringPiece() {};
+    ~UnicodeStringPiece() {}
   private:
     MaybeStackArray<char, 20>  buf;
 };
@@ -138,7 +164,7 @@ UnicodeStringPiece::UnicodeStringPiece(const UnicodeString &s) {
         capacity = requiredCapacity;
         s.extract(0, len, buf.getAlias(), capacity);
     }
-    this->set(buf, requiredCapacity - 1);
+    this->set(buf.getAlias(), requiredCapacity - 1);
 }
 
 
@@ -280,6 +306,15 @@ void DecimalFormatTest::DataDrivenTests() {
                            formatLineMat.group(2, status),    // rounding mode
                            formatLineMat.group(3, status),    // input decimal number
                            formatLineMat.group(4, status),    // expected formatted result
+                           kFormattable,
+                           status);
+
+            execFormatTest(lineNum,
+                           formatLineMat.group(1, status),    // Pattern
+                           formatLineMat.group(2, status),    // rounding mode
+                           formatLineMat.group(3, status),    // input decimal number
+                           formatLineMat.group(4, status),    // expected formatted result
+                           kStringPiece,
                            status);
             continue;
         }
@@ -368,6 +403,7 @@ void DecimalFormatTest::execFormatTest(int32_t lineNum,
                            const UnicodeString &round,       // rounding mode
                            const UnicodeString &input,       // input decimal number
                            const UnicodeString &expected,    // expected formatted result
+                           EFormatInputType inType,          // input number type
                            UErrorCode &status) {
     if (U_FAILURE(status)) {
         return;
@@ -404,31 +440,43 @@ void DecimalFormatTest::execFormatTest(int32_t lineNum,
         errln("file dcfmtest.txt, line %d: Bad rounding mode \"%s\"",
                 lineNum, UnicodeStringPiece(round).data());
     }
-    
+
+    const char *typeStr = "Unknown";
     UnicodeString result;
     UnicodeStringPiece spInput(input);
-    //fmtr.format(spInput, result, NULL, status);
 
-    Formattable fmtbl;
-    fmtbl.setDecimalNumber(spInput, status);
-    //NumberFormat &nfmtr = fmtr;
-    fmtr.format(fmtbl, result, NULL, status);
+    switch (inType) {
+    case kFormattable:
+        {
+            typeStr = "Formattable";
+            Formattable fmtbl;
+            fmtbl.setDecimalNumber(spInput, status);
+            fmtr.format(fmtbl, result, NULL, status);
+        }
+        break;
+    case kStringPiece:
+        typeStr = "StringPiece";
+        fmtr.format(spInput, result, NULL, status);
+        break;
+    }
 
     if ((status == U_FORMAT_INEXACT_ERROR) && (result == "") && (expected == "Inexact")) {
         // Test succeeded.
         status = U_ZERO_ERROR;
         return;
     }
+
     if (U_FAILURE(status)) {
-        errln("file dcfmtest.txt, line %d: format() returned %s.",
-            lineNum, u_errorName(status));
+        errln("[%s] file dcfmtest.txt, line %d: format() returned %s.",
+            typeStr, lineNum, u_errorName(status));
         status = U_ZERO_ERROR;
         return;
     }
     
     if (result != expected) {
-        errln("file dcfmtest.txt, line %d: expected \"%s\", got \"%s\"",
-            lineNum, UnicodeStringPiece(expected).data(), UnicodeStringPiece(result).data());
+        errln("[%s] file dcfmtest.txt, line %d: expected \"%s\", got \"%s\", %s",
+            typeStr, lineNum, UnicodeStringPiece(expected).data(), UnicodeStringPiece(result).data(),
+            u_errorName(status));
     }
 }
 
@@ -473,7 +521,7 @@ UChar *DecimalFormatTest::ReadAndConvertFile(const char *fileName, int32_t &ulen
     fileSize = ftell(f);
     fileBuf = new char[fileSize];
     fseek(f, 0, SEEK_SET);
-    amtRead = fread(fileBuf, 1, fileSize, f);
+    amtRead = static_cast<int32_t>(fread(fileBuf, 1, fileSize, f));
     if (amtRead != fileSize || fileSize <= 0) {
         errln("Error reading test data file.");
         goto cleanUpAndReturn;
@@ -518,7 +566,7 @@ cleanUpAndReturn:
         errln("ICU Error \"%s\"\n", u_errorName(status));
         delete retPtr;
         retPtr = NULL;
-    };
+    }
     return retPtr;
 }