summaryrefslogtreecommitdiff
path: root/t/lex.lisp
blob: 40698f998e70d5ca8b16e9de1c3aa77fc598dc6c (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
(in-package #:rva-tests)

(defmacro read-this (str &body body)
  `(let ((*standard-input* (make-string-input-stream ,str)))
     ,@body))

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

(in-suite lex-tests)

(test read-token-reads-eof
      (read-this ""
                 (is (not (lex:read-token)))))

(test read-token-reads-nl
      (read-this "
"
                 (is (eq (lex:read-token) 'lex::nl))))

(test read-token-reads-left-paren
      (read-this "("
                 (is (eq (lex:read-token) 'lex::left-paren))))

(test read-token-reads-right-paren
      (read-this ")"
                 (is (eq (lex:read-token) 'lex::right-paren))))

(test read-token-reads-left-paren
      (read-this "$"
                 (is (eq (lex:read-token) 'lex::dollar))))

(test read-token-ignores-space
      (read-this " ("
                 (is (eq (lex:read-token) 'lex::left-paren))))

(test read-token-ignores-tab
      (read-this "      ("
                 (is (eq (lex:read-token) 'lex::left-paren))))

(test read-token-ignores-comment
      (read-this "; this is a comment
("
                 (is (eq (lex:read-token) 'lex::nl))))

(test read-token-immediate-zero
      (read-this "0"
                 (is (= (lex:read-token) 0))))

(test read-token-immediate-all-digits
      (read-this "123456789"
                 (is (= (lex:read-token) 123456789))))

(test read-token-immediate-invalid-immediate
      (handler-case
          (progn (read-this "0v0" (lex:read-token))
                 (fail))
        (lex:invalid-immediate-or-keyword ())))

(test read-token-keyword-single
      (read-this "a"
                 (is (string= (lex:read-token) "a"))))

(test read-token-keyword-add
      (read-this "addi"
                 (is (string= (lex:read-token) "addi"))))

(test read-token-immediate-invalid-keyword
      (handler-case
          (progn (read-this "sub0" (lex:read-token))
                 (fail))
        (lex:invalid-immediate-or-keyword ())))