blob: f000c327fa02379cd32dcf511ecbb00943d7a42c [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.
//-------------------------------------------------------------------------------------------------------
WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
var tests = [{
name: "Proxy construct trap consumes new.target",
body: function() {
let result = "";
class A {
constructor() {
assert.areEqual(B, new.target, "The whole point of the test is to make sure new.target flow through proxy!");
result += "A";
}
}
var proxyObject = new Proxy(A, {
construct: function(target, argumentsList, newTarget) {
result += "proxyObject";
assert.areEqual(A, target, "A is the target in this case");
assert.areEqual(0, argumentsList.length, "No arguments are passed");
assert.areEqual(B, newTarget, "B is also the new.target in this case");
return Reflect.construct(target, argumentsList, newTarget);
}
});
class B extends proxyObject {
constructor() {
result += "B";
super();
}
}
new B();
assert.areEqual("BproxyObjectA", result, "Test indeed ran the code I expect it to");
}
}, {
name: "Proxy construct trap consumes overridden new.target",
body: function() {
let testCompleted = false;
function MyNewTarget() {
assert.isTrue(false, "We should not be creating instance of MyNewTarget");
}
function MyConstructor() {
assert.areEqual(MyNewTarget, new.target, "myNewTarget is overridden in this case");
testCompleted = true;
}
Reflect.construct(MyConstructor, [], MyNewTarget);
assert.isTrue(testCompleted, "Test indeed ran the code I expect it to");
}
}, {
name: "Proxy construct trap spread case",
body: function() {
let result = "";
function MyConstructor() {
assert.areEqual(proxyObject, new.target, "myNewTarget is overridden in this case");
result += "MyConstructor";
}
var proxyObject = new Proxy(MyConstructor, {
construct: function(target, argumentsList, newTarget) {
result += "proxyObject";
assert.areEqual(4, argumentsList.length, "spreaded arguments count should be right");
assert.areEqual(1, argumentsList[0], "spreaded arguments[0] should be right");
assert.areEqual(2.25, argumentsList[1], "spreaded arguments[1] should be right");
assert.areEqual(undefined, argumentsList[2], "spreaded arguments[2] should be right");
assert.areEqual('hello', argumentsList[3], "spreaded arguments[3] should be right");
return Reflect.construct(target, argumentsList, newTarget);
}
});
var args = [1, 2.25, undefined, 'hello'];
var newProxyObject = new proxyObject(...args);
assert.areEqual("proxyObjectMyConstructor", result, "Test indeed ran the code I expect it to");
}
}];
testRunner.runTests(tests, {
verbose: WScript.Arguments[0] != "summary"
});