String.prototype.startsWith

This commit is contained in:
Leonardo Balter 2015-07-16 15:41:27 -04:00
parent bdd84fb6ae
commit 33c791e722
20 changed files with 541 additions and 0 deletions

View File

@ -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');

View File

@ -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');

View File

@ -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');

View File

@ -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)'
);

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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, '');
});

View File

@ -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, '');
});

View File

@ -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'
);

View File

@ -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'
);

View File

@ -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');

View File

@ -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);
});

View File

@ -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'
);

View File

@ -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'
);

View File

@ -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');

View File

@ -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, '');
});

View File

@ -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, '');
});