1b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/********************************************************************
2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 2011, International Business Machines Corporation
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * and others. All Rights Reserved.
4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ********************************************************************/
5b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* C API TEST FOR PLURAL RULES */
6b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/utypes.h"
8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if !UCONFIG_NO_FORMATTING
10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/upluralrules.h"
12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/ustring.h"
13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "cintltst.h"
14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "cmemory.h"
15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestPluralRules(void);
17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid addPluralRulesTest(TestNode** root);
19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define TESTCASE(x) addTest(root, &x, "tsformat/cpluralrulestest/" #x)
21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid addPluralRulesTest(TestNode** root)
23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE(TestPluralRules);
25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char * locale;
29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double       number;
30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char * keywordExpected;
31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} PluralRulesTestItem;
32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Just a small set of tests for now, other functionality is tested in the C++ tests */
34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const PluralRulesTestItem testItems[] = {
35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en",   0, "other" },
36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en", 0.5, "other" },
37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en",   1, "one" },
38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en", 1.5, "other" },
39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en",   2, "other" },
40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr",   0, "one" },
41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr", 0.5, "one" },
42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr",   1, "one" },
43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr", 1.5, "one" },
44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr",   2, "other" },
45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ru",   0, "many" },
46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ru", 0.5, "other" },
47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ru",   1, "one" },
48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ru", 1.5, "other" },
49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ru",   2, "few" },
50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ru",   5, "many" },
51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ru",  10, "many" },
52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ru",  11, "many" },
53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { NULL,   0, NULL }
54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum {
57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    kKeywordBufLen = 32
58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestPluralRules()
61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const PluralRulesTestItem * testItemPtr;
63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_verbose("\nTesting uplrules_open() and uplrules_select() with various parameters\n");
64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for ( testItemPtr = testItems; testItemPtr->locale != NULL; ++testItemPtr ) {
65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status = U_ZERO_ERROR;
66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UPluralRules* uplrules = uplrules_open(testItemPtr->locale, &status);
67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if ( U_SUCCESS(status) ) {
68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UChar keyword[kKeywordBufLen];
69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UChar keywordExpected[kKeywordBufLen];
70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t keywdLen = uplrules_select(uplrules, testItemPtr->number, keyword, kKeywordBufLen, &status);
71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (keywdLen >= kKeywordBufLen) {
72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                keyword[kKeywordBufLen-1] = 0;
73b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
74b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if ( U_SUCCESS(status) ) {
75b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                u_unescape(testItemPtr->keywordExpected, keywordExpected, kKeywordBufLen);
76b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if ( u_strcmp(keyword, keywordExpected) != 0 ) {
77b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    char bcharBuf[kKeywordBufLen];
78b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_data_err("ERROR: uplrules_select for locale %s, number %.1f: expect %s, get %s\n",
79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                             testItemPtr->locale, testItemPtr->number, testItemPtr->keywordExpected, u_austrcpy(bcharBuf,keyword) );
80b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
81b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("FAIL: uplrules_select for locale %s, number %.1f: %s\n",
83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        testItemPtr->locale, testItemPtr->number, myErrorName(status) );
84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            uplrules_close(uplrules);
86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("FAIL: uplrules_open for locale %s: %s\n", testItemPtr->locale, myErrorName(status) );
88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif /* #if !UCONFIG_NO_FORMATTING */
93