michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include michael@0: #include michael@0: michael@0: #include "jsapi-tests/tests.h" michael@0: michael@0: using namespace std; michael@0: michael@0: struct LooseEqualityFixture : public JSAPITest michael@0: { michael@0: virtual ~LooseEqualityFixture() {} michael@0: michael@0: bool leq(JS::HandleValue x, JS::HandleValue y) { michael@0: bool equal; michael@0: CHECK(JS_LooselyEqual(cx, x, y, &equal) && equal); michael@0: CHECK(JS_LooselyEqual(cx, y, x, &equal) && equal); michael@0: return true; michael@0: } michael@0: michael@0: bool nleq(JS::HandleValue x, JS::HandleValue y) { michael@0: bool equal; michael@0: CHECK(JS_LooselyEqual(cx, x, y, &equal) && !equal); michael@0: CHECK(JS_LooselyEqual(cx, y, x, &equal) && !equal); michael@0: return true; michael@0: } michael@0: }; michael@0: michael@0: struct LooseEqualityData michael@0: { michael@0: JS::RootedValue qNaN; michael@0: JS::RootedValue sNaN; michael@0: JS::RootedValue d42; michael@0: JS::RootedValue i42; michael@0: JS::RootedValue undef; michael@0: JS::RootedValue null; michael@0: JS::RootedValue obj; michael@0: JS::RootedValue poszero; michael@0: JS::RootedValue negzero; michael@0: michael@0: LooseEqualityData(JSContext *cx) michael@0: : qNaN(cx), michael@0: sNaN(cx), michael@0: d42(cx), michael@0: i42(cx), michael@0: undef(cx), michael@0: null(cx), michael@0: obj(cx), michael@0: poszero(cx), michael@0: negzero(cx) michael@0: { michael@0: qNaN = DOUBLE_TO_JSVAL(numeric_limits::quiet_NaN()); michael@0: sNaN = DOUBLE_TO_JSVAL(numeric_limits::signaling_NaN()); michael@0: d42 = DOUBLE_TO_JSVAL(42.0); michael@0: i42 = INT_TO_JSVAL(42); michael@0: undef = JSVAL_VOID; michael@0: null = JSVAL_NULL; michael@0: obj = OBJECT_TO_JSVAL(JS::CurrentGlobalOrNull(cx)); michael@0: poszero = DOUBLE_TO_JSVAL(0.0); michael@0: negzero = DOUBLE_TO_JSVAL(-0.0); michael@0: #ifdef XP_WIN michael@0: # define copysign _copysign michael@0: #endif michael@0: JS_ASSERT(copysign(1.0, JSVAL_TO_DOUBLE(poszero)) == 1.0); michael@0: JS_ASSERT(copysign(1.0, JSVAL_TO_DOUBLE(negzero)) == -1.0); michael@0: #ifdef XP_WIN michael@0: # undef copysign michael@0: #endif michael@0: } michael@0: }; michael@0: michael@0: // 11.9.3 1a michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_undef) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: CHECK(leq(d.undef, d.undef)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_undef) michael@0: michael@0: // 11.9.3 1b michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_null) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: CHECK(leq(d.null, d.null)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_null) michael@0: michael@0: // 11.9.3 1ci michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_nan_nleq_all) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: michael@0: CHECK(nleq(d.qNaN, d.qNaN)); michael@0: CHECK(nleq(d.qNaN, d.sNaN)); michael@0: michael@0: CHECK(nleq(d.sNaN, d.sNaN)); michael@0: CHECK(nleq(d.sNaN, d.qNaN)); michael@0: michael@0: CHECK(nleq(d.qNaN, d.d42)); michael@0: CHECK(nleq(d.qNaN, d.i42)); michael@0: CHECK(nleq(d.qNaN, d.undef)); michael@0: CHECK(nleq(d.qNaN, d.null)); michael@0: CHECK(nleq(d.qNaN, d.obj)); michael@0: michael@0: CHECK(nleq(d.sNaN, d.d42)); michael@0: CHECK(nleq(d.sNaN, d.i42)); michael@0: CHECK(nleq(d.sNaN, d.undef)); michael@0: CHECK(nleq(d.sNaN, d.null)); michael@0: CHECK(nleq(d.sNaN, d.obj)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_nan_nleq_all) michael@0: michael@0: // 11.9.3 1cii michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_all_nleq_nan) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: michael@0: CHECK(nleq(d.qNaN, d.qNaN)); michael@0: CHECK(nleq(d.qNaN, d.sNaN)); michael@0: michael@0: CHECK(nleq(d.sNaN, d.sNaN)); michael@0: CHECK(nleq(d.sNaN, d.qNaN)); michael@0: michael@0: CHECK(nleq(d.d42, d.qNaN)); michael@0: CHECK(nleq(d.i42, d.qNaN)); michael@0: CHECK(nleq(d.undef, d.qNaN)); michael@0: CHECK(nleq(d.null, d.qNaN)); michael@0: CHECK(nleq(d.obj, d.qNaN)); michael@0: michael@0: CHECK(nleq(d.d42, d.sNaN)); michael@0: CHECK(nleq(d.i42, d.sNaN)); michael@0: CHECK(nleq(d.undef, d.sNaN)); michael@0: CHECK(nleq(d.null, d.sNaN)); michael@0: CHECK(nleq(d.obj, d.sNaN)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_all_nleq_nan) michael@0: michael@0: // 11.9.3 1ciii michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_leq_same_nums) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: michael@0: CHECK(leq(d.d42, d.d42)); michael@0: CHECK(leq(d.i42, d.i42)); michael@0: CHECK(leq(d.d42, d.i42)); michael@0: CHECK(leq(d.i42, d.d42)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_leq_same_nums) michael@0: michael@0: // 11.9.3 1civ michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_pz_leq_nz) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: CHECK(leq(d.poszero, d.negzero)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_pz_leq_nz) michael@0: michael@0: // 11.9.3 1cv michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_nz_leq_pz) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: CHECK(leq(d.negzero, d.poszero)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_nz_leq_pz) michael@0: michael@0: // 1cvi onwards NOT TESTED michael@0: michael@0: // 11.9.3 2 michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_undef) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: CHECK(leq(d.null, d.undef)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_null_leq_undef) michael@0: michael@0: // 11.9.3 3 michael@0: BEGIN_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_null) michael@0: { michael@0: LooseEqualityData d(cx); michael@0: CHECK(leq(d.undef, d.null)); michael@0: return true; michael@0: } michael@0: END_FIXTURE_TEST(LooseEqualityFixture, test_undef_leq_null) michael@0: michael@0: // 4 onwards NOT TESTED