Fix syntax errors in compiler and clean up debug output
This commit is contained in:
parent
35a4fb7fef
commit
80caf6412c
19 changed files with 243 additions and 0 deletions
5
run-tests.sh
Executable file
5
run-tests.sh
Executable file
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Simple script to run all compiler tests
|
||||||
|
echo "Running all tests..."
|
||||||
|
node test-harness.js
|
||||||
42
simple-test-runner.js
Normal file
42
simple-test-runner.js
Normal file
|
|
@ -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);
|
||||||
69
test-current.js
Normal file
69
test-current.js
Normal file
|
|
@ -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);
|
||||||
8
tests/test-arithmetic.c
Normal file
8
tests/test-arithmetic.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
5
tests/test-basic.c
Normal file
5
tests/test-basic.c
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
// test-basic.c
|
||||||
|
int main(int argc, int argv)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
9
tests/test-complex-expressions.c
Normal file
9
tests/test-complex-expressions.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
9
tests/test-compound.c
Normal file
9
tests/test-compound.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
8
tests/test-expression-variables.c
Normal file
8
tests/test-expression-variables.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
11
tests/test-function-call.c
Normal file
11
tests/test-function-call.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
10
tests/test-function-decl.c
Normal file
10
tests/test-function-decl.c
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
8
tests/test-local-vars.c
Normal file
8
tests/test-local-vars.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
8
tests/test-multistatement.c
Normal file
8
tests/test-multistatement.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
10
tests/test-return.c
Normal file
10
tests/test-return.c
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
// test-return.c
|
||||||
|
int return_test(int x)
|
||||||
|
{
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, int argv)
|
||||||
|
{
|
||||||
|
return return_test(42);
|
||||||
|
}
|
||||||
8
tests/test-simple-arithmetic.c
Normal file
8
tests/test-simple-arithmetic.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
10
tests/test-simple-function.c
Normal file
10
tests/test-simple-function.c
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
5
tests/test-simple-return.c
Normal file
5
tests/test-simple-return.c
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
// test-simple-return.c
|
||||||
|
int main(int argc, int argv)
|
||||||
|
{
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
5
tests/test-simple.c
Normal file
5
tests/test-simple.c
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
// Simple test for basic compiler functionality
|
||||||
|
int main(int argc, int argv)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
7
tests/test-variable-assign.c
Normal file
7
tests/test-variable-assign.c
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
// test-variable-assign.c
|
||||||
|
int main(int argc, int argv)
|
||||||
|
{
|
||||||
|
int x = 5;
|
||||||
|
x = 10;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
6
tests/test-variable-decl.c
Normal file
6
tests/test-variable-decl.c
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
// test-variable-decl.c
|
||||||
|
int main(int argc, int argv)
|
||||||
|
{
|
||||||
|
int x = 10;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue