]> granicus.if.org Git - icu/commitdiff
Update code for correct NaN/Inf handling.
authorHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Thu, 30 Apr 2020 10:54:11 +0000 (12:54 +0200)
committerHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Wed, 17 Jun 2020 20:33:57 +0000 (22:33 +0200)
icu4c/source/test/intltest/intltest.cpp
icu4c/source/test/intltest/intltest.h

index d222d46d883ba264f9dd2c675e647d18cb835dd8..9f4ae348ab947db18cd761a1823b140f910cd70e 100644 (file)
@@ -2026,8 +2026,7 @@ UBool IntlTest::assertEquals(const char* message,
                              double expected,
                              double actual) {
     bool bothNaN = std::isnan(expected) && std::isnan(actual);
-    bool bothInf = std::isinf(expected) && std::isinf(actual);
-    if (expected != actual && !bothNaN && !bothInf) {
+    if (expected != actual && !bothNaN) {
         errln((UnicodeString)"FAIL: " + message + "; got " +
               actual + 
               "; expected " + expected);
@@ -2045,9 +2044,14 @@ UBool IntlTest::assertEquals(const char* message,
                              double expected,
                              double actual,
                              double delta) {
+    if (std::isnan(delta) || std::isinf(delta)) {
+        errln((UnicodeString)("FAIL: ") + message + "; nonsensical delta " + delta +
+              " - delta may not be NaN or Inf");
+        return FALSE;
+    }
     bool bothNaN = std::isnan(expected) && std::isnan(actual);
-    bool bothInf = std::isinf(expected) && std::isinf(actual);
-    if (abs(expected - actual) > delta && !bothNaN && !bothInf) {
+    double difference = abs(expected - actual);
+    if (expected != actual && (difference > delta || std::isnan(difference)) && !bothNaN) {
         errln((UnicodeString)("FAIL: ") + message + "; got " + actual + "; expected " + expected +
               "; acceptable delta " + delta);
         return FALSE;
index b3eec2ba01ba58860d8691b9e75a6d720673d723..ada0c0bfd6d80dceb64ea766eae09897da1d1655 100644 (file)
@@ -303,8 +303,8 @@ public:
      * Asserts that two doubles are equal to within a positive delta. Returns
      * false if they are not.
      *
-     * If the expected value is infinity then the delta value is ignored. NaNs
-     * are considered equal: assertEquals(msg, NaN, NaN, *) passes.
+     * NaNs are considered equal: assertEquals(msg, NaN, NaN, *) passes.
+     * Infs are considered equal: assertEquals(msg, inf, inf, *) passes.
      *
      * @param message - the identifying message for the AssertionError.
      * @param expected - expected value.
@@ -339,8 +339,8 @@ public:
      * Asserts that two doubles are equal to within a positive delta. Returns
      * false if they are not.
      *
-     * If the expected value is infinity then the delta value is ignored. NaNs
-     * are considered equal: assertEquals(msg, NaN, NaN, *) passes.
+     * NaNs are considered equal: assertEquals(msg, NaN, NaN, *) passes.
+     * Infs are considered equal: assertEquals(msg, inf, inf, *) passes.
      *
      * @param message - the identifying message for the AssertionError.
      * @param expected - expected value.