]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/intltest.cpp
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / intltest / intltest.cpp
index c1b6e5b2e96a26da44d2e48f4c2a90bfb67bb86b..15cd2d30776e6a544a77057b7dfeda44a9ddc84b 100644 (file)
@@ -593,6 +593,7 @@ void IntlTest::setCaller( IntlTest* callingTest )
         quick = caller->quick;
         threadCount = caller->threadCount;
         testoutfp = caller->testoutfp;
+        write_golden_data = caller->write_golden_data;
         LL_indentlevel = caller->LL_indentlevel + indentLevel_offset;
         numProps = caller->numProps;
         for (int32_t i = 0; i < numProps; i++) {
@@ -637,6 +638,13 @@ UBool IntlTest::setWarnOnMissingData( UBool warn_on_missing_dataVal )
     return rval;
 }
 
+UBool IntlTest::setWriteGoldenData( UBool write_golden_data )
+{
+    UBool rval = this->write_golden_data;
+    this->write_golden_data = write_golden_data;
+    return rval;
+}
+
 UBool IntlTest::setNoErrMsg( UBool no_err_msgVal )
 {
     UBool rval = this->no_err_msg;
@@ -1116,8 +1124,8 @@ void IntlTest::LL_message( UnicodeString message, UBool newline )
     // All error messages generated by tests funnel through here.
     // Multithreaded tests can concurrently generate errors, requiring synchronization
     // to keep each message together.
-    static UMutex *messageMutex = STATIC_NEW(UMutex);
-    Mutex lock(messageMutex);
+    static UMutex messageMutex;
+    Mutex lock(&messageMutex);
 
     // string that starts with a LineFeed character and continues
     // with spaces according to the current indentation
@@ -1224,6 +1232,7 @@ main(int argc, char* argv[])
     UBool utf8 = FALSE;
     const char *summary_file = NULL;
     UBool warnOnMissingData = FALSE;
+    UBool writeGoldenData = FALSE;
     UBool defaultDataFound = FALSE;
     int32_t threadCount = 12;
     UErrorCode errorCode = U_ZERO_ERROR;
@@ -1265,6 +1274,9 @@ main(int argc, char* argv[])
             else if (strcmp("notime", str) == 0 ||
                      strcmp("T", str) == 0)
                 no_time = TRUE;
+            else if (strcmp("goldens", str) == 0 ||
+                     strcmp("G", str) == 0)
+                writeGoldenData = TRUE;
             else if (strncmp("E", str, 1) == 0)
                 summary_file = str+1;
             else if (strcmp("x", str)==0) {
@@ -1338,6 +1350,7 @@ main(int argc, char* argv[])
     major.setLeaks( leaks );
     major.setThreadCount( threadCount );
     major.setWarnOnMissingData( warnOnMissingData );
+    major.setWriteGoldenData( writeGoldenData );
     major.setNotime (no_time);
     for (int32_t i = 0; i < nProps; i++) {
         major.setProperty(props[i]);
@@ -1371,9 +1384,10 @@ main(int argc, char* argv[])
     fprintf(stdout, "   Exhaustive (e)           : %s\n", (!quick?            "On" : "Off"));
     fprintf(stdout, "   Leaks (l)                : %s\n", (leaks?             "On" : "Off"));
     fprintf(stdout, "   utf-8 (u)                : %s\n", (utf8?              "On" : "Off"));
-    fprintf(stdout, "   notime (T)               : %s\n", (no_time?             "On" : "Off"));
-    fprintf(stdout, "   noknownissues (K)        : %s\n", (noKnownIssues?      "On" : "Off"));
+    fprintf(stdout, "   notime (T)               : %s\n", (no_time?           "On" : "Off"));
+    fprintf(stdout, "   noknownissues (K)        : %s\n", (noKnownIssues?     "On" : "Off"));
     fprintf(stdout, "   Warn on missing data (w) : %s\n", (warnOnMissingData? "On" : "Off"));
+    fprintf(stdout, "   Write golden data (G)    : %s\n", (writeGoldenData?   "On" : "Off"));
     fprintf(stdout, "   Threads                  : %d\n", threadCount);
     for (int32_t i = 0; i < nProps; i++) {
         fprintf(stdout, "   Custom property (prop:)  : %s\n", props[i]);
@@ -2105,6 +2119,42 @@ UBool IntlTest::assertEquals(const char* message,
 }
 #endif
 
+std::string vectorToString(const std::vector<std::string>& strings) {
+    std::string result = "{";
+    bool first = true;
+    for (auto element : strings) {
+        if (first) {
+            first = false;
+        } else {
+            result += ", ";
+        }
+        result += "\"";
+        result += element;
+        result += "\"";
+    }
+    result += "}";
+    return result;
+}
+
+UBool IntlTest::assertEquals(const char* message,
+                             const std::vector<std::string>& expected,
+                             const std::vector<std::string>& actual) {
+    if (expected != actual) {
+        std::string expectedAsString = vectorToString(expected);
+        std::string actualAsString = vectorToString(actual);
+        errln((UnicodeString)"FAIL: " + message +
+            "; got " + actualAsString.c_str() +
+            "; expected " + expectedAsString.c_str());
+        return FALSE;
+    }
+#ifdef VERBOSE_ASSERTIONS
+    else {
+        logln((UnicodeString)"Ok: " + message + "; got " + vectorToString(actual).c_str());
+    }
+#endif
+    return TRUE;
+}
+
 static char ASSERT_BUF[256];
 
 static const char* extractToAssertBuf(const UnicodeString& message) {
@@ -2169,6 +2219,11 @@ UBool IntlTest::assertEquals(const UnicodeString& message,
                              const UnicodeSet& actual) {
     return assertEquals(extractToAssertBuf(message), expected, actual);
 }
+UBool IntlTest::assertEquals(const UnicodeString& message,
+                             const std::vector<std::string>& expected,
+                             const std::vector<std::string>& actual) {
+    return assertEquals(extractToAssertBuf(message), expected, actual);
+}
 
 #if !UCONFIG_NO_FORMATTING
 UBool IntlTest::assertEquals(const UnicodeString& message,