+// © 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>
// 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
class InvariantStringPiece: public StringPiece {
public:
InvariantStringPiece(const UnicodeString &s);
- ~InvariantStringPiece() {};
+ ~InvariantStringPiece() {}
private:
MaybeStackArray<char, 20> buf;
};
}
// 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);
}
class UnicodeStringPiece: public StringPiece {
public:
UnicodeStringPiece(const UnicodeString &s);
- ~UnicodeStringPiece() {};
+ ~UnicodeStringPiece() {}
private:
MaybeStackArray<char, 20> buf;
};
capacity = requiredCapacity;
s.extract(0, len, buf.getAlias(), capacity);
}
- this->set(buf, requiredCapacity - 1);
+ this->set(buf.getAlias(), requiredCapacity - 1);
}
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;
}
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;
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));
}
}
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;
errln("ICU Error \"%s\"\n", u_errorName(status));
delete retPtr;
retPtr = NULL;
- };
+ }
return retPtr;
}