1#!./perl
2
3BEGIN {
4    chdir 't' if -d 't';
5    require './test.pl';
6    set_up_inc('../lib');
7}
8
9##Literal test count since evals below can fail
10plan tests => 13;
11
12$a = 'ab' . 'c';	# compile time
13$b = 'def';
14
15$c = $a . $b;
16is( $c, 'abcdef', 'compile time concatenation' );
17
18$c .= 'xyz';
19is( $c, 'abcdefxyz', 'concat to self');
20
21$_ = $a;
22$_ .= $b;
23is( $_, 'abcdef', 'concat using $_');
24
25# test that when right argument of concat is UTF8, and is the same
26# variable as the target, and the left argument is not UTF8, it no
27# longer frees the wrong string.
28{
29    sub r2 {
30	my $string = '';
31	$string .= pack("U0a*", 'mnopqrstuvwx');
32	$string = "abcdefghijkl$string";
33    }
34
35    isnt(r2(), '', 'UTF8 concat does not free the wrong string');
36    isnt(r2(), '', 'second check');
37}
38
39# test that nul bytes get copied
40{
41    my ($a, $ab)   = ("a", "a\0b");
42    my ($ua, $uab) = map pack("U0a*", $_), $a, $ab;
43
44    my $ub = pack("U0a*", 'b');
45
46    #aa\0b
47    my $t1 = $a; $t1 .= $ab;
48    like( $t1, qr/b/, 'null bytes do not stop string copy, aa\0b');
49
50    #a\0a\0b
51    my $t2 = $a; $t2 .= $uab;
52    ok( eval '$t2 =~ /$ub/', '... a\0a\0b' );
53
54    #\0aa\0b
55    my $t3 = $ua; $t3 .= $ab;
56    ok( eval '$t3 =~ /$ub/', '... \0aa\0b' );
57
58    my $t4 = $ua; $t4 .= $uab;
59    ok( eval '$t4 =~ /$ub/', '... \0a\0a\0b' );
60
61    my $t5 = $a; $t5 = $ab . $t5;
62    like( $t5, qr/$ub/, '... a\0ba' );
63
64    my $t6 = $a; $t6 = $uab . $t6;
65    ok( eval '$t6 =~ /$ub/', '... \0a\0ba' );
66
67    my $t7 = $ua; $t7 = $ab . $t7;
68    like( $t7, qr/$ub/, '... a\0b\0a' );
69
70    my $t8 = $ua; $t8 = $uab . $t8;
71    ok( eval '$t8 =~ /$ub/', '... \0a\0b\0a' );
72}
73