use strict;
use warnings;

use Net::RabbitMQ::Java;
use Test::More tests => 17;

Net::RabbitMQ::Java->init;

my $factory = Net::RabbitMQ::Java::Client::ConnectionFactory->new;
isa_ok($factory, 'Net::RabbitMQ::Java::Client::ConnectionFactory');

$factory->setUsername('guest');
$factory->setPassword('guest');
$factory->setHost($ENV{'MQHOST'} || "dev.rabbitmq.com");
$factory->setPort($ENV{'MQPORT'} || 5672);

ok(my $conn = eval { $factory->newConnection })
    or diag($@->printStackTrace);
isa_ok($conn, 'Net::RabbitMQ::Java::Client::impl::AMQConnection');

my $channel = $conn->createChannel;
isa_ok($channel, 'Net::RabbitMQ::Java::Client::impl::ChannelN');

my $cb = $conn->addShutdownListener(sub {
    my ($shutdownSignalException) = @_;
    isa_ok($shutdownSignalException, 'Net::RabbitMQ::Java::Client::ShutdownSignalException');
    like(
        $shutdownSignalException->getReason->getMethod->getReplyText,
        qr/NOT_FOUND/,
        'shutdown reason'
        );
    ok(1, 'connection shutdown');
});
isa_ok($cb, 'Net::RabbitMQ::Java::Helper::CallbackCaller');

my $cb1 = $channel->addShutdownListener(sub {
    my ($shutdownSignalException) = @_;
    isa_ok($shutdownSignalException, 'Net::RabbitMQ::Java::Client::ShutdownSignalException');
    like(
        $shutdownSignalException->getReason->getMethod->getReplyText,
        qr/NOT_FOUND/,
        'shutdown reason'
        );
    ok(1, 'channel shutdown');
});
isa_ok($cb, 'Net::RabbitMQ::Java::Helper::CallbackCaller');

my $cb2 = $channel->addShutdownListener(sub {
    ok(1, 'second channel shutdown callback');
});
isa_ok($cb2, 'Net::RabbitMQ::Java::Helper::CallbackCaller');

ok(my $txSelect_res = eval { $channel->txSelect }) or diag $@;
isa_ok($txSelect_res, 'Net::RabbitMQ::Java::Client::impl::AMQImpl::Tx::SelectOk');

for (1..3) {
    ok(eval {
        $channel->basicPublish(
            'non-existent-exchange',
            'non-existent-routing-key',
            1, #mandatory
            1, #immediate
            undef,
            "unroutable message"
        );
        1;
    }, 'basicPublish') or diag $@;
}

my $txCommit_res = eval { $channel->txCommit };
isa_ok($@, 'Net::RabbitMQ::Java::java::io::IOException', 'commit failure');

Net::RabbitMQ::Java->processCallbacks;

1;