Alt-FFI-Raw-Platypus

 view release on metacpan or  search on metacpan

t/ffi_raw_callback.t  view on Meta::CPAN

use Test2::V0 -no_srand => 1;
use Test2::Tools::FFI;
use lib 't/lib';
use FFI::Raw;

my($shared) = ffi->test->lib;

subtest 'callbacks' => sub {

  my $take_one_int_callback = FFI::Raw->new(
    $shared, 'take_one_int_callback',
    FFI::Raw::void, FFI::Raw::ptr
  );

  my $func1 = sub {
    my $num = shift;
    is($num, 42);
  };

  my $cb1 = FFI::Raw::callback($func1, FFI::Raw::void, FFI::Raw::int);

  $take_one_int_callback->call($cb1);
  $take_one_int_callback->($cb1);

  ok(1, "survived the call");

  my $return_int_callback = FFI::Raw->new(
    $shared, 'return_int_callback',
    FFI::Raw::int, FFI::Raw::ptr
  );

  my $func2 = sub {
    my $num = shift;

    return $num + 15;
  };

  my $cb2 = FFI::Raw::callback($func2, FFI::Raw::int, FFI::Raw::int);

  my $check1 = $return_int_callback->call($cb2);
  my $check2 = $return_int_callback->($cb2);

  ok(1, "survived the call");

  is($check1, (42 + 15), "returned @{[ (42+15) ]}");
  is($check2, (42 + 15), "returned @{[ (42+15) ]}");

  sub func3 {
    my $num = shift;

    return $num + 15;
  };

  my $cb3 = FFI::Raw::callback(\&func3, FFI::Raw::int, FFI::Raw::int);

  $check1 = $return_int_callback->call($cb3);
  $check2 = $return_int_callback->($cb3);

  ok(1, "survived the call (anonymous subroutine)");

  is($check1, (42 + 15), "returned @{[ (42+15) ]}");
  is($check2, (42 + 15), "returned @{[ (42+15) ]}");

  my $str_value = "foo";
  my $cb4 = FFI::Raw::callback(sub { $str_value }, FFI::Raw::str);

  ok(1, "survived the call");



( run in 1.217 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )