function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`bad value: {String(actual)}`); } function shouldThrow(func, errorMessage) { var errorThrown = false; var error = null; try { func(); } catch (e) { errorThrown = true; error = e; } if (!errorThrown) throw new Error('not thrown'); if (String(error) !== errorMessage) throw new Error(`bad error: ${String(error)}`); } { let object = { toString() { return "C"; } }; shouldBe(String.prototype.repeat.call(object, 2.5), "CC"); shouldBe(String.prototype.repeat.call(object, -0), ""); shouldBe(String.prototype.repeat.call(object, 1), "C"); shouldBe(String.prototype.repeat.call(object, { valueOf() { return 2.5; } }), "CC"); shouldThrow(() => { String.prototype.repeat.call(object, { valueOf() { throw new Error("OK"); } }); }, `Error: OK`); } { shouldBe(String.prototype.repeat.call("", 0), ""); shouldBe(String.prototype.repeat.call("", 0xFFFFFFFFF), ""); shouldThrow(() => { String.prototype.repeat.call("", Infinity); }, `RangeError: String.prototype.repeat argument must be greater than or equal to 0 and not be Infinity`); shouldThrow(() => { String.prototype.repeat.call("", -2000); }, `RangeError: String.prototype.repeat argument must be greater than or equal to 0 and not be Infinity`); }