1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/******************************************************************** 2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * COPYRIGHT: 3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Copyright (c) 2002-2010, International Business Machines Corporation and 4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * others. All Rights Reserved. 5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ********************************************************************/ 6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// dcfmtest.cpp 9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Decimal Formatter tests, data driven. 11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "intltest.h" 14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_REGULAR_EXPRESSIONS 16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/regex.h" 18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/uchar.h" 19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/ustring.h" 20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/unistr.h" 21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/dcfmtsym.h" 22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/decimfmt.h" 23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/locid.h" 24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cmemory.h" 25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "dcfmtest.h" 26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "util.h" 27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cstring.h" 28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <stdlib.h> 29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <string.h> 30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <stdio.h> 31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <string> 33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include <iostream> 34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//--------------------------------------------------------------------------- 36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Test class boilerplate 38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//--------------------------------------------------------------------------- 40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)DecimalFormatTest::DecimalFormatTest() 41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)DecimalFormatTest::~DecimalFormatTest() 46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void DecimalFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) 52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (exec) logln("TestSuite DecimalFormatTest: "); 54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) switch (index) { 55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_FILE_IO 57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 0: name = "DataDrivenTests"; 58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (exec) DataDrivenTests(); 59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) break; 60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#else 61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 0: name = "skip"; 62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) break; 63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) default: name = ""; 66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) break; //needed to end loop 67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//--------------------------------------------------------------------------- 72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Error Checking / Reporting macros used in all of the tests. 74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//--------------------------------------------------------------------------- 76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define DF_CHECK_STATUS {if (U_FAILURE(status)) \ 77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) {dataerrln("DecimalFormatTest failure at line %d. status=%s", \ 78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) __LINE__, u_errorName(status)); return 0;}} 79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define DF_ASSERT(expr) {if ((expr)==FALSE) {errln("DecimalFormatTest failure at line %d.\n", __LINE__);};} 81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define DF_ASSERT_FAIL(expr, errcode) {UErrorCode status=U_ZERO_ERROR; (expr);\ 83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)if (status!=errcode) {dataerrln("DecimalFormatTest failure at line %d. Expected status=%s, got %s", \ 84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) __LINE__, u_errorName(errcode), u_errorName(status));};} 85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define DF_CHECK_STATUS_L(line) {if (U_FAILURE(status)) {errln( \ 87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "DecimalFormatTest failure at line %d, from %d. status=%d\n",__LINE__, (line), status); }} 88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define DF_ASSERT_L(expr, line) {if ((expr)==FALSE) { \ 90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("DecimalFormatTest failure at line %d, from %d.", __LINE__, (line)); return;}} 91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// InvariantStringPiece 96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Wrap a StringPiece around the extracted invariant data of a UnicodeString. 97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// The data is guaranteed to be nul terminated. (This is not true of StringPiece 98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// in general, but is true of InvariantStringPiece) 99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class InvariantStringPiece: public StringPiece { 101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) public: 102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) InvariantStringPiece(const UnicodeString &s); 103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ~InvariantStringPiece() {}; 104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) private: 105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) MaybeStackArray<char, 20> buf; 106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)InvariantStringPiece::InvariantStringPiece(const UnicodeString &s) { 109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t len = s.length(); 110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (len+1 > buf.getCapacity()) { 111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf.resize(len+1); 112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Buffer size is len+1 so that s.extract() will nul-terminate the string. 114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) s.extract(0, len, buf.getAlias(), len+1, US_INV); 115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) this->set(buf, len); 116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// UnicodeStringPiece 120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Wrap a StringPiece around the extracted (to the default charset) data of 121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// a UnicodeString. The extracted data is guaranteed to be nul terminated. 122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// (This is not true of StringPiece in general, but is true of UnicodeStringPiece) 123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class UnicodeStringPiece: public StringPiece { 125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) public: 126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UnicodeStringPiece(const UnicodeString &s); 127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ~UnicodeStringPiece() {}; 128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) private: 129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) MaybeStackArray<char, 20> buf; 130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}; 131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UnicodeStringPiece::UnicodeStringPiece(const UnicodeString &s) { 133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t len = s.length(); 134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t capacity = buf.getCapacity(); 135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t requiredCapacity = s.extract(0, len, buf.getAlias(), capacity) + 1; 136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (capacity < requiredCapacity) { 137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) buf.resize(requiredCapacity); 138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) capacity = requiredCapacity; 139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) s.extract(0, len, buf.getAlias(), capacity); 140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) this->set(buf, requiredCapacity - 1); 142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//--------------------------------------------------------------------------- 147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// DataDrivenTests 149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// The test cases are in a separate data file, 150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//--------------------------------------------------------------------------- 152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Translate a Formattable::type enum value to a string, for error message formatting. 154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char *formattableType(Formattable::Type typ) { 155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) static const char *types[] = {"kDate", 156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "kDouble", 157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "kLong", 158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "kString", 159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "kArray", 160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "kInt64", 161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "kObject" 162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }; 163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (typ<0 || typ>Formattable::kObject) { 164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return "Unknown"; 165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return types[typ]; 167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)const char * 170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)DecimalFormatTest::getPath(char *buffer, const char *filename) { 171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode status=U_ZERO_ERROR; 172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const char *testDataDirectory = IntlTest::getSourceTestData(status); 173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DF_CHECK_STATUS; 174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) strcpy(buffer, testDataDirectory); 176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) strcat(buffer, filename); 177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return buffer; 178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void DecimalFormatTest::DataDrivenTests() { 181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char tdd[2048]; 182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const char *srcPath; 183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode status = U_ZERO_ERROR; 184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t lineNum = 0; 185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Open and read the test data file. 188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) srcPath=getPath(tdd, "dcfmtest.txt"); 190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if(srcPath==NULL) { 191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; /* something went wrong, error already output */ 192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t len; 195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar *testData = ReadAndConvertFile(srcPath, len, status); 196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; /* something went wrong, error already output */ 198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Put the test data into a UnicodeString 202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UnicodeString testString(FALSE, testData, len); 204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RegexMatcher parseLineMat(UnicodeString( 206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "(?i)\\s*parse\\s+" 207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "\"([^\"]*)\"\\s+" // Capture group 1: input text 208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "([ild])\\s+" // Capture group 2: expected parsed type 209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "\"([^\"]*)\"\\s+" // Capture group 3: expected parsed decimal 210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "\\s*(?:#.*)?"), // Trailing comment 211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 0, status); 212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RegexMatcher formatLineMat(UnicodeString( 214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "(?i)\\s*format\\s+" 215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "(\\S+)\\s+" // Capture group 1: pattern 216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "(ceiling|floor|down|up|halfeven|halfdown|halfup|default)\\s+" // Capture group 2: Rounding Mode 217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "\"([^\"]*)\"\\s+" // Capture group 3: input 218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "\"([^\"]*)\"" // Capture group 4: expected output 219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "\\s*(?:#.*)?"), // Trailing comment 220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 0, status); 221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RegexMatcher commentMat (UNICODE_STRING_SIMPLE("\\s*(#.*)?$"), 0, status); 223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RegexMatcher lineMat(UNICODE_STRING_SIMPLE("(?m)^(.*?)$"), testString, 0, status); 224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)){ 226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) dataerrln("Construct RegexMatcher() error."); 227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete [] testData; 228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Loop over the test data file, once per line. 233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) while (lineMat.find()) { 235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum++; 236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("File dcfmtest.txt, line %d: ICU Error \"%s\"", lineNum, u_errorName(status)); 238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ZERO_ERROR; 241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UnicodeString testLine = lineMat.group(1, status); 242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // printf("%s\n", UnicodeStringPiece(testLine).data()); 243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (testLine.length() == 0) { 244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) continue; 245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Parse the test line. Skip blank and comment only lines. 249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Separate out the three main fields - pattern, flags, target. 250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) commentMat.reset(testLine); 253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (commentMat.lookingAt(status)) { 254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // This line is a comment, or blank. 255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) continue; 256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Handle "parse" test case line from file 261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) parseLineMat.reset(testLine); 263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (parseLineMat.lookingAt(status)) { 264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) execParseTest(lineNum, 265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) parseLineMat.group(1, status), // input 266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) parseLineMat.group(2, status), // Expected Type 267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) parseLineMat.group(3, status), // Expected Decimal String 268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status 269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ); 270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) continue; 271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Handle "format" test case line 275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) formatLineMat.reset(testLine); 277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (formatLineMat.lookingAt(status)) { 278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) execFormatTest(lineNum, 279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) formatLineMat.group(1, status), // Pattern 280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) formatLineMat.group(2, status), // rounding mode 281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) formatLineMat.group(3, status), // input decimal number 282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) formatLineMat.group(4, status), // expected formatted result 283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status); 284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) continue; 285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Line is not a recognizable test case. 289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("Badly formed test case at line %d.\n%s\n", 291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, UnicodeStringPiece(testLine).data()); 292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete [] testData; 296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void DecimalFormatTest::execParseTest(int32_t lineNum, 301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &inputText, 302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &expectedType, 303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &expectedDecimal, 304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode &status) { 305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DecimalFormatSymbols symbols(Locale::getUS(), status); 311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UnicodeString pattern = UNICODE_STRING_SIMPLE("####"); 312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DecimalFormat format(pattern, symbols, status); 313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Formattable result; 314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.txt, line %d: %s error creating the formatter.", 316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, u_errorName(status)); 317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ParsePosition pos; 321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t expectedParseEndPosition = inputText.length(); 322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) format.parse(inputText, result, pos); 324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (expectedParseEndPosition != pos.getIndex()) { 326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.txt, line %d: Expected parse position afeter parsing: %d. " 327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) "Actual parse position: %d", expectedParseEndPosition, pos.getIndex()); 328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char expectedTypeC[2]; 332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) expectedType.extract(0, 1, expectedTypeC, 2, US_INV); 333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Formattable::Type expectType = Formattable::kDate; 334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) switch (expectedTypeC[0]) { 335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 'd': expectType = Formattable::kDouble; break; 336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 'i': expectType = Formattable::kLong; break; 337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) case 'l': expectType = Formattable::kInt64; break; 338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) default: 339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.tx, line %d: unrecongized expected type \"%s\"", 340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, InvariantStringPiece(expectedType).data()); 341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (result.getType() != expectType) { 344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.txt, line %d: expectedParseType(%s) != actual parseType(%s)", 345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, formattableType(expectType), formattableType(result.getType())); 346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) StringPiece decimalResult = result.getDecimalNumber(status); 350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("File %s, line %d: error %s. Line in file dcfmtest.txt: %d:", 352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) __FILE__, __LINE__, u_errorName(status), lineNum); 353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) InvariantStringPiece expectedResults(expectedDecimal); 357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (decimalResult != expectedResults) { 358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.txt, line %d: expected \"%s\", got \"%s\"", 359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, expectedResults.data(), decimalResult.data()); 360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void DecimalFormatTest::execFormatTest(int32_t lineNum, 367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &pattern, // Pattern 368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &round, // rounding mode 369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &input, // input decimal number 370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &expected, // expected formatted result 371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode &status) { 372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DecimalFormatSymbols symbols(Locale::getUS(), status); 377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // printf("Pattern = %s\n", UnicodeStringPiece(pattern).data()); 378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) DecimalFormat fmtr(pattern, symbols, status); 379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.txt, line %d: %s error creating the formatter.", 381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, u_errorName(status)); 382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (round=="ceiling") { 385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.setRoundingMode(DecimalFormat::kRoundCeiling); 386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (round=="floor") { 387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.setRoundingMode(DecimalFormat::kRoundFloor); 388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (round=="down") { 389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.setRoundingMode(DecimalFormat::kRoundDown); 390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (round=="up") { 391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.setRoundingMode(DecimalFormat::kRoundUp); 392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (round=="halfeven") { 393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.setRoundingMode(DecimalFormat::kRoundHalfEven); 394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (round=="halfdown") { 395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.setRoundingMode(DecimalFormat::kRoundHalfDown); 396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (round=="halfup") { 397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.setRoundingMode(DecimalFormat::kRoundHalfUp); 398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else if (round=="default") { 399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // don't set any value. 400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.setRoundingMode(DecimalFormat::kRoundFloor); 402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.txt, line %d: Bad rounding mode \"%s\"", 403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, UnicodeStringPiece(round).data()); 404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UnicodeString result; 407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UnicodeStringPiece spInput(input); 408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //fmtr.format(spInput, result, NULL, status); 409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) Formattable fmtbl; 411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtbl.setDecimalNumber(spInput, status); 412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) //NumberFormat &nfmtr = fmtr; 413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fmtr.format(fmtbl, result, NULL, status); 414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.txt, line %d: format() returned %s.", 417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, u_errorName(status)); 418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (result != expected) { 422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("file dcfmtest.txt, line %d: expected \"%s\", got \"%s\"", 423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) lineNum, UnicodeStringPiece(expected).data(), UnicodeStringPiece(result).data()); 424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//------------------------------------------------------------------------------- 429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// Read a text data file, convert it from UTF-8 to UChars, and return the data 431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// in one big UChar * buffer, which the caller must delete. 432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// (Lightly modified version of a similar function in regextst.cpp) 434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// 435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//-------------------------------------------------------------------------------- 436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UChar *DecimalFormatTest::ReadAndConvertFile(const char *fileName, int32_t &ulen, 437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode &status) { 438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UChar *retPtr = NULL; 439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) char *fileBuf = NULL; 440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const char *fileBufNoBOM = NULL; 441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) FILE *f = NULL; 442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ulen = 0; 444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return retPtr; 446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Open the file. 450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) f = fopen(fileName, "rb"); 452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (f == 0) { 453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) dataerrln("Error opening test data file %s\n", fileName); 454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_FILE_ACCESS_ERROR; 455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Read it in 459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t fileSize; 461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t amtRead; 462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) int32_t amtReadNoBOM; 463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fseek( f, 0, SEEK_END); 465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fileSize = ftell(f); 466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fileBuf = new char[fileSize]; 467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fseek(f, 0, SEEK_SET); 468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) amtRead = fread(fileBuf, 1, fileSize, f); 469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (amtRead != fileSize || fileSize <= 0) { 470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("Error reading test data file."); 471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) goto cleanUpAndReturn; 472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Look for a UTF-8 BOM on the data just read. 476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // The test data file is UTF-8. 477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // The BOM needs to be there in the source file to keep the Windows & 478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // EBCDIC machines happy, so force an error if it goes missing. 479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Many Linux editors will silently strip it. 480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fileBufNoBOM = fileBuf + 3; 482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) amtReadNoBOM = amtRead - 3; 483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (fileSize<3 || uprv_strncmp(fileBuf, "\xEF\xBB\xBF", 3) != 0) { 484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // TODO: restore this check. 485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("Test data file %s is missing its BOM", fileName); 486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fileBufNoBOM = fileBuf; 487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) amtReadNoBOM = amtRead; 488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Find the length of the input in UTF-16 UChars 492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // (by preflighting the conversion) 493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) u_strFromUTF8(NULL, 0, &ulen, fileBufNoBOM, amtReadNoBOM, &status); 495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Convert file contents from UTF-8 to UTF-16 498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // 499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (status == U_BUFFER_OVERFLOW_ERROR) { 500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Buffer Overflow is expected from the preflight operation. 501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ZERO_ERROR; 502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) retPtr = new UChar[ulen+1]; 503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) u_strFromUTF8(retPtr, ulen+1, NULL, fileBufNoBOM, amtReadNoBOM, &status); 504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)cleanUpAndReturn: 507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) fclose(f); 508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete[] fileBuf; 509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) errln("ICU Error \"%s\"\n", u_errorName(status)); 511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) delete retPtr; 512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) retPtr = NULL; 513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) }; 514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return retPtr; 515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */ 518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 519