Index: test/mjsunit/harmony/arrow-functions-this.js |
diff --git a/test/mjsunit/harmony/arrow-functions-this.js b/test/mjsunit/harmony/arrow-functions-this.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..38f29a28b8486b2191511d0d5e9db8b2af390326 |
--- /dev/null |
+++ b/test/mjsunit/harmony/arrow-functions-this.js |
@@ -0,0 +1,74 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --harmony-arrow-functions |
+ |
+var object = {}; |
+var global = this; |
+var call = Function.call.bind(Function.call); |
+ |
+var globalSloppyArrow = ()=>this; |
+var globalStrictArrow = ()=>{ "use strict"; return this; }; |
+var globalSloppyArrowEval = (s)=>eval(s); |
+var globalStrictArrowEval = (s)=>{ "use strict"; return eval(s); }; |
+ |
+var sloppyFunctionArrow = function(){ return (()=>this)(); }; |
+var strictFunctionArrow = function(){ "use strict"; |
+ return (()=>this)(); }; |
+var sloppyFunctionEvalArrow = function(){ return eval("(()=>this)()"); }; |
+var strictFunctionEvalArrow = function(){ "use strict"; |
+ return eval("(()=>this)()"); }; |
+var sloppyFunctionArrowEval = function(s) { return (()=>eval(s))(); }; |
+var strictFunctionArrowEval = function(s) { "use strict"; |
+ return (()=>eval(s))(); }; |
+ |
+var withObject = { ['this']: object } |
rossberg
2015/04/23 13:31:45
Nit: you don't need the brackets
|
+var arrowInsideWith, arrowInsideWithEval; |
+with (withObject) { |
+ arrowInsideWith = ()=>this; |
+ arrowInsideWithEval = (s)=>eval(s); |
+} |
+ |
+assertEquals(global, call(globalSloppyArrow, object)); |
+assertEquals(global, call(globalStrictArrow, object)); |
+assertEquals(global, call(globalSloppyArrowEval, object, "this")); |
+assertEquals(global, call(globalStrictArrowEval, object, "this")); |
+assertEquals(global, call(globalSloppyArrowEval, object, "(()=>this)()")); |
+assertEquals(global, call(globalStrictArrowEval, object, "(()=>this)()")); |
+ |
+assertEquals(object, call(sloppyFunctionArrow, object)); |
+assertEquals(global, call(sloppyFunctionArrow, undefined)); |
+assertEquals(object, call(strictFunctionArrow, object)); |
+assertEquals(undefined, call(strictFunctionArrow, undefined)); |
+ |
+assertEquals(object, call(sloppyFunctionEvalArrow, object)); |
+assertEquals(global, call(sloppyFunctionEvalArrow, undefined)); |
+assertEquals(object, call(strictFunctionEvalArrow, object)); |
+assertEquals(undefined, call(strictFunctionEvalArrow, undefined)); |
+ |
+assertEquals(object, call(sloppyFunctionArrowEval, object, "this")); |
+assertEquals(global, call(sloppyFunctionArrowEval, undefined, "this")); |
+// TODO(wingo): Scoping of "this" appears to be fine, but oddly the "s" |
+// in function(s) { return ()=>eval(s) } doesn't resolve to the "s" |
+// parameter in strict mode. Re-enable these tests once that bug is |
+// fixed. |
+//assertEquals(object, call(strictFunctionArrowEval, object, "this")); |
+//assertEquals(undefined, call(strictFunctionArrowEval, undefined, "this")); |
+ |
+assertEquals(object, |
+ call(sloppyFunctionArrowEval, object, "(()=>this)()")); |
+assertEquals(global, |
+ call(sloppyFunctionArrowEval, undefined, "(()=>this)()")); |
+// TODO(wingo): Same as above. |
+//assertEquals(object, |
+// call(strictFunctionArrowEval, object, "(()=>this)()")); |
+//assertEquals(undefined, |
+// call(strictFunctionArrowEval, undefined, "(()=>this)()")); |
+ |
+assertEquals(global, call(arrowInsideWith, undefined)); |
+assertEquals(global, call(arrowInsideWith, object)); |
+assertEquals(global, call(arrowInsideWithEval, undefined, "this")); |
+assertEquals(global, call(arrowInsideWithEval, object, "this")); |
+assertEquals(global, call(arrowInsideWithEval, undefined, "(()=>this)()")); |
+assertEquals(global, call(arrowInsideWithEval, object, "(()=>this)()")); |