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 Test::More tests => 14;

BEGIN {
    unshift @INC => ( 't/test_lib', '/test_lib' );
}

use Read;
use SyncRead;

can_ok( "Read", 'new' );
my $reader = Read->new();

isa_ok( $reader, 'Read' );

can_ok( "SyncRead", 'new' );
my $sync_reader = SyncRead->new();

isa_ok( $sync_reader, 'SyncRead' );
isa_ok( $sync_reader, 'Read' );

ok( $sync_reader->does('TSyncRead'), '... sync reader is a TSyncRead' );

# these should be the same
is( $reader->read(), $sync_reader->read(),
    '... these should be the same results' );

# now lets extract the actul trait and examine it

my $trait;
{
    no strict 'refs';

    # get the trait out
    $trait = ${"SyncRead::TRAITS"};
}

# check to see it is what we want it to be
isa_ok( $trait, 'Class::Trait::Config' );

# now examine the trait itself
is( $trait->name, 'TSyncRead', '... get the traits name' );

ok( eq_array( $trait->sub_traits, [] ), '... this should be empty' );
ok( eq_hash( $trait->conflicts, {} ), '... this should be empty' );
ok( eq_hash( $trait->overloads, {} ), '... this should be empty' );

ok( eq_hash( $trait->requirements, { read => 1 } ),
    '... this should not be empty' );

ok( eq_set( [ keys %{ $trait->methods } ], [ 'lock', 'unlock', 'read' ] ),
    '... this should not be empty' );