| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| |
| function write(v) { WScript.Echo(v + ""); } |
| |
| function Verify(expression, actualValue, expectedValue) |
| { |
| if (expectedValue != actualValue) |
| { |
| write("Failed: " + expression + ". Exp:" + expectedValue + " Act:" + actualValue); |
| } |
| else |
| { |
| write("PASS: " + expression + ":" + expectedValue); |
| } |
| } |
| |
| function PropertyExists(obj, propName) |
| { |
| return obj.hasOwnProperty(propName); |
| } |
| |
| function check(value) |
| { |
| write(value); |
| } |
| |
| function IncrVal() |
| { |
| check("IncrVal:: " + this.val + " args.length : " + arguments.length); |
| this.val++; |
| return this.val + " " + arguments.length; |
| } |
| |
| // Global Variables |
| var val = 100; |
| var fGlobalThis; |
| |
| |
| // Tests |
| |
| //----------------------------------------------------------------------------------------------------------- |
| // Global Object tests |
| |
| fGlobalThis = IncrVal.bind(); |
| |
| Verify("global object", fGlobalThis(), "101 0"); |
| Verify("global object", fGlobalThis(10), "102 1"); |
| Verify("global object", fGlobalThis(10,20), "103 2"); |
| |
| val = 100; |
| fGlobalThis = IncrVal.bind(this); |
| |
| Verify("global object", fGlobalThis(), "101 0"); |
| Verify("global object", fGlobalThis(10), "102 1"); |
| Verify("global object", fGlobalThis(10,20), "103 2"); |
| |
| val = 100; |
| fGlobalThis = IncrVal.bind(this, 50); |
| |
| Verify("global object", fGlobalThis(), "101 1"); |
| Verify("global object", fGlobalThis(10), "102 2"); |
| Verify("global object", fGlobalThis(10,20), "103 3"); |
| |
| val = 100; |
| fGlobalThis = IncrVal.bind(this, 50, 51); |
| |
| Verify("global object", fGlobalThis(), "101 2"); |
| Verify("global object", fGlobalThis(10), "102 3"); |
| Verify("global object", fGlobalThis(10,20), "103 4"); |
| |
| //----------------------------------------------------------------------------------------------------------- |
| |
| |
| function testGlobalBinding() |
| { |
| check("Testing Bind to global object"); |
| |
| val = 100; |
| var f1 = IncrVal.bind(); |
| |
| Verify("GlobalObject length", f1.length, 0); |
| |
| Verify("global object", f1(), "101 0"); |
| Verify("global object", f1(10), "102 1"); |
| Verify("global object", f1(10,20), "103 2"); |
| } |
| |
| function testLocalBinding() |
| { |
| check("Testing Bind to local object"); |
| |
| var objWithVal = { val : 200 } |
| var fLocal = IncrVal.bind(objWithVal); |
| |
| Verify("Local length", fLocal.length, 0); |
| |
| Verify("Local object1", fLocal(), "201 0"); |
| Verify("Local object2", fLocal(10), "202 1"); |
| Verify("Local object3", fLocal(10,20), "203 2"); |
| |
| objWithVal = { val : 200 } |
| fLocal = IncrVal.bind(objWithVal, 50); |
| |
| Verify("local length", fLocal.length, 0); |
| |
| Verify("local object", fLocal(), "201 1"); |
| Verify("local object", fLocal(10), "202 2"); |
| Verify("local object", fLocal(10,20), "203 3"); |
| |
| objWithVal = { val : 200 } |
| fLocal = IncrVal.bind(objWithVal, 50, 51); |
| |
| Verify("local length", fLocal.length, 0); |
| Verify("local object", fLocal(), "201 2"); |
| Verify("local object", fLocal(10), "202 3"); |
| Verify("local object", fLocal(10,20), "203 4"); |
| } |
| |
| function testBoundLength() |
| { |
| check("Testing Length"); |
| |
| var obj = new Object(); |
| |
| function f0() { } |
| function f1(x1) { } |
| function f2(x1,x2) { } |
| function f3(x1,x2,x3) { } |
| function f4(x1,x2,x3,x4) { } |
| function f5(x1,x2,x3,x4,x5) { } |
| |
| var bf0 = f0.bind(); Verify("1 Length0 ", bf0.length, 0); |
| var bf1 = f1.bind(); Verify("1 Length1 ", bf1.length, 1); |
| var bf2 = f2.bind(); Verify("1 Length2 ", bf2.length, 2); |
| var bf3 = f3.bind(); Verify("1 Length3 ", bf3.length, 3); |
| var bf4 = f4.bind(); Verify("1 Length4 ", bf4.length, 4); |
| var bf5 = f5.bind(); Verify("1 Length5 ", bf5.length, 5); |
| |
| bf0 = f0.bind(obj); Verify("2 Length0 ", bf0.length, 0); |
| bf1 = f1.bind(obj); Verify("2 Length1 ", bf1.length, 1); |
| bf2 = f2.bind(obj); Verify("2 Length2 ", bf2.length, 2); |
| bf3 = f3.bind(obj); Verify("2 Length3 ", bf3.length, 3); |
| bf4 = f4.bind(obj); Verify("2 Length4 ", bf4.length, 4); |
| bf5 = f5.bind(obj); Verify("2 Length5 ", bf5.length, 5); |
| |
| bf0 = f0.bind(obj, 10); Verify("3 Length0 ", bf0.length, 0); |
| bf1 = f1.bind(obj, 10); Verify("3 Length1 ", bf1.length, 0); |
| bf2 = f2.bind(obj, 10); Verify("3 Length2 ", bf2.length, 1); |
| bf3 = f3.bind(obj, 10); Verify("3 Length3 ", bf3.length, 2); |
| bf4 = f4.bind(obj, 10); Verify("3 Length4 ", bf4.length, 3); |
| bf5 = f5.bind(obj, 10); Verify("3 Length5 ", bf5.length, 4); |
| } |
| |
| function testConstruction() |
| { |
| check("Testing Construction"); |
| |
| function sum(a,b) { this.r = a + b; return this;} |
| |
| var obj = new Object(); |
| var add10 = sum.bind(obj, 10); |
| var res = new add10(20); |
| |
| Verify("Construction ", res.r, 30); |
| } |
| |
| var x = 20; |
| var y = 30; |
| |
| function testProto() |
| { |
| function add() |
| { |
| return this.x + this.y; |
| } |
| |
| Verify("Add Test", add(), 50); |
| |
| var o = { x: 5, y: 6}; |
| var f = add.bind(o); |
| |
| Verify("f Test", f(), 11); |
| |
| var f2 = new f(); |
| |
| Verify("Proto Test", add.prototype.isPrototypeOf(f2), true); |
| |
| // Test toString inline cache behavior when a bound function has a non-typical prototype |
| var a = decodeURIComponent.bind().toString; |
| Verify("Proto toString Test", Function.prototype.bind(), '[object Function]'); |
| } |
| |
| function testConstruction1() |
| { |
| function Point(x,y) |
| { |
| this.x = x; |
| this.y = y; |
| } |
| |
| var p0 = Point.bind(); |
| var r0 = new p0(0, 1); |
| Verify("TestConstruction0 x", r0.x, 0); |
| Verify("TestConstruction0 y", r0.y, 1); |
| |
| var o1 = new Object(); |
| var p1 = Point.bind(o1); |
| var r1 = new p1(100, 101); |
| Verify("TestConstruction1 x", r1.x, 100); |
| Verify("TestConstruction1 y", r1.y, 101); |
| |
| var o2 = new Object(); |
| var p2 = Point.bind(o2, 200); |
| var r2 = new p2(201); |
| Verify("TestConstruction2 x", r2.x, 200); |
| Verify("TestConstruction2 y", r2.y, 201); |
| |
| var o3 = new Object(); |
| var p3 = Point.bind(o3, 300, 301); |
| var r3 = new p3(); |
| Verify("TestConstruction3 x", r3.x, 300); |
| Verify("TestConstruction3 y", r3.y, 301); |
| } |
| |
| testGlobalBinding(); |
| testLocalBinding(); |
| testBoundLength(); |
| testConstruction(); |
| testProto(); |
| testConstruction1(); |