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