use Test::More import => ['!pass'];
use t::lib::TestUtils;

plan tests => 26;

use Dancer ':syntax';
use Dancer::Test;
use Dancer::Route;

eval { prefix 'say' };
like $@, qr/not a valid prefix/, 'prefix must start with a /';

ok( prefix '/say', 'prefix defined' );

ok(
    get(
        '/:char' => sub {
            pass and return false if length( params->{char} ) > 1;
            "char: " . params->{char};
        }
    ),
    'route /say/:char defined'
);

ok(
    get(
        '/:number' => sub {
            pass and return false if params->{number} !~ /^\d+$/;
            "number: " . params->{number};
        }
    ),
    'route /say/:number defined'
);

ok( any( '/any' => sub {"any"} ), 'route any /any defined' );

ok(
    get(
        qr{/_(.*)} => sub {
            "underscore: " . params->{splat}[0];
        }
    ),
    'route /say/_(.*) defined'
);

ok(
    get(
        '/:word' => sub {
            pass and return false if params->{word} =~ /trash/;
            "word: " . params->{word};
        }
    ),
    'route /:word defined'
);

ok(
    get(
        '/' => sub {
            "char: all";
        }
    ),
    'route / defined'
);

ok( prefix(undef), "undef prefix" );

ok(
    get(
        '/*' => sub {
            "trash: " . params->{splat}[0];
        }
    ),
    'route /say/* defined'
);

my @tests = (
    { path => '/say/',        expected => 'char: all' },
    { path => '/say/A',       expected => 'char: A' },
    { path => '/say/24',      expected => 'number: 24' },
    { path => '/say/B',       expected => 'char: B' },
    { path => '/say/Perl',    expected => 'word: Perl' },
    { path => '/say/_stuff',  expected => 'underscore: stuff' },
    { path => '/say/any',     expected => 'any' },
    { path => '/go_to_trash', expected => 'trash: go_to_trash' },
);

foreach my $test (@tests) {
    my $path     = $test->{path};
    my $expected = $test->{expected};

    response_exists [GET => $path];
    response_content_is_deeply [GET => $path], $expected;
}
