blob: feb756e27ee923f0ea4e8b8c8611e80ff06a816b [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.
//-------------------------------------------------------------------------------------------------------
// Tests for Object.setPrototypeOf and Object#__proto__ ES6 behavior
WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
var pd = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__');
var __proto__set = pd.set;
var __proto__get = pd.get;
var tests = [
{
name: "Sanity base cases",
body: function() {
assert.areEqual('function', typeof __proto__set, "Object#__proto__ is an accessor property with set method");
assert.areEqual('function', typeof __proto__get, "Object#__proto__ is an accessor property with get method");
}
},
{
name: "Error conditions for Object#__proto__",
body: function () {
assert.throws(function() { __proto__set.call(); }, TypeError, "set Object#__proto__ throws if this argument is not passed", "Object.prototype.__proto__: 'this' is not an Object");
assert.throws(function() { __proto__set.call(undefined); }, TypeError, "set Object#__proto__ throws if this argument is undefined", "Object.prototype.__proto__: 'this' is not an Object");
assert.throws(function() { __proto__set.call(null); }, TypeError, "set Object#__proto__ throws if this argument is null", "Object.prototype.__proto__: 'this' is not an Object");
assert.throws(function() { __proto__get.call(); }, TypeError, "get Object#__proto__ throws if this argument is not passed", "Object.prototype.__proto__: 'this' is not an Object");
assert.throws(function() { __proto__get.call(undefined); }, TypeError, "get Object#__proto__ throws if this argument is undefined", "Object.prototype.__proto__: 'this' is not an Object");
assert.throws(function() { __proto__get.call(null); }, TypeError, "get Object#__proto__ throws if this argument is null", "Object.prototype.__proto__: 'this' is not an Object");
}
},
{
name: "Cases where Object#__proto__ shouldn't change [[Prototype]]",
body: function () {
var p = {};
var o = Object.create(p);
assert.areEqual(undefined, __proto__set.call(o), "set Object#__proto__ returns undefined if the proto argument is not passed");
assert.areEqual(p, __proto__get.call(o), "[[Prototype]] slot of o was not changed");
assert.areEqual(undefined, __proto__set.call(o, undefined), "set Object#__proto__ returns undefined if the proto argument is undefined");
assert.areEqual(p, __proto__get.call(o), "[[Prototype]] slot of o was not changed");
assert.areEqual(undefined, __proto__set.call(o, 5), "set Object#__proto__ returns undefined if the proto argument is non-object");
assert.areEqual(p, __proto__get.call(o), "[[Prototype]] slot of o was not changed");
var n = 5;
assert.areEqual(undefined, __proto__set.call(n, {}), "set Object#__proto__ returns undefined if the this argument is non-object when proto argument is supplied");
assert.areEqual(Number.prototype, __proto__get.call(n), "[[Prototype]] slot of n was not changed");
}
},
{
name: "Simple validation of Object#__proto__",
body: function () {
var p = {};
var o = Object.create(p);
assert.areEqual(undefined, __proto__set.call(o, null), "set Object#__proto__ returns undefined if the proto argument is null");
assert.areEqual(null, __proto__get.call(o), "[[Prototype]] slot of o was changed to null");
assert.areEqual(undefined, __proto__set.call(o, p), "set Object#__proto__ returns undefined if the proto argument is object");
assert.areEqual(p, __proto__get.call(o), "[[Prototype]] slot of o was changed to p");
}
},
{
name: "Error conditions for Object.setPrototypeOf/getPrototypeOf",
body: function () {
assert.throws(function() { Object.setPrototypeOf(); }, TypeError, "Object.setPrototypeOf throws when called with no arguments", "Object.setPrototypeOf: argument is not an Object");
assert.throws(function() { Object.setPrototypeOf(undefined); }, TypeError, "Object.setPrototypeOf throws when object argument is undefined", "Object.setPrototypeOf: argument is not an Object");
assert.throws(function() { Object.setPrototypeOf(null); }, TypeError, "Object.setPrototypeOf throws when object argument is null", "Object.setPrototypeOf: argument is not an Object");
assert.throws(function() { Object.setPrototypeOf({}); }, TypeError, "Object.setPrototypeOf throws when proto is not passed", "Object.setPrototypeOf: argument is not an Object and is not null");
assert.throws(function() { Object.setPrototypeOf({}, undefined); }, TypeError, "Object.setPrototypeOf throws when proto is undefined", "Object.setPrototypeOf: argument is not an Object and is not null");
assert.throws(function() { Object.setPrototypeOf({}, 5); }, TypeError, "Object.setPrototypeOf throws when proto is not object", "Object.setPrototypeOf: argument is not an Object and is not null");
assert.throws(function() { Object.getPrototypeOf(); }, TypeError, "Object.getPrototypeOf throws when argument is not passed", "Object.getPrototypeOf: argument is not an Object");
assert.throws(function() { Object.getPrototypeOf(undefined); }, TypeError, "Object.getPrototypeOf throws when argument is undefined", "Object.getPrototypeOf: argument is not an Object");
assert.throws(function() { Object.getPrototypeOf(null); }, TypeError, "Object.getPrototypeOf throws when argument is null", "Object.getPrototypeOf: argument is not an Object");
}
},
{
name: "Object.setPrototypeOf used on non-object argument doesn't change [[Prototype]]",
body: function () {
var n = 5;
assert.areEqual(5, Object.setPrototypeOf(n, {}), "Object.setPrototypeOf returns first argument if argument is non-object when proto argument is supplied");
assert.areEqual(Number.prototype, Object.getPrototypeOf(n), "[[Prototype]] slot of n was not changed");
}
},
{
name: "Simple validation of Object.setPrototypeOf",
body: function () {
var p = {};
var o = Object.create(p);
assert.areEqual(o, Object.setPrototypeOf(o, null), "Object.setPrototypeOf returns o if the proto argument is null");
assert.areEqual(null, Object.getPrototypeOf(o), "[[Prototype]] slot of o was changed to null");
assert.areEqual(o, Object.setPrototypeOf(o, p), "Object.setPrototypeOf returns o if the proto argument is object");
assert.areEqual(p, Object.getPrototypeOf(o), "[[Prototype]] slot of o was changed to p");
}
},
];
testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });