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