xref: /openbsd/gnu/usr.bin/perl/ext/Opcode/t/Opcode.t (revision cca36db2)
1#!./perl -w
2
3$|=1;
4
5BEGIN {
6    require Config; import Config;
7    if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
8        print "1..0\n";
9        exit 0;
10    }
11}
12
13use Opcode qw(
14	opcodes opdesc opmask verify_opset
15	opset opset_to_ops opset_to_hex invert_opset
16	opmask_add full_opset empty_opset define_optag
17);
18
19use strict;
20
21my $t = 1;
22my $last_test; # initalised at end
23print "1..$last_test\n";
24
25my($s1, $s2, $s3);
26my(@o1, @o2, @o3);
27
28# --- opset_to_ops and opset
29
30my @empty_l = opset_to_ops(empty_opset);
31print @empty_l == 0 ?   "ok $t\n" : "not ok $t\n"; $t++;
32
33my @full_l1  = opset_to_ops(full_opset);
34print @full_l1 == opcodes() ? "ok $t\n" : "not ok $t\n"; $t++;
35my @full_l2 = @full_l1;	# = opcodes();	# XXX to be fixed
36print "@full_l1" eq "@full_l2" ? "ok $t\n" : "not ok $t\n"; $t++;
37
38@empty_l = opset_to_ops(opset(':none'));
39print @empty_l == 0 ?   "ok $t\n" : "not ok $t\n"; $t++;
40
41my @full_l3 = opset_to_ops(opset(':all'));
42print  @full_l1  ==  @full_l3  ? "ok $t\n" : "not ok $t\n"; $t++;
43print "@full_l1" eq "@full_l3" ? "ok $t\n" : "not ok $t\n"; $t++;
44
45die $t unless $t == 7;
46$s1 = opset(      'padsv');
47$s2 = opset($s1,  'padav');
48$s3 = opset($s2, '!padav');
49print $s1 eq $s2 ? "not ok $t\n" : "ok $t\n"; ++$t;
50print $s1 eq $s3 ? "ok $t\n" : "not ok $t\n"; ++$t;
51
52# --- define_optag
53
54print eval { opset(':_tst_') } ? "not ok $t\n" : "ok $t\n"; ++$t;
55define_optag(":_tst_", opset(qw(padsv padav padhv)));
56print eval { opset(':_tst_') } ? "ok $t\n" : "not ok $t\n"; ++$t;
57
58# --- opdesc and opcodes
59
60die $t unless $t == 11;
61print opdesc("gv") eq "glob value" ? "ok $t\n" : "not ok $t\n"; $t++;
62my @desc = opdesc(':_tst_','stub');
63print "@desc" eq "private variable private array private hash stub"
64				    ? "ok $t\n" : "not ok $t\n#@desc\n"; $t++;
65print opcodes() ? "ok $t\n" : "not ok $t\n"; $t++;
66print "ok $t\n"; ++$t;
67
68# --- invert_opset
69
70$s1 = opset(qw(fileno padsv padav));
71@o2 = opset_to_ops(invert_opset($s1));
72print @o2 == opcodes-3 ? "ok $t\n" : "not ok $t\n"; $t++;
73
74# --- opmask
75
76die $t unless $t == 16;
77print opmask() eq empty_opset() ? "ok $t\n" : "not ok $t\n"; $t++;	# work
78print length opmask() == int((opcodes()+7)/8) ? "ok $t\n" : "not ok $t\n"; $t++;
79
80# --- verify_opset
81
82print verify_opset($s1) && !verify_opset(42) ? "ok $t\n":"not ok $t\n"; $t++;
83
84# --- opmask_add
85
86opmask_add(opset(qw(fileno)));	# add to global op_mask
87print eval 'fileno STDOUT' ? "not ok $t\n" : "ok $t\n";	$t++; # fail
88print $@ =~ /'fileno' trapped/ ? "ok $t\n" : "not ok $t\n# $@\n"; $t++;
89
90# --- check use of bit vector ops on opsets
91
92$s1 = opset('padsv');
93$s2 = opset('padav');
94$s3 = opset('padsv', 'padav', 'padhv');
95
96# Non-negated
97print (($s1 | $s2) eq opset($s1,$s2) ? "ok $t\n":"not ok $t\n"); $t++;
98print (($s2 & $s3) eq opset($s2)     ? "ok $t\n":"not ok $t\n"); $t++;
99print (($s2 ^ $s3) eq opset('padsv','padhv') ? "ok $t\n":"not ok $t\n"); $t++;
100
101# Negated, e.g., with possible extra bits in last byte beyond last op bit.
102# The extra bits mean we can't just say ~mask eq invert_opset(mask).
103
104@o1 = opset_to_ops(           ~ $s3);
105@o2 = opset_to_ops(invert_opset $s3);
106print "@o1" eq "@o2" ? "ok $t\n":"not ok $t\n"; $t++;
107
108# --- finally, check some opname assertions
109
110foreach(@full_l1) { die "bad opname: $_" if /\W/ or /^\d/ }
111
112print "ok $last_test\n";
113BEGIN { $last_test = 25 }
114