12e5b6d6dSopenharmony_ci// © 2018 and later: Unicode, Inc. and others.
22e5b6d6dSopenharmony_ci// License & terms of use: http://www.unicode.org/copyright.html
32e5b6d6dSopenharmony_ci
42e5b6d6dSopenharmony_ci#include "unicode/utypes.h"
52e5b6d6dSopenharmony_ci
62e5b6d6dSopenharmony_ci#if !UCONFIG_NO_FORMATTING
72e5b6d6dSopenharmony_ci
82e5b6d6dSopenharmony_ci#include "string_segment.h"
92e5b6d6dSopenharmony_ci#include "intltest.h"
102e5b6d6dSopenharmony_ci
112e5b6d6dSopenharmony_ciclass StringSegmentTest : public IntlTest {
122e5b6d6dSopenharmony_ci  public:
132e5b6d6dSopenharmony_ci    void testOffset();
142e5b6d6dSopenharmony_ci    void testLength();
152e5b6d6dSopenharmony_ci    void testCharAt();
162e5b6d6dSopenharmony_ci    void testGetCodePoint();
172e5b6d6dSopenharmony_ci    void testCommonPrefixLength();
182e5b6d6dSopenharmony_ci
192e5b6d6dSopenharmony_ci    void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0) override;
202e5b6d6dSopenharmony_ci};
212e5b6d6dSopenharmony_ci
222e5b6d6dSopenharmony_cistatic const char16_t* SAMPLE_STRING = u"� radio �";
232e5b6d6dSopenharmony_ci
242e5b6d6dSopenharmony_civoid StringSegmentTest::runIndexedTest(int32_t index, UBool exec, const char*&name, char*) {
252e5b6d6dSopenharmony_ci    if (exec) {
262e5b6d6dSopenharmony_ci        logln("TestSuite StringSegmentTest: ");
272e5b6d6dSopenharmony_ci    }
282e5b6d6dSopenharmony_ci    TESTCASE_AUTO_BEGIN;
292e5b6d6dSopenharmony_ci        TESTCASE_AUTO(testOffset);
302e5b6d6dSopenharmony_ci        TESTCASE_AUTO(testLength);
312e5b6d6dSopenharmony_ci        TESTCASE_AUTO(testCharAt);
322e5b6d6dSopenharmony_ci        TESTCASE_AUTO(testGetCodePoint);
332e5b6d6dSopenharmony_ci        TESTCASE_AUTO(testCommonPrefixLength);
342e5b6d6dSopenharmony_ci    TESTCASE_AUTO_END;
352e5b6d6dSopenharmony_ci}
362e5b6d6dSopenharmony_ci
372e5b6d6dSopenharmony_civoid StringSegmentTest::testOffset() {
382e5b6d6dSopenharmony_ci    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
392e5b6d6dSopenharmony_ci    UnicodeString sampleString(SAMPLE_STRING);
402e5b6d6dSopenharmony_ci    StringSegment segment(sampleString, false);
412e5b6d6dSopenharmony_ci    assertEquals("Initial Offset", 0, segment.getOffset());
422e5b6d6dSopenharmony_ci    segment.adjustOffset(3);
432e5b6d6dSopenharmony_ci    assertEquals("Adjust A", 3, segment.getOffset());
442e5b6d6dSopenharmony_ci    segment.adjustOffset(2);
452e5b6d6dSopenharmony_ci    assertEquals("Adjust B", 5, segment.getOffset());
462e5b6d6dSopenharmony_ci    segment.setOffset(4);
472e5b6d6dSopenharmony_ci    assertEquals("Set Offset", 4, segment.getOffset());
482e5b6d6dSopenharmony_ci}
492e5b6d6dSopenharmony_ci
502e5b6d6dSopenharmony_civoid StringSegmentTest::testLength() {
512e5b6d6dSopenharmony_ci    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
522e5b6d6dSopenharmony_ci    UnicodeString sampleString(SAMPLE_STRING);
532e5b6d6dSopenharmony_ci    StringSegment segment(sampleString, false);
542e5b6d6dSopenharmony_ci    assertEquals("Initial length", 11, segment.length());
552e5b6d6dSopenharmony_ci    segment.adjustOffset(3);
562e5b6d6dSopenharmony_ci    assertEquals("Adjust", 8, segment.length());
572e5b6d6dSopenharmony_ci    segment.setLength(4);
582e5b6d6dSopenharmony_ci    assertEquals("Set Length", 4, segment.length());
592e5b6d6dSopenharmony_ci    segment.setOffset(5);
602e5b6d6dSopenharmony_ci    assertEquals("After adjust offset", 2, segment.length());
612e5b6d6dSopenharmony_ci    segment.resetLength();
622e5b6d6dSopenharmony_ci    assertEquals("After reset length", 6, segment.length());
632e5b6d6dSopenharmony_ci}
642e5b6d6dSopenharmony_ci
652e5b6d6dSopenharmony_civoid StringSegmentTest::testCharAt() {
662e5b6d6dSopenharmony_ci    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
672e5b6d6dSopenharmony_ci    UnicodeString sampleString(SAMPLE_STRING);
682e5b6d6dSopenharmony_ci    StringSegment segment(sampleString, false);
692e5b6d6dSopenharmony_ci    assertEquals("Initial", SAMPLE_STRING, segment.toUnicodeString());
702e5b6d6dSopenharmony_ci    assertEquals("Initial", SAMPLE_STRING, segment.toTempUnicodeString());
712e5b6d6dSopenharmony_ci    segment.adjustOffset(3);
722e5b6d6dSopenharmony_ci    assertEquals("After adjust-offset", UnicodeString(u"radio �"), segment.toUnicodeString());
732e5b6d6dSopenharmony_ci    assertEquals("After adjust-offset", UnicodeString(u"radio �"), segment.toTempUnicodeString());
742e5b6d6dSopenharmony_ci    segment.setLength(5);
752e5b6d6dSopenharmony_ci    assertEquals("After adjust-length", UnicodeString(u"radio"), segment.toUnicodeString());
762e5b6d6dSopenharmony_ci    assertEquals("After adjust-length", UnicodeString(u"radio"), segment.toTempUnicodeString());
772e5b6d6dSopenharmony_ci}
782e5b6d6dSopenharmony_ci
792e5b6d6dSopenharmony_civoid StringSegmentTest::testGetCodePoint() {
802e5b6d6dSopenharmony_ci    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
812e5b6d6dSopenharmony_ci    UnicodeString sampleString(SAMPLE_STRING);
822e5b6d6dSopenharmony_ci    StringSegment segment(sampleString, false);
832e5b6d6dSopenharmony_ci    assertEquals("Double-width code point", 0x1F4FB, segment.getCodePoint());
842e5b6d6dSopenharmony_ci    segment.setLength(1);
852e5b6d6dSopenharmony_ci    assertEquals("Invalid A", -1, segment.getCodePoint());
862e5b6d6dSopenharmony_ci    segment.resetLength();
872e5b6d6dSopenharmony_ci    segment.adjustOffset(1);
882e5b6d6dSopenharmony_ci    assertEquals("Invalid B", -1, segment.getCodePoint());
892e5b6d6dSopenharmony_ci    segment.adjustOffset(1);
902e5b6d6dSopenharmony_ci    assertEquals("Valid again", 0x20, segment.getCodePoint());
912e5b6d6dSopenharmony_ci}
922e5b6d6dSopenharmony_ci
932e5b6d6dSopenharmony_civoid StringSegmentTest::testCommonPrefixLength() {
942e5b6d6dSopenharmony_ci    // Note: sampleString needs function scope so it is valid while the StringSegment is valid
952e5b6d6dSopenharmony_ci    UnicodeString sampleString(SAMPLE_STRING);
962e5b6d6dSopenharmony_ci    StringSegment segment(sampleString, false);
972e5b6d6dSopenharmony_ci    assertEquals("", 11, segment.getCommonPrefixLength(SAMPLE_STRING));
982e5b6d6dSopenharmony_ci    assertEquals("", 4, segment.getCommonPrefixLength(u"� r"));
992e5b6d6dSopenharmony_ci    assertEquals("", 3, segment.getCommonPrefixLength(u"� x"));
1002e5b6d6dSopenharmony_ci    assertEquals("", 0, segment.getCommonPrefixLength(u"x"));
1012e5b6d6dSopenharmony_ci    segment.adjustOffset(3);
1022e5b6d6dSopenharmony_ci    assertEquals("", 0, segment.getCommonPrefixLength(u"RADiO"));
1032e5b6d6dSopenharmony_ci    assertEquals("", 5, segment.getCommonPrefixLength(u"radio"));
1042e5b6d6dSopenharmony_ci    assertEquals("", 2, segment.getCommonPrefixLength(u"rafio"));
1052e5b6d6dSopenharmony_ci    assertEquals("", 0, segment.getCommonPrefixLength(u"fadio"));
1062e5b6d6dSopenharmony_ci    segment.setLength(3);
1072e5b6d6dSopenharmony_ci    assertEquals("", 3, segment.getCommonPrefixLength(u"radio"));
1082e5b6d6dSopenharmony_ci    assertEquals("", 2, segment.getCommonPrefixLength(u"rafio"));
1092e5b6d6dSopenharmony_ci    assertEquals("", 0, segment.getCommonPrefixLength(u"fadio"));
1102e5b6d6dSopenharmony_ci    segment.resetLength();
1112e5b6d6dSopenharmony_ci    segment.setOffset(11); // end of string
1122e5b6d6dSopenharmony_ci    assertEquals("", 0, segment.getCommonPrefixLength(u"foo"));
1132e5b6d6dSopenharmony_ci}
1142e5b6d6dSopenharmony_ci
1152e5b6d6dSopenharmony_ci
1162e5b6d6dSopenharmony_ciextern IntlTest *createStringSegmentTest() {
1172e5b6d6dSopenharmony_ci    return new StringSegmentTest();
1182e5b6d6dSopenharmony_ci}
1192e5b6d6dSopenharmony_ci
1202e5b6d6dSopenharmony_ci#endif
121