Files
autogame-17_capability-evolver/scripts/validate-suite.js

52 lines
1.8 KiB
JavaScript

// Usage: node scripts/validate-suite.js [test-glob-pattern]
// Runs the project's test suite (node --test) and fails if any test fails.
// When called without arguments, runs all tests in test/.
// When called with a glob pattern, runs only matching tests.
//
// This script is intended to be used as a Gene validation command.
// It provides stronger assurance than validate-modules.js (which only
// checks that modules can be loaded).
const { execSync } = require('child_process');
const path = require('path');
const pattern = process.argv[2] || 'test/**/*.test.js';
const repoRoot = process.cwd();
const cmd = `node --test ${pattern}`;
try {
const output = execSync(cmd, {
cwd: repoRoot,
stdio: ['pipe', 'pipe', 'pipe'],
timeout: 120000,
env: Object.assign({}, process.env, {
NODE_ENV: 'test',
EVOLVER_REPO_ROOT: repoRoot,
GEP_ASSETS_DIR: path.join(repoRoot, 'assets', 'gep'),
}),
});
const out = output.toString('utf8');
const passMatch = out.match(/# pass (\d+)/);
const failMatch = out.match(/# fail (\d+)/);
const passCount = passMatch ? Number(passMatch[1]) : 0;
const failCount = failMatch ? Number(failMatch[1]) : 0;
if (failCount > 0) {
console.error('FAIL: ' + failCount + ' test(s) failed');
process.exit(1);
}
if (passCount === 0) {
console.error('FAIL: no tests found matching pattern: ' + pattern);
process.exit(1);
}
console.log('ok: ' + passCount + ' test(s) passed, 0 failed');
} catch (e) {
const stderr = e.stderr ? e.stderr.toString('utf8').slice(-500) : '';
const stdout = e.stdout ? e.stdout.toString('utf8').slice(-500) : '';
console.error('FAIL: test suite exited with code ' + (e.status || 'unknown'));
if (stderr) console.error(stderr);
if (stdout) console.error(stdout);
process.exit(1);
}