The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;

use File::Temp;
use IO::String;
use Test::More 0.88;

use Bio::GFF3::Transform::FromFasta 'gff3_from_fasta';

my @tests = (
    [
        <<'',
>foo  and this is my description
ACTGA  TGATCTGATGATGATGCTTAG TGCTGA
GATCTGATGAC
> conan  The Barbarian!!
CTAAGATGCTCGATGATAGCTAGCATGATGCTAGCTAGCATGCTAGCATGATGCATCGATCATGATG

        <<'',
##gff-version 3
foo	fasta	region	1	44	.	+	.	Name=foo;Note=and this is my description
conan	fasta	region	1	67	.	+	.	Name=conan;Note=The Barbarian!!
##FASTA
>foo  and this is my description
ACTGATGATCTGATGATGATGCTTAGTGCTGA
GATCTGATGAC
> conan  The Barbarian!!
CTAAGATGCTCGATGATAGCTAGCATGATGCTAGCTAGCATGCTAGCATGATGCATCGATCATGATG

      ],
    [
        <<'',
>LA0716_rep_c49
CAAAAACGATTCAACAATACTAATAAGATCATCAAAAATAAATCAAAGTAACATCTCAAT
CCCAAACATGAATTTTTCATCATTAATTCTATTACTTATATCATAAAAATGTAGAACTTA
GCTAACATGATATATTGTTCCACATGACAAAACAAATACAACCAAACAACACATATTAAA
AGTAATATAAATATAATAAATAACTTACTTAGGTATATTTTTCGTTTTTTTGGGGGGGGG
GGGGGGTTTTAACGAATAAGCAAGACATTTCTTCTTGCAATCCATAGTACATCCACCAGA
TCCACCACCAAAACCATAACCTTTTCCAGCACTTGAATATGATTTATAACATTTTGCTGG
ACATATTAATTTCATACCAAAACATGGGCCTTTTACTTTACACACAACACTAGACCTTAT
AACTCCACCTTTTCCATATCCACCTTTTGGGCCTCCAAATCCACCACCAAATACTCCACC
ACCAAGCCCAGGAATATTAAACCCTCCACCAGGCCCAAATATCCCACCAAAACCCACATC
CCCACCATTATTATTTCTGACTTCGCCACTGCCTGTTTCACCTCTCTTTGCCCCGTGTTT
ATTCGGGTGAATGTGTCTTGTAGCAATGGTGGAATTGAATGTTATGATGAGCAATAGAGC
TAAGAGAGTAATGGAGATTTTCTTCTATTTTTTTTTTGGTCCCCGGCCGTAATGGCCACT
CTGCGTTGATACCACTGCTTCCCGGCC
>LA0716_rep_c50
AAGTCTCATAAGGGGGGGTAGAGAAATTTCGAGCATTCAATATACTATTGCAAATAACTT
TAAAAATTCAAACTCCAATTATTTGCAGTATAAAACTACAGATACAAATCCCAGTACATG
GTTTGAGGCACGATAATAAGGTGCTGATGAAATCTAAGACATGAGTTCATAATACATTAC
TGACCAATATATTTACAAAGATTAGGGTAATGGCAGTAAAATCGTTGATTACAGACAACA
TTCTTGGGATATATTCATCTTAAAGATTAGGATTAGTAGTATGTGTGGCAGTCACAGTAG
AGACCATGGCATCAACTCCACAGATATTGTGACCCCTGCAGATCTTGTAATATCCGTGTT
CTCCCCAAGTCTTTCCCCAAGAATTCTTGATGATCCAGTAAGGCTTATTCTTGAGACGGA
TAGGTGCAAAACCTTCAGAACCATAACCGACTAGGAGGACACCATGATCCTGACGCTTGA
GGCAAATTAATGGGCATGAAACTCCTCTAACATATGTCTGCATCCAAGCAGCATTGATCC
CCACTGCAAGAGGACCATGTTTAAGCAGGTTAGCAGCAATTTGGTCTTCATCAAGACCAA

<<'',
##gff-version 3
LA0716_rep_c49	fasta	region	1	748	.	+	.	Name=LA0716_rep_c49
LA0716_rep_c50	fasta	region	1	600	.	+	.	Name=LA0716_rep_c50
##FASTA
>LA0716_rep_c49
CAAAAACGATTCAACAATACTAATAAGATCATCAAAAATAAATCAAAGTAACATCTCAAT
CCCAAACATGAATTTTTCATCATTAATTCTATTACTTATATCATAAAAATGTAGAACTTA
GCTAACATGATATATTGTTCCACATGACAAAACAAATACAACCAAACAACACATATTAAA
AGTAATATAAATATAATAAATAACTTACTTAGGTATATTTTTCGTTTTTTTGGGGGGGGG
GGGGGGTTTTAACGAATAAGCAAGACATTTCTTCTTGCAATCCATAGTACATCCACCAGA
TCCACCACCAAAACCATAACCTTTTCCAGCACTTGAATATGATTTATAACATTTTGCTGG
ACATATTAATTTCATACCAAAACATGGGCCTTTTACTTTACACACAACACTAGACCTTAT
AACTCCACCTTTTCCATATCCACCTTTTGGGCCTCCAAATCCACCACCAAATACTCCACC
ACCAAGCCCAGGAATATTAAACCCTCCACCAGGCCCAAATATCCCACCAAAACCCACATC
CCCACCATTATTATTTCTGACTTCGCCACTGCCTGTTTCACCTCTCTTTGCCCCGTGTTT
ATTCGGGTGAATGTGTCTTGTAGCAATGGTGGAATTGAATGTTATGATGAGCAATAGAGC
TAAGAGAGTAATGGAGATTTTCTTCTATTTTTTTTTTGGTCCCCGGCCGTAATGGCCACT
CTGCGTTGATACCACTGCTTCCCGGCC
>LA0716_rep_c50
AAGTCTCATAAGGGGGGGTAGAGAAATTTCGAGCATTCAATATACTATTGCAAATAACTT
TAAAAATTCAAACTCCAATTATTTGCAGTATAAAACTACAGATACAAATCCCAGTACATG
GTTTGAGGCACGATAATAAGGTGCTGATGAAATCTAAGACATGAGTTCATAATACATTAC
TGACCAATATATTTACAAAGATTAGGGTAATGGCAGTAAAATCGTTGATTACAGACAACA
TTCTTGGGATATATTCATCTTAAAGATTAGGATTAGTAGTATGTGTGGCAGTCACAGTAG
AGACCATGGCATCAACTCCACAGATATTGTGACCCCTGCAGATCTTGTAATATCCGTGTT
CTCCCCAAGTCTTTCCCCAAGAATTCTTGATGATCCAGTAAGGCTTATTCTTGAGACGGA
TAGGTGCAAAACCTTCAGAACCATAACCGACTAGGAGGACACCATGATCCTGACGCTTGA
GGCAAATTAATGGGCATGAAACTCCTCTAACATATGTCTGCATCCAAGCAGCATTGATCC
CCACTGCAAGAGGACCATGTTTAAGCAGGTTAGCAGCAATTTGGTCTTCATCAAGACCAA

      ],
  );

for ( @tests ) {
    my ( $test_fasta, $test_gff3 ) = @$_;

    my $out;
    gff3_from_fasta(
        in   => IO::String->new(\$test_fasta),
        out  => IO::String->new(\$out),
        type => 'region',
        fasta_section => 1,
      );

    is $out, $test_gff3, 'right out';

    my $tempfile = File::Temp->new;
    $tempfile->print( $test_fasta );
    $tempfile->close;

    my $out2;
    gff3_from_fasta(
        in   => "$tempfile",
        out  => IO::String->new(\$out2),
        type => 'region',
        fasta_section => 1,
      );


    is $out, $test_gff3, 'right out reading from tempfile';
}

done_testing;

# add windows line endings to test strings if necessary
sub _platform_lines {
    if( $^O eq 'MSWin32' ) {
        s/\n/\r\n/g for @_;
    }
    return wantarray ? @_  : $_[0]
}