]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/numbertest_skeletons.cpp
ICU-64243.0.1.tar.gz
[apple/icu.git] / icuSources / test / intltest / numbertest_skeletons.cpp
index 8ac05298538870c2335d3623179b6a64778c2d1b..33cd7ae04046ef4c960707d54f11edd2be898d7a 100644 (file)
@@ -110,8 +110,10 @@ void NumberSkeletonTest::validTokens() {
     for (auto& cas : cases) {
         UnicodeString skeletonString(cas);
         status.setScope(skeletonString);
-        NumberFormatter::forSkeleton(skeletonString, status);
+        UParseError perror;
+        NumberFormatter::forSkeleton(skeletonString, perror, status);
         assertSuccess(CStr(skeletonString)(), status, true);
+        assertEquals(skeletonString, -1, perror.offset);
         status.errIfFailureAndReset();
     }
 }
@@ -193,7 +195,7 @@ void NumberSkeletonTest::stemsRequiringOption() {
     static const char16_t* stems[] = {
             u"precision-increment",
             u"measure-unit",
-            u"per-unit",
+            u"per-measure-unit",
             u"currency",
             u"integer-width",
             u"numbering-system",
@@ -204,8 +206,23 @@ void NumberSkeletonTest::stemsRequiringOption() {
         for (auto& suffix : suffixes) {
             UnicodeString skeletonString = UnicodeString(stem) + suffix;
             UErrorCode status = U_ZERO_ERROR;
-            NumberFormatter::forSkeleton(skeletonString, status);
+            UParseError perror;
+            NumberFormatter::forSkeleton(skeletonString, perror, status);
             assertEquals(skeletonString, U_NUMBER_SKELETON_SYNTAX_ERROR, status);
+
+            // Check the UParseError for integrity.
+            // If an option is present, the option is wrong; error offset is at the start of the option
+            // If an option is not present, the error offset is at the token separator (end of stem)
+            int32_t expectedOffset = u_strlen(stem) + ((suffix[0] == u'/') ? 1 : 0);
+            assertEquals(skeletonString, expectedOffset, perror.offset);
+            UnicodeString expectedPreContext = skeletonString.tempSubString(0, expectedOffset);
+            if (expectedPreContext.length() >= U_PARSE_CONTEXT_LEN - 1) {
+                expectedPreContext = expectedPreContext.tempSubString(expectedOffset - U_PARSE_CONTEXT_LEN + 1);
+            }
+            assertEquals(skeletonString, expectedPreContext, perror.preContext);
+            UnicodeString expectedPostContext = skeletonString.tempSubString(expectedOffset);
+            // None of the postContext strings in this test exceed U_PARSE_CONTEXT_LEN
+            assertEquals(skeletonString, expectedPostContext, perror.postContext);
         }
     }
 }
@@ -250,7 +267,7 @@ void NumberSkeletonTest::flexibleSeparators() {
         status.setScope(skeletonString);
         UnicodeString actual = NumberFormatter::forSkeleton(skeletonString, status).locale("en")
                                .formatDouble(5142.3, status)
-                               .toString();
+                               .toString(status);
         if (!status.errDataIfFailureAndReset()) {
             assertEquals(skeletonString, expected, actual);
         }