// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --allow-natives-syntax --harmony-bigint 'use strict' const minus_one = BigInt(-1); const zero = BigInt(0); const another_zero = BigInt(0); const one = BigInt(1); const another_one = BigInt(1); const two = BigInt(2); const three = BigInt(3); const six = BigInt(6); // Strict equality { assertTrue(zero === zero); assertFalse(zero !== zero); assertTrue(zero === another_zero); assertFalse(zero !== another_zero); assertFalse(zero === one); assertTrue(zero !== one); assertTrue(one !== zero); assertFalse(one === zero); assertFalse(zero === 0); assertTrue(zero !== 0); assertFalse(0 === zero); assertTrue(0 !== zero); }{ assertTrue(%StrictEqual(zero, zero)); assertFalse(%StrictNotEqual(zero, zero)); assertTrue(%StrictEqual(zero, another_zero)); assertFalse(%StrictNotEqual(zero, another_zero)); assertFalse(%StrictEqual(zero, one)); assertTrue(%StrictNotEqual(zero, one)); assertTrue(%StrictNotEqual(one, zero)); assertFalse(%StrictEqual(one, zero)); assertFalse(%StrictEqual(zero, 0)); assertTrue(%StrictNotEqual(zero, 0)); assertFalse(%StrictEqual(0, zero)); assertTrue(%StrictNotEqual(0, zero)); } // Abstract equality { assertTrue(%Equal(zero, zero)); assertTrue(%Equal(zero, another_zero)); assertFalse(%Equal(zero, one)); assertFalse(%Equal(one, zero)); assertTrue(%Equal(zero, +0)); assertTrue(%Equal(zero, -0)); assertTrue(%Equal(+0, zero)); assertTrue(%Equal(-0, zero)); assertTrue(%Equal(zero, false)); assertTrue(%Equal(one, true)); assertFalse(%Equal(zero, true)); assertFalse(%Equal(one, false)); assertTrue(%Equal(false, zero)); assertTrue(%Equal(true, one)); assertFalse(%Equal(true, zero)); assertFalse(%Equal(false, one)); assertTrue(%Equal(one, 1)); assertTrue(%Equal(one, Number(1))); assertTrue(%Equal(1, one)); assertTrue(%Equal(Number(1), one)); assertTrue(%Equal(minus_one, -1)); assertTrue(%Equal(minus_one, Number(-1))); assertTrue(%Equal(-1, minus_one)); assertTrue(%Equal(Number(-1), minus_one)); assertFalse(%Equal(one, -1)); assertFalse(%Equal(one, Number(-1))); assertFalse(%Equal(-1, one)); assertFalse(%Equal(Number(-1), one)); assertFalse(%Equal(one, 1.0000000000001)); assertFalse(%Equal(1.0000000000001, one)); assertTrue(%Equal(zero, "")); assertTrue(%Equal("", zero)); assertTrue(%Equal(one, "1")); assertTrue(%Equal("1", one)); assertFalse(%Equal(one, "a")); assertFalse(%Equal("a", one)); assertTrue(%Equal(one, {valueOf() { return true }})); assertTrue(%Equal({valueOf() { return true }}, one)); assertFalse(%Equal(two, {valueOf() { return true }})); assertFalse(%Equal({valueOf() { return true }}, two)); assertFalse(%Equal(Symbol(), zero)); assertFalse(%Equal(zero, Symbol())); }{ assertTrue(zero == zero); assertTrue(zero == another_zero); assertFalse(zero == one); assertFalse(one == zero); assertTrue(zero == +0); assertTrue(zero == -0); assertTrue(+0 == zero); assertTrue(-0 == zero); assertTrue(zero == false); assertTrue(one == true); assertFalse(zero == true); assertFalse(one == false); assertTrue(false == zero); assertTrue(true == one); assertFalse(true == zero); assertFalse(false == one); assertTrue(one == 1); assertTrue(one == Number(1)); assertTrue(1 == one); assertTrue(Number(1) == one); assertTrue(minus_one == -1); assertTrue(minus_one == Number(-1)); assertTrue(-1 == minus_one); assertTrue(Number(-1) == minus_one); assertFalse(one == -1); assertFalse(one == Number(-1)); assertFalse(-1 == one); assertFalse(Number(-1) == one); assertFalse(one == 1.0000000000001); assertFalse(1.0000000000001 == one); assertTrue(zero == ""); assertTrue("" == zero); assertTrue(zero == " \t\r\n"); assertTrue(one == "1"); assertTrue("1" == one); assertFalse(" \t\r\n" == one); assertFalse(one == "a"); assertFalse("a" == one); assertTrue(zero == "00000000000000" + "0"); assertTrue(one == {valueOf() { return true }}); assertTrue({valueOf() { return true }} == one); assertFalse(two == {valueOf() { return true }}); assertFalse({valueOf() { return true }} == two); assertFalse(Symbol() == zero); assertFalse(zero == Symbol()); assertTrue(one == "0b1"); assertTrue(" 0b1" == one); assertTrue(one == "0o1"); assertTrue("0o1 " == one); assertTrue(one == "\n0x1"); assertTrue("0x1" == one); assertFalse(one == "1j"); assertFalse(one == "0b1ju"); assertFalse(one == "0o1jun"); assertFalse(one == "0x1junk"); }{ assertFalse(%NotEqual(zero, zero)); assertFalse(%NotEqual(zero, another_zero)); assertTrue(%NotEqual(zero, one)); assertTrue(%NotEqual(one, zero)); assertFalse(%NotEqual(zero, +0)); assertFalse(%NotEqual(zero, -0)); assertFalse(%NotEqual(+0, zero)); assertFalse(%NotEqual(-0, zero)); assertFalse(%NotEqual(zero, false)); assertFalse(%NotEqual(one, true)); assertTrue(%NotEqual(zero, true)); assertTrue(%NotEqual(one, false)); assertFalse(%NotEqual(false, zero)); assertFalse(%NotEqual(true, one)); assertTrue(%NotEqual(true, zero)); assertTrue(%NotEqual(false, one)); assertFalse(%NotEqual(one, 1)); assertFalse(%NotEqual(one, Number(1))); assertFalse(%NotEqual(1, one)); assertFalse(%NotEqual(Number(1), one)); assertFalse(%NotEqual(minus_one, -1)); assertFalse(%NotEqual(minus_one, Number(-1))); assertFalse(%NotEqual(-1, minus_one)); assertFalse(%NotEqual(Number(-1), minus_one)); assertTrue(%NotEqual(one, -1)); assertTrue(%NotEqual(one, Number(-1))); assertTrue(%NotEqual(-1, one)); assertTrue(%NotEqual(Number(-1), one)); assertTrue(%NotEqual(one, 1.0000000000001)); assertTrue(%NotEqual(1.0000000000001, one)); assertFalse(%NotEqual(zero, "")); assertFalse(%NotEqual("", zero)); assertFalse(%NotEqual(one, "1")); assertFalse(%NotEqual("1", one)); assertTrue(%NotEqual(one, "a")); assertTrue(%NotEqual("a", one)); assertFalse(%NotEqual(one, {valueOf() { return true }})); assertFalse(%NotEqual({valueOf() { return true }}, one)); assertTrue(%NotEqual(two, {valueOf() { return true }})); assertTrue(%NotEqual({valueOf() { return true }}, two)); assertTrue(%NotEqual(Symbol(), zero)); assertTrue(%NotEqual(zero, Symbol())); }{ assertFalse(zero != zero); assertFalse(zero != another_zero); assertTrue(zero != one); assertTrue(one != zero); assertFalse(zero != +0); assertFalse(zero != -0); assertFalse(+0 != zero); assertFalse(-0 != zero); assertFalse(zero != false); assertFalse(one != true); assertTrue(zero != true); assertTrue(one != false); assertFalse(false != zero); assertFalse(true != one); assertTrue(true != zero); assertTrue(false != one); assertFalse(one != 1); assertFalse(one != Number(1)); assertFalse(1 != one); assertFalse(Number(1) != one); assertFalse(minus_one != -1); assertFalse(minus_one != Number(-1)); assertFalse(-1 != minus_one); assertFalse(Number(-1) != minus_one); assertTrue(one != -1); assertTrue(one != Number(-1)); assertTrue(-1 != one); assertTrue(Number(-1) != one); assertTrue(one != 1.0000000000001); assertTrue(1.0000000000001 != one); assertFalse(zero != ""); assertFalse("" != zero); assertFalse(one != "1"); assertFalse("1" != one); assertTrue(one != "a"); assertTrue("a" != one); assertFalse(one != {valueOf() { return true }}); assertFalse({valueOf() { return true }} != one); assertTrue(two != {valueOf() { return true }}); assertTrue({valueOf() { return true }} != two); assertTrue(Symbol() != zero); assertTrue(zero != Symbol()); } // SameValue { assertTrue(Object.is(zero, zero)); assertTrue(Object.is(zero, another_zero)); assertTrue(Object.is(one, one)); assertTrue(Object.is(one, another_one)); assertFalse(Object.is(zero, +0)); assertFalse(Object.is(zero, -0)); assertFalse(Object.is(+0, zero)); assertFalse(Object.is(-0, zero)); assertFalse(Object.is(zero, one)); assertFalse(Object.is(one, minus_one)); }{ const obj = Object.defineProperty({}, 'foo', {value: zero, writable: false, configurable: false}); assertTrue(Reflect.defineProperty(obj, 'foo', {value: zero})); assertTrue(Reflect.defineProperty(obj, 'foo', {value: another_zero})); assertFalse(Reflect.defineProperty(obj, 'foo', {value: one})); } // SameValueZero { assertTrue([zero].includes(zero)); assertTrue([zero].includes(another_zero)); assertFalse([zero].includes(+0)); assertFalse([zero].includes(-0)); assertFalse([+0].includes(zero)); assertFalse([-0].includes(zero)); assertTrue([one].includes(one)); assertTrue([one].includes(another_one)); assertFalse([one].includes(1)); assertFalse([1].includes(one)); }{ assertTrue(new Set([zero]).has(zero)); assertTrue(new Set([zero]).has(another_zero)); assertFalse(new Set([zero]).has(+0)); assertFalse(new Set([zero]).has(-0)); assertFalse(new Set([+0]).has(zero)); assertFalse(new Set([-0]).has(zero)); assertTrue(new Set([one]).has(one)); assertTrue(new Set([one]).has(another_one)); }{ assertTrue(new Map([[zero, 42]]).has(zero)); assertTrue(new Map([[zero, 42]]).has(another_zero)); assertFalse(new Map([[zero, 42]]).has(+0)); assertFalse(new Map([[zero, 42]]).has(-0)); assertFalse(new Map([[+0, 42]]).has(zero)); assertFalse(new Map([[-0, 42]]).has(zero)); assertTrue(new Map([[one, 42]]).has(one)); assertTrue(new Map([[one, 42]]).has(another_one)); } // Abstract comparison { let undef = Symbol(); assertTrue(%Equal(zero, zero)); assertTrue(%GreaterThanOrEqual(zero, zero)); assertTrue(%LessThan(zero, one)); assertTrue(%GreaterThan(one, zero)); assertTrue(%LessThan(minus_one, one)); assertTrue(%GreaterThan(one, minus_one)); assertTrue(%Equal(zero, -0)); assertTrue(%LessThanOrEqual(zero, -0)); assertTrue(%GreaterThanOrEqual(zero, -0)); assertTrue(%Equal(-0, zero)); assertTrue(%LessThanOrEqual(-0, zero)); assertTrue(%GreaterThanOrEqual(-0, zero)); assertTrue(%Equal(zero, 0)); assertTrue(%Equal(0, zero)); assertTrue(%LessThan(minus_one, 1)); assertTrue(%GreaterThan(1, minus_one)); assertFalse(%LessThan(six, NaN)); assertFalse(%GreaterThan(six, NaN)); assertFalse(%Equal(six, NaN)); assertFalse(%LessThan(NaN, six)); assertFalse(%GreaterThan(NaN, six)); assertFalse(%Equal(NaN, six)); assertTrue(%LessThan(six, Infinity)); assertTrue(%GreaterThan(Infinity, six)); assertTrue(%GreaterThan(six, -Infinity)); assertTrue(%LessThan(-Infinity, six)); assertTrue(%GreaterThan(six, 5.99999999)); assertTrue(%LessThan(5.99999999, six)); assertTrue(%Equal(zero, "")); assertTrue(%LessThanOrEqual(zero, "")); assertTrue(%GreaterThanOrEqual(zero, "")); assertTrue(%Equal("", zero)); assertTrue(%LessThanOrEqual("", zero)); assertTrue(%GreaterThanOrEqual("", zero)); assertTrue(%Equal(minus_one, "\t-1 ")); assertTrue(%LessThanOrEqual(minus_one, "\t-1 ")); assertTrue(%GreaterThanOrEqual(minus_one, "\t-1 ")); assertTrue(%Equal("\t-1 ", minus_one)); assertTrue(%LessThanOrEqual("\t-1 ", minus_one)); assertTrue(%GreaterThanOrEqual("\t-1 ", minus_one)); assertFalse(%LessThan(minus_one, "-0x1")); assertFalse(%GreaterThan(minus_one, "-0x1")); assertFalse(%Equal(minus_one, "-0x1")); assertFalse(%LessThan("-0x1", minus_one)); assertFalse(%GreaterThan("-0x1", minus_one)); assertFalse(%Equal("-0x1", minus_one)); const unsafe = "9007199254740993"; // 2**53 + 1 assertFalse(%GreaterThan(eval(unsafe + "n"), unsafe)); assertFalse(%LessThan(unsafe, eval(unsafe + "n"))); assertThrows(() => %LessThan(six, Symbol(6)), TypeError); assertThrows(() => %LessThan(Symbol(6), six), TypeError); var value_five_string_six = { valueOf() { return Object(5); }, toString() { return 6; } }; assertTrue(%LessThanOrEqual(six, value_five_string_six)); assertTrue(%GreaterThanOrEqual(six, value_five_string_six)); assertTrue(%LessThanOrEqual(value_five_string_six, six)); assertTrue(%GreaterThanOrEqual(value_five_string_six, six)); }{ assertFalse(zero < zero); assertTrue(zero <= zero); assertTrue(zero < one); assertTrue(zero <= one); assertFalse(one < zero); assertFalse(one <= zero); assertTrue(minus_one < one); assertTrue(minus_one <= one); assertFalse(one < minus_one); assertFalse(one <= minus_one); assertFalse(zero < -0); assertTrue(zero <= -0); assertFalse(-0 < zero); assertTrue(-0 <= zero); assertFalse(zero < 0); assertTrue(zero <= 0); assertFalse(0 < zero); assertTrue(0 <= zero); assertTrue(minus_one < 1); assertTrue(minus_one <= 1); assertFalse(1 < minus_one); assertFalse(1 <= minus_one); assertFalse(six < NaN); assertFalse(six <= NaN); assertFalse(NaN < six); assertFalse(NaN <= six); assertTrue(six < Infinity); assertTrue(six <= Infinity); assertFalse(Infinity < six); assertFalse(Infinity <= six); assertFalse(six < -Infinity); assertFalse(six <= -Infinity); assertTrue(-Infinity < six); assertTrue(-Infinity <= six); assertFalse(six < 5.99999999); assertFalse(six <= 5.99999999); assertTrue(5.99999999 < six); assertTrue(5.99999999 <= six); assertFalse(zero < ""); assertTrue(zero <= ""); assertFalse("" < zero); assertTrue("" <= zero); assertFalse(minus_one < "\t-1 "); assertTrue(minus_one <= "\t-1 "); assertFalse("\t-1 " < minus_one); assertTrue("\t-1 " <= minus_one); assertFalse(minus_one < "-0x1"); assertFalse(minus_one <= "-0x1"); assertFalse("-0x1" < minus_one); assertFalse("-0x1" <= minus_one); const unsafe = "9007199254740993"; // 2**53 + 1 assertFalse(eval(unsafe + "n") < unsafe); assertTrue(eval(unsafe + "n") <= unsafe); assertFalse(unsafe < eval(unsafe + "n")); assertTrue(unsafe <= eval(unsafe + "n")); assertThrows(() => six < Symbol(6), TypeError); assertThrows(() => six <= Symbol(6), TypeError); assertThrows(() => Symbol(6) < six, TypeError); assertThrows(() => Symbol(6) <= six, TypeError); assertFalse(six < {valueOf() {return Object(5)}, toString() {return 6}}); assertTrue(six <= {valueOf() {return Object(5)}, toString() {return 6}}); assertFalse({valueOf() {return Object(5)}, toString() {return 6}} < six); assertTrue({valueOf() {return Object(5)}, toString() {return 6}} <= six); }