summaryrefslogtreecommitdiff
path: root/twasm/asm/tests.asm
diff options
context:
space:
mode:
Diffstat (limited to 'twasm/asm/tests.asm')
-rw-r--r--twasm/asm/tests.asm472
1 files changed, 472 insertions, 0 deletions
diff --git a/twasm/asm/tests.asm b/twasm/asm/tests.asm
new file mode 100644
index 0000000..d5341f0
--- /dev/null
+++ b/twasm/asm/tests.asm
@@ -0,0 +1,472 @@
+; ------------------------------------------------------------------------------
+; tests
+; ------------------------------------------------------------------------------
+
+; ------------------------------------------------------------------------------
+; run_tests
+;
+; description:
+; runs all tests
+; ------------------------------------------------------------------------------
+
+run_tests:
+ mov rsi, .msg
+ call print
+
+ call clear_test_arena
+ call test_copy_byte
+
+ call clear_test_arena
+ call test_copy_token
+
+ call clear_test_arena
+ call test_elemb
+
+ call clear_test_arena
+ call test_identify_token
+
+ call clear_test_arena
+ call test_identify_next_token
+
+ call clear_test_arena
+ call test_get_tte_type
+
+ call clear_test_arena
+ call test_get_tte_typed_metadata
+
+ ret
+ .msg db "running test suite...", 0x0A, 0x00
+
+; ------------------------------------------------------------------------------
+; test_copy_byte
+;
+; description:
+; tests copy_byte described functionality
+; ------------------------------------------------------------------------------
+
+test_copy_byte:
+ mov rsi, .msg
+ call print
+
+ mov rdi, test_byte ; byte to be copied
+ mov rsi, TEST_ARENA_ADDR ; location of test
+ call copy_byte
+
+ mov cx, [rsi]
+ and ax, 0xFF ; only compare bottom byte
+ and cx, 0xFF
+ cmp ax, cx ; compare returned byte to copied byte
+ jne .fail
+ cmp al, [test_byte] ; compare returned byte to expected byte
+ jne .fail
+
+ .pass:
+ mov rsi, msg_pass
+ call print
+ ret
+ .fail:
+ mov rsi, msg_fail
+ call print
+ ret
+ .msg db "test_copy_byte...", 0x00
+
+; ------------------------------------------------------------------------------
+; test_copy_token
+;
+; description:
+; tests copy_token described functionality
+; ------------------------------------------------------------------------------
+
+test_copy_token:
+ mov rsi, .msg
+ call print
+
+ ; test case: space terminated
+
+ mov rdi, test_token_space ; read buffer
+ mov rsi, TEST_ARENA_ADDR ; write buffer
+ call copy_token
+
+ ; check reported final indicies with the expected final indicies
+ cmp rax, test_token_space + 8 ; last byte read
+ jne .fail
+ cmp rdx, TEST_ARENA_ADDR + 8 ; last byte written
+ jne .fail
+
+ mov rsi, TEST_ARENA_ADDR
+ mov rcx, [rsi]
+ cmp rcx, [test_token_space] ; check if copied token matches expected token
+ jne .fail ; if not, fail
+
+ ; test case: null terminated
+
+ mov rdi, test_token_null ; read buffer
+ mov rsi, TEST_ARENA_ADDR ; write buffer
+ call copy_token
+
+ ; check reported final indicies with the expected final indicies
+ cmp rax, test_token_null + 8 ; last byte read
+ jne .fail
+ cmp rdx, TEST_ARENA_ADDR + 8 ; last byte written
+ jne .fail
+
+ mov rsi, TEST_ARENA_ADDR
+ mov rcx, [rsi]
+ cmp rcx, [test_token_null] ; check if copied token matches expected token
+ jne .fail ; if not, fail
+
+ .pass:
+ mov rsi, msg_pass
+ call print
+ ret
+ .fail:
+ mov rsi, msg_fail
+ call print
+ ret
+ .msg db "test_copy_token...", 0x00
+
+; ------------------------------------------------------------------------------
+; test_elemb
+;
+; description:
+; tests elemb described functionality
+; ------------------------------------------------------------------------------
+
+test_elemb:
+ mov rsi, .msg
+ call print
+
+ ; [0]
+ mov rdi, 5
+ mov rsi, test_elemb_5
+ mov dl, [test_elemb_5]
+ call elemb
+ cmp al, 1
+ jne .fail
+
+ ; [n - 1]
+ mov rdi, 5
+ mov rsi, test_elemb_5
+ mov dl, [test_elemb_5 + 4]
+ call elemb
+ cmp al, 1
+ jne .fail
+
+ ; [1]
+ mov rdi, 5
+ mov rsi, test_elemb_5
+ mov dl, [test_elemb_5 + 1]
+ call elemb
+ cmp al, 1
+ jne .fail
+
+ ; not present
+ mov rdi, 5
+ mov rsi, test_elemb_5
+ mov dl, 0xDA
+ call elemb
+ cmp al, 0
+ jne .fail
+
+ ; 0 length list
+ mov rdi, 0
+ mov rsi, test_elemb_0
+ mov dl, 0x34
+ call elemb
+ cmp al, 0
+ jne .fail
+
+ .pass:
+ mov rsi, msg_pass
+ call print
+ ret
+ .fail:
+ mov rsi, msg_fail
+ call print
+ ret
+ .msg db "test_elemb...", 0x00
+
+; ------------------------------------------------------------------------------
+; test_identify_token
+;
+; description:
+; tests identify_token described functionality
+; ------------------------------------------------------------------------------
+
+test_identify_token:
+ mov rsi, .msg
+ call print
+
+ ; length1 token that exists
+ mov byte [TEST_ARENA_ADDR], "*"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 1
+ call identify_token
+ cmp ax, 0x0064
+ jne .fail
+
+ ; length1 token that doesn't exist
+ mov byte [TEST_ARENA_ADDR], " "
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 1
+ call identify_token
+ cmp ax, 0xFFFF
+ jne .fail
+
+ ; length2 token that exists
+ mov word [TEST_ARENA_ADDR], "sp"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 2
+ call identify_token
+ cmp ax, 0x0026
+ jne .fail
+
+ ; length2 token that doesn't exist
+ mov word [TEST_ARENA_ADDR], "QQ"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 2
+ call identify_token
+ cmp ax, 0xFFFF
+ jne .fail
+
+ ; length3 token that exists
+ mov dword [TEST_ARENA_ADDR], "rax"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 3
+ call identify_token
+ cmp ax, 0x0000
+ jne .fail
+
+ ; length3 token that exists
+ mov dword [TEST_ARENA_ADDR], "cr0"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 3
+ call identify_token
+ cmp ax, 0x004A
+ jne .fail
+
+ ; length3 token that doesn't exist
+ mov dword [TEST_ARENA_ADDR], "r16"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 3
+ call identify_token
+ cmp ax, 0xFFFF
+ jne .fail
+
+ ; length4 token that exists
+ mov dword [TEST_ARENA_ADDR], "r10d"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 4
+ call identify_token
+ cmp ax, 0x001A
+ jne .fail
+
+ ; length4 token that exists
+ mov dword [TEST_ARENA_ADDR], "r15b"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 4
+ call identify_token
+ cmp ax, 0x003F
+ jne .fail
+
+ ; length4 token that doesn't exist
+ mov dword [TEST_ARENA_ADDR], "r15q"
+ mov rdi, TEST_ARENA_ADDR
+ mov rsi, 4
+ call identify_token
+ cmp ax, 0xFFFF
+ jne .fail
+
+ .pass:
+ mov rsi, msg_pass
+ call print
+ ret
+ .fail:
+ mov rsi, msg_fail
+ call print
+ ret
+ .msg db "test_identify_token...", 0x00
+
+; ------------------------------------------------------------------------------
+; test_identify_next_token
+;
+; description:
+; tests identify_next_token described functionality
+; ------------------------------------------------------------------------------
+
+test_identify_next_token:
+ mov rsi, .msg
+ call print
+
+ ; length1 token that exists
+ mov word [TEST_ARENA_ADDR], "* "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0x0064
+ jne .fail
+
+ ; length1 token that doesn't exist
+ mov word [TEST_ARENA_ADDR], " "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0xFFFF
+ jne .fail
+
+ ; length2 token that exists
+ mov dword [TEST_ARENA_ADDR], "sp "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0x0026
+ jne .fail
+
+ ; length2 token that doesn't exist
+ mov dword [TEST_ARENA_ADDR], "QQ "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0xFFFF
+ jne .fail
+
+ ; length3 token that exists
+ mov dword [TEST_ARENA_ADDR], "rax "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0x0000
+ jne .fail
+
+ ; length3 token that exists
+ mov dword [TEST_ARENA_ADDR], "cr0 "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0x004A
+ jne .fail
+
+ ; length3 token that doesn't exist
+ mov dword [TEST_ARENA_ADDR], "r16 "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0xFFFF
+ jne .fail
+
+ ; length4 token that exists
+ mov dword [TEST_ARENA_ADDR], "r10d"
+ mov byte [TEST_ARENA_ADDR + 4], " "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0x001A
+ jne .fail
+
+ ; length4 token that exists
+ mov dword [TEST_ARENA_ADDR], "r15b"
+ mov byte [TEST_ARENA_ADDR + 4], " "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0x003F
+ jne .fail
+
+ ; length4 token that doesn't exist
+ mov dword [TEST_ARENA_ADDR], "r15q"
+ mov byte [TEST_ARENA_ADDR + 4], " "
+ mov rdi, TEST_ARENA_ADDR
+ call identify_next_token
+ cmp ax, 0xFFFF
+ jne .fail
+
+ .pass:
+ mov rsi, msg_pass
+ call print
+ ret
+ .fail:
+ mov rsi, msg_fail
+ call print
+ ret
+ .msg db "test_identify_next_token...", 0x00
+
+
+; ------------------------------------------------------------------------------
+; test_get_tte_type
+;
+; description:
+; tests get_tte_type described functionality
+; ------------------------------------------------------------------------------
+
+test_get_tte_type:
+ mov rsi, .msg
+ call print
+
+ mov di, 0x0053 ; xor
+ call get_tte_type
+ cmp al, 0x01 ; operator
+ jne .fail
+
+ mov di, 0x0003 ; rdx
+ call get_tte_type
+ cmp al, 0x02 ; register
+ jne .fail
+
+ mov di, 0xFFFF ; unrecognised token
+ call get_tte_type
+ cmp al, UNRECOGNISED_ID_TYPE
+ jne .fail
+
+ .pass:
+ mov rsi, msg_pass
+ call print
+ ret
+ .fail:
+ mov rsi, msg_fail
+ call print
+ ret
+ .msg db "test_get_tte_type...", 0x00
+
+; ------------------------------------------------------------------------------
+; test_get_tte_typed_metadata
+;
+; description:
+; tests get_tte_typed_metadata described functionality
+; ------------------------------------------------------------------------------
+
+test_get_tte_typed_metadata:
+ mov rsi, .msg
+ call print
+
+ mov di, 0x0053 ; xor
+ call get_tte_typed_metadata
+ cmp al, 0x02 ; # operands
+ jne .fail
+
+ mov di, 0x0003 ; rdx
+ call get_tte_typed_metadata
+ cmp al, 0x03 ; width: 64 bits
+ jne .fail
+
+ mov di, 0xFFFF ; unrecognised token
+ call get_tte_typed_metadata
+ cmp al, UNRECOGNISED_ID_METADATA
+ jne .fail
+
+ .pass:
+ mov rsi, msg_pass
+ call print
+ ret
+ .fail:
+ mov rsi, msg_fail
+ call print
+ ret
+ .msg db "test_get_tte_type...", 0x00
+
+msg_pass:
+ db 0x0A
+ times (TEST_LINE_LENGTH + .start - .end) db " ", ; right align
+ .start db "passed."
+ .end db 0x0A, 0x00
+msg_fail:
+ db 0x0A
+ times (TEST_LINE_LENGTH + .start - .end) db " ",
+ .start db "failed."
+ .end db 0x0A, 0x00
+
+test_byte db "Q" ; unterminated, just a byte chillin
+test_token_null db "TestTokn", 0x00 ; followed by null terminator. Quad word
+test_token_space db "TestTokn " ; followed by space. Quad word
+test_elemb_0: ; [This Page Intentionally Left Blank]
+test_elemb_5 db 0x54, 0x00, 0x21, 0x20, 0x34