use strict;
use warnings;
use autodie;

use Test::More;
use Test::FailWarnings;
use Test::Exception;

plan tests => 14;

use IO::Framed::Write;

my $block = IO::Framed::Write->new(\*STDOUT);
my $nblock = IO::Framed::Write->new(\*STDOUT);

my @t = (
    [ blocking => $block ],
    [ 'non-blocking' => $nblock ],
);

for my $test ( @t ) {
    my ($label, $io) = @$test;

    throws_ok(
        sub { $io->write(q<>) },
        'IO::Framed::X::EmptyWrite',
        "$label: die() on empty-string write()",
    );

    throws_ok(
        sub { $io->write(undef) },
        'IO::Framed::X::EmptyWrite',
        "$label: die() on undefined write()",
    );

    throws_ok(
        sub { $io->write() },
        'IO::Framed::X::EmptyWrite',
        "$label: die() on empty write()",
    );

    #----------------------------------------------------------------------

    my $cb_called = 0;
    my $cb = sub { $cb_called++ };

    throws_ok(
        sub { $io->write(q<>, $cb) },
        'IO::Framed::X::EmptyWrite',
        "$label: die() on empty-string write() with callback",
    );

    ok( !$cb_called, '… and the callback wasn’t called' );

    throws_ok(
        sub { $io->write(undef, $cb) },
        'IO::Framed::X::EmptyWrite',
        "$label: die() on undefined write() with callback",
    );

    ok( !$cb_called, '… and the callback wasn’t called' );
}