|
|
@ -0,0 +1,90 @@
|
|
|
1
|
(load "compiler.scm")
|
|
|
2
|
|
|
|
3
|
(define (do-test name input output)
|
|
|
4
|
(let [[test-file "current-test"]
|
|
|
5
|
[test-src "current-test.s"]
|
|
|
6
|
[program (with-input-from-string input read)]]
|
|
|
7
|
(delete-file test-src)
|
|
|
8
|
(with-output-to-file test-src
|
|
|
9
|
(lambda ()
|
|
|
10
|
(compile-program program)))
|
|
|
11
|
(unless (zero? (system (format "gcc -O3 ~a driver.c -o ~a" test-src test-file)))
|
|
|
12
|
(error 'gcc "could not compile"))
|
|
|
13
|
(unless (zero? (system (format "./~a > tests-output" test-file)))
|
|
|
14
|
(error 'run "could not run"))
|
|
|
15
|
(let [[out (read-file "tests-output")]]
|
|
|
16
|
(unless (string=? out output)
|
|
|
17
|
(error 'test (format "test[~a]: ~s: Expected ~s, but got ~s" name input output out))))
|
|
|
18
|
(delete-file "tests-output")
|
|
|
19
|
(delete-file test-src)
|
|
|
20
|
(delete-file test-file)
|
|
|
21
|
(display (format "test[~a]: OK\t\t~s\n" name input))))
|
|
|
22
|
|
|
|
23
|
(define (read-file path)
|
|
|
24
|
(with-output-to-string
|
|
|
25
|
(lambda ()
|
|
|
26
|
(with-input-from-file path
|
|
|
27
|
(lambda ()
|
|
|
28
|
(let recur ()
|
|
|
29
|
(let [[c (read-char)]]
|
|
|
30
|
(unless (eof-object? c)
|
|
|
31
|
(display c)
|
|
|
32
|
(recur)))))))))
|
|
|
33
|
|
|
|
34
|
(define (do-tests name tests)
|
|
|
35
|
(unless (null? tests)
|
|
|
36
|
(do-test name (caar tests) (cadar tests))
|
|
|
37
|
(do-tests name (cdr tests))))
|
|
|
38
|
|
|
|
39
|
(do-tests "3.1 - integers"
|
|
|
40
|
'[["42" "42\n"]
|
|
|
41
|
["10" "10\n"]
|
|
|
42
|
["-1001" "-1001\n"]])
|
|
|
43
|
|
|
|
44
|
(do-tests "3.2 - immediate constants"
|
|
|
45
|
'[["#\\d" "#\\d\n"]
|
|
|
46
|
["#\\y" "#\\y\n"]
|
|
|
47
|
["#t" "#t\n"]
|
|
|
48
|
["#f" "#f\n"]
|
|
|
49
|
["()" "()\n"]])
|
|
|
50
|
|
|
|
51
|
(do-tests "3.3 - unary primitives"
|
|
|
52
|
'[["(add1 0)" "1\n"]
|
|
|
53
|
["(add1 41)" "42\n"]
|
|
|
54
|
["(add1 -131124)" "-131123\n"]
|
|
|
55
|
|
|
|
56
|
["(integer->char 121)" "#\\y\n"]
|
|
|
57
|
["(char->integer #\\y)" "121\n"]
|
|
|
58
|
|
|
|
59
|
["(zero? 0)" "#t\n"]
|
|
|
60
|
["(zero? 1)" "#f\n"]
|
|
|
61
|
["(zero? 21425)" "#f\n"]
|
|
|
62
|
["(zero? -142)" "#f\n"]
|
|
|
63
|
["(zero? ())" "#f\n"]
|
|
|
64
|
["(zero? #f)" "#f\n"]
|
|
|
65
|
["(zero? #\\x)" "#f\n"]
|
|
|
66
|
|
|
|
67
|
["(null? ())" "#t\n"]
|
|
|
68
|
["(null? 0)" "#f\n"]
|
|
|
69
|
["(null? #\\y)" "#f\n"]
|
|
|
70
|
["(null? 13)" "#f\n"]
|
|
|
71
|
["(null? #t)" "#f\n"]
|
|
|
72
|
["(null? #f)" "#f\n"]
|
|
|
73
|
|
|
|
74
|
["(integer? 0)" "#t\n"]
|
|
|
75
|
["(integer? 13)" "#t\n"]
|
|
|
76
|
["(integer? -1)" "#t\n"]
|
|
|
77
|
["(integer? 15325232)" "#t\n"]
|
|
|
78
|
["(integer? -125252121)" "#t\n"]
|
|
|
79
|
["(integer? #\\y)" "#f\n"]
|
|
|
80
|
["(integer? #t)" "#f\n"]
|
|
|
81
|
["(integer? #f)" "#f\n"]
|
|
|
82
|
["(integer? ())" "#f\n"]
|
|
|
83
|
|
|
|
84
|
["(boolean? #t)" "#t\n"]
|
|
|
85
|
["(boolean? #f)" "#t\n"]
|
|
|
86
|
["(boolean? 0)" "#f\n"]
|
|
|
87
|
["(boolean? 12421)" "#f\n"]
|
|
|
88
|
["(boolean? #\\y)" "#f\n"]
|
|
|
89
|
["(boolean? ())" "#f\n"]
|
|
|
90
|
])
|