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