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