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