tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

testLooselyEqual.cpp (4835B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #include <limits>
      6 #include <math.h>
      7 
      8 #include "js/Equality.h"  // JS::LooselyEqual
      9 #include "js/GlobalObject.h"
     10 #include "jsapi-tests/tests.h"
     11 
     12 using namespace std;
     13 
     14 struct LooseEqualityFixture : public JSAPIRuntimeTest {
     15  virtual ~LooseEqualityFixture() {}
     16 
     17  bool leq(JS::HandleValue x, JS::HandleValue y) {
     18    bool equal;
     19    CHECK(JS::LooselyEqual(cx, x, y, &equal) && equal);
     20    CHECK(JS::LooselyEqual(cx, y, x, &equal) && equal);
     21    return true;
     22  }
     23 
     24  bool nleq(JS::HandleValue x, JS::HandleValue y) {
     25    bool equal;
     26    CHECK(JS::LooselyEqual(cx, x, y, &equal) && !equal);
     27    CHECK(JS::LooselyEqual(cx, y, x, &equal) && !equal);
     28    return true;
     29  }
     30 };
     31 
     32 struct LooseEqualityData {
     33  JS::RootedValue qNaN;
     34  JS::RootedValue sNaN;
     35  JS::RootedValue d42;
     36  JS::RootedValue i42;
     37  JS::RootedValue undef;
     38  JS::RootedValue null;
     39  JS::RootedValue obj;
     40  JS::RootedValue poszero;
     41  JS::RootedValue negzero;
     42 
     43  explicit LooseEqualityData(JSContext* cx)
     44      : qNaN(cx),
     45        sNaN(cx),
     46        d42(cx),
     47        i42(cx),
     48        undef(cx),
     49        null(cx),
     50        obj(cx),
     51        poszero(cx),
     52        negzero(cx) {
     53    qNaN = JS::CanonicalizedDoubleValue(numeric_limits<double>::quiet_NaN());
     54    sNaN =
     55        JS::CanonicalizedDoubleValue(numeric_limits<double>::signaling_NaN());
     56    d42 = JS::DoubleValue(42.0);
     57    i42 = JS::Int32Value(42);
     58    undef = JS::UndefinedValue();
     59    null = JS::NullValue();
     60    obj = JS::ObjectOrNullValue(JS::CurrentGlobalOrNull(cx));
     61    poszero = JS::DoubleValue(0.0);
     62    negzero = JS::DoubleValue(-0.0);
     63 #ifdef XP_WIN
     64 #  define copysign _copysign
     65 #endif
     66    MOZ_RELEASE_ASSERT(copysign(1.0, poszero.toDouble()) == 1.0);
     67    MOZ_RELEASE_ASSERT(copysign(1.0, negzero.toDouble()) == -1.0);
     68 #ifdef XP_WIN
     69 #  undef copysign
     70 #endif
     71  }
     72 };
     73 
     74 // 11.9.3 1a
     75 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_undef) {
     76  LooseEqualityData d(cx);
     77  CHECK(leq(d.undef, d.undef));
     78  return true;
     79 }
     80 END_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_undef)
     81 
     82 // 11.9.3 1b
     83 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_null) {
     84  LooseEqualityData d(cx);
     85  CHECK(leq(d.null, d.null));
     86  return true;
     87 }
     88 END_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_null)
     89 
     90 // 11.9.3 1ci
     91 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_nan_nleq_all) {
     92  LooseEqualityData d(cx);
     93 
     94  CHECK(nleq(d.qNaN, d.qNaN));
     95  CHECK(nleq(d.qNaN, d.sNaN));
     96 
     97  CHECK(nleq(d.sNaN, d.sNaN));
     98  CHECK(nleq(d.sNaN, d.qNaN));
     99 
    100  CHECK(nleq(d.qNaN, d.d42));
    101  CHECK(nleq(d.qNaN, d.i42));
    102  CHECK(nleq(d.qNaN, d.undef));
    103  CHECK(nleq(d.qNaN, d.null));
    104  CHECK(nleq(d.qNaN, d.obj));
    105 
    106  CHECK(nleq(d.sNaN, d.d42));
    107  CHECK(nleq(d.sNaN, d.i42));
    108  CHECK(nleq(d.sNaN, d.undef));
    109  CHECK(nleq(d.sNaN, d.null));
    110  CHECK(nleq(d.sNaN, d.obj));
    111  return true;
    112 }
    113 END_FIXTURE_TEST(LooseEqualityFixture, test_nan_nleq_all)
    114 
    115 // 11.9.3 1cii
    116 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_all_nleq_nan) {
    117  LooseEqualityData d(cx);
    118 
    119  CHECK(nleq(d.qNaN, d.qNaN));
    120  CHECK(nleq(d.qNaN, d.sNaN));
    121 
    122  CHECK(nleq(d.sNaN, d.sNaN));
    123  CHECK(nleq(d.sNaN, d.qNaN));
    124 
    125  CHECK(nleq(d.d42, d.qNaN));
    126  CHECK(nleq(d.i42, d.qNaN));
    127  CHECK(nleq(d.undef, d.qNaN));
    128  CHECK(nleq(d.null, d.qNaN));
    129  CHECK(nleq(d.obj, d.qNaN));
    130 
    131  CHECK(nleq(d.d42, d.sNaN));
    132  CHECK(nleq(d.i42, d.sNaN));
    133  CHECK(nleq(d.undef, d.sNaN));
    134  CHECK(nleq(d.null, d.sNaN));
    135  CHECK(nleq(d.obj, d.sNaN));
    136  return true;
    137 }
    138 END_FIXTURE_TEST(LooseEqualityFixture, test_all_nleq_nan)
    139 
    140 // 11.9.3 1ciii
    141 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_leq_same_nums) {
    142  LooseEqualityData d(cx);
    143 
    144  CHECK(leq(d.d42, d.d42));
    145  CHECK(leq(d.i42, d.i42));
    146  CHECK(leq(d.d42, d.i42));
    147  CHECK(leq(d.i42, d.d42));
    148  return true;
    149 }
    150 END_FIXTURE_TEST(LooseEqualityFixture, test_leq_same_nums)
    151 
    152 // 11.9.3 1civ
    153 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_pz_leq_nz) {
    154  LooseEqualityData d(cx);
    155  CHECK(leq(d.poszero, d.negzero));
    156  return true;
    157 }
    158 END_FIXTURE_TEST(LooseEqualityFixture, test_pz_leq_nz)
    159 
    160 // 11.9.3 1cv
    161 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_nz_leq_pz) {
    162  LooseEqualityData d(cx);
    163  CHECK(leq(d.negzero, d.poszero));
    164  return true;
    165 }
    166 END_FIXTURE_TEST(LooseEqualityFixture, test_nz_leq_pz)
    167 
    168 // 1cvi onwards NOT TESTED
    169 
    170 // 11.9.3 2
    171 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_undef) {
    172  LooseEqualityData d(cx);
    173  CHECK(leq(d.null, d.undef));
    174  return true;
    175 }
    176 END_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_undef)
    177 
    178 // 11.9.3 3
    179 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_null) {
    180  LooseEqualityData d(cx);
    181  CHECK(leq(d.undef, d.null));
    182  return true;
    183 }
    184 END_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_null)
    185 
    186 // 4 onwards NOT TESTED