summaryrefslogtreecommitdiff
path: root/t/parse.lisp
blob: 71872925ebd843ab5b2abd8fd0bf7c3685a4313d (plain)
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
(in-package #:rva-tests)

(defmacro expect-parse-error (body)
  `(handler-case
       (progn ,body
              (fail))
     (parse::parser-error ())))

(def-suite parse-tests
  :description "Test functions exported from the parser."
  :in all-tests)

(in-suite parse-tests)

(test extract-label-is-a-label
      (is (not (parse:extract-label '("LOOP" lex::colon)))))

(test extract-label-not-a-label-one
      (let ((lst '("NICE" "TRY")))
        (is (equal lst
                   (parse:extract-label lst)))))

(test extract-label-not-a-label-two
      (let ((lst '("LOOP" lex::colon lex::colon)))
        (is (equal lst
                   (parse:extract-label lst)))))

(test extract-line-invalid-type
      (expect-parse-error (parse:tokens->ast '(("foo" lex::dollar)))))

(test to-register-nil
      (expect-parse-error (parse:to-register '())))

(test to-register-singleton
      (expect-parse-error (parse:to-register '(lex::dollar))))

(test to-register-zero
      (is (= 0 (parse:to-register '(lex::dollar 0)))))

(test to-register-one
      (is (= 1 (parse:to-register '(lex::dollar 1)))))

(test to-register-twenty-three
      (is (= 23 (parse:to-register '(lex::dollar 23)))))

(test to-register-zero-named
      (is (= 0 (parse:to-register '(lex::dollar "zr")))))

(test to-register-twenty-four
      (expect-parse-error (parse:to-register '(lex::dollar 24))))

(test to-register-negative-one
      (expect-parse-error (parse:to-register '(lex::dollar -1))))

(test extract-r-type-no-registers
      (expect-parse-error (parse:extract-r-type '("add") 0)))

(test extract-r-type-two-registers
      (expect-parse-error (parse:extract-r-type '("add" lex::dollar 2 lex::dollar 3) 0)))

(test extract-r-type-cmp-three-registers
      (expect-parse-error (parse:extract-r-type '("cmp" lex::dollar 2
                                                  lex::dollar 3 lex::dollar 4) 0)))

(test extract-r-type-simple-add
      (is (equal '(:op util::ADD :d 2 :s1 3 :s2 4)
                 (parse:extract-r-type '("add" lex::dollar 2
                                         lex::dollar 3 lex::dollar 4) 0))))

(test extract-r-type-simple-not
      (is (equal '(:op util::NOT :d 2 :s1 3 :s2 0)
                 (parse:extract-r-type '("not" lex::dollar 2 lex::dollar 3) 0))))

(test extract-r-type-simple-cmp
      (is (equal '(:op util::CMP :d 0 :s1 2 :s2 3)
                 (parse:extract-r-type '("cmp" lex::dollar 2 lex::dollar 3) 0))))