// 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: --allow-natives-syntax

var undetectable = %GetUndetectable();

var tests = [
  true,        false,
  false,       false,
  null,        true,
  void 0,      true,
  0,           false,
  0.0,         false,
  -0,          false,
  "",          false,
  -1,          false,
  -1.25,       false,
  1,           false,
  1.25,        false,
  -2147483648, false,
  2147483648,  false,
  Infinity,    false,
  -Infinity,   false,
  NaN,         false
];

var func = (function eq(a) { return a == undetectable; });
var left_funcs = [
  (function eq_L0() { return true == undetectable; }),
  (function eq_L1() { return false == undetectable; }),
  (function eq_L2() { return null == undetectable; }),
  (function eq_L3() { return void 0 == undetectable; }),
  (function eq_L4() { return 0 == undetectable; }),
  (function eq_L5() { return 0.0 == undetectable; }),
  (function eq_L6() { return -0 == undetectable; }),
  (function eq_L7() { return "" == undetectable; }),
  (function eq_L8() { return -1 == undetectable; }),
  (function eq_L9() { return -1.25 == undetectable; }),
  (function eq_L10() { return 1 == undetectable; }),
  (function eq_L11() { return 1.25 == undetectable; }),
  (function eq_L12() { return -2147483648 == undetectable; }),
  (function eq_L13() { return 2147483648 == undetectable; }),
  (function eq_L14() { return Infinity == undetectable; }),
  (function eq_L15() { return -Infinity == undetectable; }),
  (function eq_L16() { return NaN == undetectable; })
];

var right_funcs = [
  (function eq_R0() { return undetectable == true; }),
  (function eq_R1() { return undetectable == false; }),
  (function eq_R2() { return undetectable == null; }),
  (function eq_R3() { return undetectable == void 0; }),
  (function eq_R4() { return undetectable == 0; }),
  (function eq_R5() { return undetectable == 0.0; }),
  (function eq_R6() { return undetectable == -0; }),
  (function eq_R7() { return undetectable == ""; }),
  (function eq_R8() { return undetectable == -1; }),
  (function eq_R9() { return undetectable == -1.25; }),
  (function eq_R10() { return undetectable == 1; }),
  (function eq_R11() { return undetectable == 1.25; }),
  (function eq_R12() { return undetectable == -2147483648; }),
  (function eq_R13() { return undetectable == 2147483648; }),
  (function eq_R14() { return undetectable == Infinity; }),
  (function eq_R15() { return undetectable == -Infinity; }),
  (function eq_R16() { return undetectable == NaN; })
];

function test() {
  for (var i = 0; i < tests.length; i += 2) {
    var val = tests[i];
    var eq = tests[i + 1];

    assertEquals(eq, val == undetectable);
    assertEquals(eq, undetectable == val);

    assertFalse(val === undetectable);
    assertFalse(undetectable === val);

    assertEquals(eq, left_funcs[i/2]());
    assertEquals(eq, right_funcs[i/2]());
  }

  assertTrue(undetectable == undetectable);
  assertTrue(undetectable === undetectable);

}

for (var i = 0; i < 5; i++) {
  test();
}


assertFalse(undetectable == %GetUndetectable());
assertFalse(undetectable === %GetUndetectable());


function test2(a, b) {
  return a == b;
}
%PrepareFunctionForOptimization(test2);
test2(0, 1);
test2(undetectable, {});
%OptimizeFunctionOnNextCall(test2);
for (var i = 0; i < 5; ++i) {
  assertFalse(test2(undetectable, %GetUndetectable()));
}
