1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5var object = {};
6var global = this;
7var call = Function.call.bind(Function.call);
8
9var globalSloppyArrow = () => this;
10var globalStrictArrow = () => { "use strict"; return this; };
11var globalSloppyArrowEval = (s) => eval(s);
12var globalStrictArrowEval = (s) => { "use strict"; return eval(s); };
13
14var sloppyFunctionArrow = function() {
15  return (() => this)();
16};
17var strictFunctionArrow = function() {
18  "use strict";
19  return (() => this)();
20};
21var sloppyFunctionEvalArrow = function() {
22  return eval("(() => this)()");
23};
24var strictFunctionEvalArrow = function() {
25  "use strict";
26  return eval("(() => this)()");
27};
28var sloppyFunctionArrowEval = function(s) {
29  return (() => eval(s))();
30};
31var strictFunctionArrowEval = function(s) {
32  "use strict";
33  return (() => eval(s))();
34};
35
36var withObject = { 'this': object }
37var arrowInsideWith, arrowInsideWithEval;
38with (withObject) {
39  arrowInsideWith = () => this;
40  arrowInsideWithEval = (s) => eval(s);
41}
42
43assertEquals(global, call(globalSloppyArrow, object));
44assertEquals(global, call(globalStrictArrow, object));
45assertEquals(global, call(globalSloppyArrowEval, object, "this"));
46assertEquals(global, call(globalStrictArrowEval, object, "this"));
47assertEquals(global, call(globalSloppyArrowEval, object, "(() => this)()"));
48assertEquals(global, call(globalStrictArrowEval, object, "(() => this)()"));
49
50assertEquals(object, call(sloppyFunctionArrow, object));
51assertEquals(global, call(sloppyFunctionArrow, undefined));
52assertEquals(object, call(strictFunctionArrow, object));
53assertEquals(undefined, call(strictFunctionArrow, undefined));
54
55assertEquals(object, call(sloppyFunctionEvalArrow, object));
56assertEquals(global, call(sloppyFunctionEvalArrow, undefined));
57assertEquals(object, call(strictFunctionEvalArrow, object));
58assertEquals(undefined, call(strictFunctionEvalArrow, undefined));
59
60assertEquals(object, call(sloppyFunctionArrowEval, object, "this"));
61assertEquals(global, call(sloppyFunctionArrowEval, undefined, "this"));
62assertEquals(object, call(strictFunctionArrowEval, object, "this"));
63assertEquals(undefined, call(strictFunctionArrowEval, undefined, "this"));
64
65assertEquals(object,
66             call(sloppyFunctionArrowEval, object, "(() => this)()"));
67assertEquals(global,
68             call(sloppyFunctionArrowEval, undefined, "(() => this)()"));
69assertEquals(object,
70             call(strictFunctionArrowEval, object, "(() => this)()"));
71assertEquals(undefined,
72             call(strictFunctionArrowEval, undefined, "(() => this)()"));
73
74assertEquals(global, call(arrowInsideWith, undefined));
75assertEquals(global, call(arrowInsideWith, object));
76assertEquals(global, call(arrowInsideWithEval, undefined, "this"));
77assertEquals(global, call(arrowInsideWithEval, object, "this"));
78assertEquals(global, call(arrowInsideWithEval, undefined, "(() => this)()"));
79assertEquals(global, call(arrowInsideWithEval, object, "(() => this)()"));
80