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