1c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/******************************************************************** 2c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * COPYRIGHT: 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 2007-2011, International Business Machines Corporation and 4c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * others. All Rights Reserved. 5c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ********************************************************************/ 6c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 7c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/utypes.h" 8c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 9c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 10c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 11c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "plurults.h" 12c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "plurfmts.h" 13c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "cmemory.h" 14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/msgfmt.h" 15c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/plurrule.h" 16c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/plurfmt.h" 17c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 18c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PLURAL_PATTERN_DATA 4 19c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PLURAL_TEST_ARRAY_SIZE 256 20c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 21c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PLURAL_SYNTAX_DATA 8 22c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 23c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// The value must be same as PLKeywordLookups[] order. 24c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PFT_ZERO 0 25c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PFT_ONE 1 26c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PFT_TWO 2 27c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PFT_FEW 3 28c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PFT_MANY 4 29c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define PFT_OTHER 5 30c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 31c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid PluralFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) 32c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 33c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (exec) logln("TestSuite PluralFormat"); 34c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru switch (index) { 35c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TESTCASE(0, pluralFormatBasicTest); 36c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TESTCASE(1, pluralFormatUnitTest); 37c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TESTCASE(2, pluralFormatLocaleTest); 38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE(3, pluralFormatExtendedTest); 39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE(4, pluralFormatExtendedParseTest); 40c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru default: name = ""; 41c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 42c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 43c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 44c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 45c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/** 46c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Test various generic API methods of PluralFormat for Basic usage. 47c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 48c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid PluralFormatTest::pluralFormatBasicTest(/*char *par*/) 49c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 50c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status[8]; 51c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralFormat* plFmt[8]; 52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Locale locale = Locale::getDefault(); 53c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString otherPattern = UnicodeString("other{#}"); 54c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString message=UnicodeString("ERROR: PluralFormat basic test"); 55c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ========= Test constructors 57c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln(" Testing PluralFormat constructors ..."); 58c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status[0] = U_ZERO_ERROR; 59c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralRules* plRules = PluralRules::createDefaultRules(status[0]); 60c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 61c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status[0] = U_ZERO_ERROR; 62c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru NumberFormat *numFmt = NumberFormat::createInstance(status[0]); 63c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status[0])) { 64c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: Could not create NumberFormat instance with default locale "); 6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 66c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 67c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=0; i< 8; ++i) { 68c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status[i] = U_ZERO_ERROR; 69c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 70c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[0] = new PluralFormat(status[0]); 71c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[1] = new PluralFormat(*plRules, status[1]); 72c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[2] = new PluralFormat(locale, status[2]); 73c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[3] = new PluralFormat(locale, *plRules, status[3]); 74c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[4] = new PluralFormat(otherPattern, status[4]); 75c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[5] = new PluralFormat(*plRules, otherPattern, status[5]); 76c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[6] = new PluralFormat(locale, otherPattern, status[6]); 77c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[7] = new PluralFormat(locale, *plRules, otherPattern, status[7]); 78c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 79c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=0; i< 8; ++i) { 80c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_SUCCESS(status[i])) { 81c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numberFormatTest(plFmt[i], numFmt, 1, 12, NULL, NULL, FALSE, &message); 82c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numberFormatTest(plFmt[i], numFmt, 100, 112, NULL, NULL, FALSE, &message); 83c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 84c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 85c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: PluralFormat constructor failed!"); 86c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 87c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete plFmt[i]; 88c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 89c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======= Test clone, assignment operator && == operator. 90c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[0]= new PluralFormat(status[0]); 9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho plFmt[0]->setNumberFormat(numFmt,status[0]); 9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString us = UnicodeString(""); 9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho plFmt[0]->toPattern(us); 94c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt[1]= new PluralFormat(locale, status[1]); 95c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( U_SUCCESS(status[0]) && U_SUCCESS(status[1]) ) { 96c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *plFmt[1] = *plFmt[0]; 97c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (plFmt[1]!=NULL) { 98c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( *plFmt[1] != *plFmt[0] ) { 99c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("ERROR: clone plural format test failed!"); 100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 101c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 102c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 103c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 1046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("ERROR: PluralFormat constructor failed! - [0]%s [1]%s", u_errorName(status[0]), u_errorName(status[1])); 105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 10627f654740f2a26ad62a5c155af9199af9e69b889claireho delete plFmt[0]; 10727f654740f2a26ad62a5c155af9199af9e69b889claireho 10827f654740f2a26ad62a5c155af9199af9e69b889claireho status[0] = U_ZERO_ERROR; 10927f654740f2a26ad62a5c155af9199af9e69b889claireho plFmt[0]= new PluralFormat(locale, status[0]); 11027f654740f2a26ad62a5c155af9199af9e69b889claireho if ( U_SUCCESS(status[0]) ) { 11127f654740f2a26ad62a5c155af9199af9e69b889claireho *plFmt[1] = *plFmt[0]; 112c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (plFmt[1]!=NULL) { 11327f654740f2a26ad62a5c155af9199af9e69b889claireho if ( *plFmt[1] != *plFmt[0] ) { 114c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("ERROR: assignment operator test failed!"); 115c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 116c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 117c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 118c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 1196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("ERROR: PluralFormat constructor failed! - %s", u_errorName(status[1])); 120c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if ( U_SUCCESS(status[1]) ) { 12327f654740f2a26ad62a5c155af9199af9e69b889claireho plFmt[2] = (PluralFormat*) plFmt[1]->clone(); 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (plFmt[1]!=NULL) { 12627f654740f2a26ad62a5c155af9199af9e69b889claireho if ( *plFmt[1] != *plFmt[2] ) { 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("ERROR: clone function test failed!"); 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete plFmt[1]; 13127f654740f2a26ad62a5c155af9199af9e69b889claireho delete plFmt[2]; 13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else { 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln("ERROR: PluralFormat clone failed! - %s", u_errorName(status[1])); 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete plFmt[0]; 138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete numFmt; 139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete plRules; 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Tests parseObject 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode stat = U_ZERO_ERROR; 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho PluralFormat *pf = new PluralFormat(stat); 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Formattable *f = new Formattable(); 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ParsePosition *pp = new ParsePosition(); 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pf->parseObject((UnicodeString)"",*f,*pp); 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(stat)) { 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln("ERROR: PluralFormat::parseObject: %s", u_errorName(stat)); 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete pf; 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete f; 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete pp; 153c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/** 156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Unit tests of PluralFormat class. 157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid PluralFormatTest::pluralFormatUnitTest(/*char *par*/) 159c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 160c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString patternTestData[PLURAL_PATTERN_DATA] = { 161c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("odd {# is odd.} other{# is even.}"), 162c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("other{# is odd or even.}"), 163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("odd{The number {0, number, #.#0} is odd.}other{The number {0, number, #.#0} is even.}"), 164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UNICODE_STRING_SIMPLE("odd{The number {1, number, #} is odd.}other{The number {2, number, #} is even.}"), 165c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 166c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString patternOddTestResult[PLURAL_PATTERN_DATA] = { 167c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE(" is odd."), 168c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE(" is odd or even."), 169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("The number {0, number, #.#0} is odd."), 170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UNICODE_STRING_SIMPLE("The number {1, number, #} is odd."), 171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString patternEvenTestResult[PLURAL_PATTERN_DATA] = { 173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE(" is even."), 174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE(" is odd or even."), 175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("The number {0, number, #.#0} is even."), 176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UNICODE_STRING_SIMPLE("The number {2, number, #} is even."), 177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString checkSyntaxtData[PLURAL_SYNTAX_DATA] = { 179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // ICU 4.8 does not check for duplicate keywords any more. 180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho //UNICODE_STRING_SIMPLE("odd{foo} odd{bar} other{foobar}"), 181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho //UNICODE_STRING_SIMPLE("odd{foo} other{bar} other{foobar}"), 182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("odd{foo}"), 183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // ICU 4.8 does not check for unknown keywords any more. 184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho //UNICODE_STRING_SIMPLE("otto{foo} other{bar}"), 185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UNICODE_STRING_SIMPLE("*odd{foo} other{bar}"), 186c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("odd{foo},other{bar}"), 187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("od d{foo} other{bar}"), 188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("odd{foo}{foobar}other{foo}"), 189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 19250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString oddAndEvenRule = UNICODE_STRING_SIMPLE("odd: n mod 2 is 1"); 193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralRules* plRules = PluralRules::createRules(oddAndEvenRule, status); 194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: create PluralRules instance failed in unit tests.- exitting"); 196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 198c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 199c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======= Test PluralRules pattern syntax. 200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing PluralRules pattern syntax."); 201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=0; i<PLURAL_SYNTAX_DATA; ++i) { 202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralFormat plFmt=PluralFormat(*plRules, status); 205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: PluralFormat constructor failed in unit tests.- exitting"); 207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt.applyPattern(checkSyntaxtData[i], status); 210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_SUCCESS(status)) { 211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("ERROR: PluralFormat failed to detect syntax error with pattern: "+checkSyntaxtData[i]); 212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 214c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 215c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 216c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 217c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======= Test applying various pattern 218c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing various patterns"); 219c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 220c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool overwrite[PLURAL_PATTERN_DATA] = {FALSE, FALSE, TRUE, TRUE}; 221c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru NumberFormat *numFmt = NumberFormat::createInstance(status); 223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString message=UnicodeString("ERROR: PluralFormat tests various pattern ..."); 224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: Could not create NumberFormat instance with default locale "); 226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 227c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for(int32_t i=0; i<PLURAL_PATTERN_DATA; ++i) { 228c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 229c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralFormat plFmt=PluralFormat(*plRules, status); 230c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 231c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: PluralFormat constructor failed in unit tests.- exitting"); 232c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 233c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 234c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plFmt.applyPattern(patternTestData[i], status); 235c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 236c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("ERROR: PluralFormat failed to apply pattern- "+patternTestData[i]); 237c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru continue; 238c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 239c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numberFormatTest(&plFmt, numFmt, 1, 10, (UnicodeString *)&patternOddTestResult[i], 240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (UnicodeString *)&patternEvenTestResult[i], overwrite[i], &message); 241c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 242c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete plRules; 243c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete numFmt; 244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======= Test set locale 246c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 247c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plRules = PluralRules::createRules(UNICODE_STRING_SIMPLE("odd: n mod 2 is 1"), status); 248c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralFormat pluralFmt = PluralFormat(*plRules, status); 249c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 250c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: Could not create PluralFormat instance in setLocale() test - exitting. "); 251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete plRules; 252c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 253c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralFmt.applyPattern(UNICODE_STRING_SIMPLE("odd{odd} other{even}"), status); 255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralFmt.setLocale(Locale::getEnglish(), status); 256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 257c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: Could not setLocale() with English locale "); 258c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete plRules; 259c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 261c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru message = UNICODE_STRING_SIMPLE("Error set locale: pattern is not reset!"); 262c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 263c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // Check that pattern gets deleted. 264c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("\n Test setLocale() ..\n"); 265c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numFmt = NumberFormat::createInstance(Locale::getEnglish(), status); 266c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 267c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: Could not create NumberFormat instance with English locale "); 268c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numberFormatTest(&pluralFmt, numFmt, 5, 5, NULL, NULL, FALSE, &message); 270c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralFmt.applyPattern(UNICODE_STRING_SIMPLE("odd__{odd} other{even}"), status); 271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (pluralFmt.format((int32_t)1, status) != UNICODE_STRING_SIMPLE("even")) { 272c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("SetLocale should reset rules but did not."); 273c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 274c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 275c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralFmt.applyPattern(UNICODE_STRING_SIMPLE("one{one} other{not one}"), status); 276c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 277c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("SetLocale should reset rules but did not."); 278c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString one = UNICODE_STRING_SIMPLE("one"); 280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString notOne = UNICODE_STRING_SIMPLE("not one"); 281c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString plResult, numResult; 282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=0; i<20; ++i) { 283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plResult = pluralFmt.format(i, status); 284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( i==1 ) { 285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numResult = one; 286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numResult = notOne; 289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( numResult != plResult ) { 291c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("Wrong ruleset loaded by setLocale() - got:"+plResult+ UnicodeString(" expecting:")+numResult); 292c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 295c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // =========== Test copy constructor 296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Test copy constructor and == operator of PluralFormat"); 297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralFormat dupPFmt = PluralFormat(pluralFmt); 298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (pluralFmt != dupPFmt) { 299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("Failed in PluralFormat copy constructor or == operator"); 300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete plRules; 303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete numFmt; 304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/** 309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Test locale data used in PluralFormat class. 310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruPluralFormatTest::pluralFormatLocaleTest(/*char *par*/) 313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t pluralResults[PLURAL_TEST_ARRAY_SIZE]; // 0: is for default 315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======= Test DefaultRule 317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing PluralRules with no rule."); 318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* oneRuleLocales[4] = {"ja", "ko", "tr", "vi"}; 319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString testPattern = UNICODE_STRING_SIMPLE("other{other}"); 320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_OTHER; // other 322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(oneRuleLocales, 4, testPattern, pluralResults); 323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ====== Test Singular1 locales. 325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing singular1 locales."); 32650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char* singular1Locales[52] = {"bem","da","de","el","en","eo","es","et","fi", 32750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "fo","gl","he","it","nb","nl","nn","no","pt","pt_PT","sv","af","bg","bn","ca","eu","fur","fy", 32850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "gu","ha","is","ku","lb","ml","mr","nah","ne","om","or","pa","pap","ps","so","sq","sw","ta", 32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "te","tk","ur","zu","mn","gsw","rm"}; 330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} other{other}"); 331c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_OTHER; 333c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 334c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[2]= PFT_OTHER; 33550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho helperTestRusults(singular1Locales, 52, testPattern, pluralResults); 336c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test Singular01 locales. 338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing singular1 locales."); 33950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char* singular01Locales[3] = {"ff","fr","kab"}; 340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} other{other}"); 341c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_ONE; 343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[2]= PFT_OTHER; 34450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho helperTestRusults(singular01Locales, 3, testPattern, pluralResults); 345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test ZeroSingular locales. 347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing singular1 locales."); 348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* zeroSingularLocales[1] = {"lv"}; 349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("zero{zero} one{one} other{other}"); 350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_ZERO; 352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[2]= PFT_OTHER; 354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=2; i<20; ++i) { 355c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (i==11) continue; 356c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+1] = PFT_ONE; 357c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+2] = PFT_OTHER; 358c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(zeroSingularLocales, 1, testPattern, pluralResults); 360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 361c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test singular dual locales. 362c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing singular1 locales."); 363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* singularDualLocales[1] = {"ga"}; 364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} two{two} other{other}"); 365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 366c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_OTHER; 367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[2]= PFT_TWO; 369c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[3]= PFT_OTHER; 370c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(singularDualLocales, 1, testPattern, pluralResults); 371c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 372c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test Singular Zero Some locales. 373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing singular1 locales."); 374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* singularZeroSomeLocales[1] = {"ro"}; 375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("few{few} one{one} other{other}"); 376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_FEW; 378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=1; i<20; ++i) { 379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (i==11) continue; 380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i] = PFT_FEW; 381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[100+i] = PFT_FEW; 382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 383c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 384c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(singularZeroSomeLocales, 1, testPattern, pluralResults); 385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 386c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test Special 12/19. 387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing special 12 and 19."); 388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* special12_19Locales[1] = {"lt"}; 389c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} few{few} other{other}"); 390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_OTHER; 392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 393c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[2]= PFT_FEW; 394c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[10]= PFT_OTHER; 395c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=2; i<20; ++i) { 396c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (i==11) continue; 397c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+1] = PFT_ONE; 398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+2] = PFT_FEW; 399c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[(i+1)*10] = PFT_OTHER; 400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(special12_19Locales, 1, testPattern, pluralResults); 402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test Paucal Except 11 14. 404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing Paucal Except 11 and 14."); 405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* paucal01Locales[4] = {"hr","ru","sr","uk"}; 406c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} many{many} few{few} other{other}"); 407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_MANY; 409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[2]= PFT_FEW; 411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[5]= PFT_MANY; 412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[6]= PFT_MANY; 413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[7]= PFT_MANY; 414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[8]= PFT_MANY; 415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[9]= PFT_MANY; 416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=2; i<20; ++i) { 417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (i==11) continue; 418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+1] = PFT_ONE; 419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+2] = PFT_FEW; 420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+5] = PFT_MANY; 421c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+6] = PFT_MANY; 422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+7] = PFT_MANY; 423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+8] = PFT_MANY; 424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+9] = PFT_MANY; 425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(paucal01Locales, 4, testPattern, pluralResults); 427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test Singular Paucal. 429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing Singular Paucal."); 430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* singularPaucalLocales[2] = {"cs","sk"}; 431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} few{few} other{other}"); 432c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 433c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_OTHER; 434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[2]= PFT_FEW; 436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[5]= PFT_OTHER; 437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(singularPaucalLocales, 2, testPattern, pluralResults); 438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test Paucal (1), (2,3,4). 440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing Paucal (1), (2,3,4)."); 441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* paucal02Locales[1] = {"pl"}; 442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} few{few} other{other}"); 443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_OTHER; 445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 446c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[5]= PFT_OTHER; 447c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=0; i<20; ++i) { 44850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if ((i==1)||(i==11)) { 449c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+2] = PFT_OTHER; 450c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+3] = PFT_OTHER; 451c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+4] = PFT_OTHER; 452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 453c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 454c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+2] = PFT_FEW; 455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+3] = PFT_FEW; 456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+4] = PFT_FEW; 457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[i*10+5] = PFT_OTHER; 458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(paucal02Locales, 1, testPattern, pluralResults); 461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 462c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======== Test Paucal (1), (2), (3,4). 463c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing Paucal (1), (2), (3,4)."); 464c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* paucal03Locales[1] = {"sl"}; 465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} two{two} few{few} other{other}"); 466c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_memset(pluralResults, -1, sizeof(pluralResults)); 467c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[0]= PFT_OTHER; 468c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[1]= PFT_ONE; 469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[2]= PFT_TWO; 470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[3]= PFT_FEW; 471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[5]= PFT_OTHER; 472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[101]= PFT_ONE; 473c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[102]= PFT_TWO; 474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[103]= PFT_FEW; 475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru pluralResults[105]= PFT_OTHER; 476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru helperTestRusults(paucal03Locales, 1, testPattern, pluralResults); 477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // TODO: move this test to Unit Test after CLDR 1.6 is final and we support float 479c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // ======= Test French "WITHIN rule 480c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln("Testing PluralRules with fr rule."); 481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru testPattern = UNICODE_STRING_SIMPLE("one{one} other{other}"); 482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Locale ulocale((const char *)"fr"); 483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralFormat plFmt(ulocale, testPattern, status); 485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 4866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Failed to apply pattern to fr locale - %s", u_errorName(status)); 487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString plResult = plFmt.format(0.0, status); // retrun ONE 491c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plResult = plFmt.format(0.5, status); // retrun ONE 492c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plResult = plFmt.format(1.0, status); // retrun ONE 493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plResult = plFmt.format(1.9, status); // retrun ONE 494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plResult = plFmt.format(2.0, status); // retrun OTHER 495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 499b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPluralFormatTest::pluralFormatExtendedTest(void) { 500b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char *targets[] = { 501b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "There are no widgets.", 502b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "There is one widget.", 503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "There is a bling widget and one other widget.", 504b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "There is a bling widget and 2 other widgets.", 505b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "There is a bling widget and 3 other widgets.", 506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "Widgets, five (5-1=4) there be.", 507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "There is a bling widget and 5 other widgets.", 508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "There is a bling widget and 6 other widgets.", 509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char* fmt = 512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "offset:1.0 " 513b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "=0 {There are no widgets.} " 514b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "=1.0 {There is one widget.} " 515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "=5 {Widgets, five (5-1=#) there be.} " 516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "one {There is a bling widget and one other widget.} " 517b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "other {There is a bling widget and # other widgets.}"; 518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString fmtString(fmt, -1, US_INV); 521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho PluralFormat pf(Locale::getEnglish(), fmtString, status); 522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho MessageFormat mf(UNICODE_STRING_SIMPLE("{0,plural,").append(fmtString).append((UChar)0x7d /* '}' */), 523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho Locale::getEnglish(), status); 524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho Formattable args; 525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho FieldPosition ignore; 526b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dataerrln("Failed to apply pattern - %s", u_errorName(status)); 528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 530b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (int32_t i = 0; i < 7; ++i) { 531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString result = pf.format(i, status); 532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("PluralFormat.format(value %d) failed - %s", i, u_errorName(status)); 534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString expected(targets[i], -1, US_INV); 537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (expected != result) { 538b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString message("PluralFormat.format(): Expected '", -1, US_INV); 539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho message.append(expected); 540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho message.append(UnicodeString("' but got '", -1, US_INV)); 541b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho message.append(result); 542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho message.append("'", -1, US_INV); 543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln(message); 544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args.setLong(i); 546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mf.format(&args, 1, result.remove(), ignore, status); 547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("MessageFormat.format(value %d) failed - %s", i, u_errorName(status)); 549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 551b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (expected != result) { 552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString message("MessageFormat.format(): Expected '", -1, US_INV); 553b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho message.append(expected); 554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho message.append(UnicodeString("' but got '", -1, US_INV)); 555b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho message.append(result); 556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho message.append("'", -1, US_INV); 557b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln(message); 558b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 559b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 560b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 562b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 563b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoPluralFormatTest::pluralFormatExtendedParseTest(void) { 564b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char *failures[] = { 565b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "offset:1..0 =0 {Foo}", 566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "offset:1.0 {Foo}", 567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "=0= {Foo}", 568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "=0 {Foo} =0.0 {Bar}", 569b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho " = {Foo}", 570b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 571b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int len = sizeof(failures)/sizeof(failures[0]); 572b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 573b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (int i = 0; i < len; ++i) { 574b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 575b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString fmt(failures[i], -1, US_INV); 576b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho PluralFormat pf(fmt, status); 577b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_SUCCESS(status)) { 578b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("expected failure when parsing '" + fmt + "'"); 579b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 580b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 581b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruPluralFormatTest::numberFormatTest(PluralFormat* plFmt, 585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru NumberFormat *numFmt, 586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t start, 587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t end, 588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString *numOddAppendStr, 589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString *numEvenAppendStr, 590c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool overwrite, // overwrite the numberFormat.format result 591c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString *message) { 592c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 593c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( (plFmt==NULL) || (numFmt==NULL) ) { 595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dataerrln("ERROR: Could not create PluralFormat or NumberFormat - exitting"); 596c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString plResult, numResult ; 599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=start; i<= end; ++i ) { 601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numResult.remove(); 602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numResult = numFmt->format(i, numResult); 603c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plResult = plFmt->format(i, status); 604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ((numOddAppendStr!= NULL)&&(numEvenAppendStr!=NULL)) { 605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (overwrite) { 606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (i&1) { 607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numResult = *numOddAppendStr; 608c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numResult = *numEvenAppendStr; 611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 612c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { // Append the string 614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (i&1) { 615c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numResult += *numOddAppendStr; 616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 617c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else{ 618c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru numResult += *numEvenAppendStr; 619c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 620c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 621c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 622c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( (numResult!=plResult) || U_FAILURE(status) ) { 623c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if ( message == NULL ) { 624c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("ERROR: Unexpected plural format - got:"+plResult+ UnicodeString(" expecting:")+numResult); 625c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 626c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru else { 627c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln( *message+UnicodeString(" got:")+plResult+UnicodeString(" expecting:")+numResult); 628c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 629c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 631c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 632c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 633c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 634c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 635c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 636c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid 637c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruPluralFormatTest::helperTestRusults(const char** localeArray, 638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t capacityOfArray, 639c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString& testPattern, 640c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t *expResults) { 641c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status; 642c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString plResult; 643c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const UnicodeString PLKeywordLookups[6] = { 644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("zero"), 645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("one"), 646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("two"), 647c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("few"), 648c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("many"), 649c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("other"), 650c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 651c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 652c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=0; i<capacityOfArray; ++i) { 653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char *locale = localeArray[i]; 654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Locale ulocale((const char *)locale); 655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 656c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PluralFormat plFmt(ulocale, testPattern, status); 657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 6586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Failed to apply pattern to locale:"+UnicodeString(localeArray[i]) + " - " + u_errorName(status)); 659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru continue; 660c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 661c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t n=0; n<PLURAL_TEST_ARRAY_SIZE; ++n) { 662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (expResults[n]!=-1) { 663c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 664c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plResult = plFmt.format(n, status); 665c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 666c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("ERROR: Failed to format number in locale data tests with locale: "+ 667c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(localeArray[i])); 668c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 669c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (plResult != PLKeywordLookups[expResults[n]]){ 670c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru plResult = plFmt.format(n, status); 671c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("ERROR: Unexpected format result in locale: "+UnicodeString(localeArray[i])+ 672c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(" got:")+plResult+ UnicodeString(" expecting:")+ 673c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PLKeywordLookups[expResults[n]]); 674c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 675c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 676c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 677c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 678c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 679c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 680c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 681