//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- var echo = WScript.Echo; var globalObject = this; var o = {}; function foo() { echo(" ", "Evaluate arg list"); } function test(title, f) { echo(title); try { f(); } catch (e) { echo(" ", e.name); } echo(); } test("Global member missing", function () { bar(foo()); }); test("Global member undefined", function () { bar = undefined; bar(foo()); }); test("Global member null", function () { bar = null; bar(foo()); }); test("Global member is not callable", function () { bar = 23; bar(foo()); }); if (Object.defineProperties) { test("Global member getter returns undefined", function () { Object.defineProperty(this, "bar", { get: function () { }, configurable: true }); bar(foo()); }); test("Global member getter returns null", function () { Object.defineProperty(this, "bar", { get: function () { return null; }, configurable: true }); bar(foo()); }); } echo(); test("Global member missing via property reference via dot syntax", function () { globalObject.baz(foo()); }); test("Global member undefined via property reference via dot syntax", function () { globalObject.baz = undefined; globalObject.baz(foo()); }); test("Global member null via property reference via dot syntax", function () { globalObject.baz = null; globalObject.baz(foo()); }); test("Global member is not callable via property reference via dot syntax", function () { globalObject.baz = 23; globalObject.baz(foo()); }); if (Object.defineProperties) { test("Global member getter returns undefined via property reference via dot syntax", function () { Object.defineProperty(this, "baz", { get: function () { }, configurable: true }); globalObject.baz(foo()); }); test("Global member getter returns null via property reference via dot syntax", function () { Object.defineProperty(this, "baz", { get: function () { return null; }, configurable: true }); globalObject.baz(foo()); }); } echo(); function elementname() { return "buz"; } test("Global member missing via property reference via element access syntax", function () { globalObject[elementname()](foo()); }); test("Global member undefined via property reference via element access syntax", function () { globalObject[elementname()] = undefined; globalObject[elementname()](foo()); }); test("Global member null via property reference via element access syntax", function () { globalObject[elementname()] = null; globalObject[elementname()](foo()); }); test("Global member is not callable via property reference via element access syntax", function () { globalObject[elementname()] = 23; globalObject[elementname()](foo()); }); if (Object.defineProperties) { test("Global member getter returns undefined via property reference via element access syntax", function () { Object.defineProperty(this, elementname(), { get: function () { }, configurable: true }); globalObject[elementname()](foo()); }); test("Global member getter returns null via property reference via element access syntax", function () { Object.defineProperty(this, elementname(), { get: function () { return null; }, configurable: true }); globalObject[elementname()](foo()); }); } echo(); test("Object member missing", function () { o.bar(foo()); }); test("Object member undefined", function () { o.bar = undefined; o.bar(foo()); }); test("Object member null", function () { o.bar = null; o.bar(foo()); }); test("Object member is not callable", function () { o.bar = 23; o.bar(foo()); }); if (Object.defineProperties) { test("Object member getter returns undefined", function () { Object.defineProperty(o, "bar", { get: function () { }, configurable: true }); o.bar(foo()); }); test("Object member getter returns null", function () { Object.defineProperty(o, "bar", { get: function () { return null; }, configurable: true }); o.bar(foo()); }); } echo(); test("Object element missing", function () { o[3](foo()); }); test("Object element undefined", function () { o[3] = undefined; o[3](foo()); }); test("Object element null", function () { o[3] = null; o[3](foo()); }); test("Object element is not callable", function () { o[3] = 23; o[3](foo()); }); if (Object.defineProperties) { test("Object element getter returns undefined", function () { Object.defineProperty(o, 3, { get: function () { }, configurable: true }); o[3](foo()); }); test("Object element getter returns null", function () { Object.defineProperty(o, 3, { get: function () { return null; }, configurable: true }); o[3](foo()); }); }