The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use Test::More tests => 3;

BEGIN { use_ok('Module::AnyEvent::Helper::PPI::Transform'); }

my $target = <<'EOF';
package Test;

use strict;
use warnings;

sub new
{
	return bless {};
}

sub func1
{
	return 1;
}

my $ref = { func1 => 1, 1 + func1 => 2 };

sub func2
{
	return 2;
}

sub func3
{
	my ($self, $arg) = @_;
	return func1 (0) if $arg == $ref->{func1};
	return func2() if $arg == 2;
	return func4();
}
1;
EOF

my $result = <<'EOF';
use AnyEvent;use Module::AnyEvent::Helper;package Test;

use strict;
use warnings;





my $ref = { func1 => 1, 1 + func1 => 2 };



sub func3_async
{my $___cv___ = AE::cv;
	my ($self, $arg) = @_;
	Module::AnyEvent::Helper::bind_scalar($___cv___, func1_async(0), sub {
return shift->recv()  if $arg == $ref->{func1};
	Module::AnyEvent::Helper::bind_scalar($___cv___, func2_async(), sub {
return shift->recv() if $arg == 2;
	Module::AnyEvent::Helper::bind_scalar($___cv___, func4_async(), sub {
return shift->recv();
});});});return $___cv___;}
1;Module::AnyEvent::Helper::strip_async_all(-exclude => [qw()]);1;
EOF

my $trans = Module::AnyEvent::Helper::PPI::Transform->new(
	-remove_func => [qw(func1 func2)],
	-translate_func => [qw(func3)],
	-replace_func => [qw(func4)],
	-delete_func => [qw(new)],
);
ok($trans->apply(\$target));
# TODO: Maybe it is adequate to check significant elements only
is($target, $result);