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 0000000000000000000000000000000000000000..9a026d0231ed3fa2650bc86c79970f8344d5c511 --- /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 0000000000000000000000000000000000000000..d3b3f69cc75cb51e389fd6c88758d210eb56f3ed --- /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 0000000000000000000000000000000000000000..1a8b94ecbb7b5f8e030353cc1342df0d9d925f9e --- /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 0000000000000000000000000000000000000000..b71def3824bd2b84c65c6362697e8c9ce0bb11e4 --- /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 0000000000000000000000000000000000000000..3137735407405c1b16ba16756d41905399fdd03e --- /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 0000000000000000000000000000000000000000..0976dc6d8229013c37ba84d3480678b0e9b779d8 --- /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 0000000000000000000000000000000000000000..a4c590fae78539d7cd8d711fdef7c61cc805240c --- /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 0000000000000000000000000000000000000000..e31ca6886566199a929819888d4c218cb23f9f7a --- /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 0000000000000000000000000000000000000000..8226fdbc37cd05bb567fd4c167b61a234d35145f --- /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 0000000000000000000000000000000000000000..e712e4c7af2c5152f26230e45af06bb2345ca276 --- /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 0000000000000000000000000000000000000000..294c7c70ab10704d0f4bd7973132817d7c85861f --- /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 0000000000000000000000000000000000000000..d9e819747ebe8b59de6245df2dac5e4c05e9e209 --- /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 0000000000000000000000000000000000000000..a9b60e00d80638c9e9a1b4ff0db8a518abcdc8e5 --- /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 0000000000000000000000000000000000000000..5fe3bfcbf52a67f03ec99b3fa1fae2d3c219116d --- /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 0000000000000000000000000000000000000000..b7749e53aa72a3f0d779c54213309dadf98c565d --- /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 0000000000000000000000000000000000000000..14117c8fb8a027c1db246661009b59a4b8ec10d1 --- /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 0000000000000000000000000000000000000000..80a7a14e246561d93211f51d07e4720440113348 --- /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 0000000000000000000000000000000000000000..54c063095ba8172c29722177558a0873eed55e37 --- /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 0000000000000000000000000000000000000000..d89d0abd2023b564f2a8a6b3ad56e76eb45438de --- /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 0000000000000000000000000000000000000000..bf54727cd0bdd1abba6e4fd4b81088b64cd1523e --- /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, ''); +});