#!/usr/bin/env perl

use Test::Most;

use autodie;
use feature qw(say);

use Bio::MUST::Core;

my $class = 'Bio::MUST::Core::SeqId';

my @valid_ids = (

    [ ('Arabidopsis halleri_81970@78182999') x 2, 0, 0, 0, 0, undef, undef,
        'Arabidopsis', 'halleri', undef, '78182999', undef,
        '81970', undef, undef, undef, undef, undef,
        '78182999', undef, undef, undef,
        'Arabidopsis halleri', 'A. halleri', 'Arabidopsis halleri_81970',
        'Arabidopsis halleri 81970',
        'Arabidopsis halleri 81970',
        'Arabidopsis_halleri_81970@78182999',
        q{'Arabidopsis halleri_81970@78182999'} ],

    [ ('Micromonas sp._296587@255079694') x 2, 0, 0, '1', 0, undef, undef,
        'Micromonas', 'sp.', undef, '255079694', undef,
        '296587', undef, undef, undef, undef, undef,
        '255079694', undef, undef, undef,
        'Micromonas sp.', 'M. sp.', 'Micromonas sp._296587',
        'Micromonas sp. 296587',
        'Micromonas sp. 296587',
        'Micromonas_sp._296587@255079694',
        q{'Micromonas sp._296587@255079694'} ],

    [ ('cp-Arabidopsis halleri_81970@78182999') x 2, 0, 0, 0, 0, 'cp', undef,
        'Arabidopsis', 'halleri', undef, '78182999', undef,
        '81970', undef, undef, undef, undef, undef,
        '78182999', undef, undef, undef,
        'Arabidopsis halleri', 'A. halleri', 'Arabidopsis halleri_81970',
        'Arabidopsis halleri 81970',
        'cp-Arabidopsis halleri 81970',
        'cp-Arabidopsis_halleri_81970@78182999',
        q{'cp-Arabidopsis halleri_81970@78182999'} ],

    [ ('su3-Micromonas sp._296587@255079694') x 2, 0, 0, '1', 0, 'su3', undef,
        'Micromonas', 'sp.', undef, '255079694', undef,
        '296587', undef, undef, undef, undef, undef,
        '255079694', undef, undef, undef,
        'Micromonas sp.', 'M. sp.', 'Micromonas sp._296587',
        'Micromonas sp. 296587',
        'su3-Micromonas sp. 296587',
        'su3-Micromonas_sp._296587@255079694',
        q{'su3-Micromonas sp._296587@255079694'} ],

    [ ('Capsella bursa-pastoris_3719@58003767') x 2, 0, 0, 0, 0, undef, undef,
        'Capsella', 'bursa-pastoris', undef, '58003767', undef,
        '3719', undef, undef, undef, undef, undef,
        '58003767', undef, undef, undef,
        'Capsella bursa-pastoris', 'C. bursa-pastoris', 'Capsella bursa-pastoris_3719',
        'Capsella bursa-pastoris 3719',
        'Capsella bursa-pastoris 3719',
        'Capsella_bursa-pastoris_3719@58003767',
        q{'Capsella bursa-pastoris_3719@58003767'} ],

    [ ('cp-Capsella bursa-pastoris_3719@158513961') x 2, 0, 0, 0, 0, 'cp', undef,
        'Capsella', 'bursa-pastoris', undef, '158513961', undef,
        '3719', undef, undef, undef, undef, undef,
        '158513961', undef, undef, undef,
        'Capsella bursa-pastoris', 'C. bursa-pastoris', 'Capsella bursa-pastoris_3719',
        'Capsella bursa-pastoris 3719',
        'cp-Capsella bursa-pastoris 3719',
        'cp-Capsella_bursa-pastoris_3719@158513961',
        q{'cp-Capsella bursa-pastoris_3719@158513961'} ],

    [ ('Pseudo-nitzschia multiseries_37319@194836') x 2, 0, 0, 0, 0, undef, undef,
        'Pseudo-nitzschia', 'multiseries', undef, '194836', undef,
        '37319', undef, undef, undef, undef, undef,
        '194836', undef, undef, undef,
        'Pseudo-nitzschia multiseries', 'P. multiseries', 'Pseudo-nitzschia multiseries_37319',
        'Pseudo-nitzschia multiseries 37319',
        'Pseudo-nitzschia multiseries 37319',
        'Pseudo-nitzschia_multiseries_37319@194836',
        q{'Pseudo-nitzschia multiseries_37319@194836'} ],

    [ ('cp-Pseudo-nitzschia mannii_587315@111559260') x 2, 0, 0, 0, 0, 'cp', undef,
        'Pseudo-nitzschia', 'mannii', undef, '111559260', undef,
        '587315', undef, undef, undef, undef, undef,
        '111559260', undef, undef, undef,
        'Pseudo-nitzschia mannii', 'P. mannii', 'Pseudo-nitzschia mannii_587315',
        'Pseudo-nitzschia mannii 587315',
        'cp-Pseudo-nitzschia mannii 587315',
        'cp-Pseudo-nitzschia_mannii_587315@111559260',
        q{'cp-Pseudo-nitzschia mannii_587315@111559260'} ],

    [ ('cp-d#Pseudo-nitzschia mannii_587315@111559260') x 2, 0, 0, 0, '1', 'cp', 'd',
        'Pseudo-nitzschia', 'mannii', undef, '111559260', undef,
        '587315', undef, undef, undef, undef, undef,
        '111559260', undef, undef, undef,
        'Pseudo-nitzschia mannii', 'P. mannii', 'Pseudo-nitzschia mannii_587315',
        'Pseudo-nitzschia mannii 587315',
        'cp-Pseudo-nitzschia mannii 587315',
        'cp-d#Pseudo-nitzschia_mannii_587315@111559260',
        q{'cp-d#Pseudo-nitzschia mannii_587315@111559260'} ],

    [ ('nuppct#Vitrella brassicaformis_CCMP3155@ABC1234.1') x 2, 0, 0, 0, 0, undef, 'nuppct',
        'Vitrella', 'brassicaformis', 'CCMP3155', 'ABC1234.1', undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Vitrella brassicaformis', 'V. brassicaformis', 'Vitrella brassicaformis_CCMP3155',
        'Vitrella brassicaformis CCMP3155',
        'Vitrella brassicaformis CCMP3155',
        'nuppct#Vitrella_brassicaformis_CCMP3155@ABC1234.1',
        q{'nuppct#Vitrella brassicaformis_CCMP3155@ABC1234.1'} ],

    [ ('archaeon GW2011_AR10@CP010424') x 2, 0, 0, 0, 0, undef, undef,
        'archaeon', 'GW2011_AR10', undef, 'CP010424', undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'archaeon GW2011_AR10', 'a. GW2011_AR10', 'archaeon GW2011_AR10',
        'archaeon GW2011_AR10',
        'archaeon GW2011_AR10',
        'archaeon_GW2011_AR10@CP010424',
        q{'archaeon GW2011_AR10@CP010424'} ],

    [ ('Nessiteras rhombopteryx@PCR28S') x 2, 0, 0, 0, 0, undef, undef,
        'Nessiteras', 'rhombopteryx', undef, 'PCR28S', undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Nessiteras rhombopteryx', 'N. rhombopteryx', 'Nessiteras rhombopteryx',
        'Nessiteras rhombopteryx',
        'Nessiteras rhombopteryx',
        'Nessiteras_rhombopteryx@PCR28S',
        q{'Nessiteras rhombopteryx@PCR28S'} ],

    [ (q{Nessiteras rhombopteryx_'loch-ness'@PCR28S}) x 2, 0, 0, 0, 0, undef, undef,
        'Nessiteras', 'rhombopteryx', q{'loch-ness'}, 'PCR28S', undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Nessiteras rhombopteryx', 'N. rhombopteryx', q{Nessiteras rhombopteryx_'loch-ness'},
        q{Nessiteras rhombopteryx 'loch-ness'},
        q{Nessiteras rhombopteryx 'loch-ness'},
        q{Nessiteras_rhombopteryx_'loch-ness'@PCR28S},
        q{'Nessiteras rhombopteryx_loch-ness@PCR28S'} ],

    [ ('Arabidopsis halleri@ABB29495.1') x 2, 0, 0, 0, 0, undef, undef,
        'Arabidopsis', 'halleri', undef, 'ABB29495.1', undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Arabidopsis halleri', 'A. halleri', 'Arabidopsis halleri',
        'Arabidopsis halleri',
        'Arabidopsis halleri',
        'Arabidopsis_halleri@ABB29495.1',
        q{'Arabidopsis halleri@ABB29495.1'} ],

    [ ('Arabidopsis halleri_81970@ABB29495.1') x 2, 0, 0, 0, 0, undef, undef,
        'Arabidopsis', 'halleri', undef, 'ABB29495.1', undef,
        '81970', undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Arabidopsis halleri', 'A. halleri', 'Arabidopsis halleri_81970',
        'Arabidopsis halleri 81970',
        'Arabidopsis halleri 81970',
        'Arabidopsis_halleri_81970@ABB29495.1',
        q{'Arabidopsis halleri_81970@ABB29495.1'} ],

    [ ('Arabidopsis halleri_halleri@78182999') x 2, 0, 0, 0, 0, undef, undef,
        'Arabidopsis', 'halleri', 'halleri', '78182999', undef,
        undef, undef, undef, undef, undef, undef,
        '78182999', undef, undef, undef,
        'Arabidopsis halleri', 'A. halleri', 'Arabidopsis halleri_halleri',
        'Arabidopsis halleri halleri',
        'Arabidopsis halleri halleri',
        'Arabidopsis_halleri_halleri@78182999',
        q{'Arabidopsis halleri_halleri@78182999'} ],

    [ ('Arabidopsis halleri_halleri@ABB29495.1') x 2, 0, 0, 0, 0, undef, undef,
        'Arabidopsis', 'halleri', 'halleri', 'ABB29495.1', undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Arabidopsis halleri', 'A. halleri', 'Arabidopsis halleri_halleri',
        'Arabidopsis halleri halleri',
        'Arabidopsis halleri halleri',
        'Arabidopsis_halleri_halleri@ABB29495.1',
        q{'Arabidopsis halleri_halleri@ABB29495.1'} ],

    [ ('Nostoc azollae_0708@298493200') x 2, 0, 0, 0, 0, undef, undef,
        'Nostoc', 'azollae', '0708', '298493200', undef,
        undef, undef, undef, undef, undef, undef,
        '298493200', undef, undef, undef,
        'Nostoc azollae', 'N. azollae', 'Nostoc azollae_0708',
        'Nostoc azollae 0708',
        'Nostoc azollae 0708',
        'Nostoc_azollae_0708@298493200',
        q{'Nostoc azollae_0708@298493200'} ],

    [ ('Anabaena sp._90@19612') x 2, 0, 0, '1', 0, undef, undef,
        'Anabaena', 'sp.', undef, '19612', undef,
        '90', undef, undef, undef, undef, undef,
        '19612', undef, undef, undef,
        'Anabaena sp.', 'A. sp.', 'Anabaena sp._90',
        'Anabaena sp. 90',
        'Anabaena sp. 90',
        'Anabaena_sp._90@19612',
        q{'Anabaena sp._90@19612'} ],

    [ ('c#Oscarella sp._sn2011@OspS50623.H1.1...Parazoanthus_axinellae#NEW#') x 2, 0, '1', '1', '1', undef, 'c',
        'Oscarella', 'sp.', 'sn2011', 'OspS50623.H1.1', 'Parazoanthus_axinellae',
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, 'Parazoanthus axinellae',
        'Oscarella sp.', 'O. sp.', 'Oscarella sp._sn2011',
        'Oscarella sp. sn2011',
        'Oscarella sp. sn2011',
        'c#Oscarella_sp._sn2011@OspS50623.H1.1...Parazoanthus_axinellae#NEW#',
        q{'c#Oscarella sp._sn2011@OspS50623.H1.1...Parazoanthus_axinellae#NEW#'} ],

    [ ('c#Oscarella carmela@Ocar68884.H1.1...Favella_ehrenbergii#NEW#') x 2, 0, '1', 0, '1', undef, 'c',
        'Oscarella', 'carmela', undef, 'Ocar68884.H1.1', 'Favella_ehrenbergii',
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, 'Favella ehrenbergii',
        'Oscarella carmela', 'O. carmela', 'Oscarella carmela',
        'Oscarella carmela',
        'Oscarella carmela',
        'c#Oscarella_carmela@Ocar68884.H1.1...Favella_ehrenbergii#NEW#',
        q{'c#Oscarella carmela@Ocar68884.H1.1...Favella_ehrenbergii#NEW#'} ],

    [ ('Urticina eques@Uequ12160.E.lc#NEW#') x 2, 0, '1', 0, 0, undef, undef,
        'Urticina', 'eques', undef, 'Uequ12160.E.lc', undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Urticina eques', 'U. eques', 'Urticina eques',
        'Urticina eques',
        'Urticina eques',
        'Urticina_eques@Uequ12160.E.lc#NEW#',
        q{'Urticina eques@Uequ12160.E.lc#NEW#'} ],

    [ ('c#Pseudo-nitzschia australis_1024910ABMMETSP0142@CAMNT_0008229771.E.lc...Nostoc_azollae#NEW#') x 2, 0, '1', 0, '1', undef, 'c',
        'Pseudo-nitzschia', 'australis', '1024910ABMMETSP0142', 'CAMNT_0008229771.E.lc', 'Nostoc_azollae',
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, 'Nostoc azollae',
        'Pseudo-nitzschia australis', 'P. australis', 'Pseudo-nitzschia australis_1024910ABMMETSP0142',
        'Pseudo-nitzschia australis 1024910ABMMETSP0142',
        'Pseudo-nitzschia australis 1024910ABMMETSP0142',
        'c#Pseudo-nitzschia_australis_1024910ABMMETSP0142@CAMNT_0008229771.E.lc...Nostoc_azollae#NEW#',
        q{'c#Pseudo-nitzschia australis_1024910ABMMETSP0142@CAMNT_0008229771.E.lc...Nostoc_azollae#NEW#'} ],

    [ ('Micromonas sp._296587@255079694') x 2, 0, 0, '1', 0, undef, undef,
        'Micromonas', 'sp.', undef, '255079694', undef,
        '296587', undef, undef, undef, undef, undef,
        '255079694', undef, undef, undef,
        'Micromonas sp.', 'M. sp.', 'Micromonas sp._296587',
        'Micromonas sp. 296587',
        'Micromonas sp. 296587',
        'Micromonas_sp._296587@255079694',
        q{'Micromonas sp._296587@255079694'} ],

    [ ('Arabidopsis halleri_81970@ABB29495.1') x 2, 0, 0, 0, 0, undef, undef,
        'Arabidopsis', 'halleri', undef, 'ABB29495.1', undef,
        '81970', undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Arabidopsis halleri', 'A. halleri', 'Arabidopsis halleri_81970',
        'Arabidopsis halleri 81970',
        'Arabidopsis halleri 81970',
        'Arabidopsis_halleri_81970@ABB29495.1',
        q{'Arabidopsis halleri_81970@ABB29495.1'} ],

    [ ('Listeria monocytogenes_GCA_000438585.1@AGR25087.1') x 2, 0, 0, 0, 0, undef, undef,
        'Listeria', 'monocytogenes', undef, 'AGR25087.1', undef,
        'GCA_000438585.1', 'GCA_000438585.1', 'GCA_000438585', '1', 'GCA', '000438585',
        undef, undef, undef, undef,
        'Listeria monocytogenes', 'L. monocytogenes', 'Listeria monocytogenes_GCA_000438585.1',
        'Listeria monocytogenes GCA_000438585.1',
        'Listeria monocytogenes GCA_000438585.1',
        'Listeria_monocytogenes_GCA_000438585.1@AGR25087.1',
        q{'Listeria monocytogenes_GCA_000438585.1@AGR25087.1'} ],

    [ ('Listeria monocytogenes_GCF_000438585.1@AGR25087.1') x 2, 0, 0, 0, 0, undef, undef,
        'Listeria', 'monocytogenes', undef, 'AGR25087.1', undef,
        'GCF_000438585.1', 'GCF_000438585.1', 'GCF_000438585', '1', 'GCF', '000438585',
        undef, undef, undef, undef,
        'Listeria monocytogenes', 'L. monocytogenes', 'Listeria monocytogenes_GCF_000438585.1',
        'Listeria monocytogenes GCF_000438585.1',
        'Listeria monocytogenes GCF_000438585.1',
        'Listeria_monocytogenes_GCF_000438585.1@AGR25087.1',
        q{'Listeria monocytogenes_GCF_000438585.1@AGR25087.1'} ],

    [ ('81970|ABB29495.1') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, 'ABB29495.1', undef,
        '81970', undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        '81970|ABB29495.1',
        q{'81970|ABB29495.1'} ],

    [ ('45351|NEMVEDRAFT_v1g121533-PA') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, 'NEMVEDRAFT_v1g121533-PA', undef,
        '45351', undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        '45351|NEMVEDRAFT_v1g121533-PA',
        q{'45351|NEMVEDRAFT_v1g121533-PA'} ],

    [ ('GCF_000438585.1|AGR25087.1') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, 'AGR25087.1', undef,
        'GCF_000438585.1', 'GCF_000438585.1', 'GCF_000438585', '1', 'GCF', '000438585',
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'GCF_000438585.1|AGR25087.1',
        q{'GCF_000438585.1|AGR25087.1'} ],

    [ ('gi|404160475') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        '404160475', undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'gi|404160475',
        q{'gi|404160475'} ],

    [ ('gi|404160475|gb|AFR53081.1|') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, 'AFR53081.1', undef,
        undef, undef, undef, undef, undef, undef,
        '404160475', undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'gi|404160475|gb|AFR53081.1|',
        q{'gi|404160475|gb|AFR53081.1|'} ],

    [ ('gi|404160475|gb|AFR53081.1| AOX [Anthurium andraeanum]') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, 'AFR53081.1', undef,
        undef, undef, undef, undef, undef, undef,
        '404160475', undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'gi|404160475|gb|AFR53081.1| AOX [Anthurium andraeanum]',
        q{'gi|404160475|gb|AFR53081.1| AOX [Anthurium andraeanum]'} ],

    [ ('gi|11245480|gb|AAG33633.1|AF314254_1') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, 'AAG33633.1', undef,
        undef, undef, undef, undef, undef, undef,
        '11245480', undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'gi|11245480|gb|AAG33633.1|AF314254_1',
        q{'gi|11245480|gb|AAG33633.1|AF314254_1'} ],

    [ ('gi|11245480|gb|AAG33633.1|AF314254_1 alternative oxidase 1 [Chlamydomonas reinhardtii]') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, 'AAG33633.1', undef,
        undef, undef, undef, undef, undef, undef,
        '11245480', undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'gi|11245480|gb|AAG33633.1|AF314254_1 alternative oxidase 1 [Chlamydomonas reinhardtii]',
        q{'gi|11245480|gb|AAG33633.1|AF314254_1 alternative oxidase 1 [Chlamydomonas reinhardtii]'} ],

    [ ('gnl|EF-Ts_27|PF3D7_0305000') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, 'EF-Ts_27', 'PF3D7_0305000', undef,
        undef, undef, undef,
        undef,
        undef,
        'gnl|EF-Ts_27|PF3D7_0305000',
        q{'gnl|EF-Ts_27|PF3D7_0305000'},
        'gnl', 'EF-Ts_27', 'PF3D7_0305000' ],

    [ ('gnl|met-10+|PF3D7_0914300') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, 'met-10+', 'PF3D7_0914300', undef,
        undef, undef, undef,
        undef,
        undef,
        'gnl|met-10+|PF3D7_0914300',
        q{'gnl|met-10+|PF3D7_0914300'},
        'gnl', 'met-10+', 'PF3D7_0914300' ],

    [ ('gnl|TPx(Gl)_120|PF3D7_1212000') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, 'TPx(Gl)_120', 'PF3D7_1212000', undef,
        undef, undef, undef,
        undef,
        undef,
        'gnl|TPx(Gl)_120|PF3D7_1212000',
        q{'gnl|TPx(Gl)_120|PF3D7_1212000'},
        'gnl', 'TPx(Gl)_120', 'PF3D7_1212000' ],

    [ ('gnl|OTUlcp2|PF3D7_1031400.2|more-stuff preserved description') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, 'OTUlcp2', 'PF3D7_1031400.2', undef,
        undef, undef, undef,
        undef,
        undef,
        'gnl|OTUlcp2|PF3D7_1031400.2|more-stuff preserved description',
        q{'gnl|OTUlcp2|PF3D7_1031400.2|more-stuff preserved description'},
        'gnl', 'OTUlcp2', 'PF3D7_1031400.2', 'more-stuff' ],

    [ ('seq1') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'seq1',
        q{'seq1'} ],

    [ (q{Arthrospira platensis UTEX 'LB 2340' [88792662]}) x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        q{Arthrospira platensis UTEX 'LB 2340' [88792662]},
        q{'Arthrospira platensis UTEX LB 2340 [88792662]'} ],

    [ ('candidatus_methylomirabilis_oxyfera~GCA_000091165.1@FP565575~[[462948..463340]]=Bacteria-Candidate_division_nc10-unknown_class-unknown_order-unknown_family-Candidatus_methylomirabilis-Candidatus_methylomirabilis_oxyfera') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'candidatus_methylomirabilis_oxyfera~GCA_000091165.1@FP565575~[[462948..463340]]=Bacteria-Candidate_division_nc10-unknown_class-unknown_order-unknown_family-Candidatus_methylomirabilis-Candidatus_methylomirabilis_oxyfera',
        q{'candidatus_methylomirabilis_oxyfera~GCA_000091165.1@FP565575~[[462948..463340]]=Bacteria-Candidate_division_nc10-unknown_class-unknown_order-unknown_family-Candidatus_methylomirabilis-Candidatus_methylomirabilis_oxyfera'} ],

    [ ('candidatus_kinetoplastibacterium_crithidii|TCC036E~GCA_000340825.1@CP003804~[[809869..810243]]C=Bacteria-Proteobacteria-Betaproteobacteria-unknown_order-unknown_family-Kinetoplastibacterium-Candidatus_kinetoplastibacterium_crithidii') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'candidatus_kinetoplastibacterium_crithidii|TCC036E~GCA_000340825.1@CP003804~[[809869..810243]]C=Bacteria-Proteobacteria-Betaproteobacteria-unknown_order-unknown_family-Kinetoplastibacterium-Candidatus_kinetoplastibacterium_crithidii',
        q{'candidatus_kinetoplastibacterium_crithidii|TCC036E~GCA_000340825.1@CP003804~[[809869..810243]]C=Bacteria-Proteobacteria-Betaproteobacteria-unknown_order-unknown_family-Kinetoplastibacterium-Candidatus_kinetoplastibacterium_crithidii'} ],

    [ ('Escherichia_coli|ER2796~GCA_000800215.1@CP009644~[[4152126..4152491]]=Bacteria-Proteobacteria-Gammaproteobacteria-Enterobacteriales-Enterobacteriaceae-Escherichia-Escherichia_coli') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'Escherichia_coli|ER2796~GCA_000800215.1@CP009644~[[4152126..4152491]]=Bacteria-Proteobacteria-Gammaproteobacteria-Enterobacteriales-Enterobacteriaceae-Escherichia-Escherichia_coli',
        q{'Escherichia_coli|ER2796~GCA_000800215.1@CP009644~[[4152126..4152491]]=Bacteria-Proteobacteria-Gammaproteobacteria-Enterobacteriales-Enterobacteriaceae-Escherichia-Escherichia_coli'} ],

    [ ('Salmonella_enterica_subsp._enterica|SEROVARENTERITIDISEC20110358~GCA_000623335.1@CP007260~[[4225927..4226292]]=Bacteria-Proteobacteria-Gammaproteobacteria-Enterobacteriales-Enterobacteriaceae-Salmonella-Salmonella_enterica-Salmonella_enterica_subsp._enterica') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'Salmonella_enterica_subsp._enterica|SEROVARENTERITIDISEC20110358~GCA_000623335.1@CP007260~[[4225927..4226292]]=Bacteria-Proteobacteria-Gammaproteobacteria-Enterobacteriales-Enterobacteriaceae-Salmonella-Salmonella_enterica-Salmonella_enterica_subsp._enterica',
        q{'Salmonella_enterica_subsp._enterica|SEROVARENTERITIDISEC20110358~GCA_000623335.1@CP007260~[[4225927..4226292]]=Bacteria-Proteobacteria-Gammaproteobacteria-Enterobacteriales-Enterobacteriaceae-Salmonella-Salmonella_enterica-Salmonella_enterica_subsp._enterica'} ],

    [ ('Mycobacterium_tuberculosis|BEIJING/NITR203~GCA_000364825.1@CP005082~[[748789..749181]]=Bacteria-Actinobacteria-Actinobacteria-Corynebacteriales-Mycobacteriaceae-Mycobacterium-Mycobacterium_tuberculosis') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'Mycobacterium_tuberculosis|BEIJING/NITR203~GCA_000364825.1@CP005082~[[748789..749181]]=Bacteria-Actinobacteria-Actinobacteria-Corynebacteriales-Mycobacteriaceae-Mycobacterium-Mycobacterium_tuberculosis',
        q{'Mycobacterium_tuberculosis|BEIJING/NITR203~GCA_000364825.1@CP005082~[[748789..749181]]=Bacteria-Actinobacteria-Actinobacteria-Corynebacteriales-Mycobacteriaceae-Mycobacterium-Mycobacterium_tuberculosis'} ],

    [ ('Pycnococcus provasolii_41880@PROTID001') x 2, 0, 0, 0, 0, undef, undef,
        'Pycnococcus', 'provasolii', undef, 'PROTID001', undef,
        '41880', undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Pycnococcus provasolii', 'P. provasolii', 'Pycnococcus provasolii_41880',
        'Pycnococcus provasolii 41880',
        'Pycnococcus provasolii 41880',
        'Pycnococcus_provasolii_41880@PROTID001',
        q{'Pycnococcus provasolii_41880@PROTID001'} ],

    [ ('Pycnococcus provasolii_RCC251_MMETSP1472_41880@PROTID001') x 2, 0, 0, 0, 0, undef, undef,
        'Pycnococcus', 'provasolii', 'RCC251_MMETSP1472', 'PROTID001', undef,
        '41880', undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Pycnococcus provasolii', 'P. provasolii', 'Pycnococcus provasolii_RCC251_MMETSP1472_41880',
        'Pycnococcus provasolii RCC251_MMETSP1472 41880',
        'Pycnococcus provasolii RCC251_MMETSP1472 41880',
        'Pycnococcus_provasolii_RCC251_MMETSP1472_41880@PROTID001',
        q{'Pycnococcus provasolii_RCC251_MMETSP1472_41880@PROTID001'} ],

    [ ('Moorea producens_GCF_001854205.1@PROTID001') x 2, 0, 0, 0, 0, undef, undef,
        'Moorea', 'producens', undef, 'PROTID001', undef,
        'GCF_001854205.1', 'GCF_001854205.1', 'GCF_001854205', '1', 'GCF', '001854205',
        undef, undef, undef, undef,
        'Moorea producens', 'M. producens', 'Moorea producens_GCF_001854205.1',
        'Moorea producens GCF_001854205.1',
        'Moorea producens GCF_001854205.1',
        'Moorea_producens_GCF_001854205.1@PROTID001',
        q{'Moorea producens_GCF_001854205.1@PROTID001'} ],

    [ ('Moorea producens_JHB_GCF_001854205.1@PROTID001') x 2, 0, 0, 0, 0, undef, undef,
        'Moorea', 'producens', 'JHB', 'PROTID001', undef,
        'GCF_001854205.1', 'GCF_001854205.1', 'GCF_001854205', '1', 'GCF', '001854205',
        undef, undef, undef, undef,
        'Moorea producens', 'M. producens', 'Moorea producens_JHB_GCF_001854205.1',
        'Moorea producens JHB GCF_001854205.1',
        'Moorea producens JHB GCF_001854205.1',
        'Moorea_producens_JHB_GCF_001854205.1@PROTID001',
        q{'Moorea producens_JHB_GCF_001854205.1@PROTID001'} ],

    [ ('u#Emiliania huxleyi_PLYM219@CAMNT_0030889445') x 2, 0, 0, 0, '1', undef, 'u',
        'Emiliania', 'huxleyi', 'PLYM219', 'CAMNT_0030889445', undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        'Emiliania huxleyi', 'E. huxleyi', 'Emiliania huxleyi_PLYM219',
        'Emiliania huxleyi PLYM219',
        'Emiliania huxleyi PLYM219',
        'u#Emiliania_huxleyi_PLYM219@CAMNT_0030889445',
        q{'u#Emiliania huxleyi_PLYM219@CAMNT_0030889445'} ],

    # space-trailing ids (unparsable)
    [ ('Arabidopsis halleri_81970@78182999 ') x 2, '1', undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef,
        undef, undef, undef, undef, undef, undef,
        undef, undef, undef, undef,
        undef, undef, undef,
        undef,
        undef,
        'Arabidopsis halleri_81970@78182999 ',
        q{'Arabidopsis halleri_81970@78182999 '} ],

    # quoted ids (from trees)
    [ q{'Nematostella_vectensis_45351@NEMVEDRAFT_v1g166011-PA'}, 'Nematostella vectensis_45351@NEMVEDRAFT_v1g166011-PA', 0, 0, 0, 0, undef, undef,
        'Nematostella', 'vectensis', undef, 'NEMVEDRAFT_v1g166011-PA', undef, '45351',
        undef, undef, undef, undef, undef, undef, undef, undef, undef,
        'Nematostella vectensis', 'N. vectensis', 'Nematostella vectensis_45351',
        'Nematostella vectensis 45351', 'Nematostella vectensis 45351',
        'Nematostella_vectensis_45351@NEMVEDRAFT_v1g166011-PA',
        q{'Nematostella vectensis_45351@NEMVEDRAFT_v1g166011-PA'} ],
);

for my $exp_row (@valid_ids) {
    my $seq_id = $class->new( full_id => $exp_row->[0] );
    explain $seq_id->full_id;
    my $got_row = [
        $seq_id->full_id,                           # 0
        $seq_id->is_foreign,                        # 1
        $seq_id->is_new,                            # 2
        $seq_id->is_genus_only,                     # 3
        $seq_id->is_doubtful,                       # 4
        $seq_id->family,                            # 5
        $seq_id->tag,                               # 6
        $seq_id->genus,                             # 7
        $seq_id->species,                           # 8
        $seq_id->strain,                            # 9
        $seq_id->accession,                         # 10
        $seq_id->tail,                              # 11
        $seq_id->taxon_id,                          # 12
        $seq_id->gca,                               # 13
        $seq_id->gca_novers,                        # 14
        $seq_id->gca_vers,                          # 15
        $seq_id->gca_prefix,                        # 16
        $seq_id->gca_number,                        # 17
        $seq_id->gi,                                # 18
        $seq_id->database,                          # 19
        $seq_id->identifier,                        # 20
        $seq_id->contam_org,                        # 21
        $seq_id->org,                               # 22
        $seq_id->abbr_org,                          # 23
        $seq_id->full_org,                          # 24
        $seq_id->full_org( q{ } ),                  # 25
        $seq_id->family_then_full_org( q{ } ),      # 26
        $seq_id->foreign_id,                        # 27
        $seq_id->nexus_id,                          # 28
        $seq_id->all_parts,                         # 29 must be the last element because when undef
                                                    #    it returns an empty list that flatens to no
                                                    #    element and shortens the list by one and thus
                                                    #    modifies array index
    ];
    # explain $got_row;
    is_deeply $got_row, [ @{$exp_row}[1..$#{$exp_row}] ],
        "Built and queried SeqId: $exp_row->[0]";
}

my @ids2build = (
    [ 'Arabidopsis halleri', '81970', '78182999',
        'Arabidopsis halleri_81970@78182999' ],
    [ 'Micromonas sp. RCC299', '296587', '255079694',
        'Micromonas sp._296587@255079694' ],
    [ 'Capsella bursa-pastoris', '3719', '158513961',
        'Capsella bursa-pastoris_3719@158513961' ],
    [ 'Pseudo-nitzschia multiseries', '37319', '194836',
        'Pseudo-nitzschia multiseries_37319@194836' ],
    [ 'Capsella bursa-pastoris', '3719', q{},
        'Capsella bursa-pastoris_3719' ],
    [ 'Ostreococcus \'lucimarinus\'', '242159', q{},
        'Ostreococcus lucimarinus_242159' ],
    [ 'Micromonas sp. RCC299', '296587', q{},
        'Micromonas sp._296587' ],
    [ 'Candidatus Phytoplasma mali', '37692', q{},
        'Phytoplasma mali_37692' ],
    [ 'Candidatus Arthromitus sp. SFB-rat-Yit', '1041504', q{},
        'Arthromitus sp._1041504' ],
    [ 'Candidatus Cloacamonas acidaminovorans str. Evry', '459349', q{},
        'Cloacamonas acidaminovorans_459349' ],
    [ 'Clostridium sticklandii', '1511', q{},
        'Clostridium sticklandii_1511' ],
    [ 'Clostridium sticklandii', q{}, q{},
        'Clostridium sticklandii' ],

    # TODO: add more ids! (test no species at all genus-like, viruses etc)
);

my @strains2build = (
    [ 'Arabidopsis halleri', '81970', '78182999', 1,
        'Arabidopsis halleri_81970@78182999' ],
    [ 'Micromonas sp. RCC299', '296587', '255079694', 1,
        'Micromonas sp._RCC299_296587@255079694' ],
    [ 'Capsella bursa-pastoris', '3719', '158513961', 1,
        'Capsella bursa-pastoris_3719@158513961' ],
    [ 'Pseudo-nitzschia multiseries', '37319', '194836', 1,
        'Pseudo-nitzschia multiseries_37319@194836' ],
    [ 'Capsella bursa-pastoris', '3719', q{}, 1,
        'Capsella bursa-pastoris_3719' ],
    [ 'Ostreococcus \'lucimarinus\'', '242159', q{}, 1,
        'Ostreococcus lucimarinus_242159' ],
    [ 'Micromonas sp. RCC299', '296587', q{}, 1,
        'Micromonas sp._RCC299_296587' ],
    [ 'Candidatus Phytoplasma mali', '37692', q{}, 1,
        'Phytoplasma mali_37692' ],
    [ 'Candidatus Arthromitus sp. SFB-rat-Yit', '1041504', q{}, 1,
        'Arthromitus sp._SFBratYit_1041504' ],
    [ 'Candidatus Cloacamonas acidaminovorans str. Evry', '459349', q{}, 1,
        'Cloacamonas acidaminovorans_Evry_459349' ],
    [ 'Clostridium sticklandii', '1511', q{}, 1,
        'Clostridium sticklandii_1511' ],
    [ 'Clostridium sticklandii', q{}, q{}, 1,
        'Clostridium sticklandii' ],

    # TODO: add more ids! (test no species at all genus-like, viruses etc)
);

for my $exp_row (@ids2build) {
    my $seq_id = $class->new_with(
        org       => $exp_row->[0],
        taxon_id  => $exp_row->[1],
        accession => $exp_row->[2]
    );
    cmp_ok $seq_id->full_id, 'eq', $exp_row->[3],
        "got expected SeqId: $exp_row->[3]";
}

for my $exp_row (@strains2build) {
    my $seq_id = $class->new_with(
        org         => $exp_row->[0],
        taxon_id    => $exp_row->[1],
        accession   => $exp_row->[2],
        keep_strain => $exp_row->[3]
    );
    cmp_ok $seq_id->full_id, 'eq', $exp_row->[4],
        "got expected SeqId: $exp_row->[4]";
}

my @ids2clean = (
    [ 'Candidatus Phytoplasma mali', 'Phytoplasma mali' ],
    [ 'Candidatus Arthromitus sp. SFB-rat-Yit', 'Arthromitus sp. SFB-rat-Yit' ],
# TODO: check these
#     [ 'uncultured cyanobacterium', 'cyanobacterium' ],
#     [ 'uncultured actinobacterium WB039', 'actinobacterium WB039' ],
    [ 'uncultured Candidatus Hamiltonella sp.', 'Hamiltonella sp.' ],
    [ 'cf. Stagonospora sp. S619', 'Stagonospora sp. S619' ],
    [ 'cf. Pavona sp. 2 DGL-2013', 'Pavona sp. 2 DGL-2013' ],
);
explain \@ids2clean;

for my $exp_row (@ids2clean) {
    my $org = $class->clean_ncbi_name( $exp_row->[0] );

    cmp_ok $org, 'eq', $exp_row->[1],
        "got expected SeqId: $exp_row->[1]";
}

done_testing;