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