| //------------------------------------------------------------------------------------------------------- | |
| // Copyright (C) Microsoft. All rights reserved. | |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
| //------------------------------------------------------------------------------------------------------- | |
| var obj = new Object(); | |
| obj.n = null; | |
| obj.blah = 1; | |
| obj[0] = null; | |
| obj[1] = 1; | |
| var n = null; | |
| var blah = 1; | |
| // Call integer global var | |
| function CallErrorTest0() | |
| { | |
| blah(); | |
| } | |
| // new integer global var | |
| function CallErrorTest1() | |
| { | |
| new blah(); | |
| } | |
| // Call integer property | |
| function CallErrorTest2() | |
| { | |
| obj.blah(); | |
| } | |
| // new integer property | |
| function CallErrorTest3() | |
| { | |
| new obj.blah(); | |
| } | |
| // Call primitive null | |
| function CallErrorTest4() | |
| { | |
| null(); | |
| } | |
| // New primitive null | |
| function CallErrorTest5() | |
| { | |
| new null(); | |
| } | |
| // Call integer | |
| function CallErrorTest6() | |
| { | |
| 1(); | |
| } | |
| // new integer | |
| function CallErrorTest7() | |
| { | |
| new 1(); | |
| } | |
| // Call parameter | |
| function CallErrorTest8() | |
| { | |
| function func(f) | |
| { | |
| f(); | |
| } | |
| func(1); | |
| } | |
| // Call index - null | |
| function CallErrorTest9() | |
| { | |
| obj[0](); | |
| } | |
| // new index - null | |
| function CallErrorTest10() | |
| { | |
| new obj[0](); | |
| } | |
| // Call index - number | |
| function CallErrorTest11() | |
| { | |
| obj[1](); | |
| } | |
| // new index - number | |
| function CallErrorTest12() | |
| { | |
| new obj[1](); | |
| } | |
| // Call index on null | |
| function CallErrorTest13() | |
| { | |
| n[1](); | |
| } | |
| // new index on null | |
| function CallErrorTest14() | |
| { | |
| new n[1](); | |
| } | |
| // Call property on null | |
| function CallErrorTest15() | |
| { | |
| n.prop(); | |
| } | |
| // new property on null | |
| function CallErrorTest16() | |
| { | |
| new n.prop(); | |
| } | |
| // Call null property | |
| function CallErrorTest17() | |
| { | |
| obj.n(); | |
| } | |
| // new null property | |
| function CallErrorTest18() | |
| { | |
| new obj.n(); | |
| } | |
| // Call null global var | |
| function CallErrorTest17() | |
| { | |
| n(); | |
| } | |
| // new null global var | |
| function CallErrorTest18() | |
| { | |
| new n(); | |
| } | |
| var i = 0; | |
| while (this["CallErrorTest" + i] != undefined) | |
| { | |
| safeCall(this["CallErrorTest" + i]); | |
| i++; | |
| } | |
| writeLine(""); | |
| writeLine(""); | |
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
| // The following tests invalid function calls on unresolvable vars, nonexisting and existing globals accessed using different | |
| // methods, local vars, objects, arrays, and deleted properties. Test functions are generated for each case and evaluated. | |
| var testCase_implicitGlobal = "implicit global"; | |
| var testCase_globalUsingWindow = "global using window"; | |
| var testCase_globalUsingThis = "global using this"; | |
| var testCase_local = "local"; | |
| var testCase_object = "object"; | |
| var testCase_arrayInitialized = "array initialized"; | |
| var testCase_arrayAssigned = "array assigned"; | |
| var testCases = | |
| [ | |
| testCase_implicitGlobal, | |
| testCase_globalUsingWindow, | |
| testCase_globalUsingThis, | |
| testCase_local, | |
| testCase_object, | |
| testCase_arrayInitialized, | |
| testCase_arrayAssigned | |
| ]; | |
| var testValue_uninitialized = null; // don't initialize before calling as a function | |
| var testValue_undefined = "undefined"; | |
| var testValue_null = "null"; | |
| var testValue_number = "1"; | |
| var testValue_object = "{}"; | |
| var testValues = | |
| [ | |
| testValue_uninitialized, | |
| testValue_undefined, | |
| testValue_null, | |
| testValue_number, | |
| testValue_object | |
| ]; | |
| var globalIndex = 0; | |
| function generateAndRunTests(testCase, doDelete) | |
| { | |
| if (testCase === testCase_local && doDelete) | |
| return; // deleting is not supported for this test case | |
| writeLine("--- Test case: " + testCase + ", do delete: " + doDelete + " ---"); | |
| writeLine(""); | |
| for (var testValueIndex in testValues) | |
| { | |
| var testValue = testValues[testValueIndex]; | |
| // A function that looks like the following is generated, and varies based on the test case and test value. The function | |
| // below is generated for the following parameters: {testCase_arrayAssigned, testValue_object, doDelete = true} | |
| // safeCall(function () | |
| // { | |
| // var a = []; | |
| // a[0] = {}; | |
| // delete a[0]; | |
| // a[0](); | |
| // }); | |
| var globalIdentifier; | |
| switch (testCase) | |
| { | |
| case testCase_implicitGlobal: | |
| globalIdentifier = "g" + globalIndex++; | |
| break; | |
| case testCase_globalUsingWindow: | |
| globalIdentifier = "window.g" + globalIndex++; | |
| break; | |
| case testCase_globalUsingThis: | |
| globalIdentifier = "this.g" + globalIndex++; | |
| break; | |
| } | |
| var f = "safeCall(function(){"; | |
| switch (testCase) | |
| { | |
| case testCase_implicitGlobal: | |
| case testCase_globalUsingWindow: | |
| case testCase_globalUsingThis: | |
| if (!testValue && doDelete) | |
| continue; // no need to delete an uninitialized property | |
| if (testCase === testCase_globalUsingWindow) | |
| writeLine("Only valid in IE:"); // the result of this test is only valid when run in IE since 'window' is undefined otherwise | |
| if (testCase === testCase_globalUsingThis && (!testValue || doDelete)) | |
| writeLine("INCORRECT in JC all versions:"); // BUG: these cases produce incorrect results in JC (all versions) but work in IE | |
| if (testValue) | |
| f += globalIdentifier + "=" + testValue + ";"; | |
| if (doDelete) | |
| f += "delete " + globalIdentifier + ";"; | |
| f += globalIdentifier + "();"; | |
| break; | |
| case testCase_local: | |
| f += "var v"; | |
| if (testValue) | |
| f += "=" + testValue; | |
| f += ";v();"; | |
| break; | |
| case testCase_object: | |
| if (!testValue && doDelete) | |
| continue; // no need to delete an uninitialized property | |
| f += "var o={"; | |
| if (testValue) | |
| f += "p:" + testValue; | |
| f += "};" | |
| if (doDelete) | |
| f += "delete o.p;"; | |
| f += "o.p();"; | |
| break; | |
| case testCase_arrayInitialized: | |
| if (!testValue && doDelete) | |
| continue; // no need to delete an uninitialized property | |
| if (testValue === testValue_undefined && !doDelete) | |
| writeLine("INCORRECT in compat modes:"); | |
| f += "var a=["; | |
| if (testValue) | |
| f += testValue; | |
| f += "];" | |
| if (doDelete) | |
| f += "delete a[0];"; | |
| f += "a[0]();"; | |
| break; | |
| case testCase_arrayAssigned: | |
| if (!testValue && doDelete) | |
| continue; // no need to delete an uninitialized property | |
| f += "var a=[];"; | |
| if (testValue) | |
| f += "a[0]=" + testValue + ";"; | |
| if (doDelete) | |
| f += "delete a[0];"; | |
| f += "a[0]();"; | |
| break; | |
| default: | |
| writeLine("Unknown test case '" + testCase + "'."); | |
| return; | |
| } | |
| f += "});"; | |
| writeLine(f); | |
| eval(f); | |
| writeLine(""); | |
| } | |
| writeLine(""); | |
| } | |
| var booleans = [false, true]; | |
| for (var testCaseIndex in testCases) | |
| { | |
| var testCase = testCases[testCaseIndex]; | |
| for (var doDeleteIndex in booleans) | |
| { | |
| var doDelete = booleans[doDeleteIndex]; | |
| generateAndRunTests(testCase, doDelete); | |
| } | |
| } | |
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
| // Helpers | |
| function writeLine(str) | |
| { | |
| WScript.Echo("" + str); | |
| } | |
| function safeCall(func) | |
| { | |
| try | |
| { | |
| return func(); | |
| } | |
| catch (ex) | |
| { | |
| writeLine(ex.name + " (" + ex.number + "): " + ex.message); | |
| } | |
| } |