test('simple file operations, ignore', async () => {
		let request: IWatcherRequest = { basePath: testDir, ignored: ['**/b/**', '**/*.js', '.git/**'] };
		service.setRoots([request]);
		await wait(300);

		assert.equal(service.wacherCount, 1);

		// create various ignored files
		let file1 = path.join(bFolder, 'file1.txt'); // hidden
		await pfs.writeFile(file1, 'Hello');
		let file2 = path.join(b2Folder, 'file2.txt'); // hidden
		await pfs.writeFile(file2, 'Hello');
		let folder1 = path.join(bFolder, 'folder1'); // hidden
		await pfs.mkdirp(folder1);
		let folder2 = path.join(aFolder, 'b'); // hidden
		await pfs.mkdirp(folder2);
		let folder3 = path.join(testDir, '.git'); // hidden
		await pfs.mkdirp(folder3);
		let folder4 = path.join(testDir, '.git1');
		await pfs.mkdirp(folder4);
		let folder5 = path.join(aFolder, '.git');
		await pfs.mkdirp(folder5);
		let file3 = path.join(aFolder, 'file3.js'); // hidden
		await pfs.writeFile(file3, 'var x;');
		let file4 = path.join(aFolder, 'file4.txt');
		await pfs.writeFile(file4, 'Hello');
		await assertFileEvents(result, [{ path: file4, type: FileChangeType.ADDED }, { path: folder4, type: FileChangeType.ADDED }, { path: folder5, type: FileChangeType.ADDED }]);

		// move some files
		let movedFile1 = path.join(folder2, 'file1.txt'); // from ignored to ignored
		await pfs.rename(file1, movedFile1);
		let movedFile2 = path.join(aFolder, 'file2.txt'); // from ignored to visible
		await pfs.rename(file2, movedFile2);
		let movedFile3 = path.join(aFolder, 'file3.txt'); // from ignored file ext to visible
		await pfs.rename(file3, movedFile3);
		await assertFileEvents(result, [{ path: movedFile2, type: FileChangeType.ADDED }, { path: movedFile3, type: FileChangeType.ADDED }]);

		// delete all files
		await pfs.del(movedFile1); // hidden
		await pfs.del(movedFile2);
		await pfs.del(movedFile3);
		await pfs.del(folder1); // hidden
		await pfs.del(folder2); // hidden
		await pfs.del(folder3); // hidden
		await pfs.del(folder4);
		await pfs.del(folder5);
		await pfs.del(file4);
		await assertFileEvents(result, [{ path: movedFile2, type: FileChangeType.DELETED }, { path: movedFile3, type: FileChangeType.DELETED }, { path: file4, type: FileChangeType.DELETED }, { path: folder4, type: FileChangeType.DELETED }, { path: folder5, type: FileChangeType.DELETED }]);
	});
	test('simple file operations, nested roots', async () => {
		let request1: IWatcherRequest = { basePath: testDir, ignored: ['**/b2/**'] };
		let request2: IWatcherRequest = { basePath: bFolder, ignored: ['**/b3/**'] };
		service.setRoots([request1, request2]);
		await wait(300);

		assert.equal(service.wacherCount, 1);

		// create files
		let filePath1 = path.join(bFolder, 'file1.xml'); // visible by both
		await pfs.writeFile(filePath1, '');
		let filePath2 = path.join(b2Folder, 'file2.xml'); // filtered by root1, but visible by root2
		await pfs.writeFile(filePath2, '');
		let folderPath1 = path.join(b2Folder, 'b3'); // filtered
		await pfs.mkdirp(folderPath1);
		let filePath3 = path.join(folderPath1, 'file3.xml'); // filtered
		await pfs.writeFile(filePath3, '');

		await assertFileEvents(result, [{ path: filePath1, type: FileChangeType.ADDED }, { path: filePath2, type: FileChangeType.ADDED }]);

		let renamedFilePath2 = path.join(folderPath1, 'file2.xml');
		// move a file
		await pfs.rename(filePath2, renamedFilePath2);
		await assertFileEvents(result, [{ path: filePath2, type: FileChangeType.DELETED }]);

		// delete all
		await pfs.del(folderPath1);
		await pfs.del(filePath1);

		await assertFileEvents(result, [{ path: filePath1, type: FileChangeType.DELETED }]);
	});
	test('simple file operations, single root, no ignore', async () => {
		let request: IWatcherRequest = { basePath: testDir, ignored: [] };
		service.setRoots([request]);
		await wait(300);

		assert.equal(service.wacherCount, 1);

		// create a file
		let testFilePath = path.join(testDir, 'file.txt');
		await pfs.writeFile(testFilePath, '');
		await assertFileEvents(result, [{ path: testFilePath, type: FileChangeType.ADDED }]);

		// modify a file
		await pfs.writeFile(testFilePath, 'Hello');
		await assertFileEvents(result, [{ path: testFilePath, type: FileChangeType.UPDATED }]);

		// create a folder
		let testFolderPath = path.join(testDir, 'newFolder');
		await pfs.mkdirp(testFolderPath);
		// copy a file
		let copiedFilePath = path.join(testFolderPath, 'file2.txt');
		await pfs.copy(testFilePath, copiedFilePath);
		await assertFileEvents(result, [{ path: copiedFilePath, type: FileChangeType.ADDED }, { path: testFolderPath, type: FileChangeType.ADDED }]);

		// delete a file
		await pfs.del(copiedFilePath);
		let renamedFilePath = path.join(testFolderPath, 'file3.txt');
		// move a file
		await pfs.rename(testFilePath, renamedFilePath);
		await assertFileEvents(result, [{ path: copiedFilePath, type: FileChangeType.DELETED }, { path: testFilePath, type: FileChangeType.DELETED }, { path: renamedFilePath, type: FileChangeType.ADDED }]);

		// delete a folder
		await pfs.del(testFolderPath);
		await assertFileEvents(result, [{ path: testFolderPath, type: FileChangeType.DELETED }, { path: renamedFilePath, type: FileChangeType.DELETED }]);
	});