// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 21.1.2.2
description: >
  Throw a RangeError if an argument is not equal to its Integer representation.
info: |
  String.fromCodePoint ( ...codePoints )

  1. Let codePoints be a List containing the arguments passed to this function.
  2. Let length be the number of elements in codePoints.
  3. Let elements be a new List.
  4. Let nextIndex be 0.
  5. Repeat while nextIndex < length
    a. Let next be codePoints[nextIndex].
    b. Let nextCP be ToNumber(next).
    c. ReturnIfAbrupt(nextCP).
    d. If SameValue(nextCP, ToInteger(nextCP)) is false, throw a RangeError
    exception.
  ...
features: [String.fromCodePoint]
---*/

assert.throws(RangeError, function() {
  String.fromCodePoint(3.14);
});

assert.throws(RangeError, function() {
  String.fromCodePoint(42, 3.14);
});

assert.throws(RangeError, function() {
  String.fromCodePoint('3.14');
});

// ToNumber(undefined) returns NaN.
assert.throws(RangeError, function() {
  String.fromCodePoint(undefined);
});

assert.throws(RangeError, function() {
  String.fromCodePoint('_1');
});

assert.throws(RangeError, function() {
  String.fromCodePoint('1a');
});
