| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- //-------------------------------------------------------------------------------------------------------
- // 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();
|