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