Repository navigation
Expand file tree
/
Copy pathtest_runner.cpp
More file actions
106 lines (90 loc) · 3.13 KB
/
Copy pathtest_runner.cpp
File metadata and controls
106 lines (90 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <cassert>
#include "Lexer.h"
#include "Parser.h"
#include "SemanticAnalyzer.h"
#include "IRGenerator.h"
#include "IRInterpreter.h"
#include "Diagnostic.h"
// Forward declarations of unit test suites
void runLexerTests();
void runParserTests();
void runSemanticTests();
void runIRTests();
void runCodeGenTests();
static bool runSampleTest(const std::string& path, int64_t expectedExitCode) {
std::ifstream file(path);
if (!file.is_open()) {
std::cerr << " [FAIL] Cannot open sample file: " << path << "\n";
return false;
}
std::ostringstream ss;
ss << file.rdbuf();
std::string src = ss.str();
DiagnosticEngine diag;
diag.setSource(src, path);
Lexer lexer(src, path, diag);
Parser parser(lexer, diag);
auto prog = parser.parseProgram();
if (diag.hasErrors()) {
std::cerr << " [FAIL] Parsing failed for: " << path << "\n";
return false;
}
SemanticAnalyzer sema(diag);
if (!sema.analyze(*prog)) {
std::cerr << " [FAIL] Semantic analysis failed for: " << path << "\n";
return false;
}
IRGenerator gen(diag);
auto module = gen.generate(*prog);
if (diag.hasErrors()) {
std::cerr << " [FAIL] IR generation failed for: " << path << "\n";
return false;
}
IRInterpreter vm(*module);
int64_t exitCode = vm.run("main");
if (exitCode != expectedExitCode) {
std::cerr << " [FAIL] " << path << ": expected " << expectedExitCode << ", got " << exitCode << "\n";
return false;
}
std::cout << " [PASS] " << path << " (exit code = " << exitCode << ")\n";
return true;
}
int main() {
std::cout << "========================================\n";
std::cout << " C COMPILER TEST SUITE\n";
std::cout << "========================================\n\n";
runLexerTests();
std::cout << "\n";
runParserTests();
std::cout << "\n";
runSemanticTests();
std::cout << "\n";
runIRTests();
std::cout << "\n";
runCodeGenTests();
std::cout << "\n";
std::cout << "[RUNNING] End-to-End Sample Program Tests...\n";
bool allSamplesPassed = true;
allSamplesPassed &= runSampleTest("tests/c_samples/01_arithmetic.c", 88);
allSamplesPassed &= runSampleTest("tests/c_samples/02_control_flow.c", 43);
allSamplesPassed &= runSampleTest("tests/c_samples/03_functions.c", 140);
allSamplesPassed &= runSampleTest("tests/c_samples/04_pointers.c", 145);
allSamplesPassed &= runSampleTest("tests/c_samples/05_arrays.c", 155);
allSamplesPassed &= runSampleTest("tests/c_samples/06_structs.c", 107);
allSamplesPassed &= runSampleTest("tests/c_samples/07_sort.c", 91);
std::cout << "\n========================================\n";
if (allSamplesPassed) {
std::cout << " ALL TESTS PASSED SUCCESSFULLY! (100%)\n";
std::cout << "========================================\n";
return 0;
} else {
std::cerr << " SOME TESTS FAILED!\n";
std::cout << "========================================\n";
return 1;
}
}