// 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 }
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"));
assertEquals(object, call(strictFunctionArrowEval, object, "this"));
assertEquals(undefined, call(strictFunctionArrowEval, undefined, "this"));

assertEquals(object,
             call(sloppyFunctionArrowEval, object, "(() => this)()"));
assertEquals(global,
             call(sloppyFunctionArrowEval, undefined, "(() => this)()"));
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)()"));
