diff --git a/test/built-ins/String/prototype/repeat/count-coerced-to-zero-returns-empty-string.js b/test/built-ins/String/prototype/repeat/count-coerced-to-zero-returns-empty-string.js
new file mode 100644
index 0000000000000000000000000000000000000000..f058f3bce1e6ce6d673e3126309a04aeb78d2d29
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/count-coerced-to-zero-returns-empty-string.js
@@ -0,0 +1,22 @@
+// 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.3.13
+description: >
+  If ToInteger(count) is zero, returns an empty String.
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  8. Let T be a String value that is made from n copies of S appended together.
+  If n is 0, T is the empty String.
+  9. Return T.
+---*/
+
+var str = 'ES2015';
+
+assert.sameValue(str.repeat(NaN), '', 'str.repeat(NaN) returns ""');
+assert.sameValue(str.repeat(null), '', 'str.repeat(null) returns ""');
+assert.sameValue(str.repeat(undefined), '', 'str.repeat(undefined) returns ""');
+assert.sameValue(str.repeat(false), '', 'str.repeat(false) returns ""');
+assert.sameValue(str.repeat('0'), '', 'str.repeat("0") returns ""');
+assert.sameValue(str.repeat(0.9), '', 'str.repeat(0.9) returns ""');
diff --git a/test/built-ins/String/prototype/repeat/count-is-infinity-throws.js b/test/built-ins/String/prototype/repeat/count-is-infinity-throws.js
new file mode 100644
index 0000000000000000000000000000000000000000..f9af5b546788d8d30538ab6f5273264a66889a7b
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/count-is-infinity-throws.js
@@ -0,0 +1,15 @@
+// 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.3.13
+description: >
+  Throws a RangeError if count < 0
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  7. If n is +∞, throw a RangeError exception.
+---*/
+
+assert.throws(RangeError, function() {
+  ''.repeat(Infinity);
+});
diff --git a/test/built-ins/String/prototype/repeat/count-is-zero-returns-empty-string.js b/test/built-ins/String/prototype/repeat/count-is-zero-returns-empty-string.js
new file mode 100644
index 0000000000000000000000000000000000000000..3183f21d49d0fec340136033dd9943f99b567c30
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/count-is-zero-returns-empty-string.js
@@ -0,0 +1,15 @@
+// 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.3.13
+description: >
+  If count is zero, returns an empty String.
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  8. Let T be a String value that is made from n copies of S appended together.
+  If n is 0, T is the empty String.
+  9. Return T.
+---*/
+
+assert.sameValue('foo'.repeat(0), '');
diff --git a/test/built-ins/String/prototype/repeat/count-less-than-zero-throws.js b/test/built-ins/String/prototype/repeat/count-less-than-zero-throws.js
new file mode 100644
index 0000000000000000000000000000000000000000..a23026483d7d37e9202c49e556e0d0e43fd70b7c
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/count-less-than-zero-throws.js
@@ -0,0 +1,19 @@
+// 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.3.13
+description: >
+  Throws a RangeError if count < 0
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  6. If n < 0, throw a RangeError exception.
+---*/
+
+assert.throws(RangeError, function() {
+  ''.repeat(-1);
+});
+
+assert.throws(RangeError, function() {
+  ''.repeat(-Infinity);
+});
diff --git a/test/built-ins/String/prototype/repeat/empty-string-returns-empty.js b/test/built-ins/String/prototype/repeat/empty-string-returns-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..31da7d90cd809fd1ad26acb2a99a1c76800b0c61
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/empty-string-returns-empty.js
@@ -0,0 +1,19 @@
+// 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.3.13
+description: >
+  An empty repeated n times will return an empty string.
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  8. Let T be a String value that is made from n copies of S appended together.
+  If n is 0, T is the empty String.
+  9. Return T.
+---*/
+
+assert.sameValue(''.repeat(1), '', '"".repeat(1)');
+assert.sameValue(''.repeat(3), '', '"".repeat(3)');
+
+var maxSafe32bitInt = 2147483647;
+assert.sameValue(''.repeat(maxSafe32bitInt), '', '"".repeat(maxSafe32bitInt)');
diff --git a/test/built-ins/String/prototype/repeat/length.js b/test/built-ins/String/prototype/repeat/length.js
new file mode 100644
index 0000000000000000000000000000000000000000..2deb1799fe744c9f82d0fac0d6380c9d03baccdb
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/length.js
@@ -0,0 +1,22 @@
+// 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.3.13
+description: >
+  String.prototype.repeat.length value and descriptor.
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  String.prototype.repeat.length, 1,
+  'The value of `String.prototype.repeat.length` is `1`'
+);
+
+verifyNotEnumerable(String.prototype.repeat, 'length');
+verifyNotWritable(String.prototype.repeat, 'length');
+verifyConfigurable(String.prototype.repeat, 'length');
diff --git a/test/built-ins/String/prototype/repeat/name.js b/test/built-ins/String/prototype/repeat/name.js
new file mode 100644
index 0000000000000000000000000000000000000000..b4607d65a6e594f95352afa7ca6530fef32df857
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/name.js
@@ -0,0 +1,22 @@
+// 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.3.13
+description: >
+  String.prototype.repeat.name value and descriptor.
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  String.prototype.repeat.name, 'repeat',
+  'The value of `String.prototype.repeat.name` is `"repeat"`'
+);
+
+verifyNotEnumerable(String.prototype.repeat, 'name');
+verifyNotWritable(String.prototype.repeat, 'name');
+verifyConfigurable(String.prototype.repeat, 'name');
diff --git a/test/built-ins/String/prototype/repeat/repeat-string-n-times.js b/test/built-ins/String/prototype/repeat/repeat-string-n-times.js
new file mode 100644
index 0000000000000000000000000000000000000000..db6a4929f331dd46704228c5cde4c749b1929231
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/repeat-string-n-times.js
@@ -0,0 +1,28 @@
+// 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.3.13
+description: >
+  Returns a String made from n copies of the original String appended together.
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  8. Let T be a String value that is made from n copies of S appended together.
+  If n is 0, T is the empty String.
+  9. Return T.
+---*/
+
+var str = 'abc';
+assert.sameValue(str.repeat(1), str, 'str.repeat(1) === str');
+assert.sameValue(str.repeat(3), 'abcabcabc', 'str.repeat(3) === "abcabcabc"');
+
+str = '';
+var i = 0;
+var count = 10000;
+
+while (i < count) {
+  str += '.';
+  i++;
+}
+
+assert.sameValue('.'.repeat(count), str);
diff --git a/test/built-ins/String/prototype/repeat/repeat.js b/test/built-ins/String/prototype/repeat/repeat.js
new file mode 100644
index 0000000000000000000000000000000000000000..5a632bd5a07c7ecb034f0b43d1f109ac32bfe80e
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/repeat.js
@@ -0,0 +1,22 @@
+// 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.3.13
+description: >
+  Property type and descriptor.
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  typeof String.prototype.repeat,
+  'function',
+  '`typeof String.prototype.repeat` is `function`'
+);
+
+verifyNotEnumerable(String.prototype, 'repeat');
+verifyWritable(String.prototype, 'repeat');
+verifyConfigurable(String.prototype, 'repeat');
diff --git a/test/built-ins/String/prototype/repeat/return-abrupt-from-count-as-symbol.js b/test/built-ins/String/prototype/repeat/return-abrupt-from-count-as-symbol.js
new file mode 100644
index 0000000000000000000000000000000000000000..96dc9ed95e22afbd735e86ea7eebbf2922f80a77
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/return-abrupt-from-count-as-symbol.js
@@ -0,0 +1,19 @@
+// 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.3.13
+description: >
+  Returns abrupt from ToInteger(count) where count is a Symbol
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  4. Let n be ToInteger(count).
+  5. ReturnIfAbrupt(n).
+features: [Symbol]
+---*/
+
+var s = Symbol('');
+
+assert.throws(TypeError, function() {
+  ''.repeat(s);
+});
diff --git a/test/built-ins/String/prototype/repeat/return-abrupt-from-count.js b/test/built-ins/String/prototype/repeat/return-abrupt-from-count.js
new file mode 100644
index 0000000000000000000000000000000000000000..0b44ab825b3b7e1ad3efac8a25414df01b249f56
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/return-abrupt-from-count.js
@@ -0,0 +1,22 @@
+// 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.3.13
+description: >
+  Returns abrupt from ToInteger(count)
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  4. Let n be ToInteger(count).
+  5. ReturnIfAbrupt(n).
+---*/
+
+var o = {
+  toString: function() {
+    throw new Test262Error();
+  }
+}
+
+assert.throws(Test262Error, function() {
+  ''.repeat(o);
+});
diff --git a/test/built-ins/String/prototype/repeat/return-abrupt-from-this-as-symbol.js b/test/built-ins/String/prototype/repeat/return-abrupt-from-this-as-symbol.js
new file mode 100644
index 0000000000000000000000000000000000000000..a8ad73837a1293895b16523a01feff9a4c08d77a
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/return-abrupt-from-this-as-symbol.js
@@ -0,0 +1,20 @@
+// 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.3.13
+description: >
+  Returns abrupt from ToString(this) where this is a Symbol
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  1. Let O be RequireObjectCoercible(this value).
+  2. Let S be ToString(O).
+  3. ReturnIfAbrupt(S).
+features: [Symbol]
+---*/
+
+var s = Symbol('');
+
+assert.throws(TypeError, function() {
+  String.prototype.repeat.call(s);
+});
diff --git a/test/built-ins/String/prototype/repeat/return-abrupt-from-this.js b/test/built-ins/String/prototype/repeat/return-abrupt-from-this.js
new file mode 100644
index 0000000000000000000000000000000000000000..d9316e12f513ad595b17dca6a156f99dd85c11a9
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/return-abrupt-from-this.js
@@ -0,0 +1,23 @@
+// 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.3.13
+description: >
+  Returns abrupt from ToString(this)
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  1. Let O be RequireObjectCoercible(this value).
+  2. Let S be ToString(O).
+  3. ReturnIfAbrupt(S).
+---*/
+
+var o = {
+  toString: function() {
+    throw new Test262Error();
+  }
+};
+
+assert.throws(Test262Error, function() {
+  String.prototype.repeat.call(o);
+});
diff --git a/test/built-ins/String/prototype/repeat/this-is-null-throws.js b/test/built-ins/String/prototype/repeat/this-is-null-throws.js
new file mode 100644
index 0000000000000000000000000000000000000000..70c351d151542a3ff5f2fdff89218e531a605bd1
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/this-is-null-throws.js
@@ -0,0 +1,16 @@
+// 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.3.13
+description: >
+  Throws TypeError when `this` is null
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  1. Let O be RequireObjectCoercible(this value).
+  2. Let S be ToString(O).
+---*/
+
+assert.throws(TypeError, function() {
+  String.prototype.repeat.call(null);
+});
diff --git a/test/built-ins/String/prototype/repeat/this-is-undefined-throws.js b/test/built-ins/String/prototype/repeat/this-is-undefined-throws.js
new file mode 100644
index 0000000000000000000000000000000000000000..18e6fb640a33e3ca06d5732ada9d9517c78d7e91
--- /dev/null
+++ b/test/built-ins/String/prototype/repeat/this-is-undefined-throws.js
@@ -0,0 +1,16 @@
+// 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.3.13
+description: >
+  Throws TypeError when `this` is undefined
+info: >
+  21.1.3.13 String.prototype.repeat ( count )
+
+  1. Let O be RequireObjectCoercible(this value).
+  2. Let S be ToString(O).
+---*/
+
+assert.throws(TypeError, function() {
+  String.prototype.repeat.call(undefined);
+});