1// © 2018 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3
4#include "unicode/utypes.h"
5
6#if !UCONFIG_NO_FORMATTING
7
8#include "string_segment.h"
9#include "intltest.h"
10
11class StringSegmentTest : public IntlTest {
12  public:
13    void testOffset();
14    void testLength();
15    void testCharAt();
16    void testGetCodePoint();
17    void testCommonPrefixLength();
18
19    void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0) override;
20};
21
22static const char16_t* SAMPLE_STRING = u"� radio �";
23
24void StringSegmentTest::runIndexedTest(int32_t index, UBool exec, const char*&name, char*) {
25    if (exec) {
26        logln("TestSuite StringSegmentTest: ");
27    }
28    TESTCASE_AUTO_BEGIN;
29        TESTCASE_AUTO(testOffset);
30        TESTCASE_AUTO(testLength);
31        TESTCASE_AUTO(testCharAt);
32        TESTCASE_AUTO(testGetCodePoint);
33        TESTCASE_AUTO(testCommonPrefixLength);
34    TESTCASE_AUTO_END;
35}
36
37void StringSegmentTest::testOffset() {
38    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
39    UnicodeString sampleString(SAMPLE_STRING);
40    StringSegment segment(sampleString, false);
41    assertEquals("Initial Offset", 0, segment.getOffset());
42    segment.adjustOffset(3);
43    assertEquals("Adjust A", 3, segment.getOffset());
44    segment.adjustOffset(2);
45    assertEquals("Adjust B", 5, segment.getOffset());
46    segment.setOffset(4);
47    assertEquals("Set Offset", 4, segment.getOffset());
48}
49
50void StringSegmentTest::testLength() {
51    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
52    UnicodeString sampleString(SAMPLE_STRING);
53    StringSegment segment(sampleString, false);
54    assertEquals("Initial length", 11, segment.length());
55    segment.adjustOffset(3);
56    assertEquals("Adjust", 8, segment.length());
57    segment.setLength(4);
58    assertEquals("Set Length", 4, segment.length());
59    segment.setOffset(5);
60    assertEquals("After adjust offset", 2, segment.length());
61    segment.resetLength();
62    assertEquals("After reset length", 6, segment.length());
63}
64
65void StringSegmentTest::testCharAt() {
66    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
67    UnicodeString sampleString(SAMPLE_STRING);
68    StringSegment segment(sampleString, false);
69    assertEquals("Initial", SAMPLE_STRING, segment.toUnicodeString());
70    assertEquals("Initial", SAMPLE_STRING, segment.toTempUnicodeString());
71    segment.adjustOffset(3);
72    assertEquals("After adjust-offset", UnicodeString(u"radio �"), segment.toUnicodeString());
73    assertEquals("After adjust-offset", UnicodeString(u"radio �"), segment.toTempUnicodeString());
74    segment.setLength(5);
75    assertEquals("After adjust-length", UnicodeString(u"radio"), segment.toUnicodeString());
76    assertEquals("After adjust-length", UnicodeString(u"radio"), segment.toTempUnicodeString());
77}
78
79void StringSegmentTest::testGetCodePoint() {
80    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
81    UnicodeString sampleString(SAMPLE_STRING);
82    StringSegment segment(sampleString, false);
83    assertEquals("Double-width code point", 0x1F4FB, segment.getCodePoint());
84    segment.setLength(1);
85    assertEquals("Invalid A", -1, segment.getCodePoint());
86    segment.resetLength();
87    segment.adjustOffset(1);
88    assertEquals("Invalid B", -1, segment.getCodePoint());
89    segment.adjustOffset(1);
90    assertEquals("Valid again", 0x20, segment.getCodePoint());
91}
92
93void StringSegmentTest::testCommonPrefixLength() {
94    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
95    UnicodeString sampleString(SAMPLE_STRING);
96    StringSegment segment(sampleString, false);
97    assertEquals("", 11, segment.getCommonPrefixLength(SAMPLE_STRING));
98    assertEquals("", 4, segment.getCommonPrefixLength(u"� r"));
99    assertEquals("", 3, segment.getCommonPrefixLength(u"� x"));
100    assertEquals("", 0, segment.getCommonPrefixLength(u"x"));
101    segment.adjustOffset(3);
102    assertEquals("", 0, segment.getCommonPrefixLength(u"RADiO"));
103    assertEquals("", 5, segment.getCommonPrefixLength(u"radio"));
104    assertEquals("", 2, segment.getCommonPrefixLength(u"rafio"));
105    assertEquals("", 0, segment.getCommonPrefixLength(u"fadio"));
106    segment.setLength(3);
107    assertEquals("", 3, segment.getCommonPrefixLength(u"radio"));
108    assertEquals("", 2, segment.getCommonPrefixLength(u"rafio"));
109    assertEquals("", 0, segment.getCommonPrefixLength(u"fadio"));
110    segment.resetLength();
111    segment.setOffset(11); // end of string
112    assertEquals("", 0, segment.getCommonPrefixLength(u"foo"));
113}
114
115
116extern IntlTest *createStringSegmentTest() {
117    return new StringSegmentTest();
118}
119
120#endif
121