Mercurial > pub > Impl
diff _test/Test/Web/ViewSelector.pm @ 285:546957c50a36
*IMPL::Web::Handler::TTView Reworked template selection mechanism
*IMPL::Web::Application: refactoring
-Removed obsolete IMPL::Text modules
author | cin |
---|---|
date | Mon, 18 Feb 2013 02:55:59 +0400 |
parents | |
children | 608e74bc309f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/_test/Test/Web/ViewSelector.pm Mon Feb 18 02:55:59 2013 +0400 @@ -0,0 +1,137 @@ +package Test::Web::ViewSelector; +use strict; + +use Scalar::Util qw(reftype); +use IMPL::Test qw(test assert assertarray); +use IMPL::declare { + require => { + TTView => 'IMPL::Web::Handler::TTView' + }, + base => [ + 'IMPL::Test::Unit' => '@_' + ] +}; + +test TestParseRules => sub { + my $rule = TTView->ParseRule('/category/item => item.html'); + + assert(reftype($rule) eq 'HASH'); + assert(reftype($rule->{selector}) eq 'ARRAY'); + assertarray([map $_->{name}, @{$rule->{selector}}], [qw(category item)]); + assert($rule->{data} eq 'item.html'); + assert($rule->{weight} == 2); + + $rule = TTView->ParseRule('category//item => item.html'); + + assert(reftype($rule) eq 'HASH'); + assert(reftype($rule->{selector}) eq 'ARRAY'); + assertarray([map $_->{name}, @{$rule->{selector}}], [undef, 'category', undef ,'item']); + assert($rule->{data} eq 'item.html'); + assert($rule->{weight} == 2); + + $rule = TTView->ParseRule('///category//item///// => item.html'); + # trailing slashes must be ignored + assertarray([map $_->{name}, @{$rule->{selector}}], [undef,undef, 'category', undef ,'item']); + + $rule = TTView->ParseRule('{cat:\w+}@OrgClass/products/@My::PoductClass/view => view.html'); + + assert(reftype($rule) eq 'HASH'); + assert(reftype($rule->{selector}) eq 'ARRAY'); + assert($rule->{data} eq 'view.html'); + assert($rule->{weight} == 4); + assert($rule->{selector}[0]->{any}); + assert($rule->{selector}[1]->{rx}); + assert($rule->{selector}[1]->{var} eq 'cat'); + assert($rule->{selector}[1]->{class} eq 'OrgClass'); + assert($rule->{selector}[3]->{class} eq 'My::PoductClass'); + assertarray([map $_->{name}, @{$rule->{selector}}], [undef,undef, 'products', undef ,'view']); + + $rule = TTView->ParseRule('/ => index.html'); + assert($rule->{weight} == 0); +}; + +test TestNamesMatch => sub { + my @rules = map TTView->ParseRule($_), + 'view => view.html', # weight 1 + 'shoes/view => shoes/view.html', # weight 2 + '/root/org/items/add => add.html'; # weight 4 + + assert( + TTView->MatchPath( + [ map { name => $_ }, qw(root view)], + \@rules + ) eq 'view.html' + ); + + assert( + TTView->MatchPath( + [ map { name => $_ }, qw(root shoes view)], + \@rules + ) eq 'shoes/view.html' + ); + + assert( + TTView->MatchPath( + [ map { name => $_ }, qw(root org products shoes view)], + \@rules + ) eq 'shoes/view.html' + ); + + assert( + TTView->MatchPath( + [ map { name => $_ }, qw(root org items add)], + \@rules + ) eq 'add.html' + ); +}; + +{ + package Test::Web::ViewSelector::Container; + + package Test::Web::ViewSelector::Orgs; + use IMPL::declare { + base => ['-Test::Web::ViewSelector::Container' => undef] + }; +} + +test TestComplexMatch => sub { + my @rules = map TTView->ParseRule($_), + '{container:.*}@Test::Web::ViewSelector::Container/{item:.*}/{action:.*} => {container}/{item}/{action}.html', # weight 3 + '/root//orgs/{org:.*}/info => orgs/{org}.html', # weight 4 + '@Test::Web::ViewSelector::Container => container.html'; + + my $path = [ + { name => 'root'}, + { name => 'list', class => 'Test::Web::ViewSelector::Container'}, + { name => 'hp' }, + { name => 'info'} + ]; + + my $result = TTView->MatchPath($path,\@rules); + my $expected = 'list/hp/info.html'; + + assert( $result eq $expected, "Expected: $expected", "Got: $result" ); + + $path = [ + { name => 'root'}, + { name => 'orgs', class => 'Test::Web::ViewSelector::Orgs'}, + { name => 'ms' }, + { name => 'info'} + ]; + $result = TTView->MatchPath($path,\@rules); + $expected = 'orgs/ms.html'; + + assert( $result eq $expected, "Expected: $expected", "Got: $result" ); + + $path = [ + { name => 'root'}, + { name => 'service'}, + { name => 'orgs', class => 'Test::Web::ViewSelector::Container' } + ]; + $result = TTView->MatchPath($path,\@rules); + $expected = 'container.html'; + + assert( $result eq $expected, "Expected: $expected", "Got: $result" ); +}; + +1; \ No newline at end of file