diff --git a/src/vs/workbench/services/search/test/node/fixtures/more/file.txt b/src/vs/workbench/services/search/test/node/fixtures/more/file.txt index e69de29bb2d..c4d0bf153e4 100644 --- a/src/vs/workbench/services/search/test/node/fixtures/more/file.txt +++ b/src/vs/workbench/services/search/test/node/fixtures/more/file.txt @@ -0,0 +1 @@ +Conway \ No newline at end of file diff --git a/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts b/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts index e95e8930f8c..19b60d672d5 100644 --- a/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts +++ b/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts @@ -8,6 +8,7 @@ import path = require('path'); import assert = require('assert'); +import * as glob from 'vs/base/common/glob'; import { TPromise } from 'vs/base/common/winjs.base'; import { FileWalker } from 'vs/workbench/services/search/node/fileSearch'; import { ISerializedFileMatch, IRawSearch, IFolderSearch } from 'vs/workbench/services/search/node/search'; @@ -19,12 +20,18 @@ function countAll(matches: ISerializedFileMatch[]): number { return matches.reduce((acc, m) => acc + m.numMatches, 0); } -const TEST_ROOT_FOLDER = path.normalize(require.toUrl('./fixtures')); -function rootFolderQueries(): IFolderSearch[] { - return [ - { folder: TEST_ROOT_FOLDER } - ]; -} +const TEST_FIXTURES = path.normalize(require.toUrl('./fixtures')); +const EXAMPLES_FIXTURES = path.join(TEST_FIXTURES, 'examples'); +const MORE_FIXTURES = path.join(TEST_FIXTURES, 'more'); +const TEST_ROOT_FOLDER: IFolderSearch = { folder: TEST_FIXTURES }; +const ROOT_FOLDER_QUERY: IFolderSearch[] = [ + TEST_ROOT_FOLDER +]; + +const MULTIROOT_QUERIES: IFolderSearch[] = [ + { folder: EXAMPLES_FIXTURES }, + { folder: MORE_FIXTURES } +]; const textSearchWorkerProvider = new TextSearchWorkerProvider(); @@ -86,25 +93,21 @@ function doSearchTest(config: IRawSearch, expectedResultCount: number, done) { .then(done, done); } -suite('Search-integration', () => { - test('Text: GameOfLife', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test +suite('Search-integration', function () { + this.timeout(1000 * 60); // increase timeout for this suite - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.js', - contentPattern: { pattern: 'GameOfLife', modifiers: 'i' }, + test('Text: GameOfLife', function (done: () => void) { + const config = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: 'GameOfLife' }, }; doSearchTest(config, 4, done); }); test('Text: GameOfLife (RegExp)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.js', + const config = { + folderQueries: ROOT_FOLDER_QUERY, contentPattern: { pattern: 'Game.?fL\\w?fe', isRegExp: true } }; @@ -112,11 +115,8 @@ suite('Search-integration', () => { }); test('Text: GameOfLife (RegExp to EOL)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.js', + const config = { + folderQueries: ROOT_FOLDER_QUERY, contentPattern: { pattern: 'GameOfLife.*', isRegExp: true } }; @@ -124,11 +124,8 @@ suite('Search-integration', () => { }); test('Text: GameOfLife (Word Match, Case Sensitive)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.js', + const config = { + folderQueries: ROOT_FOLDER_QUERY, contentPattern: { pattern: 'GameOfLife', isWordMatch: true, isCaseSensitive: true } }; @@ -136,11 +133,8 @@ suite('Search-integration', () => { }); test('Text: GameOfLife (Word Match, Spaces)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.js', + const config = { + folderQueries: ROOT_FOLDER_QUERY, contentPattern: { pattern: ' GameOfLife ', isWordMatch: true } }; @@ -148,11 +142,8 @@ suite('Search-integration', () => { }); test('Text: GameOfLife (Word Match, Punctuation and Spaces)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.js', + const config = { + folderQueries: ROOT_FOLDER_QUERY, contentPattern: { pattern: ', as =', isWordMatch: true } }; @@ -160,36 +151,27 @@ suite('Search-integration', () => { }); test('Text: Helvetica (UTF 16)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.css', - contentPattern: { pattern: 'Helvetica', modifiers: 'i' } + const config = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: 'Helvetica' } }; doSearchTest(config, 3, done); }); test('Text: e', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.*', - contentPattern: { pattern: 'e', modifiers: 'i' } + const config = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: 'e' } }; doSearchTest(config, 776, done); }); test('Text: e (with excludes)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config: any = { - folderQueries: rootFolderQueries(), - filePattern: '*.*', - contentPattern: { pattern: 'e', modifiers: 'i' }, + const config: any = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: 'e' }, excludePattern: { '**/examples': true } }; @@ -197,12 +179,9 @@ suite('Search-integration', () => { }); test('Text: e (with includes)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config: any = { - folderQueries: rootFolderQueries(), - filePattern: '*.*', - contentPattern: { pattern: 'e', modifiers: 'i' }, + const config: any = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: 'e' }, includePattern: { '**/examples/**': true } }; @@ -210,12 +189,9 @@ suite('Search-integration', () => { }); test('Text: e (with includes and exclude)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config: any = { - folderQueries: rootFolderQueries(), - filePattern: '*.*', - contentPattern: { pattern: 'e', modifiers: 'i' }, + const config: any = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: 'e' }, includePattern: { '**/examples/**': true }, excludePattern: { '**/examples/small.js': true } }; @@ -224,13 +200,10 @@ suite('Search-integration', () => { }); test('Text: a (capped)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - const maxResults = 520; - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.*', - contentPattern: { pattern: 'a', modifiers: 'i' }, + const config = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: 'a' }, maxResults }; @@ -242,26 +215,65 @@ suite('Search-integration', () => { }); test('Text: a (no results)', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.*', - contentPattern: { pattern: 'ahsogehtdas', modifiers: 'i' } + const config = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: 'ahsogehtdas' } }; doSearchTest(config, 0, done); }); test('Text: -size', function (done: () => void) { - this.timeout(1000 * 60); // increase timeout for this one test - - let config = { - folderQueries: rootFolderQueries(), - filePattern: '*.css', - contentPattern: { pattern: '-size', modifiers: 'i' } + const config = { + folderQueries: ROOT_FOLDER_QUERY, + contentPattern: { pattern: '-size' } }; doSearchTest(config, 9, done); }); -}); \ No newline at end of file + + test('Multiroot: Conway', function (done: () => void) { + const config: IRawSearch = { + folderQueries: MULTIROOT_QUERIES, + contentPattern: { pattern: 'conway' } + }; + + doSearchTest(config, 8, done); + }); + + test('Multiroot: e with partial global exclude', function (done: () => void) { + const config: IRawSearch = { + folderQueries: MULTIROOT_QUERIES, + contentPattern: { pattern: 'e' }, + excludePattern: makeExpression('**/*.txt') + }; + + doSearchTest(config, 382, done); + }); + + test('Multiroot: e with global excludes', function (done: () => void) { + const config: IRawSearch = { + folderQueries: MULTIROOT_QUERIES, + contentPattern: { pattern: 'e' }, + excludePattern: makeExpression('**/*.txt', '**/*.js') + }; + + doSearchTest(config, 0, done); + }); + + test('Multiroot: e with folder exclude', function (done: () => void) { + const config: IRawSearch = { + folderQueries: [ + { folder: EXAMPLES_FIXTURES, excludePattern: makeExpression('**/e*.js') }, + { folder: MORE_FIXTURES } + ], + contentPattern: { pattern: 'e' } + }; + + doSearchTest(config, 286, done); + }); +}); + +function makeExpression(...patterns: string[]): glob.IExpression { + return patterns.reduce((glob, cur) => { glob[cur] = true; return glob; }, Object.create(null)); +} \ No newline at end of file