This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix a problem with jump-tries, add (?FAIL) pattern.
[perl5.git] / t / op / vec.t
CommitLineData
a687059c
LW
1#!./perl
2
60ab2483
SP
3BEGIN {
4 chdir 't' if -d 't';
5 @INC = qw(. ../lib);
6}
7
8require "test.pl";
9plan( tests => 31 );
a687059c 10
210db7fc
PP
11my $Is_EBCDIC = (ord('A') == 193) ? 1 : 0;
12
60ab2483
SP
13is(vec($foo,0,1), 0);
14is(length($foo), 0);
a687059c 15vec($foo,0,1) = 1;
60ab2483
SP
16is(length($foo), 1);
17is(unpack('C',$foo), 1);
18is(vec($foo,0,1), 1);
a687059c 19
60ab2483 20is(vec($foo,20,1), 0);
a687059c 21vec($foo,20,1) = 1;
60ab2483
SP
22is(vec($foo,20,1), 1);
23is(length($foo), 3);
24is(vec($foo,1,8), 0);
a687059c 25vec($foo,1,8) = 0xf1;
60ab2483
SP
26is(vec($foo,1,8), 0xf1);
27is((unpack('C',substr($foo,1,1)) & 255), 0xf1);
28is(vec($foo,2,4), 1);;
29is(vec($foo,3,4), 15);
deb3007b 30vec($Vec, 0, 32) = 0xbaddacab;
60ab2483
SP
31is($Vec, "\xba\xdd\xac\xab");
32is(vec($Vec, 0, 32), 3135089835);
a687059c 33
4ebbc975
GS
34# ensure vec() handles numericalness correctly
35$foo = $bar = $baz = 0;
36vec($foo = 0,0,1) = 1;
37vec($bar = 0,1,1) = 1;
38$baz = $foo | $bar;
60ab2483
SP
39ok($foo eq "1" && $foo == 1);
40ok($bar eq "2" && $bar == 2);
41ok("$foo $bar $baz" eq "1 2 3");
fe58ced6
MG
42
43# error cases
44
45$x = eval { vec $foo, 0, 3 };
60ab2483
SP
46like($@, /^Illegal number of bits in vec/);
47$@ = undef;
fe58ced6 48$x = eval { vec $foo, 0, 0 };
60ab2483
SP
49like($@, /^Illegal number of bits in vec/);
50$@ = undef;
fe58ced6 51$x = eval { vec $foo, 0, -13 };
60ab2483
SP
52like($@, /^Illegal number of bits in vec/);
53$@ = undef;
fe58ced6 54$x = eval { vec($foo, -1, 4) = 2 };
60ab2483
SP
55like($@, /^Illegal number of bits in vec/);
56$@ = undef;
57ok(! vec('abcd', 7, 8));
246fae53
MG
58
59# UTF8
60# N.B. currently curiously coded to circumvent bugs elswhere in UTF8 handling
61
62$foo = "\x{100}" . "\xff\xfe";
63$x = substr $foo, 1;
60ab2483
SP
64is(vec($x, 0, 8), 255);
65$@ = undef;
246fae53 66eval { vec($foo, 1, 8) };
60ab2483
SP
67ok(! $@);
68$@ = undef;
246fae53 69eval { vec($foo, 1, 8) = 13 };
60ab2483 70ok(! $@);
210db7fc 71if ($Is_EBCDIC) {
60ab2483 72 is($foo, "\x8c\x0d\xff\x8a\x69");
210db7fc
PP
73}
74else {
60ab2483 75 is($foo, "\xc4\x0d\xc3\xbf\xc3\xbe");
210db7fc 76}
33b45480 77$foo = "\x{100}" . "\xff\xfe";
246fae53
MG
78$x = substr $foo, 1;
79vec($x, 2, 4) = 7;
60ab2483 80is($x, "\xff\xf7");
246fae53
MG
81
82# mixed magic
83
84$foo = "\x61\x62\x63\x64\x65\x66";
60ab2483 85is(vec(substr($foo, 2, 2), 0, 16), 25444);
246fae53 86vec(substr($foo, 1,3), 5, 4) = 3;
60ab2483 87is($foo, "\x61\x62\x63\x34\x65\x66");
24aef97f
HS
88
89# A variation of [perl #20933]
90{
91 my $s = "";
92 vec($s, 0, 1) = 0;
93 vec($s, 1, 1) = 1;
94 my @r;
95 $r[$_] = \ vec $s, $_, 1 for (0, 1);
60ab2483 96 ok(!(${ $r[0] } != 0 || ${ $r[1] } != 1));
24aef97f 97}