Mercurial > pub > Impl
view _test/Test/DOM/Node.pm @ 250:129e48bb5afb
DOM refactoring
ObjectToDOM methods are virtual
QueryToDOM uses inflators
Fixed transform for the complex values in the ObjectToDOM
QueryToDOM doesn't allow to use complex values (HASHes) as values for nodes (overpost problem)
author | sergey |
---|---|
date | Wed, 07 Nov 2012 04:17:53 +0400 |
parents | 4d0e1962161c |
children | 99ac2e19c0cc |
line wrap: on
line source
package Test::DOM::Node; use strict; use warnings; use parent qw(IMPL::Test::Unit); use IMPL::Test qw(test shared failed cmparray assert); use IMPL::Class::Property; use Scalar::Util qw(weaken); require IMPL::DOM::Node; __PACKAGE__->PassThroughArgs; BEGIN { shared public property Root => prop_all; } test Create => sub { my ($this) = @_; $this->Root(new IMPL::DOM::Document(nodeName => 'Root')) or failed "Failed to create a document"; }; test InsertNode => sub { my ($this) = @_; my $child = $this->Root->insertNode(new IMPL::DOM::Node(nodeName => 'Child')) or failed "Failed to insert a child node"; failed "fiestChild returned incorrect results" unless ($this->Root->firstChild || 0) == $child; }; test AppendNode => sub { my ($this) = @_; my $child = $this->Root->appendNode(new IMPL::DOM::Node(nodeName => 'Child')) or failed "Failed to append a child node"; my $lastChild = $this->Root->removeLast; failed "removeLast returned incorrect results" unless $lastChild == $child; }; test GetDocumentNode => sub { my ($this) = @_; my $child = $this->Root->firstChild->appendNode(new IMPL::DOM::Node(nodeName => 'GrandChild')) or failed "Failed to append a child node"; failed "document property is undef" unless $child->document; failed "document property returned incorrect value" unless $child->document == $this->Root; }; test DocumentCreateNode => sub { my ($this) = @_; my $child = $this->Root->firstChild->appendNode($this->Root->Create(Info => { uuid => '77f9-9a-6d58' } )) or failed "Failed to append a child node"; failed "document property is undef" unless $child->document; failed "document property returned incorrect value" unless $child->document == $this->Root; }; test MoveNode => sub { my ($this) = @_; my $grandChild = $this->Root->firstChild->firstChild; $this->Root->appendNode($grandChild); failed "incorrect new parentNode value" unless ($grandChild->parentNode || 0) == $this->Root; failed "incorrect new document value" unless ($grandChild->document || 0) == $this->Root; }; test AppendRange => sub { my ($this) = @_; my $count = $this->Root->childNodes->Count; $this->Root->appendRange( map IMPL::DOM::Node->new(nodeName => "Item", nodeValue => $_),1..10 ); failed "Wrong number of a child nodes", "Expected: ".($count+10), "Actual: ".$this->Root->childNodes->Count unless $count + 10 == $this->Root->childNodes->Count; }; test SelectNodes => sub { my ($this) = @_; my @result = $this->Root->selectNodes("Item"); failed "Wrong number of a selected nodes", "Expected: 10", "Actual: ".scalar(@result) unless @result == 10; }; test SelectNodesByQuery => sub { my ($this) = @_; my @result = $this->Root->selectNodes(sub { $_->nodeName =~ /child/i } ); failed "Wrong number of a selected nodes", "Expected: 2", "Actual: ".scalar(@result) unless @result == 2; }; test SelectNodesPath => sub { my ($this) = @_; my @result = $this->Root->selectNodes('Child','Info'); failed "Failed to select a node by path 'Child/Info'" unless @result; }; test SelectByAxisDescendant => sub { my ($this) = @_; my @result = $this->Root->selectNodes( { descendant => ['GrandChild','Info']} ); failed "Failed to select a node by path '//(GrandChild|Info)/'" unless @result == 2; }; test SelectByAxisAncestor => sub { my ($this) = @_; my @result = $this->Root->selectSingleNode( { descendant => 'Info'} )->selectNodes( { ancestor => undef } ) ; failed "Failed to select a node by path '//Info/ancestor:*'" unless @result == 2; }; test CheckNodesValues => sub { my ($this) = @_; my @expected = (1..10); my @result = map $_->nodeValue, grep $_->nodeValue, $this->Root->selectNodes("Item"); failed "Some nodes returned wrong node values or in a wrong order", "Expected: ".join(', ',@expected), "Recieved: ".join(', ',@result) unless cmparray(\@expected,\@result); failed "a text property of a root node returned a wrong value", "Expected: @expected", "Recieved: ". $this->Root->text unless $this->Root->text eq join '',@expected; }; test isComplex => sub { my ($this) = @_; failed "property isComplex returned false for the root node" unless $this->Root->isComplex; failed "property isComplex returned true for a simple node", $this->Root->selectSingleNode('Item')->childNodes->Count if $this->Root->selectSingleNode('Item')->isComplex; }; test setObjectProperty => sub { my ($this) = @_; my $node = Test::DOM::TypedNode->new(nodeName => 'TestNode'); my $name = 'Vergon 6'; $node->nodeProperty(name => $name); failed "Failed to set a property 'name'", "Expected: $name", "Got: ".$node->name unless $node->name eq $name; $name = 'entity_vergon_6'; $node->systemName($name); failed "Failed to set a property 'systemName'", "Expected: $name", "Got: ".$node->nodeProperty('systemName') unless $node->nodeProperty('systemName') eq $name; }; test setDynamicProperty => sub { my $node = Test::DOM::TypedNode->new(nodeName => 'TestNode'); my $uuid = 'entity_76fd98b9e7a'; $node->nodeProperty(uuid => $uuid); failed "Failed to set a dynamic property 'uuid'", "Expected: $uuid", "Got: ".$node->nodeProperty('uuid') unless $node->nodeProperty('uuid') eq $uuid; }; test setPrivateProperty => sub { my $node = Test::DOM::TypedNode->new(nodeName => 'TestNode'); eval { $node->nodeProperty(_private => 'failed'); 1; } and failed "Setting a private property successfull"; }; test createNodeWithProps => sub { my $uuid = 'entity_76fd98b9e7a'; my $name = 'Vergon 6'; my $systemName = 'entity_vergon_6'; my $node = Test::DOM::TypedNode->new( nodeName => 'TestNode', uuid => $uuid, name => $name, systemName => $systemName ); failed "Failed to get dynamic property 'uuid'" unless $node->nodeProperty('uuid') eq $uuid; failed "Failed to get property 'name' through nodeProperty method" unless $node->nodeProperty('name') eq $name; failed "Failed to get property name directly" unless $node->name eq $name; }; test listNodePredefinedProps => sub { my $node = Test::DOM::TypedNode->new(nodeName => 'TestNode'); my @props = $node->listProperties; my @expected = qw(name _private); failed "Got wrong list of props", @props unless cmparray(\@props,\@expected); }; test listNodeAllProps => sub { my $node = Test::DOM::TypedNode->new( nodeName => 'TestNode', uuid => 'ade58f98b', # dynamic name => 'noname', # predefined systemName => 'no sys' # not visible to DOM ); my @props = $node->listProperties; my @expected = qw(name _private uuid); # systemName is not a DOM prop failed "Got wrong list of props", @props unless cmparray(\@props,\@expected); }; test MemoryLeaks => sub { my $doc = new IMPL::DOM::Document(nodeName => 'Root'); weaken($doc); assert(not defined $doc); }; package Test::DOM::TypedNode; use parent qw(IMPL::DOM::Node); use IMPL::Class::Property; use IMPL::DOM::Property qw(_dom); __PACKAGE__->PassThroughArgs; BEGIN { public _dom property name => prop_all; public property systemName => prop_all; private _dom property _private => prop_all; } 1;