]>
Commit | Line | Data |
---|---|---|
4388f060 | 1 | /******************************************************************** |
57a6839d | 2 | * Copyright (c) 2011-2014, International Business Machines Corporation |
4388f060 A |
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 | ||
16 | static void TestPluralRules(void); | |
51004dcb | 17 | static void TestOrdinalRules(void); |
4388f060 A |
18 | |
19 | void addPluralRulesTest(TestNode** root); | |
20 | ||
21 | #define TESTCASE(x) addTest(root, &x, "tsformat/cpluralrulestest/" #x) | |
22 | ||
23 | void addPluralRulesTest(TestNode** root) | |
24 | { | |
25 | TESTCASE(TestPluralRules); | |
51004dcb | 26 | TESTCASE(TestOrdinalRules); |
4388f060 A |
27 | } |
28 | ||
29 | typedef 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 */ | |
36 | static 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 | ||
58 | enum { | |
59 | kKeywordBufLen = 32 | |
60 | }; | |
61 | ||
62 | static 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 | ||
51004dcb A |
94 | static 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 | ||
4388f060 | 112 | #endif /* #if !UCONFIG_NO_FORMATTING */ |