-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterpreter_test.dart
125 lines (109 loc) · 3.35 KB
/
interpreter_test.dart
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import 'dart:async';
import 'dart:convert';
import 'dart:io' hide exitCode;
import 'package:path/path.dart' as path;
import 'package:test/test.dart';
import 'package:syllad/syd-core.dart';
import 'package:syllad/syd-runner.dart';
import 'package:syllad/run_tests.dart';
void main() {
TestRunner runner = OurInterpreterRunner();
for (File file in Directory('tests').listSync(recursive: true).whereType<File>().where((File file) => file.path.endsWith('.syd')).toList()
..sort((File a, File b) => a.path.compareTo(b.path))) {
test(
skip: path.split(file.path).contains('compiler-specific') || path.split(file.path).contains('test-manually'),
'${file.path}',
() {
StringBuffer output = StringBuffer();
bool testResult = runner.runAndEvaluateTest(
file,
output,
);
if(output.isNotEmpty) {
print('testrunner message:\n$output');
}
expect(
testResult,
isNot(false),
);
},
);
}
}
class OurInterpreterRunner extends TestRunner {
String get description => 'interpreter';
TestResult executeTest(File file) {
TestOutput errorOutput = TestOutput();
TestOutput output = TestOutput(errorOutput);
int exitCode = 0;
try {
runFile(file.readAsStringSync(), 'lib/rtl.syd', file.path, false, true, [file.path], output, errorOutput, (e) {
exitCode = e;
});
} on SydException catch (e) {
errorOutput.writeln(e);
switch (e.exitCode) {
case -1:
return TestResult.compilationFailed('Stderr:\n${prettify(errorOutput.output.toString())}');
case -2: // general test runtime error
case -3: // test assert
case -4: // test throw
return TestResult.testRan(runtimeError: true, testStdout: output.output.toString(), testStderr: errorOutput.output.toString(), testExitCode: e.exitCode);
default:
throw 'Invalid exit code ${e.exitCode}';
}
} catch (e, st) {
output.addError(e, st);
return TestResult.hostFailed('Stderr:\n${prettify(errorOutput.output.toString())}',);
}
return TestResult.testRan(runtimeError: false, testStdout: output.output.toString(), testStderr: errorOutput.output.toString(), testExitCode: exitCode);
}
}
class TestOutput implements IOSink {
late final IOSink stderr;
StringBuffer output = StringBuffer();
@override
Encoding encoding = utf8;
TestOutput([IOSink? stderr]) {
this.stderr = stderr ?? this;
}
@override
void add(List<int> data) {
output.write(encoding.decode(data));
}
@override
void addError(Object error, [StackTrace? stackTrace]) {
stderr.writeln(error);
stderr.writeln(stackTrace);
}
@override
Future addStream(Stream<List<int>> stream) {
return stream.reduce((a, b) => a.followedBy(b).toList()).then((value) => write(value));
}
@override
Future close() {
return done;
}
@override
Future get done => Completer().future;
@override
Future flush() {
return Future.value();
}
@override
void write(Object? object) {
output.write(object);
}
@override
void writeAll(Iterable objects, [String separator = ""]) {
output.writeAll(objects, separator);
}
@override
void writeCharCode(int charCode) {
output.writeCharCode(charCode);
}
@override
void writeln([Object? object = ""]) {
output.writeln(object);
}
}