import {test, withFixture} from './helpers/watch.js'; test('waits for changes', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1() { await this.assertIdle(); this.done(); }, }); }); test('watcher can be configured to ignore files', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1() { await this.assertIdle(async () => { await this.touch('ignored-by-watcher.js'); }); this.done(); }, }); }); test('new, empty directories are ignored', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1() { await this.assertIdle(async () => { await this.mkdir('empty-directory'); }); this.done(); }, }); }); test('runs test files that depend on the changed file', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1() { await this.touch('source.js'); }, async 2({stats}) { t.deepEqual(stats.passed, [{file: 'source.test.js', title: 'source'}]); this.done(); }, }); }); test('runs all test files if a file is changed that is not depended on', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1({stats}) { await this.touch('not-depended-on.js'); return stats.passed; }, async 2({stats}, previousPassed) { t.deepEqual(stats.passed, previousPassed); this.done(); }, }); }); test('runs all test files if a new file is added', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1({stats}) { await this.write('new-file.js'); return stats.passed; }, async 2({stats}, previousPassed) { t.deepEqual(stats.passed, previousPassed); this.done(); }, }); }); test('does not run deleted test file, even if source it previously depended on is changed', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1() { await this.assertIdle(async () => { await this.rm('source.test.js'); await this.touch('source.js'); }); this.done(); }, }); }); test('runs test file when source it depends on is deleted', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1() { await this.rm('source.js'); }, async 2({stats}) { t.is(stats.passed.length, 0); t.is(stats.uncaughtExceptions.length, 1); t.regex(stats.uncaughtExceptions[0].message, /Cannot find module.+source\.js.+imported from.+source\.test\.js/); this.done(); }, }); }); test('once test files containing .only() tests are encountered, always run those, but exclusively the .only tests', withFixture('exclusive'), async (t, fixture) => { await fixture.watch({ async 1({stats}) { t.is(stats.failed.length, 2); t.is(stats.passed.length, 3); const contents = await this.read('a.test.js'); await this.write('a.test.js', contents.replace('test(\'pass', 'test.only(\'pass')); return stats.passed.filter(({file}) => file !== 'c.test.js'); }, async 2({stats}, passed) { t.is(stats.failed.length, 0); t.is(stats.passed.length, 2); t.deepEqual(stats.passed, passed); this.done(); }, }); }); test('filters test files', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1({stats}) { t.false(stats.passed.some(({file}) => file === 'test.js')); await this.assertIdle(async () => { await this.touch('test.js'); }); this.done(); }, }, ['source.test.js']); });