ab847218f19312581630e56abb9e81b6b4595f0fe02655380546335c7d35b14806ac2715f23ac34982898f873b0c190ea7ff8de04e96b5de2a7e66dd19d75a 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. 'use strict';
  2. var hasOwn = require('hasown');
  3. var inspect = require('object-inspect');
  4. var supportsDescriptors = require('define-properties').supportsDescriptors;
  5. var v = require('es-value-fixtures');
  6. var forEach = require('for-each');
  7. var availableFlags = require('available-regexp-flags');
  8. var regexProperties = require('available-regexp-flags/properties');
  9. var sortedFlags = availableFlags.slice().sort(function (a, b) { return a.localeCompare(b); }).join('');
  10. var getRegexLiteral = function (stringRegex) {
  11. try {
  12. // eslint-disable-next-line no-new-func
  13. return Function('return ' + stringRegex + ';')();
  14. } catch (e) { /**/ }
  15. return null;
  16. };
  17. module.exports = function runTests(flags, t) {
  18. forEach(v.primitives, function (nonObject) {
  19. t['throws'](
  20. function () { flags(nonObject); },
  21. TypeError,
  22. 'throws when called with a non-object receiver: ' + inspect(nonObject)
  23. );
  24. });
  25. t.equal(flags(/a/g), 'g', 'flags(/a/g) !== "g"');
  26. t.equal(flags(/a/gmi), 'gim', 'flags(/a/gmi) !== "gim"');
  27. t.equal(flags(new RegExp('a', 'gmi')), 'gim', 'flags(new RegExp("a", "gmi")) !== "gim"');
  28. t.equal(flags(/a/), '', 'flags(/a/) !== ""');
  29. t.equal(flags(new RegExp('a')), '', 'flags(new RegExp("a")) !== ""');
  30. forEach(availableFlags, function (flag) {
  31. var property = regexProperties[flag];
  32. t.test(property + ' flag', function (st) {
  33. st.equal(flags(getRegexLiteral('/a/' + flag)), flag, 'flags(/a/' + flag + ') !== ' + inspect(flag));
  34. st.equal(flags(new RegExp('a', flag)), flag, 'flags(new RegExp("a", ' + inspect(flag) + ')) !== ' + inspect(flag));
  35. st.end();
  36. });
  37. });
  38. t.test('sorting', function (st) {
  39. st.equal(flags(/a/gim), 'gim', 'flags(/a/gim) !== "gim"');
  40. st.equal(flags(/a/mig), 'gim', 'flags(/a/mig) !== "gim"');
  41. st.equal(flags(/a/mgi), 'gim', 'flags(/a/mgi) !== "gim"');
  42. if (hasOwn(RegExp.prototype, 'sticky')) {
  43. st.equal(flags(getRegexLiteral('/a/gyim')), 'gimy', 'flags(/a/gyim) !== "gimy"');
  44. }
  45. if (hasOwn(RegExp.prototype, 'unicode')) {
  46. st.equal(flags(getRegexLiteral('/a/ugmi')), 'gimu', 'flags(/a/ugmi) !== "gimu"');
  47. }
  48. if (hasOwn(RegExp.prototype, 'dotAll')) {
  49. st.equal(flags(getRegexLiteral('/a/sgmi')), 'gims', 'flags(/a/sgmi) !== "gims"');
  50. }
  51. var randomFlags = availableFlags.slice().sort(function () { return Math.random() > 0.5 ? 1 : -1; }).join('').replace('v', '');
  52. st.equal(
  53. flags(getRegexLiteral('/a/' + randomFlags)),
  54. sortedFlags.replace('v', ''),
  55. 'random: flags(/a/' + randomFlags + ') === ' + inspect(sortedFlags)
  56. );
  57. st.end();
  58. });
  59. t.test('basic examples', function (st) {
  60. st.equal(flags(/a/g), 'g', '(/a/g).flags !== "g"');
  61. st.equal(flags(/a/gmi), 'gim', '(/a/gmi).flags !== "gim"');
  62. st.equal(flags(new RegExp('a', 'gmi')), 'gim', 'new RegExp("a", "gmi").flags !== "gim"');
  63. st.equal(flags(/a/), '', '(/a/).flags !== ""');
  64. st.equal(flags(new RegExp('a')), '', 'new RegExp("a").flags !== ""');
  65. st.end();
  66. });
  67. t.test('generic flags', function (st) {
  68. st.equal(flags({}), '');
  69. st.equal(flags({ ignoreCase: true }), 'i');
  70. st.equal(flags({ dotAll: 1, global: 0, sticky: 1, unicode: 1 }), 'suy');
  71. st.equal(flags({ __proto__: { multiline: true } }), 'm');
  72. var obj = {};
  73. forEach(availableFlags, function (flag) {
  74. if (flag !== 'v') {
  75. obj[regexProperties[flag]] = true;
  76. }
  77. });
  78. st.equal(flags(obj), sortedFlags.replace('v', ''), 'an object with every available flag: ' + sortedFlags);
  79. st.end();
  80. });
  81. t.test('getters', { skip: !supportsDescriptors }, function (st) {
  82. /* eslint getter-return: 0 */
  83. var calls = '';
  84. var re = {};
  85. Object.defineProperty(re, 'hasIndices', {
  86. get: function () {
  87. calls += 'd';
  88. }
  89. });
  90. Object.defineProperty(re, 'global', {
  91. get: function () {
  92. calls += 'g';
  93. }
  94. });
  95. Object.defineProperty(re, 'ignoreCase', {
  96. get: function () {
  97. calls += 'i';
  98. }
  99. });
  100. Object.defineProperty(re, 'multiline', {
  101. get: function () {
  102. calls += 'm';
  103. }
  104. });
  105. Object.defineProperty(re, 'dotAll', {
  106. get: function () {
  107. calls += 's';
  108. }
  109. });
  110. Object.defineProperty(re, 'unicode', {
  111. get: function () {
  112. calls += 'u';
  113. }
  114. });
  115. Object.defineProperty(re, 'sticky', {
  116. get: function () {
  117. calls += 'y';
  118. }
  119. });
  120. flags(re);
  121. st.equal(calls, 'dgimsuy', 'getters are called in expected order');
  122. st.end();
  123. });
  124. };