comparison interps/clc-intercal/CLC-INTERCAL-Base-1.-94.-2/t/04bytecode-assignments.t @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
comparison
equal deleted inserted replaced
995:6883f5911eb7 996:859f9b4339e6
1 # test bytecode interpreter - expressions
2
3 # Copyright (c) 2006-2008 Claudio Calvelli, all rights reserved.
4
5 # CLC-INTERCAL is copyrighted software. However, permission to use, modify,
6 # and distribute it is granted provided that the conditions set out in the
7 # licence agreement are met. See files README and COPYING in the distribution.
8
9 use Language::INTERCAL::GenericIO '1.-94.-2', qw($devnull);
10 use Language::INTERCAL::Interpreter '1.-94.-2';
11 use Language::INTERCAL::Rcfile '1.-94.-2';
12 use Language::INTERCAL::ByteCode '1.-94.-2', qw(:BC reg_code);
13 use Language::INTERCAL::Splats '1.-94.-2', qw(:SP);
14
15 use vars qw(@all_tests);
16
17 require 't/expressions';
18
19 $| = 1;
20
21 my $randomness = 5;
22 @all_tests = map {
23 # repeat any tests involving randomness 5 times for better testing
24 defined $_->[5] ? () : ($_->[6] ? ($_) x $randomness : $_)
25 } @all_tests;
26 # add a couple of splat tests
27 push @all_tests,
28 ['SPL', BC_SPL, 2, [], ['.1' => SP_NODIM], SP_NODIM],
29 ['SPL', BC_SPL, 2, [], ['.1' => SP_NORESUME], SP_NORESUME];
30
31 my $maxtest = 2 * scalar @all_tests;
32 print "1..$maxtest\n";
33
34 my $testnum = 1;
35 my $rc = new Language::INTERCAL::Rcfile;
36 for my $tester (@all_tests) {
37 my ($name, $opcode, $base, $in, $out, $splat, $israndom) = @$tester;
38 my $obj = new Language::INTERCAL::Interpreter($rc);
39 $obj->object->setbug(0, 0);
40 my @x = (BC_STO, reg_code($out->[0]), ref $opcode ? @$opcode : $opcode);
41 my @y = (BC_STO, ref $opcode ? @$opcode : $opcode);
42 for my $r (@$in) {
43 if (ref $r) {
44 next if $r->[0] =~ /^%/;
45 push @x, reg_code($r->[0]);
46 push @y, reg_code($r->[0]);
47 } else {
48 push @x, BC($r);
49 push @y, BC($r);
50 }
51 }
52 push @y, reg_code($out->[0]);
53 my $cp = 0;
54 my @c = ();
55 push @c, pack('C*', BC_STS, BC($cp++), BC(1), BC(0), BC(0), @x);
56 push @c, pack('C*', BC_STS, BC($cp++), BC(1), BC(0), BC(0), @y);
57 push @c, pack('C*', BC_STS, BC($cp++), BC(1), BC(0), BC(0), BC_GUP);
58 eval {
59 $obj->object->source('source');
60 $obj->object->code(\@c);
61 for my $r (@$in) {
62 if (ref $r && $r->[0] =~ /^%/) {
63 $obj->setreg($r->[0], $r->[1]);
64 }
65 }
66 $obj->setreg($out->[0], $out->[1]);
67 $obj->setreg('%BA', $base);
68 $obj->setreg('@OSFH', $devnull);
69 $obj->setreg('@TRFH', $devnull);
70 $obj->start()->run()->stop();
71 };
72 if ($@) {
73 print "not ok ", $testnum++, "\n";
74 print "not ok ", $testnum++, "\n";
75 print STDERR "Failed $name\n";
76 next;
77 }
78 my $os = $obj->splat;
79 if (defined $os) {
80 print defined $splat && $os == $splat ? "" : "not ", "ok ", $testnum++, "\n";
81 print defined $splat && $os == $splat ? "" : "not ", "ok ", $testnum++, "\n";
82 print STDERR "Failed $name (splat=$os)\n" unless defined $splat && $os == $splat;
83 next;
84 } else {
85 print defined $splat ? "not " : "", "ok ", $testnum++, "\n";
86 print STDERR "Failed $name\n" if defined $splat;
87 }
88 my $v = eval { $obj->getreg($out->[0])->number };
89 if ($@) {
90 print "not ok ", $testnum++, "\n";
91 print STDERR "Failed $name: $@";
92 next;
93 }
94 print STDERR "Failed $name ($v != $out->[1])\n" if $v != $out->[1];
95 print $v == $out->[1] ? '' : 'not ', "ok ", $testnum++, "\n";
96 }
97