# testing Bio::DB::Query::HIVQuery # $Id: HIVQuery.t 232 2008-12-11 14:51:51Z maj $ use strict; use warnings; BEGIN { use Bio::Root::Test; test_begin( -tests => 41, -requires_modules => [qw( XML::Simple )] ); use_ok('Bio::DB::Query::HIVQuery'); use_ok('Bio::DB::HIV'); use_ok( 'Bio::Annotation::Collection' ); use_ok( 'Bio::Annotation::Comment' ); use_ok( 'Bio::Annotation::Reference' ); use_ok( 'Bio::DB::HIV::HIVQueryHelper' ); } my $tobj= new Bio::DB::Query::HIVQuery(-RUN_OPTION=>0); #object tests isa_ok($tobj, 'Bio::DB::Query::HIVQuery'); #compliance tests isa_ok($tobj, 'Bio::Root::Root'); can_ok($tobj, qw( count ids query )); #methods can_ok($tobj, qw( get_annotations_by_ids get_annotations_by_id add_annotations_for_id remove_annotations_for_ids remove_annotations_for_id remove_annotations get_accessions get_accessions_by_ids get_accessions_by_id ) ); #internals can_ok($tobj, qw( _do_query _reset _session_id _run_option add_id lanl_base map_db make_search_if search_ _map_db_uri _make_search_if_uri _search_uri _schema_file _schema _lanl_query _lanl_response _create_lanl_query _do_lanl_request _parse_lanl_response _parse_query_string _sorry ) ); #defaults tests ok($tobj->_map_db_uri, "_map_db_uri set in default object"); ok($tobj->_make_search_if_uri, "_make_search_if_uri set in default object"); ok($tobj->_search_uri, "_search_uri set in default object"); ok($tobj->_schema_file, "_schema_file set in default object"); ok(defined $tobj->_run_option, "_run_option set in default object"); ok($tobj->{_annotations}, "annotations container available"); # query syntax (no run) $tobj->_reset; $tobj->query(['coreceptor'=>['CCR5 CXCR4','CXCR4'], subtype=>['D', 'F'], country=>'Any']); is($tobj->_do_query(0), 0, 'query syntax check 1'); $tobj->_reset; $tobj->query({'coreceptor'=>['CCR5 CXCR4','CXCR4'], subtype=>['D', 'F'], country=>'Any'}); is($tobj->_do_query(0), 0, 'query syntax check 2'); $tobj->_reset; $tobj->query({'query'=>{'coreceptor'=>['CCR5 CXCR4','CXCR4'], subtype=>['D', 'F']}, 'annot'=> ['country']}); is($tobj->_do_query(0),0, 'query syntax check 3'); $tobj->_reset; $tobj->query("('CCR5 CXCR4', 'CXCR4')[coreceptor] (D F)[subtype] {[country]}"); is($tobj->_do_query(0),0, 'query parser check'); #multiquery parse $tobj->_reset; $tobj->query( "(SI[phenotype] ('CCR5 CXCR4')[coreceptor] C[subtype] OR NSI[phenotype] D[subtype]) AND ZA[country]"); is($tobj->_do_query(0),0, 'multiquery parse check'); SKIP: { test_skip(-requires_module => 'HTML::Parser', -tests => 3); no warnings; # HTML::Parser has an uninited value issue use_ok('HTML::Parser'); use warnings; # help test; just tests that file can be written and that tags are in matching # pairs, with reasonable placement of and my $hlpf = test_output_file(); my $a = 0; my $html = 0; my $h = HTML::Parser->new( empty_element_tags=>1, start_h => [sub {$a++; (shift eq 'html') && ($a==1) && $html++}, "tagname"], end_h => [sub {$a--; (shift eq 'html') && ($a==0) && $html++;}, "tagname"] ); ok($tobj->help($hlpf), "help html to file"); { local $/; undef $/; open HP, $hlpf; $h->parse(); is_deeply([$a, $html], [0, 2], "help html parsed"); 1; } } #exceptions tests #pre-run query exceptions $tobj->verbose(2); $tobj->_reset; $tobj->query( "narb[scroob]" ); throws_ok {$tobj->_do_query} qr/BadParameter/, "bad field exception check"; $tobj->_reset; $tobj->query( "narb[phenotype]" ); throws_ok {$tobj->_do_query} qr/BadParameter/, "bad match data exception check"; $tobj->_reset; $tobj->query( [ 'cd4_count' => "" ] ); throws_ok {$tobj->_do_query} qr/BadParameter/, "empty field not ok exception check"; $tobj->_reset; $tobj->{_schema} = undef; throws_ok {$tobj->_do_query} qr/SchemaNotInit/, "uninitialized schema exception check"; throws_ok {$tobj->count} qr/Query not yet run/, "query not run (level 1) warning check"; throws_ok {$tobj->get_annotations_by_id($tobj->ids)} qr/Requires query run/, "query not run (level 2) warning check"; # network tests SKIP : { test_skip(-tests => 10, -requires_networking => 1); eval {$tobj = Bio::DB::Query::HIVQuery->new(-QUERY=>"(SI[phenotype] ('CCR5 CXCR4')[coreceptor] C[subtype] OR NSI[phenotype] D[subtype]) AND ZA[country]",-RUN_OPTION=>2)}; if ($@) { diag($@); skip("Network problems, skipping all", 10); } ok($tobj,"live query"); cmp_ok( $tobj->count, ">=", 12, "enough sequences returned"); # test query object handling of Bio::DB::HIV my ($tdb, $seqio, $seq); ok( $tdb = new Bio::DB::HIV, "create Bio::DB::HIV object"); eval {$seqio = $tdb->get_Stream_by_query($tobj)}; if ($@) { diag($@); skip("Network problems, skipping all", 7); } ok($seqio, "get SeqIO stream from query"); # test HIVAnnotProcessor indirectly ok($seq = $seqio->next_seq, "access sequence stream"); ok($seq->annotation->get_value('Virus'), "'Virus' annotation present"); like ($seq->annotation->get_value('Virus','phenotype'), qr/SI/, "'Virus' phenotype annotation present"); like ($seq->annotation->get_value('Virus', 'subtype'), qr/[CD]/, "'Virus' subtype annotation present"); ok($seq->accession_number, "GenBank accession available"); # exception checks $tobj->_reset; $tobj->verbose(2); $tobj->query( "2BR02B[accession]" ); throws_ok {$tobj->_do_query(2)} qr/no sequences/i, "no sequences warning check"; }