summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp')
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp
index d142f048d58..b6f2eab6a84 100644
--- a/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/usettest.cpp
@@ -42,15 +42,6 @@ UnicodeString operator+(const UnicodeString& left, const UnicodeSet& set) {
return left + UnicodeSetTest::escape(pat);
}
-#define CASE(id,test) case id: \
- name = #test; \
- if (exec) { \
- logln(#test "---"); \
- logln(); \
- test(); \
- } \
- break
-
UnicodeSetTest::UnicodeSetTest() : utf8Cnv(NULL) {
}
@@ -100,6 +91,7 @@ UnicodeSetTest::runIndexedTest(int32_t index, UBool exec,
TESTCASE_AUTO(TestUCAUnsafeBackwards);
TESTCASE_AUTO(TestIntOverflow);
TESTCASE_AUTO(TestUnusedCcc);
+ TESTCASE_AUTO(TestDeepPattern);
TESTCASE_AUTO_END;
}
@@ -3970,3 +3962,19 @@ void UnicodeSetTest::TestUnusedCcc() {
assertTrue("[:ccc=1.1:] -> empty set", ccc1_1.isEmpty());
#endif
}
+
+void UnicodeSetTest::TestDeepPattern() {
+ IcuTestErrorCode errorCode(*this, "TestDeepPattern");
+ // Nested ranges are parsed via recursion which can use a lot of stack space.
+ // After a reasonable limit, we should get an error.
+ constexpr int32_t DEPTH = 20000;
+ UnicodeString pattern, suffix;
+ for (int32_t i = 0; i < DEPTH; ++i) {
+ pattern.append(u"[a", 2);
+ suffix.append(']');
+ }
+ pattern.append(suffix);
+ UnicodeSet set(pattern, errorCode);
+ assertTrue("[a[a[a...1000s...]]] -> error", errorCode.isFailure());
+ errorCode.reset();
+}