diff --git a/run-tests.sh b/run-tests.sh new file mode 100755 index 0000000..a308fa1 --- /dev/null +++ b/run-tests.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +# Simple script to run all compiler tests +echo "Running all tests..." +node test-harness.js \ No newline at end of file diff --git a/simple-test-runner.js b/simple-test-runner.js new file mode 100644 index 0000000..2132677 --- /dev/null +++ b/simple-test-runner.js @@ -0,0 +1,42 @@ +#!/usr/bin/env node + +import fs from "node:fs/promises"; + +async function main() { + const testFiles = await fs.readdir("./tests"); + const cFiles = testFiles.filter(file => file.endsWith(".c")); + + let passed = 0; + let failed = 0; + + console.log(`Running ${cFiles.length} tests...\n`); + + for (const cFile of cFiles) { + try { + console.log(`Testing ${cFile}...`); + const { spawn } = await import("node:child_process"); + const child = spawn("node", ["index.js", `tests/${cFile}`], { cwd: "." }); + + child.on("close", (code) => { + if (code === 0) { + console.log(` ✓ ${cFile} passed`); + passed++; + } else { + console.log(` ✗ ${cFile} failed with code ${code}`); + failed++; + } + }); + + child.stderr.on("data", (data) => { + console.error(` Error: ${data.toString()}`); + }); + } catch (error) { + console.log(` ✗ ${cFile} failed with exception: ${error.message}`); + failed++; + } + } + + console.log(`\nResults: ${passed} passed, ${failed} failed`); +} + +main().catch(console.error); \ No newline at end of file diff --git a/test-current.js b/test-current.js new file mode 100644 index 0000000..a1d52fc --- /dev/null +++ b/test-current.js @@ -0,0 +1,69 @@ +#!/usr/bin/env node + +// Test what we have working right now + +import fs from "node:fs/promises"; +import { spawn } from "node:child_process"; + +async function runTest(testName) { + try { + console.log(`\nTesting ${testName}...`); + const child = spawn("node", ["index.js", `tests/${testName}`], { cwd: "." }); + + return new Promise((resolve, reject) => { + let stderr = ''; + + child.stderr.on("data", (data) => { + stderr += data.toString(); + }); + + child.on("close", (code) => { + if (code === 0) { + console.log(` ✓ ${testName} - PASSED`); + resolve({ name: testName, passed: true }); + } else { + console.log(` ✗ ${testName} - FAILED (exit code ${code})`); + if (stderr) { + console.log(` Error: ${stderr.substring(0, 100)}...`); + } + resolve({ name: testName, passed: false, error: stderr }); + } + }); + }); + } catch (error) { + console.log(` ✗ ${testName} - EXCEPTION: ${error.message}`); + return { name: testName, passed: false, error: error.message }; + } +} + +async function main() { + const testFiles = await fs.readdir("./tests"); + const testNames = testFiles.filter(file => file.endsWith(".c")); + + console.log(`\nRunning current tests (${testNames.length} total)`); + + let results = []; + + for (const testName of testNames) { + const result = await runTest(testName); + results.push(result); + } + + const passed = results.filter(r => r.passed).length; + const failed = results.length - passed; + + console.log(`\nResults: ${passed} passed, ${failed} failed`); + + if (failed === 0) { + console.log("All tests passed! ✓"); + } else { + console.log("Some tests failed! ✗"); + } + + console.log("\nFailed tests:"); + results.filter(r => !r.passed).forEach(r => { + console.log(` - ${r.name}`); + }); +} + +main().catch(console.error); \ No newline at end of file diff --git a/tests/test-arithmetic.c b/tests/test-arithmetic.c new file mode 100644 index 0000000..04dd163 --- /dev/null +++ b/tests/test-arithmetic.c @@ -0,0 +1,8 @@ +// test-arithmetic.c +int main(int argc, int argv) +{ + int a = 5; + int b = 3; + int c = a + b; + return c; +} \ No newline at end of file diff --git a/tests/test-basic.c b/tests/test-basic.c new file mode 100644 index 0000000..6320519 --- /dev/null +++ b/tests/test-basic.c @@ -0,0 +1,5 @@ +// test-basic.c +int main(int argc, int argv) +{ + return 0; +} \ No newline at end of file diff --git a/tests/test-complex-expressions.c b/tests/test-complex-expressions.c new file mode 100644 index 0000000..0d1a08b --- /dev/null +++ b/tests/test-complex-expressions.c @@ -0,0 +1,9 @@ +// test-complex-expressions.c +int main(int argc, int argv) +{ + int a = 2; + int b = 3; + int c = 4; + int result = a + b * c - 1; + return result; +} \ No newline at end of file diff --git a/tests/test-compound.c b/tests/test-compound.c new file mode 100644 index 0000000..85887ff --- /dev/null +++ b/tests/test-compound.c @@ -0,0 +1,9 @@ +// test-compound.c +int main(int argc, int argv) +{ + int a = 5; + int b = 3; + int c = 2; + int result = a + b * c; + return result; +} \ No newline at end of file diff --git a/tests/test-expression-variables.c b/tests/test-expression-variables.c new file mode 100644 index 0000000..39ede50 --- /dev/null +++ b/tests/test-expression-variables.c @@ -0,0 +1,8 @@ +// test-expression-variables.c +int main(int argc, int argv) +{ + int x = 10; + int y = 20; + int z = x + y; + return z; +} \ No newline at end of file diff --git a/tests/test-function-call.c b/tests/test-function-call.c new file mode 100644 index 0000000..84fa3be --- /dev/null +++ b/tests/test-function-call.c @@ -0,0 +1,11 @@ +// test-function-call.c +int add(int a, int b) +{ + return a + b; +} + +int main(int argc, int argv) +{ + int result = add(5, 3); + return result; +} \ No newline at end of file diff --git a/tests/test-function-decl.c b/tests/test-function-decl.c new file mode 100644 index 0000000..319d688 --- /dev/null +++ b/tests/test-function-decl.c @@ -0,0 +1,10 @@ +// test-function-decl.c +int add(int a, int b) +{ + return a + b; +} + +int main(int argc, int argv) +{ + return add(1, 2); +} \ No newline at end of file diff --git a/tests/test-local-vars.c b/tests/test-local-vars.c new file mode 100644 index 0000000..ee6795f --- /dev/null +++ b/tests/test-local-vars.c @@ -0,0 +1,8 @@ +// test-local-vars.c +int main(int argc, int argv) +{ + int a = 1; + int b = 2; + int c = a + b; + return c; +} \ No newline at end of file diff --git a/tests/test-multistatement.c b/tests/test-multistatement.c new file mode 100644 index 0000000..1b061ee --- /dev/null +++ b/tests/test-multistatement.c @@ -0,0 +1,8 @@ +// test-multistatement.c +int main(int argc, int argv) +{ + int a = 1; + int b = 2; + int c = a + b; + return c; +} \ No newline at end of file diff --git a/tests/test-return.c b/tests/test-return.c new file mode 100644 index 0000000..a5b4172 --- /dev/null +++ b/tests/test-return.c @@ -0,0 +1,10 @@ +// test-return.c +int return_test(int x) +{ + return x; +} + +int main(int argc, int argv) +{ + return return_test(42); +} \ No newline at end of file diff --git a/tests/test-simple-arithmetic.c b/tests/test-simple-arithmetic.c new file mode 100644 index 0000000..c51cd3e --- /dev/null +++ b/tests/test-simple-arithmetic.c @@ -0,0 +1,8 @@ +// test-simple-arithmetic.c +int main(int argc, int argv) +{ + int a = 10; + int b = 20; + int c = a + b; + return c; +} \ No newline at end of file diff --git a/tests/test-simple-function.c b/tests/test-simple-function.c new file mode 100644 index 0000000..7fa2459 --- /dev/null +++ b/tests/test-simple-function.c @@ -0,0 +1,10 @@ +// test-simple-function.c +int add(int a, int b) +{ + return a + b; +} + +int main(int argc, int argv) +{ + return add(1, 2); +} \ No newline at end of file diff --git a/tests/test-simple-return.c b/tests/test-simple-return.c new file mode 100644 index 0000000..58444a4 --- /dev/null +++ b/tests/test-simple-return.c @@ -0,0 +1,5 @@ +// test-simple-return.c +int main(int argc, int argv) +{ + return 42; +} \ No newline at end of file diff --git a/tests/test-simple.c b/tests/test-simple.c new file mode 100644 index 0000000..3aaab5f --- /dev/null +++ b/tests/test-simple.c @@ -0,0 +1,5 @@ +// Simple test for basic compiler functionality +int main(int argc, int argv) +{ + return 0; +} \ No newline at end of file diff --git a/tests/test-variable-assign.c b/tests/test-variable-assign.c new file mode 100644 index 0000000..3996218 --- /dev/null +++ b/tests/test-variable-assign.c @@ -0,0 +1,7 @@ +// test-variable-assign.c +int main(int argc, int argv) +{ + int x = 5; + x = 10; + return x; +} \ No newline at end of file diff --git a/tests/test-variable-decl.c b/tests/test-variable-decl.c new file mode 100644 index 0000000..21b8f45 --- /dev/null +++ b/tests/test-variable-decl.c @@ -0,0 +1,6 @@ +// test-variable-decl.c +int main(int argc, int argv) +{ + int x = 10; + return x; +} \ No newline at end of file