// 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
"use strict";

function test(expected, f) {
  assertEquals(expected, f());
  assertEquals(expected, f());
  %OptimizeFunctionOnNextCall(f);
  assertEquals(expected, f());
  assertEquals(expected, f());
}

function testThrows(f) {
  assertThrows(f);
  assertThrows(f);
  %OptimizeFunctionOnNextCall(f);
  assertThrows(f);
  assertThrows(f);
}

function f1() { return NaN; }
test((0/0), f1);

function f2() { return (0/0); }
test((0/0), f2);

function f3() { return (0/0) == (0/0); }
test(false, f3);

function f4() { return (0/0) == NaN; }
test(false, f4);

function f5() { return NaN == (0/0); }
test(false, f5);

function f6() { return "" + NaN; }
test("NaN", f6);

function f7() { return (0/0) === (0/0); }
test(false, f7);

function f8() { return (0/0) === NaN; }
test(false, f8);

function f9() { return NaN === (0/0); }
test(false, f9);

// ----

function g1() { return NaN; }
test((0/0), g1);

function g2() { return (0/0); }
test((0/0), g2);

function g3() { return (0/0) == (0/0); }
test(false, g3);

function g4() { return (0/0) == NaN; }
test(false, g4);

function g5() { return NaN == (0/0); }
test(false, g5);

function g6() { return "" + NaN; }
test("NaN", g6);

function g7() { return (0/0) === (0/0); }
test(false, g7);

function g8() { return (0/0) === NaN; }
test(false, g8);

function g9() { return NaN === (0/0); }
test(false, g9);

testThrows(function() { NaN = 111; });

function h1() { return NaN; }
test((0/0), h1);

function h2() { return (0/0); }
test((0/0), h2);

function h3() { return (0/0) == (0/0); }
test(false, h3);

function h4() { return (0/0) == NaN; }
test(false, h4);

function h5() { return NaN == (0/0); }
test(false, h5);

function h6() { return "" + NaN; }
test("NaN", h6);

function h7() { return (0/0) === (0/0); }
test(false, h7);

function h8() { return (0/0) === NaN; }
test(false, h8);

function h9() { return NaN === (0/0); }
test(false, h9);

// -------------

function k1() { return this.NaN; }
testThrows(k1);

function k2() { return (0/0); }
test((0/0), k2);

function k3() { return (0/0) == (0/0); }
test(false, k3);

function k4() { return (0/0) == this.NaN; }
testThrows(k4);

function k5() { return this.NaN == (0/0); }
testThrows(k5);

function k6() { return "" + this.NaN; }
testThrows(k6);

function k7() { return (0/0) === (0/0); }
test(false, k7);

function k8() { return (0/0) === this.NaN; }
testThrows(k8);

function k9() { return this.NaN === (0/0); }
testThrows(k9);
