Mercurial > pub > Impl
comparison _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 |
comparison
equal
deleted
inserted
replaced
| 284:f2a6bc5f3184 | 285:546957c50a36 |
|---|---|
| 1 package Test::Web::ViewSelector; | |
| 2 use strict; | |
| 3 | |
| 4 use Scalar::Util qw(reftype); | |
| 5 use IMPL::Test qw(test assert assertarray); | |
| 6 use IMPL::declare { | |
| 7 require => { | |
| 8 TTView => 'IMPL::Web::Handler::TTView' | |
| 9 }, | |
| 10 base => [ | |
| 11 'IMPL::Test::Unit' => '@_' | |
| 12 ] | |
| 13 }; | |
| 14 | |
| 15 test TestParseRules => sub { | |
| 16 my $rule = TTView->ParseRule('/category/item => item.html'); | |
| 17 | |
| 18 assert(reftype($rule) eq 'HASH'); | |
| 19 assert(reftype($rule->{selector}) eq 'ARRAY'); | |
| 20 assertarray([map $_->{name}, @{$rule->{selector}}], [qw(category item)]); | |
| 21 assert($rule->{data} eq 'item.html'); | |
| 22 assert($rule->{weight} == 2); | |
| 23 | |
| 24 $rule = TTView->ParseRule('category//item => item.html'); | |
| 25 | |
| 26 assert(reftype($rule) eq 'HASH'); | |
| 27 assert(reftype($rule->{selector}) eq 'ARRAY'); | |
| 28 assertarray([map $_->{name}, @{$rule->{selector}}], [undef, 'category', undef ,'item']); | |
| 29 assert($rule->{data} eq 'item.html'); | |
| 30 assert($rule->{weight} == 2); | |
| 31 | |
| 32 $rule = TTView->ParseRule('///category//item///// => item.html'); | |
| 33 # trailing slashes must be ignored | |
| 34 assertarray([map $_->{name}, @{$rule->{selector}}], [undef,undef, 'category', undef ,'item']); | |
| 35 | |
| 36 $rule = TTView->ParseRule('{cat:\w+}@OrgClass/products/@My::PoductClass/view => view.html'); | |
| 37 | |
| 38 assert(reftype($rule) eq 'HASH'); | |
| 39 assert(reftype($rule->{selector}) eq 'ARRAY'); | |
| 40 assert($rule->{data} eq 'view.html'); | |
| 41 assert($rule->{weight} == 4); | |
| 42 assert($rule->{selector}[0]->{any}); | |
| 43 assert($rule->{selector}[1]->{rx}); | |
| 44 assert($rule->{selector}[1]->{var} eq 'cat'); | |
| 45 assert($rule->{selector}[1]->{class} eq 'OrgClass'); | |
| 46 assert($rule->{selector}[3]->{class} eq 'My::PoductClass'); | |
| 47 assertarray([map $_->{name}, @{$rule->{selector}}], [undef,undef, 'products', undef ,'view']); | |
| 48 | |
| 49 $rule = TTView->ParseRule('/ => index.html'); | |
| 50 assert($rule->{weight} == 0); | |
| 51 }; | |
| 52 | |
| 53 test TestNamesMatch => sub { | |
| 54 my @rules = map TTView->ParseRule($_), | |
| 55 'view => view.html', # weight 1 | |
| 56 'shoes/view => shoes/view.html', # weight 2 | |
| 57 '/root/org/items/add => add.html'; # weight 4 | |
| 58 | |
| 59 assert( | |
| 60 TTView->MatchPath( | |
| 61 [ map { name => $_ }, qw(root view)], | |
| 62 \@rules | |
| 63 ) eq 'view.html' | |
| 64 ); | |
| 65 | |
| 66 assert( | |
| 67 TTView->MatchPath( | |
| 68 [ map { name => $_ }, qw(root shoes view)], | |
| 69 \@rules | |
| 70 ) eq 'shoes/view.html' | |
| 71 ); | |
| 72 | |
| 73 assert( | |
| 74 TTView->MatchPath( | |
| 75 [ map { name => $_ }, qw(root org products shoes view)], | |
| 76 \@rules | |
| 77 ) eq 'shoes/view.html' | |
| 78 ); | |
| 79 | |
| 80 assert( | |
| 81 TTView->MatchPath( | |
| 82 [ map { name => $_ }, qw(root org items add)], | |
| 83 \@rules | |
| 84 ) eq 'add.html' | |
| 85 ); | |
| 86 }; | |
| 87 | |
| 88 { | |
| 89 package Test::Web::ViewSelector::Container; | |
| 90 | |
| 91 package Test::Web::ViewSelector::Orgs; | |
| 92 use IMPL::declare { | |
| 93 base => ['-Test::Web::ViewSelector::Container' => undef] | |
| 94 }; | |
| 95 } | |
| 96 | |
| 97 test TestComplexMatch => sub { | |
| 98 my @rules = map TTView->ParseRule($_), | |
| 99 '{container:.*}@Test::Web::ViewSelector::Container/{item:.*}/{action:.*} => {container}/{item}/{action}.html', # weight 3 | |
| 100 '/root//orgs/{org:.*}/info => orgs/{org}.html', # weight 4 | |
| 101 '@Test::Web::ViewSelector::Container => container.html'; | |
| 102 | |
| 103 my $path = [ | |
| 104 { name => 'root'}, | |
| 105 { name => 'list', class => 'Test::Web::ViewSelector::Container'}, | |
| 106 { name => 'hp' }, | |
| 107 { name => 'info'} | |
| 108 ]; | |
| 109 | |
| 110 my $result = TTView->MatchPath($path,\@rules); | |
| 111 my $expected = 'list/hp/info.html'; | |
| 112 | |
| 113 assert( $result eq $expected, "Expected: $expected", "Got: $result" ); | |
| 114 | |
| 115 $path = [ | |
| 116 { name => 'root'}, | |
| 117 { name => 'orgs', class => 'Test::Web::ViewSelector::Orgs'}, | |
| 118 { name => 'ms' }, | |
| 119 { name => 'info'} | |
| 120 ]; | |
| 121 $result = TTView->MatchPath($path,\@rules); | |
| 122 $expected = 'orgs/ms.html'; | |
| 123 | |
| 124 assert( $result eq $expected, "Expected: $expected", "Got: $result" ); | |
| 125 | |
| 126 $path = [ | |
| 127 { name => 'root'}, | |
| 128 { name => 'service'}, | |
| 129 { name => 'orgs', class => 'Test::Web::ViewSelector::Container' } | |
| 130 ]; | |
| 131 $result = TTView->MatchPath($path,\@rules); | |
| 132 $expected = 'container.html'; | |
| 133 | |
| 134 assert( $result eq $expected, "Expected: $expected", "Got: $result" ); | |
| 135 }; | |
| 136 | |
| 137 1; |
