## test script for Bio::Biblio::*
use utf8;
use strict;
use warnings;
use Bio::Annotation::DBLink;

use Test::More tests => 537;

my @modules;

BEGIN {
    @modules = qw(
                  Bio::Biblio::Article
                  Bio::Biblio::Book
                  Bio::Biblio::BookArticle
                  Bio::Biblio::Journal
                  Bio::Biblio::JournalArticle
                  Bio::Biblio::MedlineArticle
                  Bio::Biblio::MedlineBook
                  Bio::Biblio::MedlineBookArticle
                  Bio::Biblio::MedlineJournal
                  Bio::Biblio::MedlineJournalArticle
                  Bio::Biblio::Organisation
                  Bio::Biblio::Patent
                  Bio::Biblio::Person
                  Bio::Biblio::Proceeding
                  Bio::Biblio::Provider
                  Bio::Biblio::Ref
                  Bio::Biblio::Service
                  Bio::Biblio::TechReport
                  Bio::Biblio::Thesis
                  Bio::Biblio::WebResource
                  Bio::Biblio::PubmedArticle
                  Bio::Biblio::PubmedBookArticle
                  Bio::Biblio::PubmedJournalArticle
                  );
    use_ok($_) foreach (@modules);
}

my ($biblio, $count, $str, @args);
my ($citation, $provider);

foreach my $object (@modules) {
    ok (defined ($biblio = $object->new()));
}

my @scalar_methods_for_ref =
    qw(
     abstract
     abstract_language
     abstract_type
     author_list_complete
     cross_references_list_complete
     date
     date_completed
     date_created
     date_revised
     format
     identifier
     language
     last_modified_date
     repository_subset
     rights
     spatial_location
     subject_headings_source
     temporal_period
     title
     toc
     toc_type
     type
     );
my @other_methods_for_ref =
    qw(
     authors
     cross_references
     codes
     contributors
     keywords
     publisher
     subject_headings
    );

my @scalar_methods_for_book =
    qw(
     edition
     isbn
     series
     volume
     );
my @other_methods_for_book =
    qw(
     editor
     );

my @scalar_methods_for_bookarticle =
    qw(
     );
my @other_methods_for_bookarticle =
    qw(
     book
     );

my @scalar_methods_for_article =
    qw(
     first_page
     last_page
     );
my @other_methods_for_article =
    qw(
     );

my @scalar_methods_for_journalarticle =
    qw(
     issue
     issue_supplement
     volume
     );
my @other_methods_for_journalarticle =
    qw(
     journal
     );

my @scalar_methods_for_medlinearticle =
    qw(
     affiliation
     citation_owner
     date_of_electronic_publication
     gene_symbols
     grant_list_complete
     medline_date
     medline_id
     medline_page
     number_of_references
     other_languages
     pmid
     season
     status
     vernacular_title
     );

my @other_methods_for_medlinearticle =
    qw(
     chemicals
     comment_ins
     comment_ons
     erratum_fors
     erratum_ins
     general_notes
     grants
     mesh_headings
     original_report_ins
     other_abstracts
     other_ids
     republished_froms
     republished_ins
     retraction_ins
     retraction_ofs
     summary_for_patients_ins
     update_ins
     update_ofs
     );

my @scalar_methods_for_medlinejournalarticle =
    qw(
     );
my @other_methods_for_medlinejournalarticle =
    qw(
     journal
     );

my @scalar_methods_for_medlinebookarticle =
    qw(
     );
my @other_methods_for_medlinebookarticle =
    qw(
     book
     );

my @scalar_methods_for_medlinebook =
    qw(
     );
my @other_methods_for_medlinebook =
    qw(
     );

my @scalar_methods_for_pubmedarticle =
    qw(
     pubmed_status
     pubmed_provider_id
     );
my @other_methods_for_pubmedarticle =
    qw(
     pubmed_history_list
     pubmed_article_id_list
     pubmed_url_list
     );

my @scalar_methods_for_journal =
    qw(
     abbreviation
     issn
     name
     );
my @other_methods_for_journal =
    qw(
     );

my @scalar_methods_for_medlinejournal =
    qw(
     coden
     country
     medline_code
     medline_ta
     nlm_unique_id
     );
my @other_methods_for_medlinejournal =
    qw(
     );

my @scalar_methods_for_patent =
    qw(
     doc_number
     doc_office
     doc_type
     );
my @other_methods_for_patent =
    qw(
     applicants
     );

my @scalar_methods_for_webresource =
    qw(
     url
     estimated_size
     cost
     );
my @other_methods_for_webresource =
    qw(
     );

my @scalar_methods_for_provider =
    qw(
     type
     );

my @scalar_methods_for_person =
    qw(
     affiliation
     email
     firstname
     forename
     initials
     lastname
     middlename
     postal_address
     suffix
     );

my @scalar_methods_for_organisation =
    qw(
     name
     );

my @scalar_methods_for_service =
    qw(
     name
     );

#
# Bio::Biblio::MedlineJournalArticle
#
$citation = Bio::Biblio::MedlineJournalArticle->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_ref,
                    @scalar_methods_for_article,
                    @scalar_methods_for_journalarticle,
                    @scalar_methods_for_medlinearticle,
                    @scalar_methods_for_medlinejournalarticle) {
    $str = 'string' . ($count++);
    is $citation->$method ($str), $str, "set '$method'";
    is $citation->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::MedlineJournalArticle->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $citation->$method(), $args[$i+1], $method;
}
foreach my $method (@other_methods_for_ref,
                    @other_methods_for_article,
                    @other_methods_for_journalarticle,
                    @other_methods_for_medlinearticle,
                    @other_methods_for_medlinejournalarticle) {
    is $citation->$method(), undef, "get '$method'";
}
my ($me) = Bio::Biblio::Person->new(-lastname => 'me');
my ($you) = Bio::Biblio::Person->new(-lastname => 'you');
ok $citation->add_author ($me), "add_author 1";
ok $citation->add_author ($you), "add_author 2";
is ${ $citation->authors }[1]->lastname, 'you', "get authors";

ok $citation->add_contributor ($me), "add_contributor 1";
ok $citation->add_contributor ($you), "add_contributor 2";
is ${ $citation->contributors }[1]->lastname, 'you', "get contributors";

my $link1 = Bio::Annotation::DBLink->new(-database => 'here',
                                         -primary_id => '001'
                                        );
my $link2 = Bio::Annotation::DBLink->new(-database => 'there',
                                         -primary_id => '002'
                                        );

ok $citation->add_cross_reference ($link1), "add_cross_reference 1";
ok $citation->add_cross_reference ($link2), "add_cross_reference 2";
is ${ $citation->cross_references }[0]->database, 'here', "get cross_references";
is ${ $citation->cross_references }[1]->primary_id, '002', "get cross_references";


#
# Bio::Biblio::MedlineBookArticle
#
$citation = Bio::Biblio::MedlineBookArticle->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_ref,
                    @scalar_methods_for_article,
                    @scalar_methods_for_bookarticle,
                    @scalar_methods_for_medlinearticle,
                    @scalar_methods_for_medlinebookarticle) {
    $str = 'string' . ($count++);
    is $citation->$method ($str), $str, "set '$method'";
    is $citation->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::MedlineBookArticle->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $citation->$method(), $args[$i+1], $method;
}
foreach my $method (@other_methods_for_ref,
                    @other_methods_for_article,
                    @other_methods_for_bookarticle,
                    @other_methods_for_medlinearticle,
                    @other_methods_for_medlinebookarticle) {
    is $citation->$method(), undef, "get '$method'";
}


#
# Bio::Biblio::MedlineBook
#
$citation = Bio::Biblio::MedlineBook->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_ref,
                    @scalar_methods_for_book,
                    @scalar_methods_for_medlinebook) {
    $str = 'string' . ($count++);
    is $citation->$method ($str), $str, "set '$method'";
    is $citation->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::MedlineBook->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $citation->$method(), $args[$i+1], $method;
}
foreach my $method (@other_methods_for_ref,
                    @other_methods_for_book,
                    @other_methods_for_medlinebook) {
    is $citation->$method(), undef, "get '$method'";
}

#
# Bio::Biblio::MedlineJournal
#
$citation = Bio::Biblio::MedlineJournal->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_journal,
                    @scalar_methods_for_medlinejournal) {
    $str = 'string' . ($count++);
    is $citation->$method ($str), $str, "set '$method'";
    is $citation->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::MedlineJournal->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $citation->$method(), $args[$i+1], $method;
}
foreach my $method (@other_methods_for_journal,
                    @other_methods_for_medlinejournal) {
    is $citation->$method(), undef, "get '$method'";
}

#
# Bio::Biblio::Patent
#
$citation = Bio::Biblio::Patent->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_patent) {
    $str = 'string' . ($count++);
    is $citation->$method ($str), $str, "set '$method'";
    is $citation->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::Patent->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $citation->$method(), $args[$i+1], $method;
}
foreach my $method (@other_methods_for_patent) {
    is $citation->$method(), undef, "get '$method'";
}

#
# Bio::Biblio::WebResource
#
$citation = Bio::Biblio::WebResource->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_webresource) {
    $str = 'string' . ($count++);
    is $citation->$method ($str), $str, "set '$method'";
    is $citation->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::WebResource->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $citation->$method(), $args[$i+1], $method;
}
foreach my $method (@other_methods_for_webresource) {
    is $citation->$method(), undef, "get '$method'";
}


#
# Bio::Biblio::Person
#
$provider = Bio::Biblio::Person->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_provider,
                    @scalar_methods_for_person) {
    $str = 'string' . ($count++);
    is $provider->$method ($str), $str, "set '$method'";
    is $provider->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::Person->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $provider->$method(), $args[$i+1], $method;
}

#
# Bio::Biblio::Organisation
#
$provider = Bio::Biblio::Organisation->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_provider,
                    @scalar_methods_for_organisation) {
    $str = 'string' . ($count++);
    is $provider->$method ($str), $str, "set '$method'";
    is $provider->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::Organisation->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $provider->$method(), $args[$i+1], $method;
}

#
# Bio::Biblio::Service
#
$provider = Bio::Biblio::Service->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_provider,
                    @scalar_methods_for_organisation) {
    $str = 'string' . ($count++);
    is $provider->$method ($str), $str, "set '$method'";
    is $provider->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::Service->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $provider->$method(), $args[$i+1], $method;
}

#
# Bio::Biblio::PubmedJournalArticle
#
$citation = Bio::Biblio::PubmedJournalArticle->new();
@args = ();
$count = 1;
foreach my $method (@scalar_methods_for_pubmedarticle) {
    $str = 'string' . ($count++);
    is $citation->$method ($str), $str, "set '$method'";
    is $citation->$method(), $str, "get '$method'";
    push (@args, ("-$method" => $str));
}

ok defined ($biblio = Bio::Biblio::PubmedJournalArticle->new(@args));
for (my $i = 0; $i < @args; $i += 2) {
    my $method = substr ($args[$i], 1);
    is $citation->$method(), $args[$i+1], $method;
}
foreach my $method (@other_methods_for_pubmedarticle) {
    is $citation->$method(), undef, "get '$method'";
}
