| Index: source/test/intltest/simplepatternformattertest.cpp
|
| diff --git a/source/test/intltest/simplepatternformattertest.cpp b/source/test/intltest/simplepatternformattertest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a530c5229186d1670d7ceb6ec4dba3d12652e15f
|
| --- /dev/null
|
| +++ b/source/test/intltest/simplepatternformattertest.cpp
|
| @@ -0,0 +1,240 @@
|
| +/*
|
| +*******************************************************************************
|
| +* Copyright (C) 2014, International Business Machines Corporation and *
|
| +* others. All Rights Reserved. *
|
| +*******************************************************************************
|
| +*
|
| +* File SIMPLEPATTERNFORMATTERTEST.CPP
|
| +*
|
| +********************************************************************************
|
| +*/
|
| +#include "cstring.h"
|
| +#include "intltest.h"
|
| +#include "simplepatternformatter.h"
|
| +
|
| +class SimplePatternFormatterTest : public IntlTest {
|
| +public:
|
| + SimplePatternFormatterTest() {
|
| + }
|
| + void TestNoPlaceholders();
|
| + void TestOnePlaceholder();
|
| + void TestManyPlaceholders();
|
| + void TestGetPatternWithNoPlaceholders();
|
| + void TestOptimization();
|
| + void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
|
| +private:
|
| +};
|
| +
|
| +void SimplePatternFormatterTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) {
|
| + TESTCASE_AUTO_BEGIN;
|
| + TESTCASE_AUTO(TestNoPlaceholders);
|
| + TESTCASE_AUTO(TestOnePlaceholder);
|
| + TESTCASE_AUTO(TestManyPlaceholders);
|
| + TESTCASE_AUTO(TestGetPatternWithNoPlaceholders);
|
| + TESTCASE_AUTO(TestOptimization);
|
| + TESTCASE_AUTO_END;
|
| +}
|
| +
|
| +void SimplePatternFormatterTest::TestNoPlaceholders() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + SimplePatternFormatter fmt("This doesn''t have templates '{0}");
|
| + assertEquals("PlaceholderCount", 0, fmt.getPlaceholderCount());
|
| + UnicodeString appendTo;
|
| + assertEquals(
|
| + "format",
|
| + "This doesn't have templates {0}",
|
| + fmt.format("unused", appendTo, status));
|
| + fmt.compile("This has {} bad {012d placeholders", status);
|
| + assertEquals("PlaceholderCount", 0, fmt.getPlaceholderCount());
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "format",
|
| + "This has {} bad {012d placeholders",
|
| + fmt.format("unused", appendTo, status));
|
| + assertSuccess("Status", status);
|
| +}
|
| +
|
| +void SimplePatternFormatterTest::TestOnePlaceholder() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + SimplePatternFormatter fmt;
|
| + fmt.compile("{0} meter", status);
|
| + assertEquals("PlaceholderCount", 1, fmt.getPlaceholderCount());
|
| + UnicodeString appendTo;
|
| + assertEquals(
|
| + "format",
|
| + "1 meter",
|
| + fmt.format("1", appendTo, status));
|
| + assertSuccess("Status", status);
|
| +
|
| + // assignment
|
| + SimplePatternFormatter s;
|
| + s = fmt;
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "Assignment",
|
| + "1 meter",
|
| + s.format("1", appendTo, status));
|
| +
|
| + // Copy constructor
|
| + SimplePatternFormatter r(fmt);
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "Copy constructor",
|
| + "1 meter",
|
| + r.format("1", appendTo, status));
|
| + assertSuccess("Status", status);
|
| +}
|
| +
|
| +void SimplePatternFormatterTest::TestManyPlaceholders() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + SimplePatternFormatter fmt;
|
| + fmt.compile(
|
| + "Templates {2}{1}{5} and {4} are out of order.", status);
|
| + assertSuccess("Status", status);
|
| + assertFalse("startsWithPlaceholder", fmt.startsWithPlaceholder(2));
|
| + assertEquals("PlaceholderCount", 6, fmt.getPlaceholderCount());
|
| + UnicodeString values[] = {
|
| + "freddy", "tommy", "frog", "billy", "leg", "{0}"};
|
| + UnicodeString *params[] = {
|
| + &values[0], &values[1], &values[2], &values[3], &values[4], &values[5]};
|
| + int32_t offsets[6];
|
| + int32_t expectedOffsets[6] = {-1, 22, 18, -1, 35, 27};
|
| + UnicodeString appendTo("Prefix: ");
|
| + assertEquals(
|
| + "format",
|
| + "Prefix: Templates frogtommy{0} and leg are out of order.",
|
| + fmt.format(
|
| + params,
|
| + UPRV_LENGTHOF(params),
|
| + appendTo,
|
| + offsets,
|
| + UPRV_LENGTHOF(offsets),
|
| + status));
|
| + assertSuccess("Status", status);
|
| + for (int32_t i = 0; i < UPRV_LENGTHOF(expectedOffsets); ++i) {
|
| + if (expectedOffsets[i] != offsets[i]) {
|
| + errln("Expected %d, got %d", expectedOffsets[i], offsets[i]);
|
| + }
|
| + }
|
| + appendTo.remove();
|
| +
|
| + // Not having enough placeholder params results in error.
|
| + fmt.format(
|
| + params,
|
| + UPRV_LENGTHOF(params) - 1,
|
| + appendTo,
|
| + offsets,
|
| + UPRV_LENGTHOF(offsets),
|
| + status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR) {
|
| + errln("Expected U_ILLEGAL_ARGUMENT_ERROR");
|
| + }
|
| +
|
| + // Ensure we don't write to offsets array beyond its length.
|
| + status = U_ZERO_ERROR;
|
| + offsets[UPRV_LENGTHOF(offsets) - 1] = 289;
|
| + appendTo.remove();
|
| + fmt.format(
|
| + params,
|
| + UPRV_LENGTHOF(params),
|
| + appendTo,
|
| + offsets,
|
| + UPRV_LENGTHOF(offsets) - 1,
|
| + status);
|
| + assertEquals("Offsets buffer length", 289, offsets[UPRV_LENGTHOF(offsets) - 1]);
|
| +
|
| + // Test assignment
|
| + SimplePatternFormatter s;
|
| + s = fmt;
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "Assignment",
|
| + "Templates frogtommy{0} and leg are out of order.",
|
| + s.format(
|
| + params,
|
| + UPRV_LENGTHOF(params),
|
| + appendTo,
|
| + NULL,
|
| + 0,
|
| + status));
|
| +
|
| + // Copy constructor
|
| + SimplePatternFormatter r(fmt);
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "Copy constructor",
|
| + "Templates frogtommy{0} and leg are out of order.",
|
| + r.format(
|
| + params,
|
| + UPRV_LENGTHOF(params),
|
| + appendTo,
|
| + NULL,
|
| + 0,
|
| + status));
|
| + r.compile("{0} meter", status);
|
| + assertEquals("PlaceholderCount", 1, r.getPlaceholderCount());
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "Replace with new compile",
|
| + "freddy meter",
|
| + r.format("freddy", appendTo, status));
|
| + r.compile("{0}, {1}", status);
|
| + assertEquals("PlaceholderCount", 2, r.getPlaceholderCount());
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "2 arg",
|
| + "foo, bar",
|
| + r.format("foo", "bar", appendTo, status));
|
| + r.compile("{0}, {1} and {2}", status);
|
| + assertEquals("PlaceholderCount", 3, r.getPlaceholderCount());
|
| + appendTo.remove();
|
| + assertEquals(
|
| + "3 arg",
|
| + "foo, bar and baz",
|
| + r.format("foo", "bar", "baz", appendTo, status));
|
| + assertSuccess("Status", status);
|
| +}
|
| +
|
| +void SimplePatternFormatterTest::TestGetPatternWithNoPlaceholders() {
|
| + SimplePatternFormatter fmt("{0} has no {1} placeholders.");
|
| + assertEquals(
|
| + "", " has no placeholders.", fmt.getPatternWithNoPlaceholders());
|
| +}
|
| +
|
| +void SimplePatternFormatterTest::TestOptimization() {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + SimplePatternFormatter fmt;
|
| + fmt.compile("{2}, {0}, {1} and {3}", status);
|
| + assertSuccess("Status", status);
|
| + assertTrue("startsWithPlaceholder", fmt.startsWithPlaceholder(2));
|
| + assertFalse("startsWithPlaceholder", fmt.startsWithPlaceholder(0));
|
| + UnicodeString values[] = {
|
| + "freddy", "frog", "leg", "by"};
|
| + UnicodeString *params[] = {
|
| + &values[0], &values[1], &values[2], &values[3]};
|
| + int32_t offsets[4];
|
| + int32_t expectedOffsets[4] = {5, 13, 0, 22};
|
| +
|
| + // The pattern starts with {2}, so format should append the result of
|
| + // the rest of the pattern to values[2], the value for {2}.
|
| + assertEquals(
|
| + "format",
|
| + "leg, freddy, frog and by",
|
| + fmt.format(
|
| + params,
|
| + UPRV_LENGTHOF(params),
|
| + values[2],
|
| + offsets,
|
| + UPRV_LENGTHOF(offsets),
|
| + status));
|
| + assertSuccess("Status", status);
|
| + for (int32_t i = 0; i < UPRV_LENGTHOF(expectedOffsets); ++i) {
|
| + if (expectedOffsets[i] != offsets[i]) {
|
| + errln("Expected %d, got %d", expectedOffsets[i], offsets[i]);
|
| + }
|
| + }
|
| +}
|
| +
|
| +extern IntlTest *createSimplePatternFormatterTest() {
|
| + return new SimplePatternFormatterTest();
|
| +}
|
|
|