The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use parent qw(Test::Class);
use Test::More;
use Test::Fatal;

use lib 'lib';

use Ubic::Multiservice::Simple;
use Ubic::Service::SimpleDaemon;

my $s1 = Ubic::Service::SimpleDaemon->new({ name => 'sleep', bin => 'sleep 1000' });
my $s2 = Ubic::Service::SimpleDaemon->new({ bin => 'sleep 2000' });

sub generic : Test(8) {
    my $ms = Ubic::Multiservice::Simple->new({
        s1 => $s1,
        s2 => $s2,
    });

    ok(scalar $ms->has_service('s1'), 'has_service returns true for existing service');
    ok(not(scalar $ms->has_service('s3')), 'has_service returns false for non-existing service');

    is_deeply([ sort $ms->services ], [ sort($s1, $s2) ], 'services() return both services');
    is_deeply([ sort $ms->service_names ], [ sort('s1', 's2') ], 'service_names() return both service names');

    $ms->name('named');
    is_deeply([ sort $ms->service_names ], [ sort('s1', 's2') ], "service_names() return both service names even when it's named");

    is(scalar $ms->service('s2')->name, 's2', 'multiservice assigns names to services');
    is(scalar $ms->service('s1')->name, 'sleep', '...unless they are already named');

    my $error = exception {
        Ubic::Multiservice::Simple->new({
            s1 => $s1,
            s2 => 'non-service',
        });
    };
    ok $error, 'new fails when non-service is specified as value';
}

sub nested : Test(4) {
    my $ms = Ubic::Multiservice::Simple->new({
        s1 => $s1,
        m1 => Ubic::Multiservice::Simple->new({
            s2 => $s2,
        }),
    });
    # testing has_service for nested unexistent services
    ok not exception { scalar $ms->has_service('s1.blah') };
    ok not exception { scalar $ms->has_service('s1.blah.blah') };
    ok not exception { scalar $ms->has_service('m1.blah.blah') };
    ok not exception { scalar $ms->has_service('m1.s2.blah') };
}

__PACKAGE__->new->runtests;