create ReadChannel object to allow moving Shere logic into connect
[scpubgit/Object-Remote.git] / t / start_core.t
CommitLineData
11e7c8a5 1use strictures 1;
2use Test::More;
a7111726 3use Object::Remote;
4use File::Spec;
11e7c8a5 5
6{
7 package S1S;
8
9 use Moo;
10
11 sub get_s2 {
12 S2S->new
13 }
14}
15
16{
17 package S1F;
18
19 use Object::Remote::Future;
20 use Moo;
21
22 our $C;
23
24 sub get_s2 {
9822fc76 25 shift->maybe::start::_real_get_s2;
26 }
27
28 sub _real_get_s2 {
11e7c8a5 29 future {
30 my $f = shift;
a7111726 31 $C = sub { $f->done(S2F->new); undef($f); undef($C); };
11e7c8a5 32 $f;
33 }
34 }
35}
36
37{
38 package S2S;
39
40 use Moo;
41
42 sub get_s3 { 'S3' }
43}
44
45{
46 package S2F;
47
48 use Object::Remote::Future;
49 use Moo;
50
51 our $C;
52
53 sub get_s3 {
54 future {
55 my $f = shift;
a7111726 56 $C = sub { $f->done('S3'); undef($f); undef($C); };
11e7c8a5 57 $f;
58 }
59 }
60}
61
62my $res;
63
64S1S->start::get_s2->then::get_s3->on_ready(sub { ($res) = $_[0]->get });
65
66is($res, 'S3', 'Synchronous code ok');
67
68undef($res);
69
70S1F->start::get_s2->then::get_s3->on_ready(sub { ($res) = $_[0]->get });
71
72ok(!$S2F::C, 'Second future not yet constructed');
73
74$S1F::C->();
75
76ok($S2F::C, 'Second future constructed after first future completed');
77
78ok(!$res, 'Nothing happened yet');
79
80$S2F::C->();
81
82is($res, 'S3', 'Asynchronous code ok');
83
a7111726 84is(S1S->get_s2->get_s3, 'S3', 'Sync without start');
85
befabdee 86Object::Remote->current_loop->watch_time(
87 after => 0.1,
88 code => sub {
89 $S1F::C->();
90 Object::Remote->current_loop->watch_time(
91 after => 0.1,
92 code => sub { $S2F::C->() }
93 );
a7111726 94 }
95);
96
97is(S1F->get_s2->get_s3, 'S3', 'Async without start');
98
11e7c8a5 99done_testing;