File: //usr/share/nodejs/fast-glob/out/utils/pattern.spec.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const util = require("./pattern");
describe('Utils → Pattern', () => {
describe('.isStaticPattern', () => {
it('should return true for static pattern', () => {
const actual = util.isStaticPattern('dir');
assert.ok(actual);
});
it('should return false for dynamic pattern', () => {
const actual = util.isStaticPattern('*');
assert.ok(!actual);
});
});
describe('.isDynamicPattern', () => {
describe('Without options', () => {
it('should return false for an empty string', () => {
assert.ok(!util.isDynamicPattern(''));
});
it('should return true for patterns that include the escape symbol', () => {
assert.ok(util.isDynamicPattern('\\'));
});
it('should return true for everything when the `caseSensitiveMatch` option is disabled', () => {
assert.ok(util.isDynamicPattern('abc', { caseSensitiveMatch: false }));
});
it('should return true for patterns that include common glob symbols', () => {
assert.ok(util.isDynamicPattern('*'));
assert.ok(util.isDynamicPattern('abc/*'));
assert.ok(util.isDynamicPattern('?'));
assert.ok(util.isDynamicPattern('abc/?'));
assert.ok(util.isDynamicPattern('!abc'));
});
it('should return true for patterns that include regex group symbols', () => {
assert.ok(util.isDynamicPattern('(a|)'));
assert.ok(util.isDynamicPattern('(a|b)'));
assert.ok(util.isDynamicPattern('abc/(a|b)'));
});
it('should return true for patterns that include regex character class symbols', () => {
assert.ok(util.isDynamicPattern('[abc]'));
assert.ok(util.isDynamicPattern('abc/[abc]'));
assert.ok(util.isDynamicPattern('[^abc]'));
assert.ok(util.isDynamicPattern('abc/[^abc]'));
assert.ok(util.isDynamicPattern('[1-3]'));
assert.ok(util.isDynamicPattern('abc/[1-3]'));
assert.ok(util.isDynamicPattern('[[:alpha:][:digit:]]'));
assert.ok(util.isDynamicPattern('abc/[[:alpha:][:digit:]]'));
});
it('should return true for patterns that include glob extension symbols', () => {
assert.ok(util.isDynamicPattern('@()'));
assert.ok(util.isDynamicPattern('@(a)'));
assert.ok(util.isDynamicPattern('@(a|b)'));
assert.ok(util.isDynamicPattern('abc/!(a|b)'));
assert.ok(util.isDynamicPattern('*(a|b)'));
assert.ok(util.isDynamicPattern('?(a|b)'));
assert.ok(util.isDynamicPattern('+(a|b)'));
});
it('should return false for glob extension when the `extglob` option is disabled', () => {
assert.ok(!util.isDynamicPattern('@()', { extglob: false }));
assert.ok(!util.isDynamicPattern('@(a)', { extglob: false }));
assert.ok(!util.isDynamicPattern('@(a|b)', { extglob: false }));
assert.ok(!util.isDynamicPattern('abc/!(a|b)', { extglob: false }));
assert.ok(util.isDynamicPattern('*(a|b)', { extglob: true }));
assert.ok(util.isDynamicPattern('?(a|b)', { extglob: true }));
assert.ok(!util.isDynamicPattern('+(a|b)', { extglob: false }));
});
it('should return true for patterns that include brace expansions symbols', () => {
assert.ok(util.isDynamicPattern('{,}'));
assert.ok(util.isDynamicPattern('{a,}'));
assert.ok(util.isDynamicPattern('{,b}'));
assert.ok(util.isDynamicPattern('{a,b}'));
assert.ok(util.isDynamicPattern('{1..3}'));
});
it('should return false for brace extension when the `braceExpansion` option is disabled', () => {
assert.ok(!util.isDynamicPattern('{,}', { braceExpansion: false }));
assert.ok(!util.isDynamicPattern('{a,}', { braceExpansion: false }));
assert.ok(!util.isDynamicPattern('{,b}', { braceExpansion: false }));
assert.ok(!util.isDynamicPattern('{a,b}', { braceExpansion: false }));
assert.ok(!util.isDynamicPattern('{1..3}', { braceExpansion: false }));
});
it('should return false for "!" symbols when a symbol is not specified first in the string', () => {
assert.ok(!util.isDynamicPattern('abc!'));
});
it('should return false for a completely static pattern', () => {
assert.ok(!util.isDynamicPattern(''));
assert.ok(!util.isDynamicPattern('.'));
assert.ok(!util.isDynamicPattern('abc'));
assert.ok(!util.isDynamicPattern('~abc'));
assert.ok(!util.isDynamicPattern('~/abc'));
assert.ok(!util.isDynamicPattern('+~/abc'));
assert.ok(!util.isDynamicPattern('@.(abc)'));
assert.ok(!util.isDynamicPattern('(a b)'));
assert.ok(!util.isDynamicPattern('(a b)'));
assert.ok(!util.isDynamicPattern('[abc'));
});
it('should return false for unfinished regex character class', () => {
assert.ok(!util.isDynamicPattern('['));
assert.ok(!util.isDynamicPattern('[abc'));
});
it('should return false for unfinished regex group', () => {
assert.ok(!util.isDynamicPattern('(a|b'));
assert.ok(!util.isDynamicPattern('abc/(a|b'));
});
it('should return false for unfinished glob extension', () => {
assert.ok(!util.isDynamicPattern('@('));
assert.ok(!util.isDynamicPattern('@(a'));
assert.ok(!util.isDynamicPattern('@(a|'));
assert.ok(!util.isDynamicPattern('@(a|b'));
});
it('should return false for unfinished brace expansions', () => {
assert.ok(!util.isDynamicPattern('{'));
assert.ok(!util.isDynamicPattern('{a'));
assert.ok(!util.isDynamicPattern('{,'));
assert.ok(!util.isDynamicPattern('{a,'));
assert.ok(!util.isDynamicPattern('{a,b'));
});
});
describe('With options', () => {
it('should return true for patterns that include "*?" symbols even when the "extglob" option is disabled', () => {
assert.ok(util.isDynamicPattern('*(a|b)', { extglob: false }));
assert.ok(util.isDynamicPattern('?(a|b)', { extglob: false }));
});
it('should return true when the "caseSensitiveMatch" option is enabled', () => {
assert.ok(util.isDynamicPattern('a', { caseSensitiveMatch: false }));
});
it('should return false for glob extension when the "extglob" option is disabled', () => {
assert.ok(!util.isDynamicPattern('@(a|b)', { extglob: false }));
assert.ok(!util.isDynamicPattern('abc/!(a|b)', { extglob: false }));
assert.ok(!util.isDynamicPattern('+(a|b)', { extglob: false }));
});
it('should return false for brace expansions when the "braceExpansion" option is disabled', () => {
assert.ok(!util.isDynamicPattern('{a,b}', { braceExpansion: false }));
assert.ok(!util.isDynamicPattern('{1..3}', { braceExpansion: false }));
});
});
});
describe('.convertToPositivePattern', () => {
it('should returns converted positive pattern', () => {
const expected = '*.js';
const actual = util.convertToPositivePattern('!*.js');
assert.strictEqual(actual, expected);
});
it('should returns pattern without changes', () => {
const expected = '*.js';
const actual = util.convertToPositivePattern('*.js');
assert.strictEqual(actual, expected);
});
});
describe('.convertToNegativePattern', () => {
it('should returns converted negative pattern', () => {
const expected = '!*.js';
const actual = util.convertToNegativePattern('*.js');
assert.strictEqual(actual, expected);
});
});
describe('.isNegativePattern', () => {
it('should returns true', () => {
const actual = util.isNegativePattern('!*.md');
assert.ok(actual);
});
it('should returns false', () => {
const actual = util.isNegativePattern('*.md');
assert.ok(!actual);
});
it('should returns false for extglob', () => {
const actual = util.isNegativePattern('!(a|b|c)');
assert.ok(!actual);
});
});
describe('.isPositivePattern', () => {
it('should returns true', () => {
const actual = util.isPositivePattern('*.md');
assert.ok(actual);
});
it('should returns false', () => {
const actual = util.isPositivePattern('!*.md');
assert.ok(!actual);
});
});
describe('.getNegativePatterns', () => {
it('should returns only negative patterns', () => {
const expected = ['!*.spec.js'];
const actual = util.getNegativePatterns(['*.js', '!*.spec.js', '*.ts']);
assert.deepStrictEqual(actual, expected);
});
it('should returns empty array', () => {
const expected = [];
const actual = util.getNegativePatterns(['*.js', '*.ts']);
assert.deepStrictEqual(actual, expected);
});
});
describe('.getPositivePatterns', () => {
it('should returns only positive patterns', () => {
const expected = ['*.js', '*.ts'];
const actual = util.getPositivePatterns(['*.js', '!*.spec.js', '*.ts']);
assert.deepStrictEqual(actual, expected);
});
it('should returns empty array', () => {
const expected = [];
const actual = util.getPositivePatterns(['!*.js', '!*.ts']);
assert.deepStrictEqual(actual, expected);
});
});
describe('.getBaseDirectory', () => {
it('should returns base directory', () => {
const expected = 'root';
const actual = util.getBaseDirectory('root/*.js');
assert.strictEqual(actual, expected);
});
it('should returns base directory without slash transformation', () => {
const expected = '.';
const actual = util.getBaseDirectory('file-\\(suffix\\).md');
assert.strictEqual(actual, expected);
});
});
describe('.hasGlobStar', () => {
it('should returns true for pattern that includes globstar', () => {
const actual = util.hasGlobStar('**/*.js');
assert.ok(actual);
});
it('should returns false for pattern that has no globstar', () => {
const actual = util.hasGlobStar('*.js');
assert.ok(!actual);
});
});
describe('.endsWithSlashGlobStar', () => {
it('should returns true for pattern that ends with slash and globstar', () => {
const actual = util.endsWithSlashGlobStar('name/**');
assert.ok(actual);
});
it('should returns false for pattern that has no slash, but ends with globstar', () => {
const actual = util.endsWithSlashGlobStar('**');
assert.ok(!actual);
});
it('should returns false for pattern that does not ends with globstar', () => {
const actual = util.endsWithSlashGlobStar('name/**/*');
assert.ok(!actual);
});
});
describe('.isAffectDepthOfReadingPattern', () => {
it('should return true for pattern that ends with slash and globstar', () => {
const actual = util.isAffectDepthOfReadingPattern('name/**');
assert.ok(actual);
});
it('should return true for pattern when the last partial of the pattern is static pattern', () => {
const actual = util.isAffectDepthOfReadingPattern('**/name');
assert.ok(actual);
});
it('should return false', () => {
const actual = util.isAffectDepthOfReadingPattern('**/name/*');
assert.ok(!actual);
});
});
describe('.expandPatternsWithBraceExpansion', () => {
it('should return an array of expanded patterns with brace expansion', () => {
const expected = ['a/b/d', 'a/c/d', 'a/*', 'a/b/c'];
const actual = util.expandPatternsWithBraceExpansion(['a/{b,c}/d', 'a/{*,b/c}']);
assert.deepStrictEqual(actual, expected);
});
});
describe('.expandBraceExpansion', () => {
it('should return an array of expanded patterns with brace expansion without dupes', () => {
const expected = ['a/b', 'a/c/d', 'a/c'];
const actual = util.expandBraceExpansion('a/{b,c/d,{b,c}}');
assert.deepStrictEqual(actual, expected);
});
});
describe('.getPatternParts', () => {
it('should return an array with a single item when the pattern is an empty string', () => {
const expected = [''];
const actual = util.getPatternParts('', {});
assert.deepStrictEqual(actual, expected);
});
it('should return an array with a single item (micromatch/picomatch#58)', () => {
const expected = ['a*'];
const actual = util.getPatternParts('a*', {});
assert.deepStrictEqual(actual, expected);
});
it('should return the correct set of parts for the pattern with a forward slash (micromatch/picomatch#58)', () => {
const expected = ['', 'lib', '*'];
const actual = util.getPatternParts('/lib/*', {});
assert.deepStrictEqual(actual, expected);
});
it('should return an array of pattern parts', () => {
const expected = ['a', '*', 'b', '**', 'c'];
const actual = util.getPatternParts('a/*/b/**/c', {});
assert.deepStrictEqual(actual, expected);
});
});
describe('.makeRe', () => {
it('should return regexp for provided pattern', () => {
const actual = util.makeRe('*.js', {});
assert.ok(actual instanceof RegExp);
});
});
describe('.convertPatternsToRe', () => {
it('should return regexps for provided patterns', () => {
const [actual] = util.convertPatternsToRe(['*.js'], {});
assert.ok(actual instanceof RegExp);
});
});
describe('.matchAny', () => {
it('should return true', () => {
const actual = util.matchAny('fixtures/nested/file.txt', [/fixture/, /fixtures\/nested\/file/]);
assert.ok(actual);
});
it('should return false', () => {
const actual = util.matchAny('fixtures/directory', [/fixtures\/file/]);
assert.ok(!actual);
});
});
});