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