16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 2002-2013, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// dcfmtest.cpp 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Decimal Formatter tests, data driven. 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "intltest.h" 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_REGULAR_EXPRESSIONS 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/regex.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/dcfmtsym.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/decimfmt.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "dcfmtest.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "util.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h> 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h> 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string> 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <iostream> 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//--------------------------------------------------------------------------- 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Test class boilerplate 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//--------------------------------------------------------------------------- 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgDecimalFormatTest::DecimalFormatTest() 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgDecimalFormatTest::~DecimalFormatTest() 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid DecimalFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) logln("TestSuite DecimalFormatTest: "); 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (index) { 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: name = "DataDrivenTests"; 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) DataDrivenTests(); 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: name = "skip"; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: name = ""; 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; //needed to end loop 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//--------------------------------------------------------------------------- 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Error Checking / Reporting macros used in all of the tests. 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//--------------------------------------------------------------------------- 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DF_CHECK_STATUS {if (U_FAILURE(status)) \ 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {dataerrln("DecimalFormatTest failure at line %d. status=%s", \ 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org __LINE__, u_errorName(status)); return 0;}} 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DF_ASSERT(expr) {if ((expr)==FALSE) {errln("DecimalFormatTest failure at line %d.\n", __LINE__);};} 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DF_ASSERT_FAIL(expr, errcode) {UErrorCode status=U_ZERO_ERROR; (expr);\ 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgif (status!=errcode) {dataerrln("DecimalFormatTest failure at line %d. Expected status=%s, got %s", \ 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org __LINE__, u_errorName(errcode), u_errorName(status));};} 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DF_CHECK_STATUS_L(line) {if (U_FAILURE(status)) {errln( \ 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DecimalFormatTest failure at line %d, from %d. status=%d\n",__LINE__, (line), status); }} 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DF_ASSERT_L(expr, line) {if ((expr)==FALSE) { \ 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("DecimalFormatTest failure at line %d, from %d.", __LINE__, (line)); return;}} 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// InvariantStringPiece 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Wrap a StringPiece around the extracted invariant data of a UnicodeString. 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// The data is guaranteed to be nul terminated. (This is not true of StringPiece 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// in general, but is true of InvariantStringPiece) 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass InvariantStringPiece: public StringPiece { 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org InvariantStringPiece(const UnicodeString &s); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ~InvariantStringPiece() {}; 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private: 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MaybeStackArray<char, 20> buf; 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgInvariantStringPiece::InvariantStringPiece(const UnicodeString &s) { 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len = s.length(); 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (len+1 > buf.getCapacity()) { 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buf.resize(len+1); 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Buffer size is len+1 so that s.extract() will nul-terminate the string. 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.extract(0, len, buf.getAlias(), len+1, US_INV); 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->set(buf.getAlias(), len); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// UnicodeStringPiece 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Wrap a StringPiece around the extracted (to the default charset) data of 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// a UnicodeString. The extracted data is guaranteed to be nul terminated. 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// (This is not true of StringPiece in general, but is true of UnicodeStringPiece) 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass UnicodeStringPiece: public StringPiece { 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeStringPiece(const UnicodeString &s); 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ~UnicodeStringPiece() {}; 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private: 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MaybeStackArray<char, 20> buf; 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringPiece::UnicodeStringPiece(const UnicodeString &s) { 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len = s.length(); 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t capacity = buf.getCapacity(); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t requiredCapacity = s.extract(0, len, buf.getAlias(), capacity) + 1; 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (capacity < requiredCapacity) { 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buf.resize(requiredCapacity); 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org capacity = requiredCapacity; 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.extract(0, len, buf.getAlias(), capacity); 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->set(buf.getAlias(), requiredCapacity - 1); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//--------------------------------------------------------------------------- 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// DataDrivenTests 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// The test cases are in a separate data file, 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//--------------------------------------------------------------------------- 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Translate a Formattable::type enum value to a string, for error message formatting. 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *formattableType(Formattable::Type typ) { 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char *types[] = {"kDate", 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "kDouble", 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "kLong", 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "kString", 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "kArray", 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "kInt64", 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "kObject" 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (typ<0 || typ>Formattable::kObject) { 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return "Unknown"; 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return types[typ]; 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char * 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgDecimalFormatTest::getPath(char *buffer, const char *filename) { 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status=U_ZERO_ERROR; 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *testDataDirectory = IntlTest::getSourceTestData(status); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DF_CHECK_STATUS; 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(buffer, testDataDirectory); 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(buffer, filename); 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return buffer; 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid DecimalFormatTest::DataDrivenTests() { 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char tdd[2048]; 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *srcPath; 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t lineNum = 0; 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Open and read the test data file. 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcPath=getPath(tdd, "dcfmtest.txt"); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(srcPath==NULL) { 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; /* something went wrong, error already output */ 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len; 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *testData = ReadAndConvertFile(srcPath, len, status); 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; /* something went wrong, error already output */ 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Put the test data into a UnicodeString 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString testString(FALSE, testData, len); 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RegexMatcher parseLineMat(UnicodeString( 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "(?i)\\s*parse\\s+" 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\"([^\"]*)\"\\s+" // Capture group 1: input text 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "([ild])\\s+" // Capture group 2: expected parsed type 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\"([^\"]*)\"\\s+" // Capture group 3: expected parsed decimal 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\s*(?:#.*)?"), // Trailing comment 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, status); 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RegexMatcher formatLineMat(UnicodeString( 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "(?i)\\s*format\\s+" 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "(\\S+)\\s+" // Capture group 1: pattern 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "(ceiling|floor|down|up|halfeven|halfdown|halfup|default|unnecessary)\\s+" // Capture group 2: Rounding Mode 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\"([^\"]*)\"\\s+" // Capture group 3: input 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\"([^\"]*)\"" // Capture group 4: expected output 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\s*(?:#.*)?"), // Trailing comment 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, status); 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RegexMatcher commentMat (UNICODE_STRING_SIMPLE("\\s*(#.*)?$"), 0, status); 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RegexMatcher lineMat(UNICODE_STRING_SIMPLE("(?m)^(.*?)$"), testString, 0, status); 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)){ 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Construct RegexMatcher() error."); 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete [] testData; 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Loop over the test data file, once per line. 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (lineMat.find()) { 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum++; 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("File dcfmtest.txt, line %d: ICU Error \"%s\"", lineNum, u_errorName(status)); 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString testLine = lineMat.group(1, status); 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // printf("%s\n", UnicodeStringPiece(testLine).data()); 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testLine.length() == 0) { 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Parse the test line. Skip blank and comment only lines. 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Separate out the three main fields - pattern, flags, target. 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org commentMat.reset(testLine); 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (commentMat.lookingAt(status)) { 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // This line is a comment, or blank. 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Handle "parse" test case line from file 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseLineMat.reset(testLine); 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (parseLineMat.lookingAt(status)) { 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org execParseTest(lineNum, 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseLineMat.group(1, status), // input 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseLineMat.group(2, status), // Expected Type 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseLineMat.group(3, status), // Expected Decimal String 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ); 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Handle "format" test case line 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.reset(testLine); 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (formatLineMat.lookingAt(status)) { 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org execFormatTest(lineNum, 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.group(1, status), // Pattern 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.group(2, status), // rounding mode 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.group(3, status), // input decimal number 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.group(4, status), // expected formatted result 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org kFormattable, 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status); 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org execFormatTest(lineNum, 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.group(1, status), // Pattern 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.group(2, status), // rounding mode 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.group(3, status), // input decimal number 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatLineMat.group(4, status), // expected formatted result 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org kStringPiece, 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status); 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Line is not a recognizable test case. 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Badly formed test case at line %d.\n%s\n", 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum, UnicodeStringPiece(testLine).data()); 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete [] testData; 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid DecimalFormatTest::execParseTest(int32_t lineNum, 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString &inputText, 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString &expectedType, 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString &expectedDecimal, 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &status) { 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DecimalFormatSymbols symbols(Locale::getUS(), status); 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString pattern = UNICODE_STRING_SIMPLE("####"); 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DecimalFormat format(pattern, symbols, status); 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable result; 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("file dcfmtest.txt, line %d: %s error creating the formatter.", 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum, u_errorName(status)); 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ParsePosition pos; 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t expectedParseEndPosition = inputText.length(); 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org format.parse(inputText, result, pos); 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (expectedParseEndPosition != pos.getIndex()) { 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("file dcfmtest.txt, line %d: Expected parse position afeter parsing: %d. " 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Actual parse position: %d", expectedParseEndPosition, pos.getIndex()); 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char expectedTypeC[2]; 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedType.extract(0, 1, expectedTypeC, 2, US_INV); 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable::Type expectType = Formattable::kDate; 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (expectedTypeC[0]) { 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 'd': expectType = Formattable::kDouble; break; 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 'i': expectType = Formattable::kLong; break; 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 'l': expectType = Formattable::kInt64; break; 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("file dcfmtest.tx, line %d: unrecongized expected type \"%s\"", 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum, InvariantStringPiece(expectedType).data()); 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result.getType() != expectType) { 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("file dcfmtest.txt, line %d: expectedParseType(%s) != actual parseType(%s)", 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum, formattableType(expectType), formattableType(result.getType())); 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece decimalResult = result.getDecimalNumber(status); 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("File %s, line %d: error %s. Line in file dcfmtest.txt: %d:", 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org __FILE__, __LINE__, u_errorName(status), lineNum); 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org InvariantStringPiece expectedResults(expectedDecimal); 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (decimalResult != expectedResults) { 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("file dcfmtest.txt, line %d: expected \"%s\", got \"%s\"", 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum, expectedResults.data(), decimalResult.data()); 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid DecimalFormatTest::execFormatTest(int32_t lineNum, 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString &pattern, // Pattern 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString &round, // rounding mode 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString &input, // input decimal number 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString &expected, // expected formatted result 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org EFormatInputType inType, // input number type 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &status) { 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DecimalFormatSymbols symbols(Locale::getUS(), status); 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // printf("Pattern = %s\n", UnicodeStringPiece(pattern).data()); 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DecimalFormat fmtr(pattern, symbols, status); 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("file dcfmtest.txt, line %d: %s error creating the formatter.", 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum, u_errorName(status)); 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (round=="ceiling") { 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundCeiling); 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (round=="floor") { 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundFloor); 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (round=="down") { 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundDown); 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (round=="up") { 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundUp); 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (round=="halfeven") { 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundHalfEven); 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (round=="halfdown") { 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundHalfDown); 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (round=="halfup") { 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundHalfUp); 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (round=="default") { 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // don't set any value. 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (round=="unnecessary") { 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundUnnecessary); 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.setRoundingMode(DecimalFormat::kRoundFloor); 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("file dcfmtest.txt, line %d: Bad rounding mode \"%s\"", 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum, UnicodeStringPiece(round).data()); 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *typeStr = "Unknown"; 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString result; 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeStringPiece spInput(input); 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (inType) { 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case kFormattable: 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org typeStr = "Formattable"; 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable fmtbl; 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtbl.setDecimalNumber(spInput, status); 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.format(fmtbl, result, NULL, status); 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case kStringPiece: 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org typeStr = "StringPiece"; 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmtr.format(spInput, result, NULL, status); 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((status == U_FORMAT_INEXACT_ERROR) && (result == "") && (expected == "Inexact")) { 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Test succeeded. 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("[%s] file dcfmtest.txt, line %d: format() returned %s.", 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org typeStr, lineNum, u_errorName(status)); 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result != expected) { 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("[%s] file dcfmtest.txt, line %d: expected \"%s\", got \"%s\"", 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org typeStr, lineNum, UnicodeStringPiece(expected).data(), UnicodeStringPiece(result).data()); 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------- 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Read a text data file, convert it from UTF-8 to UChars, and return the data 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// in one big UChar * buffer, which the caller must delete. 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// (Lightly modified version of a similar function in regextst.cpp) 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------------------- 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar *DecimalFormatTest::ReadAndConvertFile(const char *fileName, int32_t &ulen, 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &status) { 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *retPtr = NULL; 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *fileBuf = NULL; 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *fileBufNoBOM = NULL; 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILE *f = NULL; 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ulen = 0; 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return retPtr; 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Open the file. 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org f = fopen(fileName, "rb"); 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (f == 0) { 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Error opening test data file %s\n", fileName); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_FILE_ACCESS_ERROR; 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Read it in 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t fileSize; 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t amtRead; 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t amtReadNoBOM; 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fseek( f, 0, SEEK_END); 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fileSize = ftell(f); 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fileBuf = new char[fileSize]; 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fseek(f, 0, SEEK_SET); 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org amtRead = fread(fileBuf, 1, fileSize, f); 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (amtRead != fileSize || fileSize <= 0) { 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Error reading test data file."); 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanUpAndReturn; 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Look for a UTF-8 BOM on the data just read. 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The test data file is UTF-8. 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The BOM needs to be there in the source file to keep the Windows & 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // EBCDIC machines happy, so force an error if it goes missing. 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Many Linux editors will silently strip it. 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fileBufNoBOM = fileBuf + 3; 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org amtReadNoBOM = amtRead - 3; 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fileSize<3 || uprv_strncmp(fileBuf, "\xEF\xBB\xBF", 3) != 0) { 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // TODO: restore this check. 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Test data file %s is missing its BOM", fileName); 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fileBufNoBOM = fileBuf; 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org amtReadNoBOM = amtRead; 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Find the length of the input in UTF-16 UChars 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // (by preflighting the conversion) 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strFromUTF8(NULL, 0, &ulen, fileBufNoBOM, amtReadNoBOM, &status); 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Convert file contents from UTF-8 to UTF-16 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status == U_BUFFER_OVERFLOW_ERROR) { 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Buffer Overflow is expected from the preflight operation. 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org retPtr = new UChar[ulen+1]; 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strFromUTF8(retPtr, ulen+1, NULL, fileBufNoBOM, amtReadNoBOM, &status); 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcleanUpAndReturn: 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(f); 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] fileBuf; 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("ICU Error \"%s\"\n", u_errorName(status)); 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete retPtr; 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org retPtr = NULL; 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return retPtr; 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */ 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 548