summaryrefslogtreecommitdiff
path: root/t/70await+feature-class.t
diff options
context:
space:
mode:
Diffstat (limited to 't/70await+feature-class.t')
-rw-r--r--t/70await+feature-class.t70
1 files changed, 70 insertions, 0 deletions
diff --git a/t/70await+feature-class.t b/t/70await+feature-class.t
new file mode 100644
index 0000000..782d886
--- /dev/null
+++ b/t/70await+feature-class.t
@@ -0,0 +1,70 @@
+#!/usr/bin/perl
+
+use v5.14;
+use warnings;
+
+use Test2::V0 0.000148; # is_oneref
+
+BEGIN {
+ plan skip_all => "Future >= 0.49 is not available"
+ unless eval { require Future;
+ Future->VERSION( '0.49' ) };
+ plan skip_all => "Future::AsyncAwait >= 0.45 is not available"
+ unless eval { require Future::AsyncAwait;
+ Future::AsyncAwait->VERSION( '0.45' ) };
+ # version 5.37.10 added the ability to start_subparse() with CVf_IsMETHOD,
+ # which we need
+ plan skip_all => "feature 'class' is not available"
+ unless $^V ge v5.37.10;
+ plan skip_all => "XS::Parse::Sublike >= 0.17 is not in use"
+ unless $XS::Parse::Sublike::VERSION >= 0.17;
+
+ # If Future::XS is installed, then check it's at least 0.08; earlier
+ # versions will crash
+ if( eval { require Future::XS } ) {
+ plan skip_all => "Future::XS is installed but it is older than 0.08"
+ unless eval { Future::AsyncAwait->VERSION( '0.08' ); };
+ }
+
+ diag( "Future::AsyncAwait $Future::AsyncAwait::VERSION, " .
+ "core perl version $^V" );
+}
+
+use Future::AsyncAwait;
+
+use feature 'class';
+no warnings 'experimental::class';
+
+# async method
+{
+ class Thunker {
+ field $_times_thunked = 0;
+
+ method count { $_times_thunked }
+
+ async method thunk {
+ my ( $f ) = @_;
+ await $f;
+ $_times_thunked++;
+ return "result";
+ }
+ }
+
+ my $thunker = Thunker->new;
+ is_oneref( $thunker, 'after ->new' );
+
+ my $f1 = Future->new;
+ my $fret = $thunker->thunk( $f1 );
+ is_refcount( $thunker, 2, 'during async sub' );
+
+ is( $thunker->count, 0, 'count is 0 before $f1->done' );
+
+ $f1->done;
+
+ is_oneref( $thunker, 'after ->done' );
+
+ is( $thunker->count, 1, 'count is 1 after $f1->done' );
+ is( $fret->get, "result", '$fret for await in async method' );
+}
+
+done_testing;