The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;

use AnyEvent;
use AnyEvent::Debounce;

{
    my $sent = 0;
    my $done = AnyEvent->condvar;
    my $d = AnyEvent::Debounce->new(
        front_triggered    => 0,
        always_reset_timer => 0,
        delay              => 2,
        cb                 => sub { $done->send([@_]) },
    );

    my $sender; $sender = AnyEvent->timer( after => 0, interval => 0.1, cb => sub {
        $d->send($sent);
        undef $sender if ++$sent > 9;
    });

    my $result = $done->recv;

    is $sent, 10, 'got 10 events before cb was called';
    is_deeply $result, [map { [$_] } 0..9], 'got the events we expected';
}

{
    my $sent = 0;
    my $done = AnyEvent->condvar;
    my $d = AnyEvent::Debounce->new(
        front_triggered    => 0,
        always_reset_timer => 1,
        delay              => 0.15,
        cb                 => sub { $done->send([@_]) },
    );

    my $sender; $sender = AnyEvent->timer( after => 0, interval => 0.1, cb => sub {
        $d->send($sent);
        undef $sender if ++$sent > 9;
    });

    my $result = $done->recv;

    is $sent, 10, 'got 10 events before cb was called';
    is_deeply $result, [map { [$_] } 0..9], 'got the events we expected';
}


{
    my $sent = 0;
    my $got  = 0;
    my $done = AnyEvent->condvar;

    my $d = AnyEvent::Debounce->new(
        front_triggered    => 1,
        always_reset_timer => 0,
        delay              => 1.5,
        cb                 => sub { $got++ },
    );

    $done->begin;
    my $waiter = AnyEvent->timer( after => 2, cb => sub { $done->end } );

    $done->begin;
    my $sender; $sender = AnyEvent->timer( after => 0, interval => 0.1, cb => sub {
        $d->send($sent);
        if(++$sent > 9){
            undef $sender;
            $done->end;
        }
    });

    $done->recv;

    is $sent, 10, 'sent 10 events';
    is $got, 1, 'got 1 event';
}

{
    my $sent = 0;
    my $got  = 0;
    my $done = AnyEvent->condvar;

    my $d = AnyEvent::Debounce->new(
        front_triggered    => 1,
        always_reset_timer => 1,
        delay              => 0.15,
        cb                 => sub { $got++ },
    );

    $done->begin;
    my $waiter = AnyEvent->timer( after => 2, cb => sub { $done->end } );

    $done->begin;
    my $sender; $sender = AnyEvent->timer( after => 0, interval => 0.1, cb => sub {
        $d->send($sent);
        if(++$sent > 9){
            undef $sender;
            $done->end;
        }
    });

    $done->recv;

    is $sent, 10, 'sent 10 events';
    is $got, 1, 'got 1 event';
}

done_testing;