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/. */
8 #include "js/Equality.h" // JS::LooselyEqual
9 #include "js/GlobalObject.h"
10 #include "jsapi-tests/tests.h"
14 struct LooseEqualityFixture
: public JSAPIRuntimeTest
{
15 virtual ~LooseEqualityFixture() {}
17 bool leq(JS::HandleValue x
, JS::HandleValue y
) {
19 CHECK(JS::LooselyEqual(cx
, x
, y
, &equal
) && equal
);
20 CHECK(JS::LooselyEqual(cx
, y
, x
, &equal
) && equal
);
24 bool nleq(JS::HandleValue x
, JS::HandleValue y
) {
26 CHECK(JS::LooselyEqual(cx
, x
, y
, &equal
) && !equal
);
27 CHECK(JS::LooselyEqual(cx
, y
, x
, &equal
) && !equal
);
32 struct LooseEqualityData
{
37 JS::RootedValue undef
;
40 JS::RootedValue poszero
;
41 JS::RootedValue negzero
;
43 explicit LooseEqualityData(JSContext
* cx
)
53 qNaN
= JS::CanonicalizedDoubleValue(numeric_limits
<double>::quiet_NaN());
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);
64 # define copysign _copysign
66 MOZ_RELEASE_ASSERT(copysign(1.0, poszero
.toDouble()) == 1.0);
67 MOZ_RELEASE_ASSERT(copysign(1.0, negzero
.toDouble()) == -1.0);
75 BEGIN_FIXTURE_TEST(LooseEqualityFixture
, test_undef_leq_undef
) {
76 LooseEqualityData
d(cx
);
77 CHECK(leq(d
.undef
, d
.undef
));
80 END_FIXTURE_TEST(LooseEqualityFixture
, test_undef_leq_undef
)
83 BEGIN_FIXTURE_TEST(LooseEqualityFixture
, test_null_leq_null
) {
84 LooseEqualityData
d(cx
);
85 CHECK(leq(d
.null
, d
.null
));
88 END_FIXTURE_TEST(LooseEqualityFixture
, test_null_leq_null
)
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
));
113 END_FIXTURE_TEST(LooseEqualityFixture
, test_nan_nleq_all
)
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
));
138 END_FIXTURE_TEST(LooseEqualityFixture
, test_all_nleq_nan
)
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
));
150 END_FIXTURE_TEST(LooseEqualityFixture
, test_leq_same_nums
)
153 BEGIN_FIXTURE_TEST(LooseEqualityFixture
, test_pz_leq_nz
) {
154 LooseEqualityData
d(cx
);
155 CHECK(leq(d
.poszero
, d
.negzero
));
158 END_FIXTURE_TEST(LooseEqualityFixture
, test_pz_leq_nz
)
161 BEGIN_FIXTURE_TEST(LooseEqualityFixture
, test_nz_leq_pz
) {
162 LooseEqualityData
d(cx
);
163 CHECK(leq(d
.negzero
, d
.poszero
));
166 END_FIXTURE_TEST(LooseEqualityFixture
, test_nz_leq_pz
)
168 // 1cvi onwards NOT TESTED
171 BEGIN_FIXTURE_TEST(LooseEqualityFixture
, test_null_leq_undef
) {
172 LooseEqualityData
d(cx
);
173 CHECK(leq(d
.null
, d
.undef
));
176 END_FIXTURE_TEST(LooseEqualityFixture
, test_null_leq_undef
)
179 BEGIN_FIXTURE_TEST(LooseEqualityFixture
, test_undef_leq_null
) {
180 LooseEqualityData
d(cx
);
181 CHECK(leq(d
.undef
, d
.null
));
184 END_FIXTURE_TEST(LooseEqualityFixture
, test_undef_leq_null
)
186 // 4 onwards NOT TESTED