Bug 1852740: add tests for the `fetchpriority` attribute in Link headers. r=necko...
[gecko.git] / js / src / jsapi-tests / testLooselyEqual.cpp
blob8fa369f7e7d4cde2fc4926196df5bf0c25ae4ed1
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/. */
5 #include <limits>
6 #include <math.h>
8 #include "js/Equality.h" // JS::LooselyEqual
9 #include "js/GlobalObject.h"
10 #include "jsapi-tests/tests.h"
12 using namespace std;
14 struct LooseEqualityFixture : public JSAPIRuntimeTest {
15 virtual ~LooseEqualityFixture() {}
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;
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;
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;
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
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;
80 END_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_undef)
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;
88 END_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_null)
90 // 11.9.3 1ci
91 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_nan_nleq_all) {
92 LooseEqualityData d(cx);
94 CHECK(nleq(d.qNaN, d.qNaN));
95 CHECK(nleq(d.qNaN, d.sNaN));
97 CHECK(nleq(d.sNaN, d.sNaN));
98 CHECK(nleq(d.sNaN, d.qNaN));
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));
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;
113 END_FIXTURE_TEST(LooseEqualityFixture, test_nan_nleq_all)
115 // 11.9.3 1cii
116 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_all_nleq_nan) {
117 LooseEqualityData d(cx);
119 CHECK(nleq(d.qNaN, d.qNaN));
120 CHECK(nleq(d.qNaN, d.sNaN));
122 CHECK(nleq(d.sNaN, d.sNaN));
123 CHECK(nleq(d.sNaN, d.qNaN));
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));
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;
138 END_FIXTURE_TEST(LooseEqualityFixture, test_all_nleq_nan)
140 // 11.9.3 1ciii
141 BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_leq_same_nums) {
142 LooseEqualityData d(cx);
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;
150 END_FIXTURE_TEST(LooseEqualityFixture, test_leq_same_nums)
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;
158 END_FIXTURE_TEST(LooseEqualityFixture, test_pz_leq_nz)
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;
166 END_FIXTURE_TEST(LooseEqualityFixture, test_nz_leq_pz)
168 // 1cvi onwards NOT TESTED
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;
176 END_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_undef)
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;
184 END_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_null)
186 // 4 onwards NOT TESTED