// Copyright 2017 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'


// Without .toJSON method.

assertEquals(undefined, BigInt.prototype.toJSON);
assertThrows(() => JSON.stringify(42n), TypeError);
assertThrows(() => JSON.stringify(Object(42n)), TypeError);


// With .toJSON method that returns a string.

BigInt.prototype.toJSON = function() {
  assertEquals("bigint", typeof this);
  return String(this);
}
assertEquals("\"42\"", JSON.stringify(42n));

BigInt.prototype.toJSON = function() {
  assertEquals("object", typeof this);
  return String(this);
}
assertEquals("\"42\"", JSON.stringify(Object(42n)));


// With .toJSON method that returns a BigInt primitive.

BigInt.prototype.toJSON = function() {return this};
assertThrows(() => JSON.stringify(42n), TypeError);
assertThrows(() => JSON.stringify(Object(42n)), TypeError);


// With .toJSON method that returns a BigInt object.

BigInt.prototype.toJSON = function() {return Object(this)};
assertThrows(() => JSON.stringify(42n), TypeError);
assertThrows(() => JSON.stringify(Object(42n)), TypeError);


// Without .toJSON method but with a replacer returning a string.

delete BigInt.prototype.toJSON;
let replacer;

replacer = function(k, v) {
  assertEquals("bigint", typeof v);
  assertTrue(42n == v);
  return "43";
}
assertEquals("\"43\"", JSON.stringify(42n, replacer));

replacer = function(k, v) {
  assertEquals("object", typeof v);
  assertTrue(42n == v);
  return "43";
}
assertEquals("\"43\"", JSON.stringify(Object(42n), replacer));


// Without .toJSON method but with a replacer returning a BigInt primitive.

assertEquals(undefined, BigInt.prototype.toJSON);

replacer = () => 43n;
assertThrows(() => JSON.stringify(42n, replacer), TypeError);
assertThrows(() => JSON.stringify(Object(42n), replacer), TypeError);


// Without .toJSON method but with a replacer returning a BigInt object.

assertEquals(undefined, BigInt.prototype.toJSON);

replacer = () => Object(43n);
assertThrows(() => JSON.stringify(42n, replacer), TypeError);
assertThrows(() => JSON.stringify(Object(42n), replacer), TypeError);
