Evo
view release on metacpan or search on metacpan
t/evo/promise/promise/driver_resolve.t view on Meta::CPAN
{
package MyTestPromise;
use Evo -Class;
with 'Evo::Promise::Role';
sub postpone ($self, $code) {
}
package My::Thenable;
use Evo '-Class *';
has 'then_fn';
sub then { $_[0]->then_fn->(@_); }
}
sub p { MyTestPromise->new(@_) }
VALUE: {
my $p = p();
$p->d_resolve('VAL');
ok is_fulfilled_with 'VAL', $p;
}
BLESSED_OBJ: {
my $p = p();
$p->d_resolve(my $obj = bless {}, 'My::Obj');
ok is_fulfilled_with $obj, $p;
}
BLESSED_REF: {
my $p = p();
$p->d_resolve('VAL');
ok is_fulfilled_with 'VAL', $p;
}
SAME_OBJ: {
my $p = p();
$p->d_resolve($p);
ok is_rejected_with 'TypeError', $p;
}
# promise
FULFILLED: {
my $p = p();
my $f = p()->d_fulfill(0);
$p->d_resolve($f);
ok is_fulfilled_with 0 => $p;
}
REJECTED: {
my $p = p();
my $r = p()->d_reject(0);
$p->d_resolve($r);
ok is_rejected_with 0 => $p;
}
LOCKED: {
my $p = p();
my $pending = p();
$p->d_resolve($pending);
ok is_locked_in $pending => $p;
}
# thenable
THENABLE_ASYNC: {
my $th = My::Thenable->new(then_fn => sub { });
my $p = p();
$p->d_resolve($th);
ok !$p->d_settled;
}
THENABLE_CALLS_REJECT: {
my $th = My::Thenable->new(then_fn => sub { $_[2]->('R') });
my $p = p();
$p->d_resolve($th);
ok is_rejected_with 'R', $p;
}
THENABLE_CALLS_RESOLVE_WITH_VALUE: {
my $th = My::Thenable->new(then_fn => sub { $_[1]->('V') });
my $p = p();
$p->d_resolve($th);
ok is_fulfilled_with 'V', $p;
}
THENABLE_CALLS_RESOLVE_WITH_THENABLE: {
my $called;
my $th2 = My::Thenable->new(then_fn => sub { $called++; $_[1]->('V') });
my $th1 = My::Thenable->new(then_fn => sub { $called++; $_[1]->($th2) });
my $p = p();
$p->d_resolve($th1);
ok is_fulfilled_with 'V', $p;
is $called, 2;
}
done_testing;
( run in 0.672 second using v1.01-cache-2.11-cpan-364913b4093 )