1/*
2*******************************************************************************
3* Copyright (C) 2014, International Business Machines Corporation and         *
4* others. All Rights Reserved.                                                *
5*******************************************************************************
6*
7* File QUANTITYFORMATTERTEST.CPP
8*
9********************************************************************************
10*/
11#include "cstring.h"
12#include "intltest.h"
13#include "quantityformatter.h"
14#include "simplepatternformatter.h"
15#include "unicode/numfmt.h"
16#include "unicode/plurrule.h"
17
18
19class QuantityFormatterTest : public IntlTest {
20public:
21    QuantityFormatterTest() {
22    }
23    void TestBasic();
24    void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
25private:
26};
27
28void QuantityFormatterTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) {
29  TESTCASE_AUTO_BEGIN;
30  TESTCASE_AUTO(TestBasic);
31  TESTCASE_AUTO_END;
32}
33
34void QuantityFormatterTest::TestBasic() {
35    UErrorCode status = U_ZERO_ERROR;
36#if !UCONFIG_NO_FORMATTING
37    QuantityFormatter fmt;
38    assertFalse(
39            "adding bad variant",
40            fmt.add("a bad variant", "{0} pounds", status));
41    assertEquals("adding bad variant status", U_ILLEGAL_ARGUMENT_ERROR, status);
42    status = U_ZERO_ERROR;
43    assertFalse(
44            "Adding bad pattern",
45            fmt.add("other", "{0} {1} too many placeholders", status));
46    assertEquals("adding bad pattern status", U_ILLEGAL_ARGUMENT_ERROR, status);
47    status = U_ZERO_ERROR;
48    assertFalse("isValid with no patterns", fmt.isValid());
49    assertTrue(
50            "Adding good pattern with no placeholders",
51            fmt.add("other", "no placeholder", status));
52    assertTrue(
53            "Adding good pattern",
54            fmt.add("other", "{0} pounds", status));
55    assertTrue("isValid with other", fmt.isValid());
56    assertTrue(
57            "Adding good pattern",
58            fmt.add("one", "{0} pound", status));
59
60    assertEquals(
61            "getByVariant",
62            fmt.getByVariant("bad variant")->getPatternWithNoPlaceholders(),
63            " pounds");
64    assertEquals(
65            "getByVariant",
66            fmt.getByVariant("other")->getPatternWithNoPlaceholders(),
67            " pounds");
68    assertEquals(
69            "getByVariant",
70            fmt.getByVariant("one")->getPatternWithNoPlaceholders(),
71            " pound");
72    assertEquals(
73            "getByVariant",
74            fmt.getByVariant("few")->getPatternWithNoPlaceholders(),
75            " pounds");
76
77    // Test copy constructor
78    {
79        QuantityFormatter copied(fmt);
80        assertEquals(
81                "copied getByVariant",
82                copied.getByVariant("other")->getPatternWithNoPlaceholders(),
83                " pounds");
84        assertEquals(
85                "copied getByVariant",
86                copied.getByVariant("one")->getPatternWithNoPlaceholders(),
87                " pound");
88        assertEquals(
89                "copied getByVariant",
90                copied.getByVariant("few")->getPatternWithNoPlaceholders(),
91                " pounds");
92    }
93
94    // Test assignment
95    {
96        QuantityFormatter assigned;
97        assigned = fmt;
98        assertEquals(
99                "assigned getByVariant",
100                assigned.getByVariant("other")->getPatternWithNoPlaceholders(),
101                " pounds");
102        assertEquals(
103                "assigned getByVariant",
104                assigned.getByVariant("one")->getPatternWithNoPlaceholders(),
105                " pound");
106        assertEquals(
107                "assigned getByVariant",
108                assigned.getByVariant("few")->getPatternWithNoPlaceholders(),
109                " pounds");
110    }
111
112    // Test format.
113    {
114        LocalPointer<NumberFormat> numfmt(
115                NumberFormat::createInstance(Locale::getEnglish(), status));
116        LocalPointer<PluralRules> plurrule(
117                PluralRules::forLocale("en", status));
118        FieldPosition pos(FieldPosition::DONT_CARE);
119        UnicodeString appendTo;
120        assertEquals(
121                "format singular",
122                "1 pound",
123                fmt.format(
124                        1,
125                        *numfmt,
126                        *plurrule,
127                        appendTo,
128                        pos,
129                        status), TRUE);
130        appendTo.remove();
131        assertEquals(
132                "format plural",
133                "2 pounds",
134                fmt.format(
135                        2,
136                        *numfmt,
137                        *plurrule,
138                        appendTo,
139                        pos,
140                        status), TRUE);
141    }
142    fmt.reset();
143    assertFalse("isValid after reset", fmt.isValid());
144#endif
145    assertSuccess("", status);
146}
147
148extern IntlTest *createQuantityFormatterTest() {
149    return new QuantityFormatterTest();
150}
151