1#!/usr/bin/perl
2
3use v5.10;
4use strict;
5use warnings;
6
7use Test::More;
8
9use Future;
10
11our $VAR = "";
12# around Future::wrap_cb => sub { ... }
13{
14   my $orig = Future->can( 'wrap_cb' );
15   no warnings 'redefine';
16   *Future::wrap_cb = sub {
17      my $cb = $orig->(@_);
18      my $saved_VAR = $VAR;
19
20      return sub {
21         local $VAR = $saved_VAR;
22         $cb->(@_);
23      };
24   };
25}
26
27# on_ready
28{
29   my $result;
30   my $f = Future->new;
31
32   {
33      local $VAR = "inner";
34      $f->on_ready( sub { $result = $VAR } );
35   }
36
37   $f->done;
38
39   is( $result, "inner", 'on_ready wraps CB' );
40}
41
42# on_done
43{
44   my $result;
45   my $f = Future->new;
46
47   {
48      local $VAR = "inner";
49      $f->on_done( sub { $result = $VAR } );
50   }
51
52   $f->done;
53
54   is( $result, "inner", 'on_done wraps CB' );
55}
56
57# on_fail
58{
59   my $result;
60   my $f = Future->new;
61
62   {
63      local $VAR = "inner";
64      $f->on_fail( sub { $result = $VAR } );
65   }
66
67   $f->fail( "Failed" );
68
69   is( $result, "inner", 'on_fail wraps CB' );
70}
71
72# then
73{
74   my $result;
75   my $f = Future->new;
76
77   my $f2;
78   {
79      local $VAR = "inner";
80      $f2 = $f->then( sub { $result = $VAR; Future->done } );
81   }
82
83   $f->done;
84
85   is( $result, "inner", 'then wraps CB' );
86}
87
88# else
89{
90   my $result;
91   my $f = Future->new;
92
93   my $f2;
94   {
95      local $VAR = "inner";
96      $f2 = $f->else( sub { $result = $VAR; Future->done } );
97   }
98
99   $f->fail( "Failed" );
100
101   is( $result, "inner", 'else wraps CB' );
102}
103
104# Other sequence methods all use the same ->_sequence so all should be fine
105
106done_testing;
107