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