From 33710a8ebe229e769c7155b60e11e6f744d0137f Mon Sep 17 00:00:00 2001 From: andromeda Date: Mon, 9 Mar 2026 10:08:19 +0100 Subject: work on metadata system, put tests in seperate file --- twasm/asm/tests.asm | 472 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 472 insertions(+) create mode 100644 twasm/asm/tests.asm (limited to 'twasm/asm/tests.asm') 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 -- cgit v1.3.1