| 11 | 1 package Test::DOM::Navigator; | 
|  | 2 use base qw(IMPL::Test::Unit); | 
|  | 3 | 
|  | 4 __PACKAGE__->PassThroughArgs; | 
|  | 5 | 
|  | 6 use IMPL::Test qw(test failed); | 
|  | 7 use IMPL::DOM::Navigator; | 
| 24 | 8 use IMPL::DOM::Navigator::SchemaNavigator; | 
| 11 | 9 use IMPL::DOM::Node; | 
| 24 | 10 use IMPL::DOM::Schema; | 
|  | 11 use IMPL::Class::Property; | 
|  | 12 | 
|  | 13 BEGIN { | 
|  | 14     public property doc => prop_all; | 
|  | 15 } | 
|  | 16 | 
|  | 17 sub CTOR { | 
|  | 18     my ($this) = @_; | 
|  | 19 | 
|  | 20     $this->doc( | 
|  | 21         IMPL::DOM::Node->new(nodeName => 'root')->appendRange( | 
|  | 22             IMPL::DOM::Node->new(nodeName=> 'age', nodeValue => 21), | 
|  | 23             IMPL::DOM::Node->new(nodeName=> 'address')->appendRange( | 
|  | 24                 IMPL::DOM::Node->new(nodeName=>'city', nodeValue=>'moscow'), | 
|  | 25                 IMPL::DOM::Node->new(nodeName=>'street', nodeValue=>'main'), | 
|  | 26                 IMPL::DOM::Node->new(nodeName=>'phone',nodeValue=>'123-456'), | 
|  | 27             ), | 
|  | 28             IMPL::DOM::Node->new(nodeName=> 'address')->appendRange( | 
|  | 29                 IMPL::DOM::Node->new(nodeName=>'city', nodeValue=>'San Francisco'), | 
|  | 30                 IMPL::DOM::Node->new(nodeName=>'street', nodeValue=>'Libertador'), | 
|  | 31             ), | 
|  | 32             IMPL::DOM::Node->new(nodeName=> 'contacts')->appendRange( | 
|  | 33                 IMPL::DOM::Node->new(nodeName=>'phone',nodeValue=>'123-123'), | 
|  | 34                 IMPL::DOM::Node->new(nodeName=>'phone',nodeValue=>'1-233-434-34-54'), | 
|  | 35                 IMPL::DOM::Node->new(nodeName=>'email',nodeValue=>'some@mail.none') | 
|  | 36             ) | 
|  | 37 | 
|  | 38         ) | 
|  | 39     ); | 
|  | 40 } | 
| 11 | 41 | 
|  | 42 test Creation => sub { | 
|  | 43     my ($this) = @_; | 
|  | 44 | 
|  | 45     my $doc = new IMPL::DOM::Node(nodeName => 'root'); | 
|  | 46 | 
|  | 47     my $obj = new IMPL::DOM::Navigator($doc) or failed "Failed to create instance" ; | 
|  | 48 }; | 
|  | 49 | 
|  | 50 test Navigate => sub { | 
|  | 51     my $doc = new IMPL::DOM::Node(nodeName => 'root'); | 
|  | 52     my $child = $doc->insertNode( | 
|  | 53         new IMPL::DOM::Node( | 
|  | 54             nodeName => 'Child' | 
|  | 55         ) | 
|  | 56     ); | 
|  | 57 | 
|  | 58     my $navi = new IMPL::DOM::Navigator($doc); | 
|  | 59     my $navresult = $navi->Navigate("Child"); | 
|  | 60 | 
|  | 61     failed ("Navigate retuned unexpected result", "Recieved: $navresult", "Expected: $child") if $child != $navresult; | 
|  | 62     my $curr = $navi->Current; | 
|  | 63     failed ("Current node has a wrong value","Current: $curr","Expected: $child") if $child != $curr; | 
|  | 64 }; | 
|  | 65 | 
|  | 66 test PathToString => sub { | 
|  | 67     my $doc = new IMPL::DOM::Node(nodeName => 'root'); | 
|  | 68     my $child = $doc->insertNode( | 
|  | 69         new IMPL::DOM::Node( | 
|  | 70             nodeName => 'Child' | 
|  | 71         ) | 
|  | 72     ); | 
|  | 73 | 
|  | 74     my $navi = new IMPL::DOM::Navigator($doc); | 
|  | 75     $navi->Navigate("Child"); | 
|  | 76 | 
|  | 77     my $expected = "root/Child"; | 
|  | 78     my $res = $navi->PathToString; | 
|  | 79     failed("Unexpected PathToString result","Recieved: $res","Expected: $expected") if $res ne $expected; | 
|  | 80 }; | 
|  | 81 | 
|  | 82 test Back => sub { | 
|  | 83     my $doc = new IMPL::DOM::Node(nodeName => 'root'); | 
|  | 84     my $child = $doc->insertNode( | 
|  | 85         new IMPL::DOM::Node( | 
|  | 86             nodeName => 'Child' | 
|  | 87         ) | 
|  | 88     ); | 
|  | 89 | 
|  | 90     my $navi = new IMPL::DOM::Navigator($doc); | 
|  | 91     $navi->Navigate("Child"); | 
|  | 92     my $navresult = $navi->Back; | 
|  | 93 | 
|  | 94     failed ("Back() retuned unexpected result", "Recieved: $navresult", "Expected: $doc") if $doc != $navresult; | 
|  | 95     my $curr = $navi->Current; | 
|  | 96     failed ("Current node has a wrong value","Current: $curr","Expected: $doc") if $doc != $curr; | 
|  | 97 }; | 
|  | 98 | 
| 24 | 99 test selectNodes1 => sub { | 
|  | 100     my ($this) = @_; | 
|  | 101 | 
|  | 102     my $navi = new IMPL::DOM::Navigator($this->doc); | 
|  | 103     my @result = $navi->selectNodes('contacts','phone'); | 
|  | 104     failed "Expected to get two entries, but got:",map($_->nodeName,@result) unless @result == 2; | 
|  | 105 }; | 
| 11 | 106 | 
| 24 | 107 test selectNodes2 => sub { | 
|  | 108     my ($this) = @_; | 
|  | 109 | 
|  | 110     my $navi = new IMPL::DOM::Navigator($this->doc); | 
|  | 111     my @result = $navi->selectNodes(undef,'phone'); | 
|  | 112     failed "Expected to get three entries, but got:",map($_->nodeName,@result) unless @result == 3; | 
|  | 113 }; | 
| 11 | 114 | 
| 24 | 115 test FetchDoeachState => sub { | 
|  | 116     my ($this) = @_; | 
|  | 117 | 
|  | 118     my $navi = new IMPL::DOM::Navigator($this->doc); | 
|  | 119 | 
|  | 120     $navi->Navigate(undef,'phone'); | 
|  | 121 | 
|  | 122     $navi->saveState(); | 
|  | 123 | 
|  | 124     my @result; | 
|  | 125     doeach $navi sub { | 
|  | 126         push @result,$_; | 
|  | 127     }; | 
|  | 128 | 
|  | 129     failed "Expected to get three nodes, but got: ", map($_->nodeName,@result) unless @result == 3; | 
|  | 130 | 
|  | 131     $navi->restoreState(); | 
|  | 132     @result = (); | 
|  | 133 | 
|  | 134     push @result, $_ while fetch $navi; | 
|  | 135 | 
|  | 136     failed "Expected to get three nodes, but got: ", map($_->nodeName,@result) unless @result == 3; | 
|  | 137 }; | 
|  | 138 | 
|  | 139 test NavigateSchema => sub { | 
|  | 140     my $navi = new IMPL::DOM::Navigator::SchemaNavigator(IMPL::DOM::Schema->MetaSchema); | 
|  | 141 | 
|  | 142     my $root = $navi->NavigateName('schema') or failed "Failed to navigate to the root element"; | 
|  | 143 | 
|  | 144     $navi->saveState; | 
|  | 145     $navi->NavigateName('Node') or failed "Failed to navigate to a simple node"; | 
|  | 146     $navi->restoreState; | 
|  | 147 | 
|  | 148     failed "Can't navigate from simple node" if $navi->NavigateName('Property'); | 
|  | 149 | 
|  | 150     $navi->NavigateName('ComplexType') or failed "Failed to navigate to a complex node"; | 
|  | 151     $navi->NavigateName('NodeSet') or failed "Failed to navigate to NodeSet"; | 
|  | 152     $navi->SchemaBack(); | 
|  | 153     $navi->NavigateName('NodeList') or failed "Failed to navigate to NodeList"; | 
|  | 154     $navi->NavigateName('SimpleNode') or failed "Failed to navigate to SimpleNode"; | 
|  | 155     $navi->NavigateName('Enum') or failed "Failed to navigate to Enum"; | 
|  | 156     $navi->NavigateName('Item') or failed "Failed to navigate to Item"; | 
|  | 157 | 
|  | 158 }; | 
| 11 | 159 | 
|  | 160 | 
|  | 161 1; |