From 33c791e722a7360599d1d2df08b96ac34cf682e0 Mon Sep 17 00:00:00 2001
From: Leonardo Balter <leonardo.balter@gmail.com>
Date: Thu, 16 Jul 2015 15:41:27 -0400
Subject: [PATCH] String.prototype.startsWith

---
 .../startsWith/coerced-values-of-position.js  | 39 +++++++++++++++++
 .../String/prototype/startsWith/length.js     | 22 ++++++++++
 .../String/prototype/startsWith/name.js       | 22 ++++++++++
 .../startsWith/out-of-bounds-position.js      | 43 +++++++++++++++++++
 .../return-abrupt-from-position-as-symbol.js  | 22 ++++++++++
 .../startsWith/return-abrupt-from-position.js | 25 +++++++++++
 ...turn-abrupt-from-searchstring-as-symbol.js | 21 +++++++++
 ...rn-abrupt-from-searchstring-regexp-test.js | 42 ++++++++++++++++++
 .../return-abrupt-from-searchstring.js        | 24 +++++++++++
 .../return-abrupt-from-this-as-symbol.js      | 20 +++++++++
 .../startsWith/return-abrupt-from-this.js     | 23 ++++++++++
 .../return-true-if-searchstring-is-empty.js   | 40 +++++++++++++++++
 .../searchstring-found-with-position.js       | 34 +++++++++++++++
 .../searchstring-found-without-position.js    | 24 +++++++++++
 .../searchstring-is-regexp-throws.js          | 21 +++++++++
 .../searchstring-not-found-with-position.js   | 31 +++++++++++++
 ...searchstring-not-found-without-position.js | 34 +++++++++++++++
 .../String/prototype/startsWith/startsWith.js | 22 ++++++++++
 .../startsWith/this-is-null-throws.js         | 16 +++++++
 .../startsWith/this-is-undefined-throws.js    | 16 +++++++
 20 files changed, 541 insertions(+)
 create mode 100644 test/built-ins/String/prototype/startsWith/coerced-values-of-position.js
 create mode 100644 test/built-ins/String/prototype/startsWith/length.js
 create mode 100644 test/built-ins/String/prototype/startsWith/name.js
 create mode 100644 test/built-ins/String/prototype/startsWith/out-of-bounds-position.js
 create mode 100644 test/built-ins/String/prototype/startsWith/return-abrupt-from-position-as-symbol.js
 create mode 100644 test/built-ins/String/prototype/startsWith/return-abrupt-from-position.js
 create mode 100644 test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-as-symbol.js
 create mode 100644 test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-regexp-test.js
 create mode 100644 test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring.js
 create mode 100644 test/built-ins/String/prototype/startsWith/return-abrupt-from-this-as-symbol.js
 create mode 100644 test/built-ins/String/prototype/startsWith/return-abrupt-from-this.js
 create mode 100644 test/built-ins/String/prototype/startsWith/return-true-if-searchstring-is-empty.js
 create mode 100644 test/built-ins/String/prototype/startsWith/searchstring-found-with-position.js
 create mode 100644 test/built-ins/String/prototype/startsWith/searchstring-found-without-position.js
 create mode 100644 test/built-ins/String/prototype/startsWith/searchstring-is-regexp-throws.js
 create mode 100644 test/built-ins/String/prototype/startsWith/searchstring-not-found-with-position.js
 create mode 100644 test/built-ins/String/prototype/startsWith/searchstring-not-found-without-position.js
 create mode 100644 test/built-ins/String/prototype/startsWith/startsWith.js
 create mode 100644 test/built-ins/String/prototype/startsWith/this-is-null-throws.js
 create mode 100644 test/built-ins/String/prototype/startsWith/this-is-undefined-throws.js

diff --git a/test/built-ins/String/prototype/startsWith/coerced-values-of-position.js b/test/built-ins/String/prototype/startsWith/coerced-values-of-position.js
new file mode 100644
index 0000000000..9a026d0231
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/coerced-values-of-position.js
@@ -0,0 +1,39 @@
+// 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.18
+description: >
+  Returns based on coerced values of position.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  9. Let pos be ToInteger(position). (If position is undefined, this step
+  produces the value 0).
+  10. ReturnIfAbrupt(pos).
+  11. Let len be the number of elements in S.
+  12. Let start be min(max(pos, 0), len).
+  13. Let searchLength be the number of elements in searchStr.
+  14. If searchLength+start is greater than len, return false.
+  15. If the sequence of elements of S starting at start of length searchLength
+  is the same as the full element sequence of searchStr, return true.
+  16. Otherwise, return false.
+  ...
+---*/
+
+var str = 'The future is cool!';
+
+assert(str.startsWith('The future', NaN), 'NaN coerced to 0');
+assert(str.startsWith('The future', null), 'null coerced to 0');
+assert(str.startsWith('The future', false), 'false coerced to 0');
+assert(str.startsWith('The future', ''), '"" coerced to 0');
+assert(str.startsWith('The future', '0'), '"0" coerced to 0');
+assert(str.startsWith('The future', undefined), 'undefined coerced to 0');
+assert(str.startsWith('The future', 0.4), '0.4 coerced to 0');
+
+assert.sameValue(
+  str.startsWith('The future', true), false,
+  'true coerced to 1'
+);
+assert.sameValue(str.startsWith('The future', '1'), false, '"1" coerced to 1');
+assert.sameValue(str.startsWith('The future', 1.4), false, '1.4 coerced to 1');
diff --git a/test/built-ins/String/prototype/startsWith/length.js b/test/built-ins/String/prototype/startsWith/length.js
new file mode 100644
index 0000000000..d3b3f69cc7
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/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.18
+description: >
+  String.prototype.startsWith.length value and descriptor.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  The length property of the startsWith method is 1.
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  String.prototype.startsWith.length, 1,
+  'The value of `String.prototype.startsWith.length` is `1`'
+);
+
+verifyNotEnumerable(String.prototype.startsWith, 'length');
+verifyNotWritable(String.prototype.startsWith, 'length');
+verifyConfigurable(String.prototype.startsWith, 'length');
diff --git a/test/built-ins/String/prototype/startsWith/name.js b/test/built-ins/String/prototype/startsWith/name.js
new file mode 100644
index 0000000000..1a8b94ecbb
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/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.18
+description: >
+  String.prototype.startsWith.name value and descriptor.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  String.prototype.startsWith.name, 'startsWith',
+  'The value of `String.prototype.startsWith.name` is `"startsWith"`'
+);
+
+verifyNotEnumerable(String.prototype.startsWith, 'name');
+verifyNotWritable(String.prototype.startsWith, 'name');
+verifyConfigurable(String.prototype.startsWith, 'name');
diff --git a/test/built-ins/String/prototype/startsWith/out-of-bounds-position.js b/test/built-ins/String/prototype/startsWith/out-of-bounds-position.js
new file mode 100644
index 0000000000..b71def3824
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/out-of-bounds-position.js
@@ -0,0 +1,43 @@
+// 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.18
+description: >
+  Returns false if searchLength + start position is greater than string length.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  11. Let len be the number of elements in S.
+  12. Let start be min(max(pos, 0), len).
+  13. Let searchLength be the number of elements in searchStr.
+  14. If searchLength+start is greater than len, return false.
+  ...
+---*/
+
+var str = 'The future is cool!';
+
+assert.sameValue(
+  str.startsWith('!', str.length), false,
+  'str.startsWith("!", str.length) returns false'
+);
+
+assert.sameValue(
+  str.startsWith('!', 100), false,
+  'str.startsWith("!", 100) returns false'
+);
+
+assert.sameValue(
+  str.startsWith('!', Infinity), false,
+  'str.startsWith("!", Infinity) returns false'
+);
+
+assert(
+  str.startsWith('The future', -1),
+  'position argument < 0 will search from the start of the string (-1)'
+);
+
+assert(
+  str.startsWith('The future', -Infinity),
+  'position argument < 0 will search from the start of the string (-Infinity)'
+);
diff --git a/test/built-ins/String/prototype/startsWith/return-abrupt-from-position-as-symbol.js b/test/built-ins/String/prototype/startsWith/return-abrupt-from-position-as-symbol.js
new file mode 100644
index 0000000000..3137735407
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/return-abrupt-from-position-as-symbol.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.18
+description: >
+  Returns abrupt from ToInteger(position) as a Symbol.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  9. Let pos be ToInteger(position). (If position is undefined, this step
+  produces the value 0).
+  10. ReturnIfAbrupt(pos).
+  ...
+features: [Symbol]
+---*/
+
+var position = Symbol();
+
+assert.throws(TypeError, function() {
+  ''.startsWith('', position);
+});
diff --git a/test/built-ins/String/prototype/startsWith/return-abrupt-from-position.js b/test/built-ins/String/prototype/startsWith/return-abrupt-from-position.js
new file mode 100644
index 0000000000..0976dc6d82
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/return-abrupt-from-position.js
@@ -0,0 +1,25 @@
+// 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.18
+description: >
+  Returns abrupt from ToInteger(position).
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  9. Let pos be ToInteger(position). (If position is undefined, this step
+  produces the value 0).
+  10. ReturnIfAbrupt(pos).
+  ...
+---*/
+
+var position = {
+  valueOf: function() {
+    throw new Test262Error();
+  }
+};
+
+assert.throws(Test262Error, function() {
+  ''.startsWith('', position);
+});
diff --git a/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-as-symbol.js b/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-as-symbol.js
new file mode 100644
index 0000000000..a4c590fae7
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-as-symbol.js
@@ -0,0 +1,21 @@
+// 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.18
+description: >
+  Returns abrupt from ToString(searchString) as a Symbol
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  7. Let searchStr be ToString(searchString).
+  8. ReturnIfAbrupt(searchString).
+  ...
+features: [Symbol]
+---*/
+
+var s = Symbol();
+
+assert.throws(TypeError, function() {
+  ''.startsWith(s);
+});
diff --git a/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-regexp-test.js b/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-regexp-test.js
new file mode 100644
index 0000000000..e31ca68865
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring-regexp-test.js
@@ -0,0 +1,42 @@
+// 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.18
+description: >
+  Returns abrupt from IsRegExp(searchString).
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  4. Let isRegExp be IsRegExp(searchString).
+  5. ReturnIfAbrupt(isRegExp).
+  ...
+
+  7.2.8 IsRegExp ( argument )
+
+  2. Let isRegExp be Get(argument, @@match).
+  3. ReturnIfAbrupt(isRegExp).
+features: [Symbol.match]
+---*/
+
+var obj = {};
+Object.defineProperty(obj, Symbol.match, {
+  get: function() {
+    throw new Test262Error();
+  }
+});
+
+assert.throws(Test262Error, function() {
+  ''.startsWith(obj);
+});
+
+var regexp = /./;
+Object.defineProperty(regexp, Symbol.match, {
+  get: function() {
+    throw new Test262Error();
+  }
+});
+
+assert.throws(Test262Error, function() {
+  ''.startsWith(regexp);
+});
diff --git a/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring.js b/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring.js
new file mode 100644
index 0000000000..8226fdbc37
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/return-abrupt-from-searchstring.js
@@ -0,0 +1,24 @@
+// 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.18
+description: >
+  Returns abrupt from ToString(searchString)
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  7. Let searchStr be ToString(searchString).
+  8. ReturnIfAbrupt(searchString).
+  ...
+---*/
+
+var obj = {
+  toString: function() {
+    throw new Test262Error();
+  }
+};
+
+assert.throws(Test262Error, function() {
+  ''.startsWith(obj);
+});
diff --git a/test/built-ins/String/prototype/startsWith/return-abrupt-from-this-as-symbol.js b/test/built-ins/String/prototype/startsWith/return-abrupt-from-this-as-symbol.js
new file mode 100644
index 0000000000..e712e4c7af
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/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.18
+description: >
+  Returns abrupt from ToString(this) where this is a Symbol
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  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.startsWith.call(s, '');
+});
diff --git a/test/built-ins/String/prototype/startsWith/return-abrupt-from-this.js b/test/built-ins/String/prototype/startsWith/return-abrupt-from-this.js
new file mode 100644
index 0000000000..294c7c70ab
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/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.18
+description: >
+  Returns abrupt from ToString(this)
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  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.startsWith.call(o, '');
+});
diff --git a/test/built-ins/String/prototype/startsWith/return-true-if-searchstring-is-empty.js b/test/built-ins/String/prototype/startsWith/return-true-if-searchstring-is-empty.js
new file mode 100644
index 0000000000..d9e819747e
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/return-true-if-searchstring-is-empty.js
@@ -0,0 +1,40 @@
+// 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.18
+description: >
+  Returns true if searchString.length == 0.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  11. Let len be the number of elements in S.
+  12. Let start be min(max(pos, 0), len).
+  13. Let searchLength be the number of elements in searchStr.
+  14. If searchLength+start is greater than len, return false.
+  15. If the sequence of elements of S starting at start of length searchLength
+  is the same as the full element sequence of searchStr, return true.
+  ...
+---*/
+
+var str = 'The future is cool!';
+
+assert(
+  str.startsWith(''),
+  'str.startsWith("") returns true'
+);
+
+assert(
+  str.startsWith('', str.length),
+  'str.startsWith("", str.length) returns true'
+);
+
+assert(
+  str.startsWith(''),
+  'str.startsWith("") returns true'
+);
+
+assert(
+  str.startsWith('', Infinity),
+  'str.startsWith("", Infinity) returns true'
+);
\ No newline at end of file
diff --git a/test/built-ins/String/prototype/startsWith/searchstring-found-with-position.js b/test/built-ins/String/prototype/startsWith/searchstring-found-with-position.js
new file mode 100644
index 0000000000..a9b60e00d8
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/searchstring-found-with-position.js
@@ -0,0 +1,34 @@
+// 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.18
+description: >
+  Returns true if searchString appears as a substring of the given string with a
+  given position.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  11. Let len be the number of elements in S.
+  12. Let start be min(max(pos, 0), len).
+  13. Let searchLength be the number of elements in searchStr.
+  14. If searchLength+start is greater than len, return false.
+  15. If the sequence of elements of S starting at start of length searchLength
+  is the same as the full element sequence of searchStr, return true.
+  ...
+---*/
+
+var str = 'The future is cool!';
+
+assert(
+  str.startsWith('The future', 0),
+  'str.startsWith("The future", 0) === true'
+);
+assert(
+  str.startsWith('future', 4),
+  'str.startsWith("future", 4) === true'
+);
+assert(
+  str.startsWith(' is cool!', 10),
+  'str.startsWith(" is cool!", 10) === true'
+);
diff --git a/test/built-ins/String/prototype/startsWith/searchstring-found-without-position.js b/test/built-ins/String/prototype/startsWith/searchstring-found-without-position.js
new file mode 100644
index 0000000000..5fe3bfcbf5
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/searchstring-found-without-position.js
@@ -0,0 +1,24 @@
+// 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.18
+description: >
+  Returns true if searchString appears as a substring of the given string.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  11. Let len be the number of elements in S.
+  12. Let start be min(max(pos, 0), len).
+  13. Let searchLength be the number of elements in searchStr.
+  14. If searchLength+start is greater than len, return false.
+  15. If the sequence of elements of S starting at start of length searchLength
+  is the same as the full element sequence of searchStr, return true.
+  ...
+---*/
+
+var str = 'The future is cool!';
+
+assert(str.startsWith('The '), 'str.startsWith("The ") === true');
+assert(str.startsWith('The future'), 'str.startsWith("The future") === true');
+assert(str.startsWith(str), 'str.startsWith(str) === true');
diff --git a/test/built-ins/String/prototype/startsWith/searchstring-is-regexp-throws.js b/test/built-ins/String/prototype/startsWith/searchstring-is-regexp-throws.js
new file mode 100644
index 0000000000..b7749e53aa
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/searchstring-is-regexp-throws.js
@@ -0,0 +1,21 @@
+// 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.18
+description: >
+  Throws a TypeError if searchString is a RegExp.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  4. Let isRegExp be IsRegExp(searchString).
+  5. ReturnIfAbrupt(isRegExp).
+  6. If isRegExp is true, throw a TypeError exception.
+  ...
+---*/
+
+var searchString = /./;
+
+assert.throws(TypeError, function() {
+  ''.startsWith(searchString);
+});
diff --git a/test/built-ins/String/prototype/startsWith/searchstring-not-found-with-position.js b/test/built-ins/String/prototype/startsWith/searchstring-not-found-with-position.js
new file mode 100644
index 0000000000..14117c8fb8
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/searchstring-not-found-with-position.js
@@ -0,0 +1,31 @@
+// 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.18
+description: >
+  Returns false if searchString is not found with a given position.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  11. Let len be the number of elements in S.
+  12. Let start be min(max(pos, 0), len).
+  13. Let searchLength be the number of elements in searchStr.
+  14. If searchLength+start is greater than len, return false.
+  15. If the sequence of elements of S starting at start of length searchLength
+  is the same as the full element sequence of searchStr, return true.
+  16. Otherwise, return false.
+  ...
+---*/
+
+var str = 'The future is cool!';
+
+assert.sameValue(
+  str.startsWith('The future', 1), false,
+  'str.startsWith("The future", 1) === false'
+);
+
+assert.sameValue(
+  str.startsWith(str, 1), false,
+  'str.startsWith(str, 1) === false'
+);
diff --git a/test/built-ins/String/prototype/startsWith/searchstring-not-found-without-position.js b/test/built-ins/String/prototype/startsWith/searchstring-not-found-without-position.js
new file mode 100644
index 0000000000..80a7a14e24
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/searchstring-not-found-without-position.js
@@ -0,0 +1,34 @@
+// 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.18
+description: >
+  Returns false if searchString is not found.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  ...
+  11. Let len be the number of elements in S.
+  12. Let start be min(max(pos, 0), len).
+  13. Let searchLength be the number of elements in searchStr.
+  14. If searchLength+start is greater than len, return false.
+  15. If the sequence of elements of S starting at start of length searchLength
+  is the same as the full element sequence of searchStr, return true.
+  16. Otherwise, return false.
+  ...
+---*/
+
+var str = 'The future is cool!';
+
+assert.sameValue(
+  str.startsWith('Flash'), false,
+  'str.startsWith("Flash") === false'
+);
+assert.sameValue(
+  str.startsWith('THE FUTURE'), false,
+  'startsWith is case sensitive'
+);
+assert.sameValue(
+  str.startsWith('future is cool!'), false,
+  'str.startsWith("future is cool!") === false'
+);
diff --git a/test/built-ins/String/prototype/startsWith/startsWith.js b/test/built-ins/String/prototype/startsWith/startsWith.js
new file mode 100644
index 0000000000..54c063095b
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/startsWith.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.18
+description: >
+  Property type and descriptor.
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  17 ECMAScript Standard Built-in Objects
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+  typeof String.prototype.startsWith,
+  'function',
+  '`typeof String.prototype.startsWith` is `function`'
+);
+
+verifyNotEnumerable(String.prototype, 'startsWith');
+verifyWritable(String.prototype, 'startsWith');
+verifyConfigurable(String.prototype, 'startsWith');
diff --git a/test/built-ins/String/prototype/startsWith/this-is-null-throws.js b/test/built-ins/String/prototype/startsWith/this-is-null-throws.js
new file mode 100644
index 0000000000..d89d0abd20
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/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.18
+description: >
+  Throws TypeError when `this` is null
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  1. Let O be RequireObjectCoercible(this value).
+  2. Let S be ToString(O).
+---*/
+
+assert.throws(TypeError, function() {
+  String.prototype.startsWith.call(null, '');
+});
diff --git a/test/built-ins/String/prototype/startsWith/this-is-undefined-throws.js b/test/built-ins/String/prototype/startsWith/this-is-undefined-throws.js
new file mode 100644
index 0000000000..bf54727cd0
--- /dev/null
+++ b/test/built-ins/String/prototype/startsWith/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.18
+description: >
+  Throws TypeError when `this` is undefined
+info: >
+  21.1.3.18 String.prototype.startsWith ( searchString [ , position ] )
+
+  1. Let O be RequireObjectCoercible(this value).
+  2. Let S be ToString(O).
+---*/
+
+assert.throws(TypeError, function() {
+  String.prototype.startsWith.call(undefined, '');
+});