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

use strict;

BEGIN { 
    use lib '.';
    use Bio::Root::Test;
    
    test_begin(-tests => 24,
			   -requires_module => 'IO::String');
	
	use_ok('Bio::LiveSeq::Mutator');
	use_ok('Bio::LiveSeq::IO::BioPerl');
	use_ok('Bio::Variation::IO');
}

$a = Bio::LiveSeq::Mutator->new();
ok $a;

is $a->numbering, 'coding';
ok $a->numbering('coding 1');
is $a->numbering, 'coding 1';

my $mt = Bio::LiveSeq::Mutation->new();
ok $mt->seq('g');
$mt->pos(100);
ok ($a->add_Mutation($mt));
my @each = $a->each_Mutation;
is( (scalar @each), 1 );
my $mt_b = pop @each;
is($mt_b->seq, 'g');
my $filename=test_input_file('ar.embl');
my $loader=Bio::LiveSeq::IO::BioPerl->load('-file' => "$filename");
my $gene_name='AR'; # was G6PD

my $gene=$loader->gene2liveseq('-gene_name' => $gene_name);
ok($gene);
ok $a->gene($gene);

my $results = $a->change_gene();
ok($results);

# bug 1701 - mutations on intron/exon boundaries where codon is split 

$loader = Bio::LiveSeq::IO::BioPerl->load( -db   => 'EMBL',
                                -file => test_input_file('ssp160.embl.1')
                        );
# move across intron/exon boundaries, check expected mutations
my @positions = (3128..3129,3188..3189);
my @bases = (qw(C C T T));
my @expected = (qw(T683T T684P T684I T684T));
my $ct = 0;

for my $pos (@positions) {
    # reset gene
    my $gene = $loader->gene2liveseq( -gene_name => 'ssp160');
    my $mutation = Bio::LiveSeq::Mutation->new( -seq => $bases[$ct],
                                                -pos => $pos,
                          );
    my $mutate = Bio::LiveSeq::Mutator->new( -gene      => $gene,
                                             -numbering => 'entry',
                           );
    
    $mutate->add_Mutation( $mutation );

    my $results = $mutate->change_gene();
    
    ok(defined($results));
    is($expected[$ct], $results->trivname);
    $ct++;
}

my $s;
my $io = IO::String->new($s);
my $out = Bio::Variation::IO->new('-fh'   => $io,
                  '-format' => 'flat'
                  );
ok($out->write($results));
ok ($s=~/DNA/ && $s=~/RNA/ && $s=~/AA/);
