# -*-Perl-*- Test Harness script for Bioperl
# $Id: GuessSeqFormat.t 15112 2008-12-08 18:12:38Z sendu $


use strict;

BEGIN {
   use lib '.';
   use Bio::Root::Test;
   
   test_begin(-tests => 49);
   
   use_ok('Bio::SeqIO');
   use_ok('Bio::AlignIO');
   use_ok('Bio::Tools::GuessSeqFormat');
}

my @seqformats = qw{ ace embl fasta gcg genbank mase
                        pfam pir raw swiss tab game};

my $format;
my $verbose = test_debug();
#
# Seqio formats
#

#not tested:  waba

my %no_seqio_module = map {$_=>1} qw {gcgblast gcgfasta mase pfam};

my $guessed_format = Bio::Tools::GuessSeqFormat->new
        (-file => test_input_file('test.waba'))->guess;
is $guessed_format, undef ;

my $seq;

eval {
   my $input = Bio::SeqIO->new
       (-file=>test_input_file('test.waba'));
   $seq = $input->next_seq();
};

ok !$seq;

$@ ? ok 1 : ok 0;

foreach $format (@seqformats) {
   SKIP: {
      if ($format eq 'game') {
         test_skip(-tests => 2, -requires_modules => [qw(XML::Writer XML::Parser::PerlSAX)]);
      }
      
      my $guessed_format = Bio::Tools::GuessSeqFormat->new
          (-file => test_input_file("test.$format"),
           #-verbose=> $verbose;
          )->guess;
      $format =~ s/\..*$//;
      is $guessed_format, $format, "Guessed:$format";
      next if $no_seqio_module{$format};
     
      eval {
          my $input = Bio::SeqIO->new
              (-file=>test_input_file("test.$format"));
          $seq = $input->next_seq();
      };
      
      my $implemented = $format eq 'ace' ? 'Bio::PrimarySeqI' : 'Bio::SeqI';
      
      isa_ok $seq, $implemented;
      
      is 0, 1, $@ if $@;
   }
}

#
# AlignIO formats
#

@seqformats = qw{ aln:clustalw fasta mase msf nexus pfam phylip
                  prodom stockholm}; # not selex (same as pfam, mainly)

my %no_alignio_module = map {$_=>1} qw {};

foreach my $ext (@seqformats) {
    my $format;
    ($ext, $format) = split /:/, $ext;
    my $guesser = Bio::Tools::GuessSeqFormat->new
        (-file => test_input_file("testaln.$ext"));
    $format ||= $ext;
    ok $guesser->guess(), $format;

    next if $no_alignio_module{$format};

    eval {
        my $input = Bio::AlignIO->new
            (-file=>test_input_file("testaln.$ext"));
        $seq = $input->next_aln();
    };
    
    isa_ok $seq, 'Bio::Align::AlignI';
    #ok 0, 1, $@ if $@;
}


#
# File handle tests
#
SKIP: {
   test_skip(-tests => 3, -requires_modules => [qw(IO::String)]);

    my $string = ">test1 no comment
agtgctagctagctagctagct
>test2 no comment
gtagttatgc
";

    my $stringfh = new IO::String($string);
    
    my $seqio = Bio::SeqIO->new(-fh => $stringfh);
    while( my $seq = $seqio->next_seq ) {
	ok $seq->id =~ /test/;
    }
    
#
# text guessing
#

    ok new Bio::Tools::GuessSeqFormat( -text => $string )->guess, 'fasta';
}
