blob: f346a7a27c1aa58598c879b78c0f9483569315c2 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
// ES6 Object.is(x,y) API extension tests -- verifies the API shape and basic functionality
WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
var tests = [
{
name: "Object.is should exist and have length 2",
body: function () {
assert.isTrue(Object.hasOwnProperty('is'), "Object should have an is method");
assert.areEqual(2, Object.is.length, "is method takes two arguments");
}
},
{
name: "Object.is(undefined, y) returns true for y = undefined, false otherwise",
body: function () {
assert.isTrue(Object.is(undefined, undefined), "Object.is(undefined, y) returns true for Type(y) = Undefined");
assert.isFalse(Object.is(undefined, null), "Object.is(undefined, y) returns false for Type(y) = Null");
assert.isFalse(Object.is(undefined, false), "Object.is(undefined, y) returns false for Type(y) = Boolean");
assert.isFalse(Object.is(undefined, ""), "Object.is(undefined, y) returns false for Type(y) = String");
assert.isFalse(Object.is(undefined, Symbol()), "Object.is(undefined, y) returns false for Type(y) = Symbol");
assert.isFalse(Object.is(undefined, 0), "Object.is(undefined, y) returns false for Type(y) = Number");
assert.isFalse(Object.is(undefined, { }), "Object.is(undefined, y) returns false for Type(y) = Object");
}
},
{
name: "Object.is(null, y) returns true for y = null, false otherwise",
body: function () {
assert.isFalse(Object.is(null, undefined), "Object.is(null, y) returns false for Type(y) = Undefined");
assert.isTrue(Object.is(null, null), "Object.is(null, y) returns true for Type(y) = Null");
assert.isFalse(Object.is(null, false), "Object.is(null, y) returns false for Type(y) = Boolean");
assert.isFalse(Object.is(null, ""), "Object.is(null, y) returns false for Type(y) = String");
assert.isFalse(Object.is(null, Symbol()), "Object.is(null, y) returns false for Type(y) = Symbol");
assert.isFalse(Object.is(null, 0), "Object.is(null, y) returns false for Type(y) = Number");
assert.isFalse(Object.is(null, { }), "Object.is(null, y) returns false for Type(y) = Object");
}
},
{
name: "Object.is(x, y), where Type(x) is Number, returns true for y = x (bitwise), false otherwise",
body: function () {
assert.isFalse(Object.is(0, undefined), "Object.is(0, y) returns false for Type(y) = Undefined");
assert.isFalse(Object.is(0, null), "Object.is(0, y) returns false for Type(y) = Null");
assert.isFalse(Object.is(0, false), "Object.is(0, y) returns false for Type(y) = Boolean");
assert.isFalse(Object.is(0, ""), "Object.is(0, y) returns false for Type(y) = String");
assert.isFalse(Object.is(0, Symbol()), "Object.is(0, y) returns false for Type(y) = Symbol");
assert.isTrue(Object.is(0, 0), "Object.is(0, y) returns true for Type(y) = Number");
assert.isFalse(Object.is(0, { }), "Object.is(0, y) returns false for Type(y) = Object");
assert.isTrue(Object.is(NaN, NaN), "Object.is(NaN, NaN) returns true");
assert.isFalse(Object.is(+0, -0), "Object.is(+0, -0) returns false");
assert.isFalse(Object.is(-0, +0), "Object.is(+0, -0) returns false");
assert.isTrue(Object.is(10, 10), "Object.is(10, 10) returns true");
assert.isFalse(Object.is(10, -10), "Object.is(10, 10) returns false");
assert.isTrue(Object.is(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY), "Object.is(+Infinity, +Infinity) returns true");
assert.isTrue(Object.is(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY), "Object.is(-Infinity, -Infinity) returns true");
assert.isFalse(Object.is(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY), "Object.is(+Infinity, -Infinity) returns false");
}
},
{
name: "Object.is(x, y), where Type(x) is String, returns true when Type(y) is String and x and y have the same sequence of code points, false otherwise",
body: function () {
assert.isFalse(Object.is("", undefined), "Object.is('', y) returns false for Type(y) = Undefined");
assert.isFalse(Object.is("", null), "Object.is('', y) returns false for Type(y) = Null");
assert.isFalse(Object.is("", false), "Object.is('', y) returns false for Type(y) = Boolean");
assert.isTrue(Object.is("", ""), "Object.is('', y) returns true for Type(y) = String where x == y");
assert.isFalse(Object.is("", Symbol()), "Object.is('', y) returns false for Type(y) = Symbol");
assert.isFalse(Object.is("", 0), "Object.is('', y) returns false for Type(y) = Number");
assert.isFalse(Object.is("", { }), "Object.is('', y) returns false for Type(y) = Object");
assert.isTrue(Object.is("abc", "abc"), "Object.is('abc', 'abc') returns true");
assert.isFalse(Object.is("abc", "xyz"), "Object.is('abc', 'xyz') returns false");
}
},
{
name: "Object.is(x, y), where Type(x) is Boolean, returns true when Type(y) is Boolean and x = y, false otherwise",
body: function () {
assert.isFalse(Object.is(false, undefined), "Object.is(false, y) returns false for Type(y) = Undefined");
assert.isFalse(Object.is(false, null), "Object.is(false, y) returns false for Type(y) = Null");
assert.isTrue(Object.is(false, false), "Object.is(false, y) returns true for Type(y) = Boolean where x == y");
assert.isFalse(Object.is(false, ""), "Object.is(false, y) returns false for Type(y) = String");
assert.isFalse(Object.is(false, Symbol()), "Object.is(false, y) returns false for Type(y) = Symbol");
assert.isFalse(Object.is(false, 0), "Object.is(false, y) returns false for Type(y) = Number");
assert.isFalse(Object.is(false, { }), "Object.is(false, y) returns false for Type(y) = Object");
assert.isTrue(Object.is(true, true), "Object.is(true, true) returns true");
assert.isFalse(Object.is(false, true), "Object.is(false, true) returns false");
}
},
{
name: "Object.is(x, y), where Type(x) is Symbol, returns true when Type(y) is Symbol and x and y are the same symbol, false otherwise",
body: function () {
var sym = Symbol();
assert.isFalse(Object.is(sym, undefined), "Object.is(Symbol(), y) returns false for Type(y) = Undefined");
assert.isFalse(Object.is(sym, null), "Object.is(Symbol(), y) returns false for Type(y) = Null");
assert.isFalse(Object.is(sym, false), "Object.is(Symbol(), y) returns false for Type(y) = Boolean");
assert.isFalse(Object.is(sym, ""), "Object.is(Symbol(), y) returns false for Type(y) = String");
assert.isTrue(Object.is(sym, sym), "Object.is(x, y) returns true when x and y are the same symbol");
assert.isFalse(Object.is(sym, 0), "Object.is(Symbol(), y) returns false for Type(y) = Number");
assert.isFalse(Object.is(sym, { }), "Object.is(Symbol(), y) returns false for Type(y) = Object");
assert.isFalse(Object.is(sym, Symbol()), "Object.is(x, y) returns false where x and y are different symbols");
}
},
{
name: "Object.is(x, y), where Type(x) is Symbol, returns true when Type(y) is Symbol and x and y are the same symbol, false otherwise",
body: function () {
var o = { };
assert.isFalse(Object.is(o, undefined), "Object.is(Symbol(), y) returns false for Type(y) = Undefined");
assert.isFalse(Object.is(o, null), "Object.is(Symbol(), y) returns false for Type(y) = Null");
assert.isFalse(Object.is(o, false), "Object.is(Symbol(), y) returns false for Type(y) = Boolean");
assert.isFalse(Object.is(o, ""), "Object.is(Symbol(), y) returns false for Type(y) = String");
assert.isFalse(Object.is(o, Symbol()), "Object.is(x, y) returns false when Type(y) = Symbol");
assert.isFalse(Object.is(o, 0), "Object.is(Symbol(), y) returns false for Type(y) = Number");
assert.isTrue(Object.is(o, o), "Object.is(Symbol(), y) returns true for Type(y) = Object where x and y are the same object");
assert.isFalse(Object.is(o, { }), "Object.is(x, y) returns false when x and y are different objects");
}
},
{
name: "Object.is(x, y), where Type(x) is function, returns true when Type(y) is function and x and y are the same function or same throw functions in sloppy mode, false otherwise",
body: function () {
function f() { }
function g() { }
var obj1 = { f }, obj2 = { f };
var bf = f.bind();
var bft = f.bind({});
assert.isTrue(Object.is(obj1.f, obj2.f), "Object.is should return true when comparing the same function object");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(f.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(f.__proto__, "caller").set), "Object.is should return true when comparing different throw type error methods on the same function");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(f.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(f.__proto__, "caller").get), "Object.is should return true when comparing different throw type error methods on the same function's different accessors");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(f.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(g.__proto__, "arguments").set), "Object.is should return true when comparing same throw type error methods on different functions");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(f.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(g.__proto__, "caller").set), "Object.is should return true when comparing different throw type error methods on the different functions");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(f.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(g.__proto__, "caller").get), "Object.is should return true when comparing different throw type error methods on the different functions' different accessors");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(bf.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(bf.__proto__, "caller").set), "Object.is should return true when comparing different throw type error methods on the same bound function");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(bf.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(bf.__proto__, "caller").get), "Object.is should return true when comparing different throw type error methods on the same bound function's different accessors");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(bft.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(bf.__proto__, "caller").get), "Object.is should return true when comparing different throw type error methods on a different bound function's different accessors");
}
},
{
name: "Object.is(x, y), where Type(x) is function, returns true when Type(y) is function and x and y are the same function or same throw functions in strict mode, false otherwise",
body: function () {
'use strict';
function f() { 'use strict'; }
var bf = f.bind();
var bft = f.bind({});
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(Function.prototype, "arguments").set, Object.getOwnPropertyDescriptor(Function.prototype, "caller").set), "Object.is should return true when comparing different throw type error methods on the same function");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(Function.prototype, "arguments").set, Object.getOwnPropertyDescriptor(Function.prototype, "caller").get), "Object.is should return true when comparing different throw type error methods on the same function's different accessors");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(bf.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(bf.__proto__, "caller").set), "Object.is should return true when comparing different throw type error methods on the same bound function");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(bf.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(bf.__proto__, "caller").get), "Object.is should return true when comparing different throw type error methods on the same bound function's different accessors");
assert.isTrue(Object.is(Object.getOwnPropertyDescriptor(bft.__proto__, "arguments").set, Object.getOwnPropertyDescriptor(bf.__proto__, "caller").get), "Object.is should return true when comparing different throw type error methods on a different bound function's different accessors");
}
},
{
name: "Object.is called with less or more than 2 arguments",
body: function () {
assert.isTrue(Object.is(), "Object.is() is the same as Object.is(undefined, undefined) which should return true");
assert.isTrue(Object.is(undefined), "Object.is(undefined) is the same as Object.is(undefined, undefined) and returns true");
assert.isFalse(Object.is(null), "Object.is(null) is the same as Object.is(null, undefined) and returns false");
assert.isFalse(Object.is(false), "Object.is(false) is the same as Object.is(false, undefined) and returns false");
assert.isFalse(Object.is(""), "Object.is('') is the same as Object.is('', undefined) and returns false");
assert.isFalse(Object.is(Symbol()), "Object.is(Symbol()) is the same as Object.is(Symbol(), undefined) and returns false");
assert.isFalse(Object.is(0), "Object.is(0) is the same as Object.is(0, undefined) and returns false");
assert.isFalse(Object.is({ }), "Object.is({ }) is the same as Object.is({ }, undefined) and returns false");
assert.isTrue(Object.is(0, 0, 1), "Object.is ignores arguments after the first two; ignores the 1");
assert.isFalse(Object.is("", 0, false), "Object.is ignores arguments after the first two; ignores the false");
}
},
];
testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });