123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937 |
- 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 template.raw: Array', function () {
- var template = {};
- var str = 'The total is 10 ($11 with tax)';
- template.raw = ['The total is ', ' ($', ' with tax)'];
- expect(String.raw(template, 10, 11)).to.eql(str);
- // eslint-disable-next-line no-template-curly-in-string
- str = 'The total is {total} (${total * 1.01} with tax)';
- template.raw = ['The total is ', ' ($', ' with tax)'];
- expect(String.raw(template, '{total}', '{total * 1.01}')).to.eql(str);
- });
- it('works with template.raw: array-like object', function () {
- var template = {};
- var str = 'The total is 10 ($11 with tax)';
- template.raw = { 0: 'The total is ', 1: ' ($', 2: ' with tax)', length: 3 };
- expect(String.raw(template, 10, 11)).to.eql(str);
- // eslint-disable-next-line no-template-curly-in-string
- str = 'The total is {total} (${total * 1.01} with tax)';
- template.raw = { 0: 'The total is ', 1: ' ($', 2: ' with tax)', length: 3 };
- expect(String.raw(template, '{total}', '{total * 1.01}')).to.eql(str);
- });
- it('works with template.raw: empty Objects', function () {
- var template = { raw: {} };
- expect(String.raw(template, '{total}', '{total * 1.01}')).to.eql('');
- expect(String.raw(template)).to.equal('');
- });
- it('ReturnIfAbrupt - Less Substitutions', function () {
- var template = {
- raw: { 0: 'The total is ', 1: ' ($', 2: ' with tax)', length: 3 }
- };
- var str = 'The total is 10 ($ with tax)';
- expect(String.raw(template, 10)).to.equal(str);
- });
- ifSymbolsDescribe('Symbol substitutions', function () {
- it('throws', function () {
- var template = {
- raw: { 0: 'The total is ', 1: ' ($', 2: ' with tax)', length: 3 }
- };
- var str = 'The total is 10 ($ with tax)';
- expect(function () { String.raw(template, Symbol()); }).to['throw'](TypeError);
- });
- });
- });
- 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('<a name="bar"baz"">foo</a>');
- });
- it('has #big', function () {
- expect('foo'.big()).to.equal('<big>foo</big>');
- });
- it('has #blink', function () {
- expect('foo'.blink()).to.equal('<blink>foo</blink>');
- });
- it('has #bold', function () {
- expect('foo'.bold()).to.equal('<b>foo</b>');
- });
- it('has #fixed', function () {
- expect('foo'.fixed()).to.equal('<tt>foo</tt>');
- });
- it('has #fontcolor', function () {
- expect('foo'.fontcolor('blue"red"green')).to.equal('<font color="blue"red"green">foo</font>');
- });
- it('has #fontsize', function () {
- expect('foo'.fontsize('10"large"small')).to.equal('<font size="10"large"small">foo</font>');
- });
- it('has #italics', function () {
- expect('foo'.italics()).to.equal('<i>foo</i>');
- });
- it('has #link', function () {
- expect('foo'.link('url"http://"')).to.equal('<a href="url"http://"">foo</a>');
- });
- it('has #small', function () {
- expect('foo'.small()).to.equal('<small>foo</small>');
- });
- it('has #strike', function () {
- expect('foo'.strike()).to.equal('<strike>foo</strike>');
- });
- it('has #sub', function () {
- expect('foo'.sub()).to.equal('<sub>foo</sub>');
- });
- it('has #sup', function () {
- expect('foo'.sup()).to.equal('<sup>foo</sup>');
- });
- });
- };
- 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);
- });
|