blob: 0fc08ee3a71d28c83907e08520f814db9cf84316 [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 actuals = new Array();
var hasAllPassed = true;
function verify(expected, testCase)
{
if(actuals.toString() != expected.toString())
{
print(testCase + " failed.");
print("ACTUALS:");
for(var item = 0; item < actuals.length; actuals++)
{
print(actuals[item]);
}
print("EXPECTED");
for(var item = 0; item < expected.length; expected++)
{
print(expected[item]);
}
hasAllPassed = false;
}
actuals = [];
}
//Test1 : Tests Optimization with bailout.
var shouldBailout = false;
var test1 = function (argMath3)
{
if(shouldBailout)
{
arguments[0] = 4;
for(var o in arguments)
{
actuals.push(o);
}
}
actuals.push(argMath3);
};
test1(10,2); // Interpreter
shouldBailout = true;
test1(10,2); // full jit
verify([10,0,1,4], "TEST 1");
//Test2: Test Inlinee Arguments optimization with StackArgsWithFormals
var inner_test2 = function(argMath6=1) {
return argMath6;
};
function test2(a,b,c) {
return inner_test2.apply({}, arguments);
}
actuals.push(test2(1,2,3));
actuals.push(test2(4,5,6));
verify([1,4], "TEST 2");
//Test3: Non Simple Parameter List
function test3(a, b =2, c = 5)
{
if(shouldBailout)
{
arguments[2] = 10;
var result = arguments[2] + a;
actuals.push(result);
return;
}
actuals.push(a+b+arguments[1]);
}
shouldBailout = false;
test3(1,2,3,4);
test3(5,6,7,8);
shouldBailout = true;
test3(10,11,12,14);
verify([5,17,20], "TEST 3");
//Test4: With Rest argument
function test4(a,b,c,d,e) {
inner_test4(a,b,c,d);
}
var inner_test4 = function (a, b, ...argArr0) {
if (arguments.length > 1) {
actuals.push(a + b);
actuals.push(argArr0[0])
}
};
test4(1,2,3,4);
test4(5,6,7,8);
verify([3,3,11,7], "TEST 4");
//Test5: Inside Loop and Bails out due to out of range of actuals access
function test5(a,b,c=10)
{
var result = 0;
for(var i = 0; i < 5; i++)
{
result += arguments[i];
}
result += (a+c);
actuals.push(result);
}
test5(1,2,3,4,5,6);
test5(1,2,3);// Bail out here.
verify([19, NaN], "TEST 5");
//Test6 : Using strict mode
function test6(a,b,c)
{
'use strict';
actuals.push(arguments[0] + arguments[2] + a + b);
}
test6(1,2,3);
test6(4,5,6,7);
verify([7,19], "TEST 6");
//Test7 : Use strict with bail out
function test7(a,b,c)
{
'use strict';
if(shouldBailout)
{
arguments[0] = 4;
}
actuals.push(a);
}
shouldBailout = false;
test7(11,12,13);
shouldBailout = true;
test7(10,20,30);
verify([11,10], "TEST 7");
//Test 8 : for-in statement
function test8(a,b)
{
for(a in [10,20])
{
actuals.push(a);
actuals.push(arguments[0]);
}
}
test8(1,2);
test8('x','y');
verify([0,0,1,1,0,0,1,1], "TEST 8");
//Test 9 : Array Destructuring.
function test9(a,b)
{
[a,b] = [10,20];
actuals.push(a + arguments[0]);
}
test9(1,2);
test9('x','y');
verify([20,20], "TEST 9");
//Test 10 : Object Destructuring.
function test10(a,b)
{
({a:a} = {a:10.5})
actuals.push(a + arguments[0]);
}
test10(1,2);
test10('x','y');
verify([21,21], "TEST 10");
//Test 11 : for-of statement
function test11(a,b)
{
for([a] of [[10],[20]])
{
actuals.push(a + arguments[0]);
}
}
test11(1,2);
test11('x','y');
verify([20,40,20,40], "TEST 11");
var obj12 = { method1: function () {} };
function test12_1(arg1) {
this.prop1 = arg1;
obj12.method1.apply(obj12, arguments);
}
function test12() {
new test12_1(-{});
}
test12();
test12();
verify([], "TEST 12");
function test13(a) {
actuals.push(typeof arguments[1]);
}
test13(1,2);
test13({}, {});
verify(["number", "object"], "TEST 13");
if(hasAllPassed)
{
print("PASSED");
}