diff options
Diffstat (limited to 'tcllib/modules/grammar_me/me_cpu.testsuite')
-rw-r--r-- | tcllib/modules/grammar_me/me_cpu.testsuite | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/tcllib/modules/grammar_me/me_cpu.testsuite b/tcllib/modules/grammar_me/me_cpu.testsuite new file mode 100644 index 0000000..9d4f8a7 --- /dev/null +++ b/tcllib/modules/grammar_me/me_cpu.testsuite @@ -0,0 +1,445 @@ +# -*- tcl -*- me_cpu.test +# ### ### ### ######### ######### ######### + +# ### ### ### ######### ######### ######### +## Cpu creation. + +test me-cpu-new-${impl}-1.0 {new, wrong args} -body { + grammar::me::cpu cpu +} -result {Error in constructor: wrong # args: should be "::grammar::me::cpu::Snit_constructor type selfns win self code_"} \ + -returnCodes error + +test me-cpu-new-${impl}-1.1 {new, wrong args} -body { + grammar::me::cpu cpu a b +} -result {Error in constructor: wrong # args: should be "::grammar::me::cpu::Snit_constructor type selfns win self code_"} \ + -returnCodes error + +test me-cpu-run-${impl}-2.0 run -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu run +} -cleanup { + cpu destroy +} -returnCodes error -result {No instructions to execute} + +set n -1 +foreach {cmd cargs expected} $asm_table { + set asm [list [linsert $cargs 0 branchlabel $cmd]] + incr n + + test me-cpu-new-${impl}-3.$n "new, $cmd, code" -body { + grammar::me::cpu cpu \ + [canon_code [grammar::me::cpu::core::asm $asm]] + cpu code + } -cleanup { + cpu destroy + } -result $expected + + test me-cpu-new-${impl}-4.$n "new, $cmd, state" -body { + grammar::me::cpu cpu \ + [canon_code [grammar::me::cpu::core::asm $asm]] + cpusubst [cpustate cpu] cd {} + } -cleanup { + cpu destroy + } -result {cd {} pc 0 ht 0 eo 0 tc {} at -1 cc {} ok 0 sv {} er {} ls {} as {} ms {} es {} rs {} nc {}} +} + +set n -1 +foreach {insns expected} $badmach_table { + incr n + + test me-cpu-new-${impl}-5.$n "new error" -body { + grammar::me::cpu cpu $insns + } -result "Error in constructor: $expected" -returnCodes error +} + +# ### ### ### ######### ######### ######### +## CPU manipulation - Add tokens I + +test me-cpu-put-${impl}-1.0 {put, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu put +} -returnCodes error -cleanup { + cpu destroy +} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col} 0] + +test me-cpu-put-${impl}-1.1 {put, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu put a +} -returnCodes error -cleanup { + cpu destroy +} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col} 1] + +test me-cpu-put-${impl}-1.2 {put, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu put a b +} -returnCodes error -cleanup { + cpu destroy +} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col} 2] + +test me-cpu-put-${impl}-1.3 {put, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu put a b c +} -returnCodes error -cleanup { + cpu destroy +} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col} 3] + +test me-cpu-put-${impl}-1.4 {put, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu put a b c d e +} -returnCodes error -cleanup { + cpu destroy +} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodput {tok lex line col}] + +test me-cpu-put-${impl}-2.0 put -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + set base [cpustate cpu] +} -body { + cpu put ID ident 1 0 + cpu put NUM 12345 1 5 + cpudelta $base [cpustate cpu] +} -cleanup { + cpu destroy + unset base +} -result {tc {{ID ident 1 0} {NUM 12345 1 5}}} + +test me-cpu-put-${impl}-3.0 {put after eof} -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu eof +} -body { + cpu put ID ident 1 0 +} -returnCodes error -cleanup { + cpu destroy +} -result {Cannot add input data after eof} + + +# ### ### ### ######### ######### ######### +## CPU manipulation - Add tokens II + +test me-cpu-putstring-${impl}-1.0 {putstring, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu putstring +} -returnCodes error -cleanup { + cpu destroy +} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodputstring {str lvar cvar} 0] + +test me-cpu-putstring-${impl}-1.1 {putstring, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu putstring a +} -returnCodes error -cleanup { + cpu destroy +} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodputstring {str lvar cvar} 1] + +test me-cpu-putstring-${impl}-1.2 {putstring, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu putstring a b +} -returnCodes error -cleanup { + cpu destroy +} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodputstring {str lvar cvar} 2] + +test me-cpu-putstring-${impl}-1.3 {putstring, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu putstring a b c d +} -returnCodes error -cleanup { + cpu destroy +} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodputstring {str lvar cvar}] + +test me-cpu-putstring-${impl}-2.0 put -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + set base [cpustate cpu] + set l 0 + set c 0 +} -body { + cpu putstring ID l c + list $l $c [cpudelta $base [cpustate cpu]] +} -cleanup { + cpu destroy + unset base +} -result {0 2 {tc {{I {} 0 0} {D {} 0 1}}}} + +test me-cpu-putstring-${impl}-3.0 {put after eof} -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu eof + set l 0 + set c 0 +} -body { + cpu putstring ID l c +} -returnCodes error -cleanup { + cpu destroy +} -result {Cannot add input data after eof} + +# ### ### ### ######### ######### ######### +## State manipulation - Set eof + +test me-cpu-eof-${impl}-1.0 {eof, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu eof x +} -returnCodes error -cleanup { + cpu destroy +} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodeof {}] + +test me-cpu-eof-${impl}-2.0 eof -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + set base [cpustate cpu] +} -body { + cpu eof + cpudelta $base [cpustate cpu] +} -cleanup { + cpu destroy +} -result {eo 1} + +# ### ### ### ######### ######### ######### +## State accessors - line/col retrieval + +test me-cpu-lc-${impl}-1.0 {lc, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu lc +} -returnCodes error -cleanup { + cpu destroy +} -result [snitWrongNumArgs cpu ::grammar::me::cpu::Snit_methodlc {location} 0] + +test me-cpu-lc-${impl}-1.1 {lc, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu lc a b +} -returnCodes error -cleanup { + cpu destroy +} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodlc {location}] + +test me-cpu-lc-${impl}-2.0 lc -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu lc 0 +} -cleanup { + cpu destroy +} -result {1 5} + +test me-cpu-lc-${impl}-3.0 {lc, bad index} -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu lc -1 +} -returnCodes error -cleanup { + cpu destroy +} -result {Illegal location -1} + +test me-cpu-lc-${impl}-3.1 {lc, bad index} -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu lc 1 +} -returnCodes error -cleanup { + cpu destroy +} -result {Illegal location 1} + +test me-cpu-lc-${impl}-3.2 {lc, bad index} -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] +} -body { + cpu lc 0 +} -returnCodes error -cleanup { + cpu destroy +} -result {Illegal location 0} + +# ### ### ### ######### ######### ######### +## State accessors - Token retrieval + +test me-cpu-tok-${impl}-1.0 {tok, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu tok a b c +} -returnCodes error -cleanup { + cpu destroy +} -result {wrong # args: should be "grammar::me::cpu::core::tok state ?from ?to??"} + +test me-cpu-tok-${impl}-2.0 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] +} -body { + cpu tok +} -cleanup { + cpu destroy +} -result {} + +test me-cpu-tok-${impl}-2.1 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu tok +} -cleanup { + cpu destroy +} -result {{NUM 12345 1 5}} + +test me-cpu-tok-${impl}-2.2 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put ID lalal 0 0 + cpu put NUM 12345 1 5 +} -body { + cpu tok +} -cleanup { + cpu destroy +} -result {{ID lalal 0 0} {NUM 12345 1 5}} + +test me-cpu-tok-${impl}-3.0 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] +} -body { + cpu tok 0 +} -cleanup { + cpu destroy +} -result {Illegal location 0} -returnCodes error + +test me-cpu-tok-${impl}-3.1 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu tok -1 +} -cleanup { + cpu destroy +} -result {Illegal location -1} -returnCodes error + +test me-cpu-tok-${impl}-3.2 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu tok 1 +} -cleanup { + cpu destroy +} -result {Illegal location 1} -returnCodes error + +test me-cpu-tok-${impl}-3.3 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu tok 0 +} -cleanup { + cpu destroy +} -result {{NUM 12345 1 5}} + +test me-cpu-tok-${impl}-3.4 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put ID lalal 0 0 + cpu put NUM 12345 1 5 +} -body { + cpu tok 0 +} -cleanup { + cpu destroy +} -result {{ID lalal 0 0}} + +test me-cpu-tok-${impl}-4.0 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu tok -1 0 +} -cleanup { + cpu destroy +} -result {Illegal start location -1} -returnCodes error + +test me-cpu-tok-${impl}-4.1 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu tok 1 0 +} -cleanup { + cpu destroy +} -result {Illegal start location 1} -returnCodes error + +test me-cpu-tok-${impl}-4.2 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu tok 0 -1 +} -cleanup { + cpu destroy +} -result {Illegal end location -1} -returnCodes error + +test me-cpu-tok-${impl}-4.3 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put NUM 12345 1 5 +} -body { + cpu tok 0 1 +} -cleanup { + cpu destroy +} -result {Illegal end location 1} -returnCodes error + +test me-cpu-tok-${impl}-4.4 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put ID lalal 0 0 + cpu put NUM 12345 1 5 +} -body { + cpu tok 1 0 +} -cleanup { + cpu destroy +} -result {Illegal empty location range 1 .. 0} -returnCodes error + +test me-cpu-tok-${impl}-4.5 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put ID lalal 0 0 + cpu put NUM 12345 1 5 +} -body { + cpu tok 0 1 +} -cleanup { + cpu destroy +} -result {{ID lalal 0 0} {NUM 12345 1 5}} + +test me-cpu-tok-${impl}-4.6 tok -setup { + grammar::me::cpu cpu [canon_code [grammar::me::cpu::core::asm {}]] + cpu put ID lalal 0 0 + cpu put ID lalal 0 0 +} -body { + cpu tok 0 0 +} -cleanup { + cpu destroy +} -result {{ID lalal 0 0}} + +# ### ### ### ######### ######### ######### +## Checking the instruction semantics + +test me-cpu-run-${impl}-1.0 {run, wrong args} -setup { + grammar::me::cpu cpu {{} {} {}} +} -body { + cpu run a b +} -returnCodes error -cleanup { + cpu destroy +} -result [snitTooManyArgs cpu ::grammar::me::cpu::Snit_methodrun {?n?}] + +set n -1 +foreach {description input eof stepsSetup steps code expectedDelta} $semantics { + incr n + + if 0 { + puts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + puts $description + puts "INPUT $input" + puts "EOF $eof" + puts "CODE $stepsSetup $steps $code" + puts $expectedDelta + } + + test me-cpu-run-${impl}-2.$n "run $description" -setup { + grammar::me::cpu cpu $code + foreach token $input { + eval [linsert $token 0 cpu put] + # cpu put {*}$token + } + if {$eof} {cpu eof} + if {$stepsSetup} {cpu run $stepsSetup} + set save [cpustate cpu] + } -body { + cpu run $steps + cpudelta $save [cpustate cpu] + } -cleanup { + cpu destroy + } -result $expectedDelta +} + +return |