Bladeren bron

Add a simple testing framework and tests

Lucas Stadler 8 jaren geleden
bovenliggende
commit
c45910023f
2 gewijzigde bestanden met toevoegingen van 93 en 0 verwijderingen
  1. 3 0
      scm/inc/Makefile
  2. 90 0
      scm/inc/tests.scm

+ 3 - 0
scm/inc/Makefile

@ -7,6 +7,9 @@ scheme: scheme.s driver.c
7 7
scheme-static: scheme.s driver.c
8 8
	gcc -O3 -static scheme.s driver.c -o $@
9 9
10
test: scheme.s driver.c
11
	petite --script tests.scm
12
10 13
asm: scheme.s
11 14
	cat scheme.s
12 15

+ 90 - 0
scm/inc/tests.scm

@ -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
    ])