blob: 0250751b45f2125ea8f7fb3132c774cb5e811699 [file] [log] [blame]
description('Tests for ES6 arrow function lexical bind of this');
function Dog(name) {
this.name = name;
this.getName = () => eval("this.name");
this.getNameHard = () => eval("(() => this.name)()");
this.getNameNesting = () => () => () => this.name;
}
var d = new Dog("Max");
shouldBe('d.getName()', 'd.name');
shouldBe('d.getNameHard()', 'd.name');
shouldBe('d.getNameNesting()()()', 'd.name');
var obj = {
name : 'objCode',
method : function () {
return (value) => this.name + "-name-" + value;
}
};
shouldBe("obj.method()('correct')", "'objCode-name-correct'");
obj.name='newObjCode';
shouldBe("obj.method()('correct')", "'newObjCode-name-correct'");
var deepObj = {
name : 'wrongObjCode',
internalObject: {
name :'internalObject',
method: function () { return (value) => this.name + "-name-" + value; }
}
};
shouldBe("deepObj.internalObject.method()('correct')", "'internalObject-name-correct'");
deepObj.internalObject.name = 'newInternalObject';
shouldBe("deepObj.internalObject.method()('correct')", "'newInternalObject-name-correct'");
var functionConstructor = function () {
this.func = () => this;
};
var instance = new functionConstructor();
shouldBe("instance.func() === instance", "true");
var ownerObj = {
method : function () {
return () => this;
}
};
shouldBe("ownerObj.method()() === ownerObj", "true");
var fake = { steal : ownerObj.method() };
shouldBe("fake.steal() === ownerObj", "true");
var real = { borrow : ownerObj.method };
shouldBe("real.borrow()() === real", "true");
var arrowFunction = { x : "right", getArrowFunction : function() { return z => this.x + z; }}.getArrowFunction();
var hostObj = { x : "wrong", func : arrowFunction };
shouldBe("arrowFunction('-this')", '"right-this"');
shouldBe("hostObj.func('-this')", '"right-this"');
var functionConstructorWithEval = function () {
this._id = 'old-value';
this.func = () => {
var f;
eval('10==10');
this._id = 'new-value';
return this._id;
};
};
var arrowWithEval = new functionConstructorWithEval();
shouldBe("arrowWithEval.func()", '"new-value"');
var internal_value_1 = 123;
var internal_value_2 = '1234';
function foo() {
let arr = () => {
var x = internal_value_1;
function bas() {
return x;
};
this._id = internal_value_2;
return bas();
};
this.arr = arr;
};
var fooObject = new foo();
shouldBe("fooObject.arr()", 'internal_value_1');
shouldBe("fooObject._id", 'internal_value_2');
function boo() {
let arr = () => {
with ({'this': 40}) {
return this;
}
}
return arr();
}
let expected = {'this': 20};
shouldBe('boo.call(expected)', 'expected');
shouldBe('(function () { return (a = this)=>{return a;}; }).call(expected)()', 'expected');
var successfullyParsed = true;