# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl 1.t' # Note added by Frank Gibbons. # Tests should, as far as possible, avoid the use of literals. # If you register a service with authURI => mysite.com, # and you want to test a retrieved description of the service, # don't test that the service returns authURI eq "mysite.com", # test so that it returns the same value as you used to register it in the first place. ######################### # change 'tests => 1' to 'tests => last_test_to_print'; #use SOAP::Lite +trace; use Test::More 'no_plan'; # perldoc Test::More for details use strict; use English; use Data::Dumper; use MOBY::Client::SecondaryArticle; #Is the client-code even installed? BEGIN { use_ok('MOBY::Client::SecondaryArticle') }; END { # Clean up after yourself, in case tests fail, or the interpreter is interrupted partway though... }; my @autoload = qw/articleName objectType namespaces XML XML_DOM isSimple isCollection isSecondary datatype default max min enum value description/; my @API = (@autoload, qw/new /); # createFrom[XML|DOM] are not meant to be public my $scndry = MOBY::Client::SecondaryArticle->new(); foreach (@autoload) {eval{$scndry->$_};} # Call all AUTOLOAD methods, to create them. can_ok("MOBY::Client::SecondaryArticle", @API) or diag("SecondaryArticle doesn't implement full API"); #my $scndry = MOBY::Client::SecondaryArticle->new(); is($scndry->isSimple, 0) or diag("SecondaryArticle cannot be Simple"); is($scndry->isSecondary, 1) or diag("SecondaryArticle must return isSecondary=1"); is($scndry->isCollection, 0) or diag("SecondaryArticle cannot be Collection"); my $aName = 'my Article'; is($scndry->articleName($aName), $aName) or diag("Couldn't set articleName"); is($scndry->articleName(), $aName) or diag("Couldn't get articleName"); my $obj_type = 'String'; is($scndry->objectType($obj_type), $obj_type) or diag("Couldn't set objectType"); is($scndry->objectType(), $obj_type) or diag("Couldn't get objectType"); my @ns = qw/SGD FB GO/; eq_array($scndry->namespaces(\@ns), \@ns) or diag("Couldn't set namespaces"); eq_array($scndry->namespaces(), \@ns) or diag("Couldn't get namespaces"); my @datatypes = qw/Integer Float String DateTime Boolean/; foreach (@datatypes) { # Correct stuff should be possible is($scndry->datatype($_), $_) or diag("Couldn't set datatype to '$_'"); is($scndry->datatype(), $_) or diag("Couldn't get datatype to '$_'"); } my @enums = (-100, -50, 0, 10, 50, 100); eq_array($scndry->enum(\@enums), \@enums) or diag("Couldn't set enumerated values"); eq_array($scndry->enum(), \@enums) or diag("Couldn't get enumerated values"); # Check XML-generation code. # In reality, (XML, createFromXML) and (XML_DOM, createFromDOM) should behave the same. # Let's not assume that though. my ($artName, $ns, $id, $value) = ('my Article', 'SGD', 'S0005111', 10); my $xml_scndry = < $value XML $scndry = MOBY::Client::SecondaryArticle->new( XML => $xml_scndry); is($scndry->articleName(), $artName) or diag("SecondaryArticle not correctly built from XML (articleName wrong)"); is($scndry->value(), $value) or diag("SecondaryArticle not correctly built from XML (value wrong)"); # Now test parsing of template parameter. # This doesn't hold actual data, it's the template that's used in service registration. # The content is quite different. sub maxval { # Return maximum value in array(ref) my @arr = ref $_[0] eq 'ARRAY' ? @{$_[0]} : @_; my $maxval = 0; foreach (@arr) { ($maxval < $_) and $maxval = $_ } return $maxval; } sub minval { # Return minimum value in array(ref) my @arr = ref $_[0] eq 'ARRAY' ? @{$_[0]} : @_; my $minval = 0; foreach (@arr) { ($minval > $_) and $minval = $_ } return $minval; } my ($maxval, $minval, $default, $obj, $desc) = (maxval(@enums), minval(@enums), -50, "Integer", "some input integer"); my $xml_tmplt = < $obj $desc $default $maxval $minval XML foreach (@enums) { $xml_tmplt .= "$_" } $xml_tmplt .= ""; $scndry = MOBY::Client::SecondaryArticle->new( XML => $xml_tmplt); is($scndry->max, $maxval) or diag("SecondaryArticle not correctly built from XML (max wrong)"); is($scndry->min(), $minval) or diag("SecondaryArticle not correctly built from XML (min wrong)"); is($scndry->description(), $desc) or diag("SecondaryArticle not correctly built from XML (description wrong)"); is($scndry->default(), $default) or diag("SecondaryArticle not correctly built from XML (default wrong)"); eq_array($scndry->enum(), \@enums) or diag("SecondaryArticle not correctly built from XML (enums wrong: " . @{$scndry->enum()} . ")"); sub XML_maker { # Turn XML text into DOM. my $XML = shift; my $parser = XML::LibXML->new(); my $doc; eval { $doc = $parser->parse_string( $XML ); }; return '' if ( $EVAL_ERROR ); #("Couldn't parse '$XML' because:\n\t$EVAL_ERROR") return $doc->getDocumentElement(); } # Now test XML_DOM argument, first with (abstract) template parameter, # then with (real) instantiated parameter $scndry = MOBY::Client::SecondaryArticle->new( XML_DOM => XML_maker($xml_scndry)); is($scndry->articleName(), $artName) or diag("SecondaryArticle not correctly built from XML_DOM (articleName wrong)"); is($scndry->value(), $value) or diag("SecondaryArticle not correctly built from XML (value wrong)"); $scndry = MOBY::Client::SecondaryArticle->new( XML_DOM => XML_maker($xml_tmplt)); is($scndry->max, $maxval) or diag("SecondaryArticle not correctly built from XML_DOM (max wrong)"); is($scndry->min(), $minval) or diag("SecondaryArticle not correctly built from XML_DOM (min wrong)"); is($scndry->default(), $default) or diag("SecondaryArticle not correctly built from XML_DOM (default wrong)"); eq_array($scndry->enum(), \@enums) or diag("SecondaryArticle not correctly built from XML_DOM (enums wrong: " . @{$scndry->enum()} . ")"); TODO: { local $TODO = <new()->XML(\$xml), I expect that the XML will be *parsed*, to modify the object, not that the attribute 'XML' will be set, and the rest left unchanged." TODO $scndry = MOBY::Client::SecondaryArticle->new(); $scndry->XML($xml_scndry); is($scndry->articleName, $artName) or diag("Couldn't create SecondaryArticle from autoloaded method XML(): articleName wrong"); is($scndry->objectType(), $obj) or diag("Couldn't create SecondaryArticle from autoloaded method XML(): objectType wrong"); # eq_array($scndry->namespaces(), [$ns]) # or diag("Couldn't create SecondaryArticle from autoloaded method XML(): namespaces wrong"); }