]> git.saurik.com Git - apple/icu.git/blame - icuSources/test/cintltst/cpluralrulestest.c
ICU-551.51.4.tar.gz
[apple/icu.git] / icuSources / test / cintltst / cpluralrulestest.c
CommitLineData
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
16static void TestPluralRules(void);
51004dcb 17static void TestOrdinalRules(void);
4388f060
A
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);
51004dcb 26 TESTCASE(TestOrdinalRules);
4388f060
A
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
51004dcb
A
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
4388f060 112#endif /* #if !UCONFIG_NO_FORMATTING */