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