blob: bb03d6a1f7655725d8c1d57a6eb26bf3dd0f3260 [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.
//-------------------------------------------------------------------------------------------------------
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);
}
}