diff options
author | Siddarth Suresh <155843085+SiddarthSuresh98@users.noreply.github.com> | 2025-04-16 16:43:38 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-16 16:43:38 -0400 |
commit | 3b8a36443a6d83b54fc698a774ef50705f36dcb9 (patch) | |
tree | c129a6d326a10f40e1a53144313d397b71eefba7 /t/parse.lisp | |
parent | 890119fceed9c57c86b43ace15ee016eb403c36a (diff) | |
parent | 76dca859f9a4c5e5575a3097d3d3a6f96d781258 (diff) |
Merge pull request #9 from bdunahu/bdunahu
Let displacement for JAL+JMP be the absolute file position of label
Diffstat (limited to 't/parse.lisp')
-rw-r--r-- | t/parse.lisp | 62 |
1 files changed, 37 insertions, 25 deletions
diff --git a/t/parse.lisp b/t/parse.lisp index 2612f45..2cb5b42 100644 --- a/t/parse.lisp +++ b/t/parse.lisp @@ -4,14 +4,23 @@ :description "Test functions exported from the parser." :in all-tests) +(defmacro expect-parse-error (body) + `(handler-case + (progn ,body + (fail)) + (esrap::parse-error ()))) + ;;; these tests are not exhaustive, and are meant to test basic functionality ;;; under correct circumstances. +;;; TODO add negative test cases +;;; TODO undesirably, these tests are setup in a way where the previous tests +;;; affect the succeeding ones (line labels) (in-suite parse-tests) (test esrap-register-bases (is (equal '(emit::p - (emit::d) + (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~%"))))) @@ -19,7 +28,7 @@ (test esrap-instr-all-type-r (is (equal '(emit::p - (emit::d) + (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)) @@ -30,7 +39,7 @@ (test esrap-instr-all-type-i (is (equal '(emit::p - (emit::d) + (emit::d) (emit::x (emit::i "LOADV" (emit::rr 8) (emit::rr 9) 1) (emit::i "STORE" (emit::rr 3) (emit::rr 5) 3) @@ -41,19 +50,19 @@ (test esrap-instr-type-all-type-j (is (equal '(emit::p - (emit::d) + (emit::d) (emit::x - (emit::j "JMP" (emit::rr 3) 3) + (emit::j "JMP" (emit::rr 0) (emit::l "FOO")) (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 8)) - (emit::j "RET" (emit::rr 0) 0) + (emit::j "RET" (emit::rr 0) 0) (emit::j "PUSH" (emit::rr 5) 0))) - (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tJMP 3($3) + (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tJMP FOO ~tJRL FOO~%~tRET~%~tPUSH $5~%"))))) (test esrap-instr-type-i-negative (is (equal '(emit::p - (emit::d) + (emit::d) (emit::x (emit::i "LOADV" (emit::rr 8) (emit::rr 3) -3))) (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tLOADV $8 -3($3)~%"))))) @@ -61,7 +70,7 @@ (test esrap-instr-type-i-vars (is (equal '(emit::p - (emit::d) + (emit::d) (emit::x (emit::i "LOADV" (emit::rr 8) (emit::rr 4) 2) (emit::i "STORE" (emit::rr 1) (emit::rr 5) 2))) @@ -71,32 +80,35 @@ (test esrap-instr-type-all-lazy-spaces (is (equal '(emit::p - (emit::d) + (emit::d) (emit::x - (emit::j "JMP" (emit::rr 3) 3) + (emit::j "JMP" (emit::rr 0) (emit::l "FOO")) (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 15)) (emit::j "PUSH" (emit::rr 5) 0))) - (esrap:parse 'parse:str->ast (format nil ".DATA~%~%.TEXT~t~%JMP 3($3)~t + (esrap:parse 'parse:str->ast (format nil ".DATA~%~%.TEXT~t~%JMP FOO~t JRL FOO~t~%PUSH $5~%"))))) (test esrap-instr-type-comments (is (equal '(emit::p - (emit::d) + (emit::d) (emit::x - (emit::j "JMP" (emit::rr 3) 3) + (emit::j "JMP" (emit::rr 0) (emit::l "FOO")) (emit::j "JRL" (emit::rr 0) (emit::l "FOO" 18)) (emit::j "PUSH" (emit::rr 5) 0))) (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT;; dot dot dot -~tJMP 3($3) ;; this does things +~tJMP FOO ;; this does things ~tJRL FOO~%~tPUSH $5~%"))))) +(test esrap-instr-bad-not + (expect-parse-error (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tNOT $5 $5 $5~%")))) + (test esrap-data-singleton (is (equal '(emit::p (emit::d 1) - (emit::x)) + (emit::x)) (esrap:parse 'parse:str->ast (format nil ".DATA~%~tA 1~%.TEXT~%"))))) (test esrap-data-loaded @@ -104,7 +116,7 @@ JRL FOO~t~%PUSH $5~%"))))) '(emit::p (emit::d 1 2 3 4 5 6 7 8) - (emit::x)) + (emit::x)) (esrap:parse 'parse:str->ast (format nil ".DATA~%~tB 1 2 3 4 5 6 7 8 .TEXT~%"))))) @@ -113,7 +125,7 @@ JRL FOO~t~%PUSH $5~%"))))) '(emit::p (emit::d 5 6 7 8 4 3 5) - (emit::x)) + (emit::x)) (esrap:parse 'parse:str->ast (format nil ".DATA~%~tC 5 6 7 8~%~tD 4 ~tE 3 5~%.TEXT~%"))))) @@ -122,18 +134,18 @@ JRL FOO~t~%PUSH $5~%"))))) '(emit::p (emit::d 5 6 7 8 4 3 5) - (emit::x)) + (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 esrap-negative-ints (is (equal - '(emit::p - (emit::d - -1) - (emit::x - (emit::i "LOADV" (emit::rr -8) (emit::rr -3) -3))) - (esrap:parse 'parse:str->ast (format nil ".DATA~%~tm -1~%.TEXT~%~tLOADV $-8 -3($-3)~%"))))) + '(emit::p + (emit::d + -1) + (emit::x + (emit::i "LOADV" (emit::rr -8) (emit::rr -3) -3))) + (esrap:parse 'parse:str->ast (format nil ".DATA~%~tm -1~%.TEXT~%~tLOADV $-8 -3($-3)~%"))))) (test esrap-data-full (is (equal |