From 3ec9f03c41108cdcee6ef7cc103a1b11f63753f1 Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Fri, 4 Apr 2025 10:38:03 -0700 Subject: [PATCH] ICU-23004 test fn impl: more deduction, simpler call sites --- .../source/test/intltest/utfiteratortest.cpp | 110 +++++++++--------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/icu4c/source/test/intltest/utfiteratortest.cpp b/icu4c/source/test/intltest/utfiteratortest.cpp index 35213224d04..2d178216ce7 100644 --- a/icu4c/source/test/intltest/utfiteratortest.cpp +++ b/icu4c/source/test/intltest/utfiteratortest.cpp @@ -348,19 +348,26 @@ public: } } - template + template void testBidiIter(StringView piped); + template + void testBidiIter(StringView sv, const std::vector &parts, CodePoints range); + template void testSafeSinglePassIter(StringView piped, bool isWellFormed); template void testUnsafeSinglePassIter(StringView piped); - template + template void testFwdIter(StringView piped); + template + void testFwdIter(const std::vector &parts, UnitIter goodLimit, + Iter iter, Iter rangeLimit); + static constexpr std::u16string_view good16{u"a|b|ç|カ|🚴"}; static const char *good8Chars; static constexpr std::u32string_view good32{U"a|b|ç|カ|🚴"}; @@ -381,24 +388,19 @@ public: static constexpr std::u32string_view bad32{badChars32, std::size(badChars32)}; void testSafe16Good() { - testBidiIter, WELL_FORMED, - UChar32, UTF_BEHAVIOR_NEGATIVE>(good16); + testBidiIter(good16); } void testSafe16Negative() { - testBidiIter, ILL_FORMED, - UChar32, UTF_BEHAVIOR_NEGATIVE>(bad16); + testBidiIter(bad16); } void testSafe16FFFD() { - testBidiIter, ILL_FORMED, - char32_t, UTF_BEHAVIOR_FFFD>(bad16); + testBidiIter(bad16); } void testSafe16Surrogate() { - testBidiIter, ILL_FORMED, - uint32_t, UTF_BEHAVIOR_SURROGATE>(bad16); + testBidiIter(bad16); } void testUnsafe16() { - testBidiIter, UNSAFE, - UChar32, UTF_BEHAVIOR_NEGATIVE>(good16); + testBidiIter(good16); } void testSafe16SinglePassIterGood() { @@ -412,31 +414,25 @@ public: } void testSafe16FwdIter() { - testFwdIter< - UTFIterator>, - WELL_FORMED>(good16); + testFwdIter(good16); } void testUnsafe16FwdIter() { - testFwdIter>, UNSAFE>(good16); + testFwdIter(good16); } void testSafe8Good() { - testBidiIter, WELL_FORMED, - UChar32, UTF_BEHAVIOR_NEGATIVE>(std::string_view{good8Chars}); + testBidiIter(std::string_view{good8Chars}); } void testSafe8Negative() { - testBidiIter, ILL_FORMED, - UChar32, UTF_BEHAVIOR_NEGATIVE>( + testBidiIter( std::string_view(string8FromBytes(badChars8, std::size(badChars8)))); } void testSafe8FFFD() { - testBidiIter, ILL_FORMED, - char32_t, UTF_BEHAVIOR_FFFD>( + testBidiIter( std::string_view(string8FromBytes(badChars8, std::size(badChars8)))); } void testUnsafe8() { - testBidiIter, UNSAFE, - UChar32, UTF_BEHAVIOR_NEGATIVE>(std::string_view{good8Chars}); + testBidiIter(std::string_view{good8Chars}); } void testSafe8SinglePassIterGood() { @@ -451,34 +447,26 @@ public: } void testSafe8FwdIter() { - testFwdIter< - UTFIterator>, - WELL_FORMED>(std::string_view{good8Chars}); + testFwdIter(std::string_view{good8Chars}); } void testUnsafe8FwdIter() { - testFwdIter>, UNSAFE>( - std::string_view{good8Chars}); + testFwdIter(std::string_view{good8Chars}); } void testSafe32Good() { - testBidiIter, WELL_FORMED, - UChar32, UTF_BEHAVIOR_NEGATIVE>(good32); + testBidiIter(good32); } void testSafe32Negative() { - testBidiIter, ILL_FORMED, - UChar32, UTF_BEHAVIOR_NEGATIVE>(bad32); + testBidiIter(bad32); } void testSafe32FFFD() { - testBidiIter, ILL_FORMED, - char32_t, UTF_BEHAVIOR_FFFD>(bad32); + testBidiIter(bad32); } void testSafe32Surrogate() { - testBidiIter, ILL_FORMED, - uint32_t, UTF_BEHAVIOR_SURROGATE>(bad32); + testBidiIter(bad32); } void testUnsafe32() { - testBidiIter, UNSAFE, - UChar32, UTF_BEHAVIOR_NEGATIVE>(good32); + testBidiIter(good32); } void testSafe32SinglePassIterGood() { @@ -492,12 +480,10 @@ public: } void testSafe32FwdIter() { - testFwdIter< - UTFIterator>, - WELL_FORMED>(good32); + testFwdIter(good32); } void testUnsafe32FwdIter() { - testFwdIter>, UNSAFE>(good32); + testFwdIter(good32); } // implementation code coverage ---------------------------------------- *** @@ -569,19 +555,30 @@ extern IntlTest *createUTFIteratorTest() { return new UTFIteratorTest(); } -template +template void UTFIteratorTest::testBidiIter(StringView piped) { using Unit = typename StringView::value_type; auto parts = split(piped); auto joined = join(parts); - auto last = parts[4]; StringView sv(joined); // "abçカ🚴" // or // "a?ç?🚴" where the ? sequences are ill-formed + if constexpr (mode == UNSAFE) { + auto range = unsafeUTFStringCodePoints(sv); + testBidiIter(sv, parts, range); + } else { + auto range = utfStringCodePoints(sv); + testBidiIter(sv, parts, range); + } +} + +template +void UTFIteratorTest::testBidiIter( + StringView sv, const std::vector &parts, CodePoints range) { constexpr bool isWellFormed = mode != ILL_FORMED; - CodePoints range{sv}; + auto last = parts[4]; auto iter = range.begin(); assertTrue( "bidirectional_iterator_tag", @@ -743,7 +740,7 @@ void UTFIteratorTest::testUnsafeSinglePassIter(StringView piped) { assertTrue("iter == endIter", iter == rangeLimit); } -template +template void UTFIteratorTest::testFwdIter(StringView piped) { using Unit = typename StringView::value_type; auto parts = split(piped); @@ -751,13 +748,20 @@ void UTFIteratorTest::testFwdIter(StringView piped) { // "abçカ🚴" FwdIter goodBegin(joined.data()); FwdIter goodLimit(joined.data() + joined.length()); - Iter iter; if constexpr (mode == UNSAFE) { - iter = Iter(goodBegin); + auto iter = unsafeUTFIterator(goodBegin); + auto rangeLimit = unsafeUTFIterator(goodLimit); + testFwdIter(parts, goodLimit, iter, rangeLimit); } else { - iter = Iter(goodBegin, goodLimit); + auto iter = utfIterator(goodBegin, goodLimit); + auto rangeLimit = utfIterator(goodLimit); + testFwdIter(parts, goodLimit, iter, rangeLimit); } - auto rangeLimit = Iter(goodLimit); +} + +template +void UTFIteratorTest::testFwdIter(const std::vector &parts, UnitIter goodLimit, + Iter iter, Iter rangeLimit) { assertTrue( "forward_iterator_tag", std::is_same_v<