// Copyright 2014 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.

#include "test/cctest/compiler/function-tester.h"

namespace v8 {
namespace internal {
namespace compiler {

TEST(BinopAdd) {
  FunctionTester T("(function(a,b) { return a + b; })");

  T.CheckCall(3, 1, 2);
  T.CheckCall(-11, -2, -9);
  T.CheckCall(-11, -1.5, -9.5);
  T.CheckCall(T.Val("AB"), T.Val("A"), T.Val("B"));
  T.CheckCall(T.Val("A11"), T.Val("A"), T.Val(11));
  T.CheckCall(T.Val("12B"), T.Val(12), T.Val("B"));
  T.CheckCall(T.Val("38"), T.Val("3"), T.Val("8"));
  T.CheckCall(T.Val("31"), T.Val("3"), T.NewObject("([1])"));
  T.CheckCall(T.Val("3[object Object]"), T.Val("3"), T.NewObject("({})"));
}


TEST(BinopSubtract) {
  FunctionTester T("(function(a,b) { return a - b; })");

  T.CheckCall(3, 4, 1);
  T.CheckCall(3.0, 4.5, 1.5);
  T.CheckCall(T.Val(-9), T.Val("0"), T.Val(9));
  T.CheckCall(T.Val(-9), T.Val(0.0), T.Val("9"));
  T.CheckCall(T.Val(1), T.Val("3"), T.Val("2"));
  T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
  T.CheckCall(T.Val(2), T.Val("3"), T.NewObject("([1])"));
  T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
}


TEST(BinopMultiply) {
  FunctionTester T("(function(a,b) { return a * b; })");

  T.CheckCall(6, 3, 2);
  T.CheckCall(4.5, 2.0, 2.25);
  T.CheckCall(T.Val(6), T.Val("3"), T.Val(2));
  T.CheckCall(T.Val(4.5), T.Val(2.0), T.Val("2.25"));
  T.CheckCall(T.Val(6), T.Val("3"), T.Val("2"));
  T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
  T.CheckCall(T.Val(3), T.Val("3"), T.NewObject("([1])"));
  T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
}


TEST(BinopDivide) {
  FunctionTester T("(function(a,b) { return a / b; })");

  T.CheckCall(2, 8, 4);
  T.CheckCall(2.1, 8.4, 4);
  T.CheckCall(V8_INFINITY, 8, 0);
  T.CheckCall(-V8_INFINITY, -8, 0);
  T.CheckCall(T.infinity(), T.Val(8), T.Val("0"));
  T.CheckCall(T.minus_infinity(), T.Val("-8"), T.Val(0.0));
  T.CheckCall(T.Val(1.5), T.Val("3"), T.Val("2"));
  T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
  T.CheckCall(T.Val(1.5), T.Val("3"), T.NewObject("([2])"));
  T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
}


TEST(BinopModulus) {
  FunctionTester T("(function(a,b) { return a % b; })");

  T.CheckCall(3, 8, 5);
  T.CheckCall(T.Val(3), T.Val("8"), T.Val(5));
  T.CheckCall(T.Val(3), T.Val(8), T.Val("5"));
  T.CheckCall(T.Val(1), T.Val("3"), T.Val("2"));
  T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
  T.CheckCall(T.Val(1), T.Val("3"), T.NewObject("([2])"));
  T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
}


TEST(BinopShiftLeft) {
  FunctionTester T("(function(a,b) { return a << b; })");

  T.CheckCall(4, 2, 1);
  T.CheckCall(T.Val(4), T.Val("2"), T.Val(1));
  T.CheckCall(T.Val(4), T.Val(2), T.Val("1"));
}


TEST(BinopShiftRight) {
  FunctionTester T("(function(a,b) { return a >> b; })");

  T.CheckCall(4, 8, 1);
  T.CheckCall(-4, -8, 1);
  T.CheckCall(T.Val(4), T.Val("8"), T.Val(1));
  T.CheckCall(T.Val(4), T.Val(8), T.Val("1"));
}


TEST(BinopShiftRightLogical) {
  FunctionTester T("(function(a,b) { return a >>> b; })");

  T.CheckCall(4, 8, 1);
  T.CheckCall(0x7ffffffc, -8, 1);
  T.CheckCall(T.Val(4), T.Val("8"), T.Val(1));
  T.CheckCall(T.Val(4), T.Val(8), T.Val("1"));
}


TEST(BinopAnd) {
  FunctionTester T("(function(a,b) { return a & b; })");

  T.CheckCall(7, 7, 15);
  T.CheckCall(7, 15, 7);
  T.CheckCall(T.Val(7), T.Val("15"), T.Val(7));
  T.CheckCall(T.Val(7), T.Val(15), T.Val("7"));
}


TEST(BinopOr) {
  FunctionTester T("(function(a,b) { return a | b; })");

  T.CheckCall(6, 4, 2);
  T.CheckCall(6, 2, 4);
  T.CheckCall(T.Val(6), T.Val("2"), T.Val(4));
  T.CheckCall(T.Val(6), T.Val(2), T.Val("4"));
}


TEST(BinopXor) {
  FunctionTester T("(function(a,b) { return a ^ b; })");

  T.CheckCall(7, 15, 8);
  T.CheckCall(7, 8, 15);
  T.CheckCall(T.Val(7), T.Val("8"), T.Val(15));
  T.CheckCall(T.Val(7), T.Val(8), T.Val("15"));
}


TEST(BinopStrictEqual) {
  FunctionTester T("(function(a,b) { return a === b; })");

  T.CheckTrue(7, 7);
  T.CheckFalse(7, 8);
  T.CheckTrue(7.1, 7.1);
  T.CheckFalse(7.1, 8.1);

  T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
  T.CheckFalse(T.Val(7.1), T.Val("7.1"));
  T.CheckFalse(T.Val(7), T.undefined());
  T.CheckFalse(T.undefined(), T.Val(7));

  CompileRun("var o = { desc : 'I am a singleton' }");
  T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])"));
  T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
  T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
}


TEST(BinopEqual) {
  FunctionTester T("(function(a,b) { return a == b; })");

  T.CheckTrue(7, 7);
  T.CheckFalse(7, 8);
  T.CheckTrue(7.1, 7.1);
  T.CheckFalse(7.1, 8.1);

  T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
  T.CheckTrue(T.Val(7.1), T.Val("7.1"));

  CompileRun("var o = { desc : 'I am a singleton' }");
  T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])"));
  T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
  T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
}


TEST(BinopNotEqual) {
  FunctionTester T("(function(a,b) { return a != b; })");

  T.CheckFalse(7, 7);
  T.CheckTrue(7, 8);
  T.CheckFalse(7.1, 7.1);
  T.CheckTrue(7.1, 8.1);

  T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
  T.CheckFalse(T.Val(7.1), T.Val("7.1"));

  CompileRun("var o = { desc : 'I am a singleton' }");
  T.CheckTrue(T.NewObject("([1])"), T.NewObject("([1])"));
  T.CheckTrue(T.NewObject("({})"), T.NewObject("({})"));
  T.CheckFalse(T.NewObject("(o)"), T.NewObject("(o)"));
}


TEST(BinopLessThan) {
  FunctionTester T("(function(a,b) { return a < b; })");

  T.CheckTrue(7, 8);
  T.CheckFalse(8, 7);
  T.CheckTrue(-8.1, -8);
  T.CheckFalse(-8, -8.1);
  T.CheckFalse(0.111, 0.111);

  T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
  T.CheckFalse(T.Val(7.1), T.Val("6.1"));
  T.CheckFalse(T.Val(7.1), T.Val("7.1"));
  T.CheckTrue(T.Val(7.1), T.Val("8.1"));
}


TEST(BinopLessThanOrEqual) {
  FunctionTester T("(function(a,b) { return a <= b; })");

  T.CheckTrue(7, 8);
  T.CheckFalse(8, 7);
  T.CheckTrue(-8.1, -8);
  T.CheckFalse(-8, -8.1);
  T.CheckTrue(0.111, 0.111);

  T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
  T.CheckFalse(T.Val(7.1), T.Val("6.1"));
  T.CheckTrue(T.Val(7.1), T.Val("7.1"));
  T.CheckTrue(T.Val(7.1), T.Val("8.1"));
}


TEST(BinopGreaterThan) {
  FunctionTester T("(function(a,b) { return a > b; })");

  T.CheckFalse(7, 8);
  T.CheckTrue(8, 7);
  T.CheckFalse(-8.1, -8);
  T.CheckTrue(-8, -8.1);
  T.CheckFalse(0.111, 0.111);

  T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
  T.CheckTrue(T.Val(7.1), T.Val("6.1"));
  T.CheckFalse(T.Val(7.1), T.Val("7.1"));
  T.CheckFalse(T.Val(7.1), T.Val("8.1"));
}


TEST(BinopGreaterThanOrEqual) {
  FunctionTester T("(function(a,b) { return a >= b; })");

  T.CheckFalse(7, 8);
  T.CheckTrue(8, 7);
  T.CheckFalse(-8.1, -8);
  T.CheckTrue(-8, -8.1);
  T.CheckTrue(0.111, 0.111);

  T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
  T.CheckTrue(T.Val(7.1), T.Val("6.1"));
  T.CheckTrue(T.Val(7.1), T.Val("7.1"));
  T.CheckFalse(T.Val(7.1), T.Val("8.1"));
}


TEST(BinopIn) {
  FunctionTester T("(function(a,b) { return a in b; })");

  T.CheckTrue(T.Val("x"), T.NewObject("({x:23})"));
  T.CheckFalse(T.Val("y"), T.NewObject("({x:42})"));
  T.CheckFalse(T.Val(123), T.NewObject("({x:65})"));
  T.CheckTrue(T.Val(1), T.NewObject("([1,2,3])"));
}


TEST(BinopInstanceOf) {
  FunctionTester T("(function(a,b) { return a instanceof b; })");

  T.CheckTrue(T.NewObject("(new Number(23))"), T.NewObject("Number"));
  T.CheckFalse(T.NewObject("(new Number(23))"), T.NewObject("String"));
  T.CheckFalse(T.NewObject("(new String('a'))"), T.NewObject("Number"));
  T.CheckTrue(T.NewObject("(new String('b'))"), T.NewObject("String"));
  T.CheckFalse(T.Val(1), T.NewObject("Number"));
  T.CheckFalse(T.Val("abc"), T.NewObject("String"));

  CompileRun("var bound = (function() {}).bind(undefined)");
  T.CheckTrue(T.NewObject("(new bound())"), T.NewObject("bound"));
  T.CheckTrue(T.NewObject("(new bound())"), T.NewObject("Object"));
  T.CheckFalse(T.NewObject("(new bound())"), T.NewObject("Number"));
}


TEST(UnopNot) {
  FunctionTester T("(function(a) { return !a; })");

  T.CheckCall(T.true_value(), T.false_value(), T.undefined());
  T.CheckCall(T.false_value(), T.true_value(), T.undefined());
  T.CheckCall(T.true_value(), T.Val(0.0), T.undefined());
  T.CheckCall(T.false_value(), T.Val(123), T.undefined());
  T.CheckCall(T.false_value(), T.Val("x"), T.undefined());
  T.CheckCall(T.true_value(), T.undefined(), T.undefined());
  T.CheckCall(T.true_value(), T.nan(), T.undefined());
}


TEST(UnopCountPost) {
  FunctionTester T("(function(a) { return a++; })");

  T.CheckCall(T.Val(0.0), T.Val(0.0), T.undefined());
  T.CheckCall(T.Val(2.3), T.Val(2.3), T.undefined());
  T.CheckCall(T.Val(123), T.Val(123), T.undefined());
  T.CheckCall(T.Val(7), T.Val("7"), T.undefined());
  T.CheckCall(T.nan(), T.Val("x"), T.undefined());
  T.CheckCall(T.nan(), T.undefined(), T.undefined());
  T.CheckCall(T.Val(1.0), T.true_value(), T.undefined());
  T.CheckCall(T.Val(0.0), T.false_value(), T.undefined());
  T.CheckCall(T.nan(), T.nan(), T.undefined());
}


TEST(UnopCountPre) {
  FunctionTester T("(function(a) { return ++a; })");

  T.CheckCall(T.Val(1.0), T.Val(0.0), T.undefined());
  T.CheckCall(T.Val(3.3), T.Val(2.3), T.undefined());
  T.CheckCall(T.Val(124), T.Val(123), T.undefined());
  T.CheckCall(T.Val(8), T.Val("7"), T.undefined());
  T.CheckCall(T.nan(), T.Val("x"), T.undefined());
  T.CheckCall(T.nan(), T.undefined(), T.undefined());
  T.CheckCall(T.Val(2.0), T.true_value(), T.undefined());
  T.CheckCall(T.Val(1.0), T.false_value(), T.undefined());
  T.CheckCall(T.nan(), T.nan(), T.undefined());
}


TEST(PropertyNamedLoad) {
  FunctionTester T("(function(a,b) { return a.x; })");

  T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined());
  T.CheckCall(T.undefined(), T.NewObject("({y:23})"), T.undefined());
}


TEST(PropertyKeyedLoad) {
  FunctionTester T("(function(a,b) { return a[b]; })");

  T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.Val("x"));
  T.CheckCall(T.Val(42), T.NewObject("([23,42,65])"), T.Val(1));
  T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val("y"));
  T.CheckCall(T.undefined(), T.NewObject("([23,42,65])"), T.Val(4));
}


TEST(PropertyNamedStore) {
  FunctionTester T("(function(a) { a.x = 7; return a.x; })");

  T.CheckCall(T.Val(7), T.NewObject("({})"), T.undefined());
  T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.undefined());
}


TEST(PropertyKeyedStore) {
  FunctionTester T("(function(a,b) { a[b] = 7; return a.x; })");

  T.CheckCall(T.Val(7), T.NewObject("({})"), T.Val("x"));
  T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.Val("x"));
  T.CheckCall(T.Val(9), T.NewObject("({x:9})"), T.Val("y"));
}


TEST(PropertyNamedDelete) {
  FunctionTester T("(function(a) { return delete a.x; })");

  CompileRun("var o = Object.create({}, { x: { value:23 } });");
  T.CheckTrue(T.NewObject("({x:42})"), T.undefined());
  T.CheckTrue(T.NewObject("({})"), T.undefined());
  T.CheckFalse(T.NewObject("(o)"), T.undefined());
}


TEST(PropertyKeyedDelete) {
  FunctionTester T("(function(a, b) { return delete a[b]; })");

  CompileRun("function getX() { return 'x'; }");
  CompileRun("var o = Object.create({}, { x: { value:23 } });");
  T.CheckTrue(T.NewObject("({x:42})"), T.Val("x"));
  T.CheckFalse(T.NewObject("(o)"), T.Val("x"));
  T.CheckFalse(T.NewObject("(o)"), T.NewObject("({toString:getX})"));
}


TEST(GlobalLoad) {
  FunctionTester T("(function() { return g; })");

  T.CheckThrows(T.undefined(), T.undefined());
  CompileRun("var g = 23;");
  T.CheckCall(T.Val(23));
}


TEST(GlobalStoreSloppy) {
  FLAG_legacy_const = true;
  FunctionTester T("(function(a,b) { g = a + b; return g; })");

  T.CheckCall(T.Val(33), T.Val(22), T.Val(11));
  CompileRun("delete g");
  CompileRun("const g = 23");
  T.CheckCall(T.Val(23), T.Val(55), T.Val(44));
}


TEST(GlobalStoreStrict) {
  FunctionTester T("(function(a,b) { 'use strict'; g = a + b; return g; })");

  T.CheckThrows(T.Val(22), T.Val(11));
  CompileRun("var g = 'a global variable';");
  T.CheckCall(T.Val(33), T.Val(22), T.Val(11));
}


TEST(ContextLoad) {
  FunctionTester T("(function(a,b) { (function(){a}); return a + b; })");

  T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
}


TEST(ContextStore) {
  FunctionTester T("(function(a,b) { (function(){x}); var x = a; return x; })");

  T.CheckCall(T.Val(23), T.Val(23), T.undefined());
  T.CheckCall(T.Val("a"), T.Val("a"), T.undefined());
}


TEST(LookupLoad) {
  FunctionTester T("(function(a,b) { with(a) { return x + b; } })");

  T.CheckCall(T.Val(24), T.NewObject("({x:23})"), T.Val(1));
  T.CheckCall(T.Val(32), T.NewObject("({x:23, b:9})"), T.Val(2));
  T.CheckCall(T.Val(45), T.NewObject("({__proto__:{x:42}})"), T.Val(3));
  T.CheckCall(T.Val(69), T.NewObject("({get x() { return 65; }})"), T.Val(4));
}


TEST(LookupStore) {
  FunctionTester T("(function(a,b) { var x; with(a) { x = b; } return x; })");

  T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val(1));
  T.CheckCall(T.Val(2), T.NewObject("({y:23})"), T.Val(2));
  T.CheckCall(T.Val(23), T.NewObject("({b:23})"), T.Val(3));
  T.CheckCall(T.undefined(), T.NewObject("({__proto__:{x:42}})"), T.Val(4));
}


TEST(BlockLoadStore) {
  FunctionTester T("(function(a) { 'use strict'; { let x = a+a; return x; }})");

  T.CheckCall(T.Val(46), T.Val(23));
  T.CheckCall(T.Val("aa"), T.Val("a"));
}


TEST(BlockLoadStoreNested) {
  const char* src =
      "(function(a,b) {"
      "'use strict';"
      "{ let x = a, y = a;"
      "  { let y = b;"
      "    return x + y;"
      "  }"
      "}})";
  FunctionTester T(src);

  T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
}


TEST(ObjectLiteralComputed) {
  FunctionTester T("(function(a,b) { o = { x:a+b }; return o.x; })");

  T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
}


TEST(ObjectLiteralNonString) {
  FunctionTester T("(function(a,b) { o = { 7:a+b }; return o[7]; })");

  T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
}


TEST(ObjectLiteralPrototype) {
  FunctionTester T("(function(a) { o = { __proto__:a }; return o.x; })");

  T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined());
  T.CheckCall(T.undefined(), T.NewObject("({y:42})"), T.undefined());
}


TEST(ObjectLiteralGetter) {
  FunctionTester T("(function(a) { o = { get x() {return a} }; return o.x; })");

  T.CheckCall(T.Val(23), T.Val(23), T.undefined());
  T.CheckCall(T.Val("x"), T.Val("x"), T.undefined());
}


TEST(ArrayLiteral) {
  FunctionTester T("(function(a,b) { o = [1, a + b, 3]; return o[1]; })");

  T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
}


TEST(RegExpLiteral) {
  FunctionTester T("(function(a) { o = /b/; return o.test(a); })");

  T.CheckTrue(T.Val("abc"));
  T.CheckFalse(T.Val("xyz"));
}


TEST(ClassLiteral) {
  FLAG_harmony_sloppy = true;
  const char* src =
      "(function(a,b) {"
      "  class C {"
      "    x() { return a; }"
      "    static y() { return b; }"
      "    get z() { return 0; }"
      "    constructor() {}"
      "  }"
      "  return new C().x() + C.y();"
      "})";
  FunctionTester T(src);

  T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
}

}  // namespace compiler
}  // namespace internal
}  // namespace v8
