summaryrefslogtreecommitdiff
path: root/t/lex.lisp
blob: 7a2060807738f882ebc39cacad488bef8487cc6c (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
(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-reads-plus
      (read-this "+"
                 (is (eq (lex:read-token) 'lex::plus))))

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

(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-binary
      (read-this "0b00101010"
                 (is (= (lex:read-token) 42))))

(test read-token-immediate-octal
      (read-this "0o052"
                 (is (= (lex:read-token) 42))))

(test read-token-immediate-hexadecimal
      (read-this "0x200"
                 (is (= (lex:read-token) 512))))

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

;; do we want a custom error for this too?
(test read-token-immediate-radix
      (handler-case
          (progn (read-this "0x" (lex:read-token))
                 (fail))
        (sb-int:simple-parse-error ())))

(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:lexer-error ())))