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

use Test::Most;

use ZMQx::Class;

subtest 'init socket without context' => sub {
    foreach (qw(REQ REP DEALER ROUTER PULL PUSH PUB SUB XPUB XSUB PAIR)) {
        lives_ok {
            ZMQx::Class->socket($_);
        } "$_";
    }
};

subtest 'init socket with context' => sub {
    my $context = ZMQx::Class->context;
    isa_ok($context,'ZMQ::LibZMQ3::Context');

    foreach (qw(REQ REP DEALER ROUTER PULL PUSH PUB SUB XPUB XSUB PAIR)) {
        lives_ok {
            ZMQx::Class->socket($context, $_);
        } "$_";
    }
};

subtest 'init, bind/connect, opts' => sub {
    lives_ok {
        ZMQx::Class->socket('PULL', bind=>'tcp://*:5599');
    } "bind";

    lives_ok {
        ZMQx::Class->socket('PULL', connect=>'tcp://localhost:5599');
    } "connect";

    {
        my $sock;
        lives_ok {
            $sock = ZMQx::Class->socket('PULL', connect=>'tcp://localhost:5599', { sndtimeo=>33 });
        } "connect & opts";
        is($sock->get_sndtimeo,33,'sock opt set');
    };
};


subtest 'die & other corner cases' => sub {
    dies_ok { ZMQx::Class->socket("NOSUCHSOCK") }
        "could not init socket NOSUCHSOCK";

    dies_ok {
        ZMQx::Class->socket('PULL', teleport=>'tcp://*:5599');
    } "cannot init socket & teleport";

    {
        my $sock = ZMQx::Class->socket('PULL', 'bind');
        is($sock->_connected,0,'not connected');
    }

    {   # cannot bind again on same port
        my $sock = ZMQx::Class->socket('PULL', bind=>'tcp://*:5599');
        throws_ok { ZMQx::Class->socket('PULL', bind=>'tcp://*:5599') } qr/Cannot bind: Address already in use/, 'cannot bind to address already in use';

    };

    throws_ok {
    ZMQx::Class->socket('PULL', connect=>'tcp://*:5598');
    } qr/Cannot connect/, 'cannot connect to tcp://*';

    warning_is {
        ZMQx::Class->socket('PULL', bind=>'tcp://*:5599',{nosuchopt=>123});
    } "no such sockopt nosuchopt", 'no such sockopt';

};

done_testing();