; *** requirements ***
; ascii.h
; core
; stdio
; lib/ari
; lib/fmt

testNum:	.db 1
; Each time we call assertSP, we verify that our stack isn't imbalanced by
; comparing SP to its saved value. Whenever your "base" SP value change,
; generally at the beginning of a test routine, run "ld (testSP), sp" to have
; proper value saved to heap.
testSP:		.dw 0xffff


STDIO_PUTC:
	out	(0), a
	cp	a
	ret

STDIO_GETC:
	jp	unsetZ

assertZ:
	ret	z
	ld	hl, .msg
	call	printstr
	jp	fail
.msg:
	.db	"Z not set", CR, LF, 0

assertNZ:
	ret	nz
	ld	hl, .msg
	call	printstr
	jp	fail
.msg:
	.db	"Z set", CR, LF, 0

assertC:
	ret	c
	ld	hl, .msg
	call	printstr
	jp	fail
.msg:
	.db	"C not set", CR, LF, 0

assertNC:
	ret	nc
	ld	hl, .msg
	call	printstr
	jp	fail
.msg:
	.db	"C set", CR, LF, 0

; Assert that A == B
assertEQB:
	cp	b
	ret	z
	call	printHex
	call	printcrlf
	ld	a, b
	call	printHex
	call	printcrlf
	ld	hl, .msg
	call	printstr
	jp	fail
.msg:
	.db	"A != B", CR, LF, 0

; Assert that HL == DE
assertEQW:
	ld	a, h
	cp	d
	jr	nz, .fail
	ld	a, l
	cp	e
	ret	z
.fail:
	call	printHexPair
	call	printcrlf
	ex	de, hl
	call	printHexPair
	call	printcrlf
	ld	hl, .msg
	call	printstr
	jp	fail
.msg:
	.db	"HL != DE", CR, LF, 0

; Given a list of pointer to test data structures in HL and a pointer to a test
; routine in IX, call (IX) with HL pointing to the test structure until the list
; points to a zero. See testParseExpr in test_expr for an example usage.
testList:
	push	hl		; --> lvl 1
	call	intoHL
	ld	a, h
	or	l
	jr	z, .end
	call	callIX
	call	nexttest
	pop	hl		; <-- lvl 1
	inc	hl \ inc hl
	jr	testList
.end:
	pop	hl		; <-- lvl 1
	ret

; test that SP == testSP
assertSP:
	ld	hl, (testSP)
	; offset the fact that we call assertSP
	dec	hl \ dec hl
	or	a		; reset carry
	sbc	hl, sp
	ret	z
	ld	hl, .msg
	call	printstr
	jr	fail
.msg:
	.db	"Wrong SP", CR, LF, 0

nexttest:
	ld	a, (testNum)
	inc	a
	ld	(testNum), a
	ret

fail:
	ld	a, (testNum)
	halt