X-Git-Url: http://erislabs.net/gitweb/?p=liburi-template-perl.git;a=blobdiff_plain;f=t%2F12-suite.t;h=cbe2869c4b9aef0114be5cd63149731369ead070;hp=c95931e8159b46ec2b0b87d73a2f283668daf6cf;hb=81c7f1b85cb98976fe96ad4f8a11037b2cb3de35;hpb=83c3737484d89a57cfd230d6a4039a269e212035 diff --git a/t/12-suite.t b/t/12-suite.t index c95931e..cbe2869 100644 --- a/t/12-suite.t +++ b/t/12-suite.t @@ -2,6 +2,7 @@ use strict; use warnings; use Test::More; +use Scalar::Util (); BEGIN { eval "use JSON ();"; @@ -10,23 +11,65 @@ BEGIN { use_ok( 'URI::Template' ); } -my @files = glob( 't/data/*.json' ); +my @files = glob( $ENV{ UT_SPEC_GLOB } || 't/cases/*.json' ); for my $file ( @files ) { + next unless -e $file; + + # skip these tests for now + next if $file =~ m{negative}; + open( my $json, $file ); my $data = do { local $/; <$json> }; close( $json ); eval { JSON->VERSION( 2 ) }; my $suite = $@ ? JSON::jsonToObj( $data ) : JSON::from_json( $data ); - my %variables = %{ $suite->{ variables } }; - - my $count = 0; - for my $test ( @{ $suite->{ tests } } ) { - my $template = URI::Template->new( $test->{ template } ); - my $result = $template->process( %variables ); - $count++; - is( $result, $test->{ expected }, "${file}#${count}" ); + + for my $name ( sort keys %$suite ) { + my $info = $suite->{ $name }; + my $vars = $info->{ variables }; + my $cases = $info->{ testcases }; + + note( sprintf( '%s [level %d]', $name, ( $info->{ level } || 4 ) ) ); + + for my $case ( @$cases ) { + my ( $input, $expect ) = @$case; + my $result; + eval { + my $template = URI::Template->new( $input ); + $result = $template->process_to_string( $vars ); + }; + + _check_result( $result, $expect, $input ); + } + } } +sub _check_result { + my ( $result, $expect, $input ) = @_; + + # boolean + if ( Scalar::Util::blessed( $expect ) ) { + ok( !defined $result, $input ); + } + + # list of possible results + elsif ( ref $expect ) { + my $ok = 0; + for my $e ( @$expect ) { + if ( $result eq $e ) { + $ok = 1; + last; + } + } + diag( "got: $result" ) if !$ok; + ok( $ok, $input ); + } + + # exact comparison + else { + is( $result, $expect, $input ); + } +}