summaryrefslogtreecommitdiff
path: root/dist/Thread-Queue/t/08_nothreads.t
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2009-09-28 17:00:50 +0100
committerNicholas Clark <nick@ccl4.org>2009-09-29 11:12:38 +0100
commite4c73f034798b83906105bd2b28ce3805d0fa348 (patch)
treef2674de541e0aa86361691763314e28adf933f29 /dist/Thread-Queue/t/08_nothreads.t
parent51bde7eebd4cedd091a03b9c38593f8e945fb4a9 (diff)
downloadperl-e4c73f034798b83906105bd2b28ce3805d0fa348.tar.gz
Move Thread::Queue from ext/ to dist/
Diffstat (limited to 'dist/Thread-Queue/t/08_nothreads.t')
-rw-r--r--dist/Thread-Queue/t/08_nothreads.t114
1 files changed, 114 insertions, 0 deletions
diff --git a/dist/Thread-Queue/t/08_nothreads.t b/dist/Thread-Queue/t/08_nothreads.t
new file mode 100644
index 0000000000..7ac43481b3
--- /dev/null
+++ b/dist/Thread-Queue/t/08_nothreads.t
@@ -0,0 +1,114 @@
+use strict;
+use warnings;
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}){
+ chdir('t');
+ unshift(@INC, '../lib');
+ }
+}
+
+use Test::More 'tests' => 32;
+
+use Thread::Queue;
+
+# Regular array
+my @ary1 = qw/foo bar baz/;
+push(@ary1, [ 1..3 ], { 'qux' => 99 });
+
+# Shared array
+my @ary2 :shared = (99, 21, 86);
+
+# Regular hash-based object
+my $obj1 = {
+ 'foo' => 'bar',
+ 'qux' => 99,
+ 'biff' => [ qw/fee fi fo/ ],
+ 'boff' => { 'bork' => 'true' },
+};
+bless($obj1, 'Foo');
+
+# Shared hash-based object
+my $obj2 = &threads::shared::share({});
+$$obj2{'bar'} = 86;
+$$obj2{'key'} = 'foo';
+bless($obj2, 'Bar');
+
+# Scalar ref
+my $sref1 = \do{ my $scalar = 'foo'; };
+
+# Shared scalar ref object
+my $sref2 = \do{ my $scalar = 69; };
+threads::shared::share($sref2);
+bless($sref2, 'Baz');
+
+# Ref of ref
+my $foo = [ 5, 'bork', { 'now' => 123 } ];
+my $bar = \$foo;
+my $baz = \$bar;
+my $qux = \$baz;
+is_deeply($$$$qux, $foo, 'Ref of ref');
+
+# Queue up items
+my $q = Thread::Queue->new(\@ary1, \@ary2);
+ok($q, 'New queue');
+is($q->pending(), 2, 'Queue count');
+$q->enqueue($obj1, $obj2);
+is($q->pending(), 4, 'Queue count');
+$q->enqueue($sref1, $sref2, $qux);
+is($q->pending(), 7, 'Queue count');
+
+# Process items in queue
+{
+ is($q->pending(), 7, 'Queue count in thread');
+
+ my $ref = $q->peek(3);
+ is(ref($ref), 'Bar', 'Item is object');
+
+ my $tary1 = $q->dequeue();
+ ok($tary1, 'Thread got item');
+ is(ref($tary1), 'ARRAY', 'Item is array ref');
+ is_deeply($tary1, \@ary1, 'Complex array');
+
+ my $tary2 = $q->dequeue();
+ ok($tary2, 'Thread got item');
+ is(ref($tary2), 'ARRAY', 'Item is array ref');
+ for (my $ii=0; $ii < @ary2; $ii++) {
+ is($$tary2[$ii], $ary2[$ii], 'Shared array element check');
+ }
+
+ my $tobj1 = $q->dequeue();
+ ok($tobj1, 'Thread got item');
+ is(ref($tobj1), 'Foo', 'Item is object');
+ is_deeply($tobj1, $obj1, 'Object comparison');
+
+ my $tobj2 = $q->dequeue();
+ ok($tobj2, 'Thread got item');
+ is(ref($tobj2), 'Bar', 'Item is object');
+ is($$tobj2{'bar'}, 86, 'Shared object element check');
+ is($$tobj2{'key'}, 'foo', 'Shared object element check');
+
+ my $tsref1 = $q->dequeue();
+ ok($tsref1, 'Thread got item');
+ is(ref($tsref1), 'SCALAR', 'Item is scalar ref');
+ is($$tsref1, 'foo', 'Scalar ref contents');
+
+ my $tsref2 = $q->dequeue();
+ ok($tsref2, 'Thread got item');
+ is(ref($tsref2), 'Baz', 'Item is object');
+ is($$tsref2, 69, 'Shared scalar ref contents');
+
+ my $qux = $q->dequeue();
+ is_deeply($$$$qux, $foo, 'Ref of ref');
+
+ is($q->pending(), 0, 'Empty queue');
+ my $nothing = $q->dequeue_nb();
+ ok(! defined($nothing), 'Nothing on queue');
+}
+
+# Check results of thread's activities
+is($q->pending(), 0, 'Empty queue');
+
+exit(0);
+
+# EOF