This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
threads 1.64 (repost)
[perl5.git] / ext / threads / t / context.t
CommitLineData
9d9ff5b1
JH
1use strict;
2use warnings;
3
4BEGIN {
5 if ($ENV{'PERL_CORE'}){
6 chdir 't';
7 unshift @INC, '../lib';
8 }
9 use Config;
10 if (! $Config{'useithreads'}) {
11 print("1..0 # Skip: Perl not compiled with 'useithreads'\n");
12 exit(0);
13 }
14}
15
16use ExtUtils::testlib;
17
18use threads;
9d9ff5b1
JH
19
20BEGIN {
58a3a76c
JH
21 eval {
22 require threads::shared;
f3086ff0 23 threads::shared->import();
58a3a76c
JH
24 };
25 if ($@ || ! $threads::shared::threads_shared) {
26 print("1..0 # Skip: threads::shared not available\n");
27 exit(0);
28 }
29
9d9ff5b1 30 $| = 1;
ead32952 31 print("1..31\n"); ### Number of tests that will be run ###
9d9ff5b1
JH
32};
33
4dcb9e53
JH
34my $TEST;
35BEGIN {
36 share($TEST);
37 $TEST = 1;
38}
9d9ff5b1
JH
39
40ok(1, 'Loaded');
41
42sub ok {
43 my ($ok, $name) = @_;
44
45 lock($TEST);
46 my $id = $TEST++;
47
48 # You have to do it this way or VMS will get confused.
49 if ($ok) {
50 print("ok $id - $name\n");
51 } else {
52 print("not ok $id - $name\n");
53 printf("# Failed test at line %d\n", (caller)[2]);
54 }
55
56 return ($ok);
57}
58
59
60### Start of Testing ###
61
62sub foo
63{
64 my $context = shift;
65 my $wantarray = wantarray();
66
67 if ($wantarray) {
da140a40 68 ok($context eq 'array', 'Array/list context');
9d9ff5b1
JH
69 return ('array');
70 } elsif (defined($wantarray)) {
71 ok($context eq 'scalar', 'Scalar context');
72 return 'scalar';
73 } else {
74 ok($context eq 'void', 'Void context');
75 return;
76 }
77}
78
79my ($thr) = threads->create('foo', 'array');
80my ($res) = $thr->join();
81ok($res eq 'array', 'Implicit array context');
82
83$thr = threads->create('foo', 'scalar');
84$res = $thr->join();
85ok($res eq 'scalar', 'Implicit scalar context');
86
87threads->create('foo', 'void');
88($thr) = threads->list();
89$res = $thr->join();
90ok(! defined($res), 'Implicit void context');
91
92$thr = threads->create({'context' => 'array'}, 'foo', 'array');
93($res) = $thr->join();
94ok($res eq 'array', 'Explicit array context');
95
96($thr) = threads->create({'scalar' => 'scalar'}, 'foo', 'scalar');
97$res = $thr->join();
98ok($res eq 'scalar', 'Explicit scalar context');
99
100$thr = threads->create({'void' => 1}, 'foo', 'void');
101$res = $thr->join();
102ok(! defined($res), 'Explicit void context');
103
ead32952
JH
104
105sub bar
106{
107 my $context = shift;
108 my $wantarray = threads->wantarray();
109
110 if ($wantarray) {
da140a40
JH
111 ok($context eq 'list', 'Array/list context');
112 return ('list');
ead32952
JH
113 } elsif (defined($wantarray)) {
114 ok($context eq 'scalar', 'Scalar context');
115 return 'scalar';
116 } else {
117 ok($context eq 'void', 'Void context');
118 return;
119 }
120}
121
da140a40 122($thr) = threads->create('bar', 'list');
ead32952
JH
123my $ctx = $thr->wantarray();
124ok($ctx, 'Implicit array context');
125($res) = $thr->join();
da140a40 126ok($res eq 'list', 'Implicit array context');
ead32952
JH
127
128$thr = threads->create('bar', 'scalar');
129$ctx = $thr->wantarray();
130ok(defined($ctx) && !$ctx, 'Implicit scalar context');
131$res = $thr->join();
132ok($res eq 'scalar', 'Implicit scalar context');
133
134threads->create('bar', 'void');
135($thr) = threads->list();
136$ctx = $thr->wantarray();
137ok(! defined($ctx), 'Implicit void context');
138$res = $thr->join();
139ok(! defined($res), 'Implicit void context');
140
da140a40 141$thr = threads->create({'context' => 'list'}, 'bar', 'list');
ead32952
JH
142$ctx = $thr->wantarray();
143ok($ctx, 'Explicit array context');
144($res) = $thr->join();
da140a40 145ok($res eq 'list', 'Explicit array context');
ead32952
JH
146
147($thr) = threads->create({'scalar' => 'scalar'}, 'bar', 'scalar');
148$ctx = $thr->wantarray();
149ok(defined($ctx) && !$ctx, 'Explicit scalar context');
150$res = $thr->join();
151ok($res eq 'scalar', 'Explicit scalar context');
152
153$thr = threads->create({'void' => 1}, 'bar', 'void');
154$ctx = $thr->wantarray();
155ok(! defined($ctx), 'Explicit void context');
156$res = $thr->join();
157ok(! defined($res), 'Explicit void context');
158
9d9ff5b1 159# EOF