The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More; # tests => 18;

BEGIN { 
    if(not not eval "require RDF::Core") {
        plan tests => 20;
    }
    else {
        plan skip_all => 'RDF::Core required';
    }

    use_ok 'RDF::Server';
    use_ok 'RDF::Server::Types';
    use_ok 'RDF::Server::Semantic::Atom';
};

use RDF::Server::Types qw( Protocol Interface Semantic Container );
eval "use Carp::Always"; # for those who don't have it

my $e;

eval {
    package My::Server;

    use RDF::Server;

    protocol 'Embedded';
    interface 'REST';
    semantic '+RDF::Server::Semantic::Atom';

    render xml => 'Atom';

    eval {
        render foo => 'Foo';
    };

    main::isnt( $@, '', 'Bad formatter package causes an error' );
};

$e = $@;
is( $e, '', 'No error creating test package' );

ok( is_Protocol( 'My::Server' ), 'Protocol is set' );
ok( is_Interface( 'My::Server' ), 'Interface is set' );
ok( is_Semantic( 'My::Server' ), 'Semantic is set' );

ok( My::Server -> does( 'RDF::Server::Protocol::Embedded' ), 'Protocol is Embedded' );
ok( My::Server -> does( 'RDF::Server::Interface::REST' ), 'Interface is REST' );

ok( My::Server -> does( 'RDF::Server::Semantic::Atom' ), 'Semantic is Atom' );

ok( My::Server -> meta -> get_attribute('handler') -> should_coerce(), 'handler should coerce');
ok( My::Server -> meta -> get_attribute('handler') -> type_constraint -> has_coercion(), 'handler type has coercion');

my $server;

eval {
    $server = My::Server -> new(
        default_renderer => 'Atom',
        handler => [ workspace => {
            title => 'title',
            collections => [
              {
                  title => 'title',
                  categories => [ ],
                  model => {
                      class => 'RDFCore',
                      namespace => 'http://www.example.org/ns/'
                  }
              }
            ]
        } ]
    );
};

$e = $@;

is( $e, '', 'No error creating server instance' ); 

isa_ok( $server -> handler, 'RDF::Server::Semantic::Atom::Workspace', 'top-level handler');

isa_ok( $server -> handler -> handlers -> (), 'ARRAY');

isa_ok( $server -> handler -> handlers -> () -> [0], 'RDF::Server::Semantic::Atom::Collection');

isa_ok( $server -> handler -> handlers -> () -> [0] -> model, 'RDF::Server::Model::RDFCore' );

eval {
    $server = My::Server -> new(
        handler => [ collaboration => {
            title => 'title'
        }]
    );
};

$e = $@;

isnt( $e, '' );
like( $e, qr{^Unknown Atom \(.*?\) document type: collaboration}, "Got the right kind of error message" );