| //------------------------------------------------------------------------------------------------------- |
| // 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" }); |