Some tests for stack operations, pushing and popping, except for pmcs. Suggest: t/op/stacks.t Alex Gough -- Hatred is the coward's revenge for being intimidated. ######### #! perl -w # Tests for stack operations, currently push_*, push_*_c and pop_* # where * != p. # Assembler code is partially generated by subs at bottom of file # Still to write: tests for (push|pop)_p(_c)? # tests for warp, unwarp and set_warp use Parrot::Test tests => 6; output_is( <<"CODE", <<'OUTPUT', "push_i & pop_i" ); @{[ set_int_regs( sub { $_[0]} )]} push_i @{[ set_int_regs( sub {-$_[0]} )]} @{[ print_int_regs() ]} pop_i @{[ print_int_regs() ]} end CODE 0-1-2-3-4 -5-6-7-8-9 -10-11-12-13-14 -15-16-17-18-19 -20-21-22-23-24 -25-26-27-28-29 -30-31 01234 56789 1011121314 1516171819 2021222324 2526272829 3031 OUTPUT SKIP: {skip("push_i_c not implemented",1); output_is(<<"CODE", <<'OUTPUT', "push_i_c & pop_i"); @{[ set_int_regs( sub {$_[0]}) ]} push_i_c @{[ print_int_regs() ]} @{[ set_int_regs( sub {-$_[0]}) ]} @{[ print_int_regs() ]} pop_i @{[ print_int_regs() ]} CODE 01234 56789 1011121314 1516171819 2021222324 2526272829 3031 0-1-2-3-4 -5-6-7-8-9 -10-11-12-13-14 -15-16-17-18-19 -20-21-22-23-24 -25-26-27-28-29 -30-31 01234 56789 1011121314 1516171819 2021222324 2526272829 3031 OUTPUT } output_is(<<"CODE", <<'OUTPUT', 'push_s & pop_s'); @{[ set_str_regs( sub {$_[0]%2} ) ]} push_s @{[ set_str_regs( sub {($_[0]+1) %2} ) ]} @{[ print_str_regs() ]} print "\\n" pop_s @{[ print_str_regs() ]} print "\\n" end CODE 10101010101010101010101010101010 01010101010101010101010101010101 OUTPUT SKIP: {skip("push_s_c not implemented", 1); output_is(<<"CODE", <<'OUTPUT', 'push_s_c & pop_s'); @{[ set_str_regs( sub {$_[0]%2} ) ]} push_s_c @{[ print_str_regs() ]} print "\\n" @{[ set_str_regs( sub {($_[0]+1) %2} ) ]} @{[ print_str_regs() ]} print "\\n" pop_s @{[ print_str_regs() ]} print "\\n" end CODE 01010101010101010101010101010101 10101010101010101010101010101010 01010101010101010101010101010101 OUTPUT } output_is(<<"CODE", <<'OUTPUT', 'push_n & pop_n'); @{[ set_num_regs( sub { "1.0".$_ } ) ]} push_n @{[ set_num_regs( sub { "-1.0".$_} ) ]} @{[ clt_num_regs() ]} print "Seem to have negative Nx\\n" pop_n @{[ cgt_num_regs() ]} print "Seem to have positive Nx after pop\\n" branch ALLOK ERROR: print "not ok\\n" ALLOK: end CODE Seem to have negative Nx Seem to have positive Nx after pop OUTPUT SKIP: { skip("push_n_c not yet implemented",1); output_is(<<"CODE", <<'OUTPUT', 'push_n_c & pop_n'); @{[ set_num_regs( sub { "1.0".$_ } ) ]} push_n_c @{[ cgt_num_regs() ]} print "Seem to have positive Nx before push\\n" @{[ set_num_regs( sub { "-1.0".$_} ) ]} @{[ clt_num_regs() ]} print "Seem to have negative Nx\\n" pop_n @{[ cgt_num_regs() ]} print "Seem to have positive Nx after pop\\n" branch ALLOK ERROR: print "not ok\\n" ALLOK: end CODE Seem to have positive Nx before push Seem to have negative Nx Seem to have positive Nx after pop OUTPUT } # I'm lazy, and 32* as much code as needed isn't needed, # if you follow... # set integer registers to some value given by $code... package main; sub set_int_regs { my $code = shift; my $rt; for (0..31) { $rt .= "\tset I$_, ".&$code($_)."\n"; } return $rt; } # print all integer registers, with newlines every five registers sub print_int_regs { my ($rt, $foo); for (0..31) { $rt .= "\tprint I$_\n"; $rt .= "\tprint \"\\n\"\n" unless ++$foo % 5; } $rt .= "\tprint \"\\n\"\n"; return $rt; } # Set all string registers to values given by &$_[0](reg num) sub set_str_regs { my $code = shift; my $rt; for (0..31) { $rt .= "\tset S$_, \"".&$code($_)."\"\n"; } return $rt; } # print string registers, no additional prints sub print_str_regs { my $rt; for (0..31) { $rt .= "\tprint S$_\n"; } return $rt; } # Set "float" registers, &$_[0](reg num) should return string sub set_num_regs { my $code = shift; my $rt; for (0..31) { $rt .= "\tset N$_, ".&$code($_[0])."\n"; } return $rt; } # rather than printing all num regs, compare all ge 0 # if any are less, jump to ERROR # sense of test may seem backwards, but isn't sub cgt_num_regs { my $rt; for (0..31) { $rt .= "\tlt_nc_ic N$_, 0, ERROR\n"; } return $rt; } # same, but this time lt 0 sub clt_num_regs { my $rt; for (0..31) { $rt .= "\tgt_nc_ic N$_, 0, ERROR\n"; } return $rt; }