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