Files
bootler/twasm/asm/tests.asm
2026-03-23 22:27:52 +01:00

610 lines
12 KiB
NASM

; ------------------------------------------------------------------------------
; tests
; ------------------------------------------------------------------------------
; ------------------------------------------------------------------------------
; run_tests
;
; description:
; runs all tests
; ------------------------------------------------------------------------------
run_tests:
mov rsi, .msg
call print.test
call test_completeness
call clear_test_arena
call test_djb2
call clear_test_arena
call test_elemb
call clear_test_arena
call test_get_tte_type
call clear_test_arena
call test_get_tte_typed_metadata
call clear_test_arena
call test_get_opcode
call clear_test_arena
call test_get_reg_bits
call clear_test_arena
call test_evaluate_constant
call clear_test_arena
call test_identify_register
call clear_test_arena
call test_identify_operator
call clear_test_arena
call test_evaluate_operand
ret
.msg db "running test suite...", 0x0A, 0x00
; ------------------------------------------------------------------------------
; test_completeness
;
; description:
; visual confirmation of binary integrity
; ------------------------------------------------------------------------------
test_completeness:
mov rsi, .msg
call print.test
mov rsi, .msg_content
call print
mov rsi, msg_end
call print
mov rsi, .msg_confirm
call print
ret
.msg db "test_completeness...", 0x0A, 0x00
.msg_content db " here is the ", 0x00
.msg_confirm db " here is the end of the binary ->|", 0x0A, " assert: the previous 2 lines are identical", 0x0A, 0x00
; ------------------------------------------------------------------------------
; test_elemb
;
; description:
; tests elemb described functionality
; ------------------------------------------------------------------------------
test_elemb:
mov rsi, .msg
call print.test
; [0]
mov rdi, 5
mov rsi, .case1
mov dl, [.case1]
call elemb
cmp al, 1
jne .fail
; [n - 1]
mov rdi, 5
mov rsi, .case1
mov dl, [.case1 + 4]
call elemb
cmp al, 1
jne .fail
; [1]
mov rdi, 5
mov rsi, .case1
mov dl, [.case1 + 1]
call elemb
cmp al, 1
jne .fail
; not present
mov rdi, 5
mov rsi, .case1
mov dl, 0xDA
call elemb
cmp al, 0
jne .fail
; 0 length list
mov rdi, 0
mov rsi, .case0
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
.case0: ; [This Page Intentionally Left Blank]
.case1 db 0x54, 0x00, 0x21, 0x20, 0x34
.msg db "test_elemb...", 0x00
; ------------------------------------------------------------------------------
; test_djb2
;
; description:
; tests djb2 described functionality
; ------------------------------------------------------------------------------
test_djb2:
mov rsi, .msg
call print.test
mov rsi, .case0
mov rdi, 0
call djb2
cmp rax, 5381
jne .fail
mov rsi, .case1
mov rdi, 1
call djb2
cmp rax, 177670
jne .fail
mov rsi, .case2
mov rdi, 2
call djb2
cmp rax, 5863208
jne .fail
; why am I testing this, of course it's without side effects xD
mov rsi, .case0
mov rdi, 0
call djb2
cmp rax, 5381
jne .fail
mov rsi, .case1
mov rdi, 1
call djb2
cmp rax, 177670
jne .fail
mov rsi, .case2
mov rdi, 2
call djb2
cmp rax, 5863208
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.case0 db ""
.case1 db "a"
.case2 db "ab"
.msg db "test_djb2...", 0x00
; ------------------------------------------------------------------------------
; test_get_tte_type
;
; description:
; tests get_tte_type described functionality
; ------------------------------------------------------------------------------
test_get_tte_type:
mov rsi, .msg
call print.test
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, 0x0056 ; mov
call get_tte_type
cmp al, 0x01 ; operator
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.test
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, 00001011b ; reg: 010b
; width: 11b (64 bits)
jne .fail
mov di, 0x0056 ; mov
call get_tte_typed_metadata
cmp al, 0x02 ; # operands
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_typed_metadata...", 0x00
; ------------------------------------------------------------------------------
; test_get_opcode
;
; description:
; tests get_opcode described functionality
; ------------------------------------------------------------------------------
test_get_opcode:
mov rsi, .msg
call print.test
mov di, 0x0053 ; xor
call get_opcode
cmp al, 0x31
jne .fail
mov di, 0x0054 ; inc
call get_opcode
cmp al, 0xFF
jne .fail
mov di, 0x004F ; hlt
call get_opcode
cmp al, 0xF4
jne .fail
mov di, 0x0003 ; rdx (not an operator)
call get_opcode
cmp al, UNRECOGNISED_ID_OPCODE
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_get_opcode...", 0x00
; ------------------------------------------------------------------------------
; test_get_reg_bits
;
; description:
; tests get_reg_bits described functionality
; ------------------------------------------------------------------------------
test_get_reg_bits:
mov rsi, .msg
call print.test
mov di, 0x0000 ; rax
call get_reg_bits
cmp al, 000b
jne .fail
mov di, 0x0010 ; eax
call get_reg_bits
cmp al, 000b
jne .fail
mov di, 0x0003 ; rdx
call get_reg_bits
cmp al, 010b
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_get_reg_bits...", 0x00
; ------------------------------------------------------------------------------
; test_evaluate_constant
;
; description:
; tests evaluate_constant described funtionality
; ------------------------------------------------------------------------------
test_evaluate_constant:
mov rsi, .msg
call print.test
; just numerals
mov rdi, .case0h ; addr of constant
mov rsi, 8 ; length of constant
call evaluate_constant
cmp rax, [.case0h_solution]
jne .fail
cmp rdx, 0x00
jne .fail
; just chars
mov rdi, .case1h ; addr of constant
mov rsi, 8 ; length of constant
call evaluate_constant
cmp rax, [.case1h_solution]
jne .fail
cmp rdx, 0x00
jne .fail
; just chars
mov rdi, .case2h ; addr of constant
mov rsi, 12 ; length of constant
call evaluate_constant
cmp rax, [.case2h_solution]
jne .fail
cmp rdx, 0x00
jne .fail
; PI x
mov rdi, .case3h ; addr of constant
mov rsi, 18 ; length of constant
call evaluate_constant
cmp rax, [.case3h_solution]
jne .fail
cmp rdx, 0x00
jne .fail
; PI q
mov rdi, .case0q
mov rsi, 16
call evaluate_constant
cmp rax, [.case0q_solution]
jne .fail
cmp rdx, 0x01
jne .fail
; PI b
mov rdi, .case0b
mov rsi, 66
call evaluate_constant
cmp rax, [.case0b_solution]
jne .fail
cmp rdx, 0x02
jne .fail
; char
mov rdi, .case0c
mov rsi, 6
call evaluate_constant
cmp rax, [.case0c_solution]
jne .fail
cmp rdx, 0x03
jne .fail
; oversized char
mov rdi, .case1c
mov rsi, 7
call evaluate_constant
cmp rdx, 0xFF
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_evaluate_constant...", 0x00
.case0h db "0x012390"
.case0h_solution dq 0x012390
.case1h db "0xABCDEF"
.case1h_solution dq 0xABCDEF
.case2h db "0x1234567890"
.case2h_solution dq 0x1234567890
.case3h db "0x243F6A8885A308D3"
.case3h_solution dq 0x243F6A8885A308D3
.case0c db '"char"'
.case0c_solution dq "char"
.case1c db '"chars"'
.case1c_solution dq "chars"
; " wow my editor really doesn't like highlighting quotes correctly
.case0q db "0q31103755242102"
.case0q_solution dq 0q31103755242102
.case0b db "0b0110011001101001011100100111001101110100001000000011011000110100"
.case0b_solution dq 0b0110011001101001011100100111001101110100001000000011011000110100
; ------------------------------------------------------------------------------
; test_identify_register
;
; description:
; tests identify_register described funtionality
; ------------------------------------------------------------------------------
test_identify_register:
mov rsi, .msg
call print.test
mov edi, "rcx"
call identify_register
cmp ax, 0x0002
jne .fail
mov edi, "RaNd"
call identify_register
cmp ax, UNRECOGNISED_TOKEN_ID
jne .fail
mov edi, ""
call identify_register
cmp ax, UNRECOGNISED_TOKEN_ID
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_identify_register...", 0x00
; ------------------------------------------------------------------------------
; test_identify_operator
;
; description:
; tests identify_operator described funtionality
; ------------------------------------------------------------------------------
test_identify_operator:
mov rsi, .msg
call print.test
mov edi, "xor"
call identify_operator
cmp ax, 0x0053
jne .fail
mov edi, [tokens.operators_end]
call identify_operator
cmp ax, UNRECOGNISED_TOKEN_ID
jne .fail
mov edi, "RaNd"
call identify_operator
cmp ax, UNRECOGNISED_TOKEN_ID
jne .fail
mov edi, ""
call identify_operator
cmp ax, UNRECOGNISED_TOKEN_ID
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.msg db "test_identify_operator...", 0x00
; ------------------------------------------------------------------------------
; test_evaluate_operand
;
; description:
; tests evaluate_operand described funtionality
; ------------------------------------------------------------------------------
test_evaluate_operand:
mov rsi, .msg
call print.test
mov rdi, .case0
mov rsi, 3
call evaluate_operand
cmp dl, 0x00
jne .fail
cmp ax, 0x0000
jne .fail
mov rdi, .case1
mov rsi, 0
call evaluate_operand
cmp dl, 0xFF
jne .fail
mov rdi, .case2
mov rsi, 3
call evaluate_operand
cmp dl, 0x00
jne .fail
cmp ax, 0x0003
jne .fail
mov rdi, .case3
mov rsi, 5
call evaluate_operand
cmp dl, 0x10
jne .fail
cmp ax, 0x0003
jne .fail
.pass:
mov rsi, msg_pass
call print
ret
.fail:
mov rsi, msg_fail
call print
ret
.case0 db "rax"
.case1: ; intentionally blank
.case2 db "rdx"
.case3 db "[rdx]"
.msg db "test_evaluate_operand...", 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