'use strict';
|
|
var has = require('has');
|
var inspect = require('object-inspect');
|
var supportsDescriptors = require('define-properties').supportsDescriptors;
|
|
var forEach = require('foreach');
|
var availableFlags = require('available-regexp-flags');
|
var regexProperties = require('available-regexp-flags/properties');
|
|
var sortedFlags = availableFlags.slice().sort(function (a, b) { return a.localeCompare(b); }).join('');
|
|
var getRegexLiteral = function (stringRegex) {
|
try {
|
// eslint-disable-next-line no-new-func
|
return Function('return ' + stringRegex + ';')();
|
} catch (e) { /**/ }
|
return null;
|
};
|
|
module.exports = function runTests(flags, t) {
|
t.equal(flags(/a/g), 'g', 'flags(/a/g) !== "g"');
|
t.equal(flags(/a/gmi), 'gim', 'flags(/a/gmi) !== "gim"');
|
t.equal(flags(new RegExp('a', 'gmi')), 'gim', 'flags(new RegExp("a", "gmi")) !== "gim"');
|
t.equal(flags(/a/), '', 'flags(/a/) !== ""');
|
t.equal(flags(new RegExp('a')), '', 'flags(new RegExp("a")) !== ""');
|
|
forEach(availableFlags, function (flag) {
|
var property = regexProperties[flag];
|
t.test(property + ' flag', function (st) {
|
st.equal(flags(getRegexLiteral('/a/' + flag)), flag, 'flags(/a/' + flag + ') !== ' + inspect(flag));
|
st.equal(flags(new RegExp('a', flag)), flag, 'flags(new RegExp("a", ' + inspect(flag) + ')) !== ' + inspect(flag));
|
st.end();
|
});
|
});
|
|
t.test('sorting', function (st) {
|
st.equal(flags(/a/gim), 'gim', 'flags(/a/gim) !== "gim"');
|
st.equal(flags(/a/mig), 'gim', 'flags(/a/mig) !== "gim"');
|
st.equal(flags(/a/mgi), 'gim', 'flags(/a/mgi) !== "gim"');
|
if (has(RegExp.prototype, 'sticky')) {
|
st.equal(flags(getRegexLiteral('/a/gyim')), 'gimy', 'flags(/a/gyim) !== "gimy"');
|
}
|
if (has(RegExp.prototype, 'unicode')) {
|
st.equal(flags(getRegexLiteral('/a/ugmi')), 'gimu', 'flags(/a/ugmi) !== "gimu"');
|
}
|
if (has(RegExp.prototype, 'dotAll')) {
|
st.equal(flags(getRegexLiteral('/a/sgmi')), 'gims', 'flags(/a/sgmi) !== "gims"');
|
}
|
|
var randomFlags = availableFlags.slice().sort(function () { return Math.random() > 0.5 ? 1 : -1; }).join('');
|
st.equal(
|
flags(getRegexLiteral('/a/' + randomFlags)),
|
sortedFlags,
|
'random: flags(/a/' + randomFlags + ') === ' + inspect(sortedFlags)
|
);
|
|
st.end();
|
});
|
|
t.test('basic examples', function (st) {
|
st.equal(flags(/a/g), 'g', '(/a/g).flags !== "g"');
|
st.equal(flags(/a/gmi), 'gim', '(/a/gmi).flags !== "gim"');
|
st.equal(flags(new RegExp('a', 'gmi')), 'gim', 'new RegExp("a", "gmi").flags !== "gim"');
|
st.equal(flags(/a/), '', '(/a/).flags !== ""');
|
st.equal(flags(new RegExp('a')), '', 'new RegExp("a").flags !== ""');
|
|
st.end();
|
});
|
|
t.test('generic flags', function (st) {
|
st.equal(flags({}), '');
|
st.equal(flags({ ignoreCase: true }), 'i');
|
st.equal(flags({ dotAll: 1, global: 0, sticky: 1, unicode: 1 }), 'suy');
|
st.equal(flags({ __proto__: { multiline: true } }), 'm');
|
|
var obj = {};
|
forEach(availableFlags, function (flag) {
|
obj[regexProperties[flag]] = true;
|
});
|
st.equal(flags(obj), sortedFlags, 'an object with every available flag: ' + sortedFlags);
|
|
st.end();
|
});
|
|
t.test('throws properly', function (st) {
|
var nonObjects = ['', false, true, 42, NaN, null, undefined];
|
st.plan(nonObjects.length);
|
var throwsOnNonObject = function (nonObject) {
|
st['throws'](flags.bind(null, nonObject), TypeError, inspect(nonObject) + ' is not an Object');
|
};
|
nonObjects.forEach(throwsOnNonObject);
|
});
|
|
t.test('getters', { skip: !supportsDescriptors }, function (st) {
|
/* eslint getter-return: 0 */
|
var calls = '';
|
var re = {};
|
Object.defineProperty(re, 'hasIndices', {
|
get: function () {
|
calls += 'd';
|
}
|
});
|
Object.defineProperty(re, 'global', {
|
get: function () {
|
calls += 'g';
|
}
|
});
|
Object.defineProperty(re, 'ignoreCase', {
|
get: function () {
|
calls += 'i';
|
}
|
});
|
Object.defineProperty(re, 'multiline', {
|
get: function () {
|
calls += 'm';
|
}
|
});
|
Object.defineProperty(re, 'dotAll', {
|
get: function () {
|
calls += 's';
|
}
|
});
|
Object.defineProperty(re, 'unicode', {
|
get: function () {
|
calls += 'u';
|
}
|
});
|
Object.defineProperty(re, 'sticky', {
|
get: function () {
|
calls += 'y';
|
}
|
});
|
|
flags(re);
|
|
st.equal(calls, 'dgimsuy', 'getters are called in expected order');
|
|
st.end();
|
});
|
};
|