test-all.mjsโข6.27 kB
#!/usr/bin/env node
/**
* Comprehensive test runner for bulk ripgrep optimization
* Runs all tests and provides a complete validation report
*/
import { spawn } from 'node:child_process';
import { promisify } from 'node:util';
const execAsync = promisify(spawn);
async function runCommand(command, args = [], options = {}) {
return new Promise((resolve, reject) => {
console.log(`๐ง Running: ${command} ${args.join(' ')}`);
const child = spawn(command, args, {
stdio: 'inherit',
...options
});
child.on('close', (code) => {
if (code === 0) {
resolve(code);
} else {
reject(new Error(`Command failed with exit code ${code}`));
}
});
child.on('error', (error) => {
reject(error);
});
});
}
async function runTestSuite(name, command, args = []) {
console.log(`\n${'='.repeat(60)}`);
console.log(`๐งช ${name}`);
console.log(`${'='.repeat(60)}`);
const startTime = Date.now();
try {
await runCommand(command, args);
const duration = Date.now() - startTime;
console.log(`\nโ
${name} completed successfully in ${duration}ms`);
return { name, success: true, duration };
} catch (error) {
const duration = Date.now() - startTime;
console.log(`\nโ ${name} failed: ${error.message}`);
return { name, success: false, duration, error: error.message };
}
}
async function checkPrerequisites() {
console.log('๐ Checking prerequisites...');
const checks = [
{ name: 'Node.js', command: 'node', args: ['--version'] },
{ name: 'npm', command: 'npm', args: ['--version'] },
{ name: 'TypeScript build', command: 'npm', args: ['run', 'build'] }
];
for (const check of checks) {
try {
await runCommand(check.command, check.args, { stdio: 'pipe' });
console.log(` โ
${check.name}: Available`);
} catch (error) {
console.log(` โ ${check.name}: Not available - ${error.message}`);
throw new Error(`Prerequisite ${check.name} not met`);
}
}
console.log('โ
All prerequisites met');
}
async function main() {
console.log('๐ Comprehensive Test Suite for Bulk Ripgrep Optimization');
console.log('=========================================================\n');
try {
// Check prerequisites
await checkPrerequisites();
// Define test suites
const testSuites = [
{
name: 'Unit Tests (Logic Validation)',
command: 'node',
args: ['scripts/test-bulk-optimization.mjs']
},
{
name: 'Smoke Tests (Functional Validation)',
command: 'node',
args: ['scripts/smoke-bulk-search.mjs']
},
{
name: 'Performance Benchmark',
command: 'node',
args: ['scripts/benchmark-search.mjs']
},
{
name: 'Original Smoke Test (Regression)',
command: 'node',
args: ['scripts/smoke-stdio.mjs', '--allow', '.']
}
];
// Run all test suites
const results = [];
for (const suite of testSuites) {
const result = await runTestSuite(suite.name, suite.command, suite.args);
results.push(result);
}
// Generate comprehensive report
console.log('\n' + '='.repeat(80));
console.log('๐ COMPREHENSIVE TEST REPORT');
console.log('='.repeat(80));
const passed = results.filter(r => r.success).length;
const failed = results.filter(r => !r.success).length;
const totalTime = results.reduce((sum, r) => sum + r.duration, 0);
console.log(`\n๐ SUMMARY:`);
console.log(` Total Test Suites: ${results.length}`);
console.log(` โ
Passed: ${passed}`);
console.log(` โ Failed: ${failed}`);
console.log(` โฑ๏ธ Total Time: ${totalTime}ms`);
console.log(`\n๐ DETAILED RESULTS:`);
results.forEach(result => {
const status = result.success ? 'โ
PASS' : 'โ FAIL';
console.log(` ${status} ${result.name} (${result.duration}ms)`);
if (result.error) {
console.log(` Error: ${result.error}`);
}
});
// Validation summary
console.log(`\n๐ฏ VALIDATION STATUS:`);
const unitTestsPassed = results.find(r => r.name.includes('Unit Tests'))?.success;
const smokeTestsPassed = results.find(r => r.name.includes('Smoke Tests'))?.success;
const benchmarkPassed = results.find(r => r.name.includes('Benchmark'))?.success;
const regressionPassed = results.find(r => r.name.includes('Regression'))?.success;
console.log(` ๐งช Logic Validation: ${unitTestsPassed ? 'โ
PASS' : 'โ FAIL'}`);
console.log(` ๐ง Functional Validation: ${smokeTestsPassed ? 'โ
PASS' : 'โ FAIL'}`);
console.log(` ๐ Performance Validation: ${benchmarkPassed ? 'โ
PASS' : 'โ FAIL'}`);
console.log(` ๐ Regression Validation: ${regressionPassed ? 'โ
PASS' : 'โ FAIL'}`);
// Final verdict
if (failed === 0) {
console.log('\n๐ ALL TESTS PASSED!');
console.log('โจ Your bulk ripgrep optimization is ready for production!');
console.log('\n๐ก Next steps:');
console.log(' 1. Push your feature branch');
console.log(' 2. Create a Pull Request');
console.log(' 3. Include these test results in your PR description');
} else {
console.log('\nโ ๏ธ SOME TESTS FAILED');
console.log('๐ง Please review the failed tests and fix issues before proceeding.');
console.log('\n๐ก Debugging tips:');
console.log(' 1. Check the detailed error messages above');
console.log(' 2. Run individual test suites for more details');
console.log(' 3. Verify your implementation matches the expected behavior');
}
process.exit(failed === 0 ? 0 : 1);
} catch (error) {
console.error('\nโ Test suite setup failed:', error.message);
console.log('\n๐ง Please ensure:');
console.log(' 1. All dependencies are installed (npm install)');
console.log(' 2. Project builds successfully (npm run build)');
console.log(' 3. You are in the project root directory');
process.exit(1);
}
}
main().catch(err => {
console.error('โ Unexpected error:', err);
process.exit(1);
});