use warnings;
use strict;
use HTTP::Request::Common;
+use utf8;
BEGIN {
use Test::More;
- eval "use Type::Tiny; 1" || do {
+ eval "use Type::Tiny 1.000005; 1" || do {
plan skip_all => "Trouble loading Type::Tiny and friends => $@";
};
}
use Types::Standard -types;
use Type::Library
-base,
- -declare => qw( UserId User ContextLike );
+ -declare => qw( UserId Heart User ContextLike );
extends "Types::Standard";
as Int,
where { $_ < 5 };
+ declare Heart,
+ as Str,
+ where { $_ eq '♥' };
+
# Tests using this are skipped pending deeper thought
coerce User,
from ContextLike,
use Moose;
use MooseX::MethodAttributes;
- use MyApp::Types qw/Tuple Int Str StrMatch ArrayRef UserId User/;
+ use Types::Standard qw/slurpy/;
+ use MyApp::Types qw/Tuple Int Str StrMatch ArrayRef UserId User Heart/;
extends 'Catalyst::Controller';
$c->res->body("name: $user->{name}, age: $user->{age}");
}
+ sub stringy_enum :Local Args('Int',Int) {
+ my ($self, $c) = @_;
+ $c->res->body('enum');
+ }
+
sub an_int :Local Args(Int) {
my ($self, $c, $int) = @_;
$c->res->body('an_int');
}
sub many_ints :Local Args(ArrayRef[Int]) {
- my ($self, $c, $int) = @_;
+ my ($self, $c, @ints) = @_;
$c->res->body('many_ints');
}
$c->res->body('tuple');
}
+ sub slurpy_tuple :Local Args(Tuple[Str,Int, slurpy ArrayRef[Int]]) {
+ my ($self, $c, $str, $int) = @_;
+ $c->res->body('tuple');
+ }
+
sub match :Local Args(StrMatch[qr{\d\d-\d\d-\d\d}]) {
my ($self, $c, $int) = @_;
$c->res->body('match');
sub chained_zero3 : Chained(chain_base2) PathPart('') Args(1) { $_[1]->res->body('chained_zero3') }
+ sub heart :Local Args(Heart) { }
+
+ sub utf8_base :Chained(/) CaptureArgs(Heart) { }
+ sub utf8_end :Chained(utf8_base) PathPart('') Args(Heart) { }
+
sub default :Default {
my ($self, $c, $int) = @_;
$c->res->body('default');
}
{
+ my $res = request '/tuple/aaa/111/111/111';
+ is $res->content, 'default';
+}
+
+{
+ my $res = request '/slurpy_tuple/aaa/111/111/111';
+ is $res->content, 'tuple';
+}
+
+
+{
my $res = request '/many_ints/1/2/a';
is $res->content, 'default';
}
is $res->content, 'chained_zero2', "request POST '/chain_base2/capture'";
}
+{
+ my $res = request '/stringy_enum/1/2';
+ is $res->content, 'enum', "request '/stringy_enum/a'";
+}
+
+{
+ my $res = request '/stringy_enum/b/2';
+ is $res->content, 'default', "request '/stringy_enum/a'";
+}
+
+{
+ my $res = request '/stringy_enum/1/a';
+ is $res->content, 'default', "request '/stringy_enum/a'";
+}
+
=over
| /chain_base/*/*/*/*/*/* | /chain_base (1)
ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('finally'), ['a','a',3,4,4,'6']) };
}
-}
-
-done_testing;
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('heart'), ['♥']) };
+ is $url, 'http://localhost/heart/%E2%99%A5';
+ }
+ {
+ ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('heart'), ['1']) };
+ }
-__END__
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('utf8_end'), ['♥','♥']) };
+ is $url, 'http://localhost/utf8_base/%E2%99%A5/%E2%99%A5';
+ }
+ {
+ ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('utf8_end'), ['2','1']) };
+ }
+}
+done_testing;