summaryrefslogtreecommitdiff
path: root/t/parse.lisp
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-04-08 21:41:35 -0400
committerbd <bdunahu@operationnull.com>2025-04-08 21:41:35 -0400
commit8ceaf87c43d412b758bb7562364f7ae8bee913ae (patch)
treeb5cfedcc055ae8ee836daf9d03e05dfa6b4086f3 /t/parse.lisp
parentb85c10ba1c53f1b442fea6bde4c2a2f73cfe5d6b (diff)
Add parsing functionality for R-type expressions
Diffstat (limited to 't/parse.lisp')
-rw-r--r--t/parse.lisp58
1 files changed, 54 insertions, 4 deletions
diff --git a/t/parse.lisp b/t/parse.lisp
index bd1310f..7187292 100644
--- a/t/parse.lisp
+++ b/t/parse.lisp
@@ -1,5 +1,11 @@
(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)
@@ -20,7 +26,51 @@
(parse:extract-label lst)))))
(test extract-line-invalid-type
- (handler-case
- (progn (parse:tokens->ast '(("foo" LEX::DOLLAR)))
- (fail))
- (lex:parser-error ())))
+ (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))))