xref: /openbsd-src/gnu/usr.bin/perl/dist/threads-shared/t/blessed.t (revision b39c515898423c8d899e35282f4b395f7cad3298)
1*b39c5158Smillertuse strict;
2*b39c5158Smillertuse warnings;
3*b39c5158Smillert
4*b39c5158SmillertBEGIN {
5*b39c5158Smillert    use Config;
6*b39c5158Smillert    if (! $Config{'useithreads'}) {
7*b39c5158Smillert        print("1..0 # SKIP Perl not compiled with 'useithreads'\n");
8*b39c5158Smillert        exit(0);
9*b39c5158Smillert    }
10*b39c5158Smillert}
11*b39c5158Smillert
12*b39c5158Smillertuse ExtUtils::testlib;
13*b39c5158Smillert
14*b39c5158Smillertsub ok {
15*b39c5158Smillert    my ($id, $ok, $name) = @_;
16*b39c5158Smillert
17*b39c5158Smillert    # You have to do it this way or VMS will get confused.
18*b39c5158Smillert    if ($ok) {
19*b39c5158Smillert        print("ok $id - $name\n");
20*b39c5158Smillert    } else {
21*b39c5158Smillert        print("not ok $id - $name\n");
22*b39c5158Smillert        printf("# Failed test at line %d\n", (caller)[2]);
23*b39c5158Smillert    }
24*b39c5158Smillert
25*b39c5158Smillert    return ($ok);
26*b39c5158Smillert}
27*b39c5158Smillert
28*b39c5158SmillertBEGIN {
29*b39c5158Smillert    $| = 1;
30*b39c5158Smillert    print("1..37\n");   ### Number of tests that will be run ###
31*b39c5158Smillert};
32*b39c5158Smillert
33*b39c5158Smillertuse threads;
34*b39c5158Smillertuse threads::shared;
35*b39c5158Smillertok(1, 1, 'Loaded');
36*b39c5158Smillert
37*b39c5158Smillert### Start of Testing ###
38*b39c5158Smillert
39*b39c5158Smillertmy ($hobj, $aobj, $sobj) : shared;
40*b39c5158Smillert
41*b39c5158Smillert$hobj = &share({});
42*b39c5158Smillert$aobj = &share([]);
43*b39c5158Smillertmy $sref = \do{ my $x };
44*b39c5158Smillertshare($sref);
45*b39c5158Smillert$sobj = $sref;
46*b39c5158Smillert
47*b39c5158Smillertthreads->create(sub {
48*b39c5158Smillert                # Bless objects
49*b39c5158Smillert                bless $hobj, 'foo';
50*b39c5158Smillert                bless $aobj, 'bar';
51*b39c5158Smillert                bless $sobj, 'baz';
52*b39c5158Smillert
53*b39c5158Smillert                # Add data to objects
54*b39c5158Smillert                $$aobj[0] = bless(&share({}), 'yin');
55*b39c5158Smillert                $$aobj[1] = bless(&share([]), 'yang');
56*b39c5158Smillert                $$aobj[2] = $sobj;
57*b39c5158Smillert
58*b39c5158Smillert                $$hobj{'hash'}   = bless(&share({}), 'yin');
59*b39c5158Smillert                $$hobj{'array'}  = bless(&share([]), 'yang');
60*b39c5158Smillert                $$hobj{'scalar'} = $sobj;
61*b39c5158Smillert
62*b39c5158Smillert                $$sobj = 3;
63*b39c5158Smillert
64*b39c5158Smillert                # Test objects in child thread
65*b39c5158Smillert                ok(2, ref($hobj) eq 'foo', "hash blessing does work");
66*b39c5158Smillert                ok(3, ref($aobj) eq 'bar', "array blessing does work");
67*b39c5158Smillert                ok(4, ref($sobj) eq 'baz', "scalar blessing does work");
68*b39c5158Smillert                ok(5, $$sobj eq '3', "scalar contents okay");
69*b39c5158Smillert
70*b39c5158Smillert                ok(6, ref($$aobj[0]) eq 'yin', "blessed hash in array");
71*b39c5158Smillert                ok(7, ref($$aobj[1]) eq 'yang', "blessed array in array");
72*b39c5158Smillert                ok(8, ref($$aobj[2]) eq 'baz', "blessed scalar in array");
73*b39c5158Smillert                ok(9, ${$$aobj[2]} eq '3', "blessed scalar in array contents");
74*b39c5158Smillert
75*b39c5158Smillert                ok(10, ref($$hobj{'hash'}) eq 'yin', "blessed hash in hash");
76*b39c5158Smillert                ok(11, ref($$hobj{'array'}) eq 'yang', "blessed array in hash");
77*b39c5158Smillert                ok(12, ref($$hobj{'scalar'}) eq 'baz', "blessed scalar in hash");
78*b39c5158Smillert                ok(13, ${$$hobj{'scalar'}} eq '3', "blessed scalar in hash contents");
79*b39c5158Smillert
80*b39c5158Smillert             })->join;
81*b39c5158Smillert
82*b39c5158Smillert# Test objects in parent thread
83*b39c5158Smillertok(14, ref($hobj) eq 'foo', "hash blessing does work");
84*b39c5158Smillertok(15, ref($aobj) eq 'bar', "array blessing does work");
85*b39c5158Smillertok(16, ref($sobj) eq 'baz', "scalar blessing does work");
86*b39c5158Smillertok(17, $$sobj eq '3', "scalar contents okay");
87*b39c5158Smillert
88*b39c5158Smillertok(18, ref($$aobj[0]) eq 'yin', "blessed hash in array");
89*b39c5158Smillertok(19, ref($$aobj[1]) eq 'yang', "blessed array in array");
90*b39c5158Smillertok(20, ref($$aobj[2]) eq 'baz', "blessed scalar in array");
91*b39c5158Smillertok(21, ${$$aobj[2]} eq '3', "blessed scalar in array contents");
92*b39c5158Smillert
93*b39c5158Smillertok(22, ref($$hobj{'hash'}) eq 'yin', "blessed hash in hash");
94*b39c5158Smillertok(23, ref($$hobj{'array'}) eq 'yang', "blessed array in hash");
95*b39c5158Smillertok(24, ref($$hobj{'scalar'}) eq 'baz', "blessed scalar in hash");
96*b39c5158Smillertok(25, ${$$hobj{'scalar'}} eq '3', "blessed scalar in hash contents");
97*b39c5158Smillert
98*b39c5158Smillertthreads->create(sub {
99*b39c5158Smillert                    # Rebless objects
100*b39c5158Smillert                    bless $hobj, 'oof';
101*b39c5158Smillert                    bless $aobj, 'rab';
102*b39c5158Smillert                    bless $sobj, 'zab';
103*b39c5158Smillert
104*b39c5158Smillert                    my $data = $$aobj[0];
105*b39c5158Smillert                    bless $data, 'niy';
106*b39c5158Smillert                    $$aobj[0] = $data;
107*b39c5158Smillert                    $data = $$aobj[1];
108*b39c5158Smillert                    bless $data, 'gnay';
109*b39c5158Smillert                    $$aobj[1] = $data;
110*b39c5158Smillert
111*b39c5158Smillert                    $data = $$hobj{'hash'};
112*b39c5158Smillert                    bless $data, 'niy';
113*b39c5158Smillert                    $$hobj{'hash'} = $data;
114*b39c5158Smillert                    $data = $$hobj{'array'};
115*b39c5158Smillert                    bless $data, 'gnay';
116*b39c5158Smillert                    $$hobj{'array'} = $data;
117*b39c5158Smillert
118*b39c5158Smillert                    $$sobj = 'test';
119*b39c5158Smillert                })->join();
120*b39c5158Smillert
121*b39c5158Smillert# Test reblessing
122*b39c5158Smillertok(26, ref($hobj) eq 'oof', "hash reblessing does work");
123*b39c5158Smillertok(27, ref($aobj) eq 'rab', "array reblessing does work");
124*b39c5158Smillertok(28, ref($sobj) eq 'zab', "scalar reblessing does work");
125*b39c5158Smillertok(29, $$sobj eq 'test', "scalar contents okay");
126*b39c5158Smillert
127*b39c5158Smillertok(30, ref($$aobj[0]) eq 'niy', "reblessed hash in array");
128*b39c5158Smillertok(31, ref($$aobj[1]) eq 'gnay', "reblessed array in array");
129*b39c5158Smillertok(32, ref($$aobj[2]) eq 'zab', "reblessed scalar in array");
130*b39c5158Smillertok(33, ${$$aobj[2]} eq 'test', "reblessed scalar in array contents");
131*b39c5158Smillert
132*b39c5158Smillertok(34, ref($$hobj{'hash'}) eq 'niy', "reblessed hash in hash");
133*b39c5158Smillertok(35, ref($$hobj{'array'}) eq 'gnay', "reblessed array in hash");
134*b39c5158Smillertok(36, ref($$hobj{'scalar'}) eq 'zab', "reblessed scalar in hash");
135*b39c5158Smillertok(37, ${$$hobj{'scalar'}} eq 'test', "reblessed scalar in hash contents");
136*b39c5158Smillert
137*b39c5158Smillertexit(0);
138*b39c5158Smillert
139*b39c5158Smillert# EOF
140