var runStringTests = function (it) {
'use strict';
var functionsHaveNames = (function foo() {}).name === 'foo';
var ifFunctionsHaveNamesIt = functionsHaveNames ? it : it.skip;
var ifShimIt = (typeof process !== 'undefined' && process.env.NO_ES6_SHIM) ? it.skip : it;
var hasSymbols = typeof Symbol === 'function' && typeof Symbol['for'] === 'function' && typeof Symbol.iterator === 'symbol';
var ifSymbolsDescribe = hasSymbols ? describe : describe.skip;
describe('String', function () {
var hasStrictMode = (function () { return this === null; }.call(null));
var testObjectCoercible = function (methodName) {
var fn = String.prototype[methodName];
if (!hasStrictMode) { return; } // skip these tests on IE <= 10
expect(function () { return fn.call(undefined); }).to['throw'](TypeError);
expect(function () { return fn.call(null); }).to['throw'](TypeError);
expect(function () { return fn.apply(undefined); }).to['throw'](TypeError);
expect(function () { return fn.apply(null); }).to['throw'](TypeError);
};
ifShimIt('is on the exported object', function () {
var exported = require('../');
expect(exported.String).to.equal(String);
});
describe('#repeat()', function () {
if (!Object.prototype.hasOwnProperty.call(String.prototype, 'repeat')) {
return it('exists', function () {
expect(String.prototype).to.have.property('repeat');
});
}
ifFunctionsHaveNamesIt('has the right name', function () {
expect(String.prototype.repeat).to.have.property('name', 'repeat');
});
it('is not enumerable', function () {
expect(String.prototype).ownPropertyDescriptor('repeat').to.have.property('enumerable', false);
});
it('has the right arity', function () {
expect(String.prototype.repeat).to.have.property('length', 1);
});
it('should throw a TypeError when called on null or undefined', function () {
testObjectCoercible('repeat');
});
it('should throw a RangeError when negative or infinite', function () {
expect(function negativeOne() { return 'test'.repeat(-1); }).to['throw'](RangeError);
expect(function infinite() { return 'test'.repeat(Infinity); }).to['throw'](RangeError);
});
it('should coerce to an integer', function () {
expect('test'.repeat(null)).to.eql('');
expect('test'.repeat(false)).to.eql('');
expect('test'.repeat('')).to.eql('');
expect('test'.repeat(NaN)).to.eql('');
expect('test'.repeat({})).to.eql('');
expect('test'.repeat([])).to.eql('');
expect('test'.repeat({
valueOf: function () { return 2; }
})).to.eql('testtest');
});
it('should work', function () {
expect('test'.repeat(3)).to.eql('testtesttest');
});
it('should work on integers', function () {
expect(String.prototype.repeat.call(2, 3)).to.eql('222');
});
it('should work on booleans', function () {
expect(String.prototype.repeat.call(true, 3)).to.eql('truetruetrue');
});
it('should work on dates', function () {
var d = new Date();
expect(String.prototype.repeat.call(d, 3)).to.eql([d, d, d].join(''));
});
});
describe('#startsWith()', function () {
if (!Object.prototype.hasOwnProperty.call(String.prototype, 'startsWith')) {
return it('exists', function () {
expect(String.prototype).to.have.property('startsWith');
});
}
ifFunctionsHaveNamesIt('has the right name', function () {
expect(String.prototype.startsWith).to.have.property('name', 'startsWith');
});
it('is not enumerable', function () {
expect(String.prototype).ownPropertyDescriptor('startsWith').to.have.property('enumerable', false);
});
it('has the right arity', function () {
// WebKit nightly had this bug, fixed in https://bugs.webkit.org/show_bug.cgi?id=143659
expect(String.prototype.startsWith).to.have.property('length', 1);
});
it('should throw a TypeError when called on null or undefined', function () {
testObjectCoercible('startsWith');
});
it('should throw a TypeError when called on null or undefined', function () {
testObjectCoercible('startsWith');
});
it('should be truthy on correct results', function () {
expect('test'.startsWith('te')).to.equal(true);
expect('test'.startsWith('st')).to.equal(false);
expect(''.startsWith('/')).to.equal(false);
expect('#'.startsWith('/')).to.equal(false);
expect('##'.startsWith('///')).to.equal(false);
expect('abc'.startsWith('abc')).to.equal(true);
expect('abcd'.startsWith('abc')).to.equal(true);
expect('abc'.startsWith('a')).to.equal(true);
expect('abc'.startsWith('abcd')).to.equal(false);
expect('abc'.startsWith('bcde')).to.equal(false);
expect('abc'.startsWith('b')).to.equal(false);
expect('abc'.startsWith('abc', 0)).to.equal(true);
expect('abc'.startsWith('bc', 0)).to.equal(false);
expect('abc'.startsWith('bc', 1)).to.equal(true);
expect('abc'.startsWith('c', 1)).to.equal(false);
expect('abc'.startsWith('abc', 1)).to.equal(false);
expect('abc'.startsWith('c', 2)).to.equal(true);
expect('abc'.startsWith('d', 2)).to.equal(false);
expect('abc'.startsWith('dcd', 2)).to.equal(false);
expect('abc'.startsWith('a', NaN)).to.equal(true);
expect('abc'.startsWith('b', NaN)).to.equal(false);
expect('abc'.startsWith('ab', -43)).to.equal(true);
expect('abc'.startsWith('ab', -Infinity)).to.equal(true);
expect('abc'.startsWith('bc', -42)).to.equal(false);
expect('abc'.startsWith('bc', -Infinity)).to.equal(false);
if (hasStrictMode) {
expect(function () {
return ''.startsWith.call(null, 'nu');
}).to['throw'](TypeError);
expect(function () {
return ''.startsWith.call(undefined, 'un');
}).to['throw'](TypeError);
}
var myobj = {
toString: function () { return 'abc'; },
startsWith: String.prototype.startsWith
};
expect(myobj.startsWith('abc')).to.equal(true);
expect(myobj.startsWith('bc')).to.equal(false);
var gotStr = false;
var gotPos = false;
myobj = {
toString: function () {
expect(gotPos).to.equal(false);
gotStr = true;
return 'xyz';
},
startsWith: String.prototype.startsWith
};
var idx = {
valueOf: function () {
expect(gotStr).to.equal(true);
gotPos = true;
return 42;
}
};
myobj.startsWith('elephant', idx);
expect(gotPos).to.equal(true);
});
it('should handle large positions', function () {
expect('abc'.startsWith('a', 42)).to.equal(false);
expect('abc'.startsWith('a', Infinity)).to.equal(false);
});
it('should coerce to a string', function () {
expect('abcd'.startsWith({ toString: function () { return 'ab'; } })).to.equal(true);
expect('abcd'.startsWith({ toString: function () { return 'foo'; } })).to.equal(false);
});
it('should not allow a regex', function () {
expect(function () { return 'abcd'.startsWith(/abc/); }).to['throw'](TypeError);
expect(function () { return 'abcd'.startsWith(new RegExp('abc')); }).to['throw'](TypeError);
});
ifSymbolsDescribe('Symbol.match', function () {
if (!hasSymbols || !Symbol.match) {
return it('exists', function () {
expect(Symbol).to.have.property('match');
});
}
it('allows a regex with Symbol.match set to a falsy value', function () {
var re = /a/g;
re[Symbol.match] = false;
expect(function () { return 'abcd'.startsWith(re); }).not.to['throw']();
expect('abcd'.startsWith(re)).to.equal('abcd'.startsWith(String(re)));
});
});
});
describe('#endsWith()', function () {
if (!Object.prototype.hasOwnProperty.call(String.prototype, 'endsWith')) {
return it('exists', function () {
expect(String.prototype).to.have.property('endsWith');
});
}
ifFunctionsHaveNamesIt('has the right name', function () {
expect(String.prototype.endsWith).to.have.property('name', 'endsWith');
});
it('is not enumerable', function () {
expect(String.prototype).ownPropertyDescriptor('endsWith').to.have.property('enumerable', false);
});
it('has the right arity', function () {
// WebKit nightly had this bug, fixed in https://bugs.webkit.org/show_bug.cgi?id=143659
expect(String.prototype.endsWith).to.have.property('length', 1);
});
it('should throw a TypeError when called on null or undefined', function () {
testObjectCoercible('endsWith');
});
it('should be truthy on correct results', function () {
expect('test'.endsWith('st')).to.equal(true);
expect('test'.endsWith('te')).to.equal(false);
expect(''.endsWith('/')).to.equal(false);
expect('#'.endsWith('/')).to.equal(false);
expect('##'.endsWith('///')).to.equal(false);
expect('abc'.endsWith('abc')).to.equal(true);
expect('abcd'.endsWith('bcd')).to.equal(true);
expect('abc'.endsWith('c')).to.equal(true);
expect('abc'.endsWith('abcd')).to.equal(false);
expect('abc'.endsWith('bbc')).to.equal(false);
expect('abc'.endsWith('b')).to.equal(false);
expect('abc'.endsWith('abc', 3)).to.equal(true);
expect('abc'.endsWith('bc', 3)).to.equal(true);
expect('abc'.endsWith('a', 3)).to.equal(false);
expect('abc'.endsWith('bc', 3)).to.equal(true);
expect('abc'.endsWith('a', 1)).to.equal(true);
expect('abc'.endsWith('abc', 1)).to.equal(false);
expect('abc'.endsWith('b', 2)).to.equal(true);
expect('abc'.endsWith('d', 2)).to.equal(false);
expect('abc'.endsWith('dcd', 2)).to.equal(false);
expect('abc'.endsWith('bc', undefined)).to.equal(true);
expect('abc'.endsWith('bc', NaN)).to.equal(false);
if (hasStrictMode) {
expect(function () {
return ''.endsWith.call(null, 'ull');
}).to['throw'](TypeError);
expect(function () {
return ''.endsWith.call(undefined, 'ned');
}).to['throw'](TypeError);
}
var myobj = {
toString: function () { return 'abc'; },
endsWith: String.prototype.endsWith
};
expect(myobj.endsWith('abc')).to.equal(true);
expect(myobj.endsWith('ab')).to.equal(false);
var gotStr = false;
var gotPos = false;
myobj = {
toString: function () {
expect(gotPos).to.equal(false);
gotStr = true;
return 'xyz';
},
endsWith: String.prototype.endsWith
};
var idx = {
valueOf: function () {
expect(gotStr).to.equal(true);
gotPos = true;
return 42;
}
};
myobj.endsWith('elephant', idx);
expect(gotPos).to.equal(true);
});
it('should coerce to a string', function () {
expect('abcd'.endsWith({ toString: function () { return 'cd'; } })).to.equal(true);
expect('abcd'.endsWith({ toString: function () { return 'foo'; } })).to.equal(false);
});
it('should not allow a regex', function () {
expect(function () { return 'abcd'.endsWith(/abc/); }).to['throw'](TypeError);
expect(function () { return 'abcd'.endsWith(new RegExp('abc')); }).to['throw'](TypeError);
});
it('should handle negative and zero endPositions properly', function () {
expect('abcd'.endsWith('bcd', 0)).to.equal(false);
expect('abcd'.endsWith('bcd', -2)).to.equal(false);
expect('abcd'.endsWith('b', -2)).to.equal(false);
expect('abcd'.endsWith('ab', -2)).to.equal(false);
expect('abc'.endsWith('bc', -43)).to.equal(false);
expect('abc'.endsWith('bc', -Infinity)).to.equal(false);
});
it('should handle large endPositions properly', function () {
expect('abc'.endsWith('a', 42)).to.equal(false);
expect('abc'.endsWith('bc', Infinity)).to.equal(true);
expect('abc'.endsWith('a', Infinity)).to.equal(false);
});
ifSymbolsDescribe('Symbol.match', function () {
if (!hasSymbols || !Symbol.match) {
return it('exists', function () {
expect(Symbol).to.have.property('match');
});
}
it('allows a regex with Symbol.match set to a falsy value', function () {
var re = /a/g;
re[Symbol.match] = false;
expect(function () { return 'abcd'.startsWith(re); }).not.to['throw']();
expect('abcd'.endsWith(re)).to.equal('abcd'.endsWith(String(re)));
});
});
});
describe('#includes()', function () {
if (!Object.prototype.hasOwnProperty.call(String.prototype, 'includes')) {
return it('exists', function () {
expect(String.prototype).to.have.property('includes');
});
}
ifFunctionsHaveNamesIt('has the right name', function () {
expect(String.prototype.includes).to.have.property('name', 'includes');
});
it('is not enumerable', function () {
expect(String.prototype).ownPropertyDescriptor('includes').to.have.property('enumerable', false);
});
it('has the right arity', function () {
// WebKit nightly had this bug, fixed in https://bugs.webkit.org/show_bug.cgi?id=143659
expect(String.prototype.includes).to.have.property('length', 1);
});
it('should throw a TypeError when called on null or undefined', function () {
testObjectCoercible('includes');
});
it('throws a TypeError when given a regex', function () {
expect(function () { 'foo'.includes(/a/g); }).to['throw'](TypeError);
});
it('should be truthy on correct results', function () {
expect('test'.includes('es')).to.equal(true);
expect('abc'.includes('a')).to.equal(true);
expect('abc'.includes('b')).to.equal(true);
expect('abc'.includes('abc')).to.equal(true);
expect('abc'.includes('bc')).to.equal(true);
expect('abc'.includes('d')).to.equal(false);
expect('abc'.includes('abcd')).to.equal(false);
expect('abc'.includes('ac')).to.equal(false);
expect('abc'.includes('abc', 0)).to.equal(true);
expect('abc'.includes('bc', 0)).to.equal(true);
expect('abc'.includes('de', 0)).to.equal(false);
expect('abc'.includes('bc', 1)).to.equal(true);
expect('abc'.includes('c', 1)).to.equal(true);
expect('abc'.includes('a', 1)).to.equal(false);
expect('abc'.includes('abc', 1)).to.equal(false);
expect('abc'.includes('c', 2)).to.equal(true);
expect('abc'.includes('d', 2)).to.equal(false);
expect('abc'.includes('dcd', 2)).to.equal(false);
expect('abc'.includes('ab', NaN)).to.equal(true);
expect('abc'.includes('cd', NaN)).to.equal(false);
var myobj = {
toString: function () { return 'abc'; },
includes: String.prototype.includes
};
expect(myobj.includes('abc')).to.equal(true);
expect(myobj.includes('cd')).to.equal(false);
var gotStr = false;
var gotPos = false;
myobj = {
toString: function () {
expect(gotPos).to.equal(false);
gotStr = true;
return 'xyz';
},
includes: String.prototype.includes
};
var idx = {
valueOf: function () {
expect(gotStr).to.equal(true);
gotPos = true;
return 42;
}
};
myobj.includes('elephant', idx);
expect(gotPos).to.equal(true);
});
it('should handle large positions', function () {
expect('abc'.includes('a', 42)).to.equal(false);
expect('abc'.includes('a', Infinity)).to.equal(false);
});
it('should handle negative positions', function () {
expect('abc'.includes('ab', -43)).to.equal(true);
expect('abc'.includes('cd', -42)).to.equal(false);
expect('abc'.includes('ab', -Infinity)).to.equal(true);
expect('abc'.includes('cd', -Infinity)).to.equal(false);
});
it('should be falsy on incorrect results', function () {
expect('test'.includes('1290')).to.equal(false);
});
ifSymbolsDescribe('Symbol.match', function () {
if (!hasSymbols || !Symbol.match) {
return it('exists', function () {
expect(Symbol).to.have.property('match');
});
}
it('allows a regex with Symbol.match set to a falsy value', function () {
var re = /a/g;
re[Symbol.match] = false;
expect(function () { return 'abcd'.includes(re); }).not.to['throw']();
expect('abcd'.includes(re)).to.equal('abcd'.includes(String(re)));
});
});
});
describe('.fromCodePoint()', function () {
if (!Object.prototype.hasOwnProperty.call(String, 'fromCodePoint')) {
return it('exists', function () {
expect(String).to.have.property('fromCodePoint');
});
}
ifFunctionsHaveNamesIt('has the right name', function () {
expect(String.fromCodePoint).to.have.property('name', 'fromCodePoint');
});
it('is not enumerable', function () {
expect(String).ownPropertyDescriptor('fromCodePoint').to.have.property('enumerable', false);
});
it('has the right arity', function () {
expect(String.fromCodePoint).to.have.property('length', 1);
});
it('throws a RangeError', function () {
var invalidValues = [
'abc',
{},
-1,
0x10FFFF + 1
];
invalidValues.forEach(function (value) {
expect(function () { return String.fromCodePoint(value); }).to['throw'](RangeError);
});
});
it('returns the empty string with no args', function () {
expect(String.fromCodePoint()).to.equal('');
});
it('works', function () {
var codePoints = [];
var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789…?!';
for (var i = 0; i < chars.length; ++i) {
codePoints.push(chars.charCodeAt(i));
expect(String.fromCodePoint(chars.charCodeAt(i))).to.equal(chars[i]);
}
expect(String.fromCodePoint.apply(String, codePoints)).to.equal(chars);
});
it('works with unicode', function () {
expect(String.fromCodePoint(0x2500)).to.equal('\u2500');
expect(String.fromCodePoint(0x010000)).to.equal('\ud800\udc00');
expect(String.fromCodePoint(0x10FFFF)).to.equal('\udbff\udfff');
});
});
describe('#codePointAt()', function () {
if (!Object.prototype.hasOwnProperty.call(String.prototype, 'codePointAt')) {
return it('exists', function () {
expect(String.prototype).to.have.property('codePointAt');
});
}
ifFunctionsHaveNamesIt('has the right name', function () {
expect(String.prototype.codePointAt).to.have.property('name', 'codePointAt');
});
it('is not enumerable', function () {
expect(String.prototype).ownPropertyDescriptor('codePointAt').to.have.property('enumerable', false);
});
it('has the right arity', function () {
expect(String.prototype.codePointAt).to.have.property('length', 1);
});
it('should throw a TypeError when called on null or undefined', function () {
testObjectCoercible('codePointAt');
});
it('should work', function () {
var str = 'abc';
expect(str.codePointAt(0)).to.equal(97);
expect(str.codePointAt(1)).to.equal(98);
expect(str.codePointAt(2)).to.equal(99);
});
it('should work with unicode', function () {
expect('\u2500'.codePointAt(0)).to.equal(0x2500);
expect('\ud800\udc00'.codePointAt(0)).to.equal(0x10000);
expect('\udbff\udfff'.codePointAt(0)).to.equal(0x10ffff);
expect('\ud800\udc00\udbff\udfff'.codePointAt(0)).to.equal(0x10000);
expect('\ud800\udc00\udbff\udfff'.codePointAt(1)).to.equal(0xdc00);
expect('\ud800\udc00\udbff\udfff'.codePointAt(2)).to.equal(0x10ffff);
expect('\ud800\udc00\udbff\udfff'.codePointAt(3)).to.equal(0xdfff);
});
it('should return undefined when pos is negative or too large', function () {
var str = 'abc';
expect(str.codePointAt(-1)).to.equal(undefined);
expect(str.codePointAt(str.length)).to.equal(undefined);
});
});
describe('#[Symbol.iterator]()', function () {
if (!Object.prototype.hasOwnProperty.call(Array, 'from')) {
return it('requires Array.from to test', function () {
expect(Array).to.have.property('from');
});
}
it('should work with plain strings', function () {
var str = 'abc';
expect(Array.from(str)).to.eql(['a', 'b', 'c']);
});
it('should work with surrogate characters', function () {
var str = '\u2500\ud800\udc00\udbff\udfff\ud800';
expect(Array.from(str)).to.eql(
['\u2500', '\ud800\udc00', '\udbff\udfff', '\ud800']
);
});
});
describe('.raw()', function () {
if (!Object.prototype.hasOwnProperty.call(String, 'raw')) {
return it('exists', function () {
expect(String).to.have.property('raw');
});
}
ifFunctionsHaveNamesIt('has the right name', function () {
expect(String.raw).to.have.property('name', 'raw');
});
it('is not enumerable', function () {
expect(String).ownPropertyDescriptor('raw').to.have.property('enumerable', false);
});
it('has the right arity', function () {
expect(String.raw).to.have.property('length', 1);
});
it('works with callSite.raw: Array', function () {
var callSite = {};
var str = 'The total is 10 ($11 with tax)';
callSite.raw = ['The total is ', ' ($', ' with tax)'];
expect(String.raw(callSite, 10, 11)).to.eql(str);
// eslint-disable-next-line no-template-curly-in-string
str = 'The total is {total} (${total * 1.01} with tax)';
callSite.raw = ['The total is ', ' ($', ' with tax)'];
expect(String.raw(callSite, '{total}', '{total * 1.01}')).to.eql(str);
});
it('works with callSite.raw: array-like object', function () {
var callSite = {};
var str = 'The total is 10 ($11 with tax)';
callSite.raw = { 0: 'The total is ', 1: ' ($', 2: ' with tax)', length: 3 };
expect(String.raw(callSite, 10, 11)).to.eql(str);
// eslint-disable-next-line no-template-curly-in-string
str = 'The total is {total} (${total * 1.01} with tax)';
callSite.raw = { 0: 'The total is ', 1: ' ($', 2: ' with tax)', length: 3 };
expect(String.raw(callSite, '{total}', '{total * 1.01}')).to.eql(str);
});
it('works with callSite.raw: empty Objects', function () {
var callSite = { raw: {} };
expect(String.raw(callSite, '{total}', '{total * 1.01}')).to.eql('');
expect(String.raw(callSite)).to.equal('');
});
it('ReturnIfAbrupt - Less Substitutions', function () {
var callSite = {
raw: { 0: 'The total is ', 1: ' ($', 2: ' with tax)', length: 3 }
};
var str = 'The total is 10 ($ with tax)';
expect(String.raw(callSite, 10)).to.equal(str);
});
});
describe('#trim()', function () {
if (!Object.prototype.hasOwnProperty.call(String.prototype, 'trim')) {
return it('exists', function () {
expect(String.prototype).to.have.property('trim');
});
}
ifFunctionsHaveNamesIt('has the right name', function () {
expect(String.prototype.trim).to.have.property('name', 'trim');
});
it('is not enumerable', function () {
expect(String.prototype).ownPropertyDescriptor('trim').to.have.property('enumerable', false);
});
it('has the right arity', function () {
expect(String.prototype.trim).to.have.property('length', 0);
});
it('should trim the correct characters', function () {
var whitespace = [
'\u0009',
'\u000b',
'\u000c',
'\u0020',
'\u00a0',
'\u1680',
'\u2000',
'\u2001',
'\u2002',
'\u2003',
'\u2004',
'\u2005',
'\u2006',
'\u2007',
'\u2008',
'\u2009',
'\u200A',
'\u202f',
'\u205f',
'\u3000'
].join('');
var lineTerminators = [
'\u000a',
'\u000d',
'\u2028',
'\u2029'
].join('');
var trimmed = (whitespace + lineTerminators).trim();
expect(trimmed).to.have.property('length', 0);
expect(trimmed).to.equal('');
});
it('should not trim U+0085', function () {
var trimmed = '\u0085'.trim();
expect(trimmed).to.have.property('length', 1);
expect(trimmed).to.equal('\u0085');
});
it('should trim on both sides', function () {
var trimmed = ' a '.trim();
expect(trimmed).to.have.property('length', 1);
expect(trimmed).to.equal('a');
});
});
describe('#search()', function () {
it('works with strings', function () {
expect('abc'.search('a')).to.equal(0);
expect('abc'.search('b')).to.equal(1);
expect('abc'.search('c')).to.equal(2);
expect('abc'.search('d')).to.equal(-1);
});
it('works with regexes', function () {
expect('abc'.search(/a/)).to.equal(0);
expect('abc'.search(/b/)).to.equal(1);
expect('abc'.search(/c/)).to.equal(2);
expect('abc'.search(/d/)).to.equal(-1);
});
ifSymbolsDescribe('Symbol.search', function () {
it('is a symbol', function () {
expect(typeof Symbol.search).to.equal('symbol');
});
if (!hasSymbols || typeof Symbol.search !== 'symbol') {
return;
}
it('is nonconfigurable', function () {
expect(Symbol).ownPropertyDescriptor('search').to.have.property('configurable', false);
});
it('is nonenumerable', function () {
expect(Symbol).ownPropertyDescriptor('search').to.have.property('enumerable', false);
});
it('is nonwritable', function () {
expect(Symbol).ownPropertyDescriptor('search').to.have.property('writable', false);
});
it('is respected', function () {
var str = Object('a');
var obj = {};
obj[Symbol.search] = function (string) { return string === str && this === obj; };
expect(str.search(obj)).to.equal(true);
});
});
});
describe('#replace()', function () {
it('works', function () {
expect('abcabc'.replace('c', 'd')).to.equal('abdabc');
expect('abcabc'.replace(/c/, 'd')).to.equal('abdabc');
expect('abcabc'.replace(/c/g, 'd')).to.equal('abdabd');
expect('abcabc'.replace(/C/ig, 'd')).to.equal('abdabd');
});
ifSymbolsDescribe('Symbol.replace', function () {
it('is a symbol', function () {
expect(typeof Symbol.replace).to.equal('symbol');
});
if (!hasSymbols || typeof Symbol.replace !== 'symbol') {
return;
}
it('is nonconfigurable', function () {
expect(Symbol).ownPropertyDescriptor('replace').to.have.property('configurable', false);
});
it('is nonenumerable', function () {
expect(Symbol).ownPropertyDescriptor('replace').to.have.property('enumerable', false);
});
it('is nonwritable', function () {
expect(Symbol).ownPropertyDescriptor('replace').to.have.property('writable', false);
});
it('respects Symbol.replace', function () {
var str = Object('a');
var replaceVal = Object('replaceValue');
var obj = {};
obj[Symbol.replace] = function (string, replaceValue) {
return string === str && replaceValue === replaceVal && this === obj;
};
expect(str.replace(obj, replaceVal)).to.equal(true);
});
});
});
describe('#split()', function () {
it('works', function () {
expect('abcabc'.split('b')).to.eql(['a', 'ca', 'c']);
expect('abcabc'.split('b', 2)).to.eql(['a', 'ca']);
expect('abcabc'.split(/b.?/)).to.eql(['a', 'a', '']);
expect('abcabc'.split(/b.?/, 2)).to.eql(['a', 'a']);
expect('abcabc'.split(/b/)).to.eql(['a', 'ca', 'c']);
expect('abcabc'.split(/b/, 2)).to.eql(['a', 'ca']);
expect('abcabc'.split(/b/g)).to.eql(['a', 'ca', 'c']);
expect('abcabc'.split(/b/g, 2)).to.eql(['a', 'ca']);
expect('abcabc'.split(/B/i)).to.eql(['a', 'ca', 'c']);
expect('abcabc'.split(/B/i, 2)).to.eql(['a', 'ca']);
expect('abcabc'.split(/B/gi)).to.eql(['a', 'ca', 'c']);
expect('abcabc'.split(/B/gi, 2)).to.eql(['a', 'ca']);
});
ifSymbolsDescribe('Symbol.split', function () {
it('is a symbol', function () {
expect(typeof Symbol.split).to.equal('symbol');
});
if (!hasSymbols || typeof Symbol.split !== 'symbol') {
return;
}
it('is nonconfigurable', function () {
expect(Symbol).ownPropertyDescriptor('split').to.have.property('configurable', false);
});
it('is nonenumerable', function () {
expect(Symbol).ownPropertyDescriptor('split').to.have.property('enumerable', false);
});
it('is nonwritable', function () {
expect(Symbol).ownPropertyDescriptor('split').to.have.property('writable', false);
});
it('respects Symbol.split', function () {
var str = Object('a');
var limitVal = Object(42);
var obj = {};
obj[Symbol.split] = function (string, limit) { return string === str && limit === limitVal && this === obj; };
expect(str.split(obj, limitVal)).to.equal(true);
});
});
});
describe('#match()', function () {
it('works with a string', function () {
var str = 'abca';
var match = str.match('a');
expect(match.index).to.equal(0);
expect(match.input).to.equal(str);
expect(Array.prototype.slice.call(match)).to.eql(['a']);
});
it('works with a regex', function () {
var str = 'abca';
var match = str.match(/a/);
expect(match.index).to.equal(0);
expect(match.input).to.equal(str);
expect(Array.prototype.slice.call(match)).to.eql(['a']);
});
ifSymbolsDescribe('Symbol.match', function () {
it('is a symbol', function () {
expect(typeof Symbol.match).to.equal('symbol');
});
if (!hasSymbols || typeof Symbol.match !== 'symbol') {
return;
}
it('is nonconfigurable', function () {
expect(Symbol).ownPropertyDescriptor('match').to.have.property('configurable', false);
});
it('is nonenumerable', function () {
expect(Symbol).ownPropertyDescriptor('match').to.have.property('enumerable', false);
});
it('is nonwritable', function () {
expect(Symbol).ownPropertyDescriptor('match').to.have.property('writable', false);
});
it('respects Symbol.match', function () {
var str = Object('a');
var obj = {};
obj[Symbol.match] = function (string) { return string === str && this === obj; };
expect(str.match(obj)).to.equal(true);
});
});
});
});
describe('Annex B', function () {
it('has #anchor', function () {
expect('foo'.anchor('bar"baz"')).to.equal('foo');
});
it('has #big', function () {
expect('foo'.big()).to.equal('foo');
});
it('has #blink', function () {
expect('foo'.blink()).to.equal('');
});
it('has #bold', function () {
expect('foo'.bold()).to.equal('foo');
});
it('has #fixed', function () {
expect('foo'.fixed()).to.equal('foo');
});
it('has #fontcolor', function () {
expect('foo'.fontcolor('blue"red"green')).to.equal('foo');
});
it('has #fontsize', function () {
expect('foo'.fontsize('10"large"small')).to.equal('foo');
});
it('has #italics', function () {
expect('foo'.italics()).to.equal('foo');
});
it('has #link', function () {
expect('foo'.link('url"http://"')).to.equal('foo');
});
it('has #small', function () {
expect('foo'.small()).to.equal('foo');
});
it('has #strike', function () {
expect('foo'.strike()).to.equal('foo');
});
it('has #sub', function () {
expect('foo'.sub()).to.equal('foo');
});
it('has #sup', function () {
expect('foo'.sup()).to.equal('foo');
});
});
};
describe('clean Object.prototype', function () {
return runStringTests.call(this, it);
});
describe('polluted Object.prototype', function () {
var shimmedIt = function () {
/* eslint-disable no-extend-native */
Object.prototype[1] = 42;
/* eslint-enable no-extend-native */
it.apply(this, arguments);
delete Object.prototype[1];
};
shimmedIt.skip = it.skip;
return runStringTests.call(this, shimmedIt);
});