summaryrefslogtreecommitdiff
path: root/t
diff options
context:
space:
mode:
Diffstat (limited to 't')
-rw-r--r--t/lex.lisp100
-rw-r--r--t/parse.lisp150
-rw-r--r--t/util.lisp16
3 files changed, 145 insertions, 121 deletions
diff --git a/t/lex.lisp b/t/lex.lisp
deleted file mode 100644
index 7a20608..0000000
--- a/t/lex.lisp
+++ /dev/null
@@ -1,100 +0,0 @@
-(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 ())))
diff --git a/t/parse.lisp b/t/parse.lisp
index bd1310f..3c29dbc 100644
--- a/t/parse.lisp
+++ b/t/parse.lisp
@@ -4,23 +4,143 @@
:description "Test functions exported from the parser."
:in all-tests)
+;;; these tests are not exhaustive, and are meant to test basic functionality
+;;; under correct circumstances.
+
(in-suite parse-tests)
-(test extract-label-is-a-label
- (is (not (parse:extract-label '("LOOP" lex::colon)))))
+(test esrap-register-bases
+ (is (equal '(emit::p
+ (emit::d)
+ (emit::x
+ (emit::r "ADD" (emit::rr 10) (emit::rr 10) (emit::rr 10))))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tADD $0O012 $0B1010 $0XA~%")))))
+
+(test esrap-instr-all-type-r
+ (is (equal
+ '(emit::p
+ (emit::d)
+ (emit::x
+ (emit::r "ADDV" (emit::rr 1) (emit::rr 2) (emit::rr 3))
+ (emit::r "NOT" (emit::rr 4) (emit::rr 0) (emit::rr 5))
+ (emit::r "CMP" (emit::rr 6) (emit::rr 7) (emit::rr 0))))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tADDV $3 $1 $2
+~tNOT $5 $4~%~tCMP $6 $7~%")))))
+
+(test esrap-instr-all-type-i
+ (is (equal
+ '(emit::p
+ (emit::d)
+ (emit::x
+ (emit::i "LOADV" (emit::rr 8) (emit::rr 9) (emit::imm 1))
+ (emit::i "STORE" (emit::rr 3) (emit::rr 5) (emit::imm 3))
+ (emit::i "ADDI" (emit::rr 5) (emit::rr 4) (emit::imm 2))))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tLOADV $8 1($9)
+~tSTORE $5 3($3)~%~tADDI $5 $4 2~%")))))
+
+(test esrap-instr-type-all-type-j
+ (is (equal
+ '(emit::p
+ (emit::d)
+ (emit::x
+ (emit::j "JMP" (emit::rr 3) (emit::imm 3))
+ (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 8))
+ (emit::j "PUSH" (emit::rr 5) (emit::imm 0))))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tJMP 3($3)
+~tJRL FOO~%~tPUSH $5~%")))))
+
+(test esrap-instr-type-i-negative
+ (is (equal
+ '(emit::p
+ (emit::d)
+ (emit::x
+ (emit::i "LOADV" (emit::rr 8) (emit::rr 3) (emit::imm -3))))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tLOADV $8 -3($3)~%")))))
+
+(test esrap-instr-type-i-vars
+ (is (equal
+ '(emit::p
+ (emit::d)
+ (emit::x
+ (emit::i "LOADV" (emit::rr 8) (emit::rr 0) (emit::var "vector"))
+ (emit::i "STORE" (emit::rr 0) (emit::rr 5) (emit::var "int"))))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tLOADV $8 vector
+~tSTORE $5 int~%")))))
+
+(test esrap-instr-type-all-lazy-spaces
+ (is (equal
+ '(emit::p
+ (emit::d)
+ (emit::x
+ (emit::j "JMP" (emit::rr 3) (emit::imm 3))
+ (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 14))
+ (emit::j "PUSH" (emit::rr 5) (emit::imm 0))))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%~%.TEXT~t~%JMP 3($3)~t
+JRL FOO~t~%PUSH $5~%")))))
+
+(test esrap-data-singleton
+ (is (equal
+ '(emit::p
+ (emit::d
+ 1)
+ (emit::x))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%~tA 1~%.TEXT~%")))))
+
+(test esrap-data-loaded
+ (is (equal
+ '(emit::p
+ (emit::d
+ 1 2 3 4 5 6 7 8)
+ (emit::x))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%~tB 1 2 3 4 5 6 7 8
+.TEXT~%")))))
+
+(test esrap-data-triple
+ (is (equal
+ '(emit::p
+ (emit::d
+ 5 6 7 8 4 3 5)
+ (emit::x))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%~tC 5 6 7 8~%~tD 4
+~tE 3 5~%.TEXT~%")))))
-(test extract-label-not-a-label-one
- (let ((lst '("NICE" "TRY")))
- (is (equal lst
- (parse:extract-label lst)))))
+(test esrap-data-lazy-spaces
+ (is (equal
+ '(emit::p
+ (emit::d
+ 5 6 7 8 4 3 5)
+ (emit::x))
+ (esrap:parse 'parse:str->ast (format nil "~%~t.DATA~t~%F 5 6 7 8~t~%G 4
+H 3 5~%.TEXT~%")))))
-(test extract-label-not-a-label-two
- (let ((lst '("LOOP" lex::colon lex::colon)))
- (is (equal lst
- (parse:extract-label lst)))))
+(test esrap-data-full
+ (is (equal
+ '(emit::p
+ (emit::d
+ 1 2 3 4 3 0)
+ (emit::x
+ (emit::i "LOAD" (emit::rr 5) (emit::rr 0) (emit::var "S"))
+ (emit::i "LOAD" (emit::rr 10) (emit::rr 0) (emit::var "ARR"))
+ (emit::i "LOAD" (emit::rr 6) (emit::rr 0) (emit::var "I"))
+ (emit::j "JRL" (emit::rr 0) (emit::l "CMP" 19))
+ (emit::r "ADD" (emit::rr 10) (emit::rr 6) (emit::rr 9))
+ (emit::i "ADDI" (emit::rr 6) (emit::rr 6) (emit::imm 1))
+ (emit::r "CMP" (emit::rr 6) (emit::rr 5) (emit::rr 0))
+ (emit::j "BGT" (emit::rr 0) (emit::l "L" 23))))
+ (esrap:parse 'parse:str->ast (format nil "
+.DATA
+ ARR 1 2 3 4
+ S 3
+ I 0
-(test extract-line-invalid-type
- (handler-case
- (progn (parse:tokens->ast '(("foo" LEX::DOLLAR)))
- (fail))
- (lex:parser-error ())))
+.TEXT
+ LOAD $5 S
+ LOAD $10 ARR
+ LOAD $6 I
+ JRL CMP
+L:
+ ADD $9 $10 $6
+ ADDI $6 $6 0X1
+CMP:
+ CMP $6 $5
+ BGT L~%")))))
diff --git a/t/util.lisp b/t/util.lisp
index c2dafab..e15e142 100644
--- a/t/util.lisp
+++ b/t/util.lisp
@@ -16,13 +16,17 @@
(is (util:asm-extension? "quux.asm")))
(test format-as-binary-unsigned-no-pad
- (is (string= (util:format-as-binary 0 0)
- "0")))
+ (is (string= "0"
+ (util:format-as-binary 0 0))))
(test format-as-binary-unsigned-no-pad-fourty-two
- (is (string= (util:format-as-binary 42 0)
- "101010")))
+ (is (string= "101010"
+ (util:format-as-binary 42 6))))
(test format-as-binary-unsigned-pad-fourty-two
- (is (string= (util:format-as-binary 42 10)
- "0000101010")))
+ (is (string= "0000101010"
+ (util:format-as-binary 42 10))))
+
+(test format-as-binary-overflow
+ (is (string= "10"
+ (util:format-as-binary 10 2))))