# Copyright 2012 by Wibowo Arindrarto.  All rights reserved.
# This code is part of the Biopython distribution and governed by its
# license.  Please see the LICENSE file that should have been included
# as part of this package.

"""Tests for SearchIO FastaIO parsers."""

import os
import unittest

from Bio import BiopythonExperimentalWarning

import warnings


with warnings.catch_warnings():
    warnings.simplefilter('ignore', BiopythonExperimentalWarning)
    from Bio.SearchIO import parse

# test case files are in the Blast directory
TEST_DIR = 'Fasta'
FMT = 'fasta-m10'


def get_file(filename):
    """Returns the path of a test file."""
    return os.path.join(TEST_DIR, filename)


class Fasta34Cases(unittest.TestCase):

    def test_output002(self):
        """Test parsing fasta34 output (output002.m10)"""

        m10_file = get_file('output002.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(3, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('gi|10955263|ref|NP_052604.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('34.26', qresult.version)
        self.assertEqual('NC_002695.faa', qresult.target)
        self.assertEqual(107, qresult.seq_len)
        self.assertEqual('plasmid mobilization [Escherichia coli O157:H7 s 107 aa', qresult.description)
        self.assertEqual(2, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|162139799|ref|NP_309634.2|', hit.id)
        self.assertEqual('23S rRNA pseudouridine synthase E [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(207, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(55, hsp.initn_score)
        self.assertEqual(55, hsp.init1_score)
        self.assertEqual(77, hsp.opt_score)
        self.assertEqual(110.8, hsp.z_score)
        self.assertEqual(26.5, hsp.bitscore)
        self.assertEqual(1.2, hsp.evalue)
        self.assertEqual(77, hsp.sw_score)
        self.assertAlmostEqual(28.4, hsp.ident_pct)
        self.assertAlmostEqual(54.5, hsp.pos_pct)
        self.assertEqual(88, hsp.aln_span)
        self.assertEqual(4, hsp.query_start)
        self.assertEqual(89, hsp.query_end)
        self.assertEqual('SGSNTRRRAISRPVR--LTAEEDQEIRKRAAECG-KTVSGFLRAAALGKKVNSLTDDRVLKEVMRLGALQKKLFIDGKRVGDREYAEV', str(hsp.query.seq))
        self.assertEqual(15, hsp.hit_start)
        self.assertEqual(103, hsp.hit_end)
        self.assertEqual('SQRSTRRKPENQPTRVILFNKPYDVLPQFTDEAGRKTLKEFIPVQGVYAAGRLDRDSEGLLVLTNNGALQARLTQPGKRTGKIYYVQV', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)
        # first qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|15831859|ref|NP_310632.1|', hit.id)
        self.assertEqual('trehalose-6-phosphate phosphatase [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(266, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(43, hsp.initn_score)
        self.assertEqual(43, hsp.init1_score)
        self.assertEqual(69, hsp.opt_score)
        self.assertEqual(98.6, hsp.z_score)
        self.assertEqual(24.6, hsp.bitscore)
        self.assertEqual(5.8, hsp.evalue)
        self.assertEqual(69, hsp.sw_score)
        self.assertAlmostEqual(28.3, hsp.ident_pct)
        self.assertAlmostEqual(66.0, hsp.pos_pct)
        self.assertEqual(53, hsp.aln_span)
        self.assertEqual(26, hsp.query_start)
        self.assertEqual(74, hsp.query_end)
        self.assertEqual('EIRKRAAECGKTVSGFLRAAA-LGKKV----NSLTDDRVLKEVMRLGALQKKL', str(hsp.query.seq))
        self.assertEqual(166, hsp.hit_start)
        self.assertEqual(219, hsp.hit_end)
        self.assertEqual('EIKPRGTSKGEAIAAFMQEAPFIGRTPVFLGDDLTDESGFAVVNRLGGMSVKI', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('gi|10955264|ref|NP_052605.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('34.26', qresult.version)
        self.assertEqual('NC_002695.faa', qresult.target)
        self.assertEqual(126, qresult.seq_len)
        self.assertEqual('hypothetical protein pOSAK1_02 [Escherichia coli O157:H7 s 126 aa', qresult.description)
        self.assertEqual(2, len(qresult))
        # second qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|15829419|ref|NP_308192.1|', hit.id)
        self.assertEqual('serine endoprotease [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(474, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(64, hsp.initn_score)
        self.assertEqual(40, hsp.init1_score)
        self.assertEqual(77, hsp.opt_score)
        self.assertEqual(105.8, hsp.z_score)
        self.assertEqual(27.0, hsp.bitscore)
        self.assertEqual(2.3, hsp.evalue)
        self.assertEqual(77, hsp.sw_score)
        self.assertAlmostEqual(25.0, hsp.ident_pct)
        self.assertAlmostEqual(62.0, hsp.pos_pct)
        self.assertEqual(92, hsp.aln_span)
        self.assertEqual(30, hsp.query_start)
        self.assertEqual(117, hsp.query_end)
        self.assertEqual('SEFFSKIESDLKKKKSKGDVFFDLIIPNG-----GKKDRYVYTSFNGEKFSSYTLNKVTKTDEYNDLSELSASFFKKNFDKINVNLLSKATS', str(hsp.query.seq))
        self.assertEqual(295, hsp.hit_start)
        self.assertEqual(384, hsp.hit_end)
        self.assertEqual('TELNSELAKAMKVDAQRG-AFVSQVLPNSSAAKAGIKAGDVITSLNGKPISSFAALRA-QVGTMPVGSKLTLGLLRDG-KQVNVNLELQQSS', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)
        # second qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|15832592|ref|NP_311365.1|', hit.id)
        self.assertEqual('phosphoribosylaminoimidazole-succinocarboxamide synthase [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(237, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(73, hsp.initn_score)
        self.assertEqual(45, hsp.init1_score)
        self.assertEqual(74, hsp.opt_score)
        self.assertEqual(105.5, hsp.z_score)
        self.assertEqual(26.0, hsp.bitscore)
        self.assertEqual(2.4, hsp.evalue)
        self.assertEqual(74, hsp.sw_score)
        self.assertAlmostEqual(27.4, hsp.ident_pct)
        self.assertAlmostEqual(58.9, hsp.pos_pct)
        self.assertEqual(73, hsp.aln_span)
        self.assertEqual(50, hsp.query_start)
        self.assertEqual(123, hsp.query_end)
        self.assertEqual('FFDLIIPNGGKKDRYVYTSFNGEKFSSYTLNKVTKTDEYNDLSELSASFFKKNFDKINVNLLSKATSFALKKG', str(hsp.query.seq))
        self.assertEqual(116, hsp.hit_start)
        self.assertEqual(185, hsp.hit_end)
        self.assertEqual('LFDLFLKNDAMHDPMVNESYC-ETFGWVSKENLARMKE---LTYKANDVLKKLFDDAGLILVDFKLEFGLYKG', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('gi|10955265|ref|NP_052606.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('34.26', qresult.version)
        self.assertEqual('NC_002695.faa', qresult.target)
        self.assertEqual(346, qresult.seq_len)
        self.assertEqual('hypothetical protein pOSAK1_03 [Escherichia coli O157:H7 s 346 aa', qresult.description)
        self.assertEqual(2, len(qresult))
        # third qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|38704138|ref|NP_311957.2|', hit.id)
        self.assertEqual('hypothetical protein ECs3930 [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(111, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(50, hsp.initn_score)
        self.assertEqual(50, hsp.init1_score)
        self.assertEqual(86, hsp.opt_score)
        self.assertEqual(117.5, hsp.z_score)
        self.assertEqual(28.6, hsp.bitscore)
        self.assertEqual(0.51, hsp.evalue)
        self.assertEqual(86, hsp.sw_score)
        self.assertAlmostEqual(30.2, hsp.ident_pct)
        self.assertAlmostEqual(63.5, hsp.pos_pct)
        self.assertEqual(63, hsp.aln_span)
        self.assertEqual(187, hsp.query_start)
        self.assertEqual(246, hsp.query_end)
        self.assertEqual('VDIKK-ETIESELHSKLPKSIDKIHEDIKKQLSCSLI--MKKID-VEMEDYSTYCFSALRAIE', str(hsp.query.seq))
        self.assertEqual(13, hsp.hit_start)
        self.assertEqual(76, hsp.hit_end)
        self.assertEqual('IDPKKIEQIARQVHESMPKGIREFGEDVEKKIRQTLQAQLTRLDLVSREEFDVQTQVLLRTRE', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)
        # third qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|15833861|ref|NP_312634.1|', hit.id)
        self.assertEqual('hypothetical protein ECs4607 [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(330, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(32, hsp.initn_score)
        self.assertEqual(32, hsp.init1_score)
        self.assertEqual(87, hsp.opt_score)
        self.assertEqual(112.7, hsp.z_score)
        self.assertEqual(29.2, hsp.bitscore)
        self.assertEqual(0.95, hsp.evalue)
        self.assertEqual(87, hsp.sw_score)
        self.assertAlmostEqual(21.0, hsp.ident_pct)
        self.assertAlmostEqual(58.0, hsp.pos_pct)
        self.assertEqual(157, hsp.aln_span)
        self.assertEqual(130, hsp.query_start)
        self.assertEqual(281, hsp.query_end)
        self.assertEqual('QYIMTTSNGDRVRAKIYKRGSIQFQGKYLQIASLINDFMCSILNMKEIVEQKNKEFNVDI---KKETI-ESELHSKLPKSIDKIHEDIKKQLSCSLIMKKIDV-EMEDYSTYCFSALRA-IEGFIYQILNDVCNPSSSKNLGEYFTENKPKYIIREI', str(hsp.query.seq))
        self.assertEqual(9, hsp.hit_start)
        self.assertEqual(155, hsp.hit_end)
        self.assertEqual('EFIRLLSDHDQFEKDQISELTVAANALKLEVAK--NNY-----NMKYSFDTQTERRMIELIREQKDLIPEKYLHQSGIKKL-KLHED---EFSSLLVDAERQVLEGSSFVLCCGEKINSTISELLSKKITDLTHPTESFTLSEYFSYDVYEEIFKKV', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

    def test_output003(self):
        """Test parsing fasta34 output (output003.m10)"""

        m10_file = get_file('output003.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(5, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('gi|152973837|ref|YP_001338874.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('34.26', qresult.version)
        self.assertEqual('NC_002127.faa', qresult.target)
        self.assertEqual(183, qresult.seq_len)
        self.assertEqual('hypothetical protein KPN_pKPN7p10262 [Klebsiella pneumoniae subsp. pneumonia 183 aa', qresult.description)
        self.assertEqual(1, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|10955263|ref|NP_052604.1|', hit.id)
        self.assertEqual('plasmid mobilization [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(107, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(43, hsp.initn_score)
        self.assertEqual(43, hsp.init1_score)
        self.assertEqual(45, hsp.opt_score)
        self.assertEqual(64.1, hsp.z_score)
        self.assertEqual(17.7, hsp.bitscore)
        self.assertEqual(0.26, hsp.evalue)
        self.assertEqual(59, hsp.sw_score)
        self.assertAlmostEqual(25.5, hsp.ident_pct)
        self.assertAlmostEqual(67.3, hsp.pos_pct)
        self.assertEqual(55, hsp.aln_span)
        self.assertEqual(86, hsp.query_start)
        self.assertEqual(141, hsp.query_end)
        self.assertEqual('ISISNNKDQYEELQKEQGERDLKTVDQLVRIAAAGGGLRLSASTKTVDQLVRIAA', str(hsp.query.seq))
        self.assertEqual(17, hsp.hit_start)
        self.assertEqual(69, hsp.hit_end)
        self.assertEqual('VRLTAEEDQ--EIRKRAAECG-KTVSGFLRAAALGKKVNSLTDDRVLKEVMRLGA', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('gi|152973838|ref|YP_001338875.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('34.26', qresult.version)
        self.assertEqual('NC_002127.faa', qresult.target)
        self.assertEqual(76, qresult.seq_len)
        self.assertEqual('hypothetical protein KPN_pKPN7p10263 [Klebsiella pneumoniae subsp. pneumonia 76 aa', qresult.description)
        self.assertEqual(0, len(qresult))

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('gi|152973839|ref|YP_001338876.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('34.26', qresult.version)
        self.assertEqual('NC_002127.faa', qresult.target)
        self.assertEqual(112, qresult.seq_len)
        self.assertEqual('hypothetical protein KPN_pKPN7p10264 [Klebsiella pneumoniae subsp. pneumonia 112 aa', qresult.description)
        self.assertEqual(0, len(qresult))

        # test fourth qresult
        qresult = qresults[3]
        self.assertEqual('gi|152973840|ref|YP_001338877.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('34.26', qresult.version)
        self.assertEqual('NC_002127.faa', qresult.target)
        self.assertEqual(63, qresult.seq_len)
        self.assertEqual('RNA one modulator-like protein [Klebsiella pneumoniae subsp. pneumoniae  63 aa', qresult.description)
        self.assertEqual(1, len(qresult))
        # fourth qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|10955265|ref|NP_052606.1|', hit.id)
        self.assertEqual('hypothetical protein pOSAK1_03 [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(346, hit.seq_len)
        self.assertEqual(1, len(hit))
        # fourth qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(35, hsp.initn_score)
        self.assertEqual(35, hsp.init1_score)
        self.assertEqual(38, hsp.opt_score)
        self.assertEqual(71.3, hsp.z_score)
        self.assertEqual(19.2, hsp.bitscore)
        self.assertEqual(0.11, hsp.evalue)
        self.assertEqual(38, hsp.sw_score)
        self.assertAlmostEqual(36.4, hsp.ident_pct)
        self.assertAlmostEqual(63.6, hsp.pos_pct)
        self.assertEqual(22, hsp.aln_span)
        self.assertEqual(42, hsp.query_start)
        self.assertEqual(63, hsp.query_end)
        self.assertEqual('DDAEHLFRTLSSR-LDALQDGN', str(hsp.query.seq))
        self.assertEqual(101, hsp.hit_start)
        self.assertEqual(123, hsp.hit_end)
        self.assertEqual('DDRANLFEFLSEEGITITEDNN', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

        # test fifth qresult
        qresult = qresults[4]
        self.assertEqual('gi|152973841|ref|YP_001338878.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('34.26', qresult.version)
        self.assertEqual('NC_002127.faa', qresult.target)
        self.assertEqual(133, qresult.seq_len)
        self.assertEqual('Excl1 protein [Klebsiella pneumoniae subsp. pneumoniae  133 aa', qresult.description)
        self.assertEqual(1, len(qresult))
        # fifth qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|10955264|ref|NP_052605.1|', hit.id)
        self.assertEqual('hypothetical protein pOSAK1_02 [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(126, hit.seq_len)
        self.assertEqual(1, len(hit))
        # fifth qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(37, hsp.initn_score)
        self.assertEqual(37, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(80.0, hsp.z_score)
        self.assertEqual(20.4, hsp.bitscore)
        self.assertEqual(0.036, hsp.evalue)
        self.assertEqual(57, hsp.sw_score)
        self.assertAlmostEqual(25.4, hsp.ident_pct)
        self.assertAlmostEqual(65.1, hsp.pos_pct)
        self.assertEqual(63, hsp.aln_span)
        self.assertEqual(48, hsp.query_start)
        self.assertEqual(109, hsp.query_end)
        self.assertEqual('VFGSFEQPKGEHLSGQVSEQ--RDTAFADQNEQVIRHLKQEIEHLNTLLLSKDSHIDSLKQAM', str(hsp.query.seq))
        self.assertEqual(65, hsp.hit_start)
        self.assertEqual(124, hsp.hit_end)
        self.assertEqual('VYTSFN---GEKFSSYTLNKVTKTDEYNDLSELSASFFKKNFDKINVNLLSKATSF-ALKKGI', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)


class Fasta35Cases(unittest.TestCase):

    def test_output001(self):
        """Test parsing fasta35 output (output001.m10)"""

        m10_file = get_file('output001.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(3, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('gi|10955263|ref|NP_052604.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('35.03', qresult.version)
        self.assertEqual('NC_009649.faa', qresult.target)
        self.assertEqual(107, qresult.seq_len)
        self.assertEqual('plasmid mobilization [Escherichia coli O157:H7 s 107 aa', qresult.description)
        self.assertEqual(2, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|152973457|ref|YP_001338508.1|', hit.id)
        self.assertEqual('ATPase with chaperone activity, ATP-binding subunit [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(931, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(65, hsp.initn_score)
        self.assertEqual(43, hsp.init1_score)
        self.assertEqual(71, hsp.opt_score)
        self.assertEqual(92.7, hsp.z_score)
        self.assertEqual(25.3, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(71, hsp.sw_score)
        self.assertAlmostEqual(25.0, hsp.ident_pct)
        self.assertAlmostEqual(57.4, hsp.pos_pct)
        self.assertEqual(108, hsp.aln_span)
        self.assertEqual(4, hsp.query_start)
        self.assertEqual(103, hsp.query_end)
        self.assertEqual('SGSNT-RRRAISRPVRLTAEED---QEIRKRAAECGKTVSGFLRAAALGKKVNSLTDDRVLKEVM-----RLGALQKKLFIDGKRVGDREYAEVLIAITEYHRALLSR', str(hsp.query.seq))
        self.assertEqual(95, hsp.hit_start)
        self.assertEqual(195, hsp.hit_end)
        self.assertEqual('AGSGAPRRRGSGLASRISEQSEALLQEAAKHAAEFGRS------EVDTEHLLLALADSDVVKTILGQFKIKVDDLKRQIESEAKR-GDKPF-EGEIGVSPRVKDALSR', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)
        # first qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|152973588|ref|YP_001338639.1|', hit.id)
        self.assertEqual('F pilus assembly protein [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(459, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(33, hsp.initn_score)
        self.assertEqual(33, hsp.init1_score)
        self.assertEqual(63, hsp.opt_score)
        self.assertEqual(87.7, hsp.z_score)
        self.assertEqual(23.4, hsp.bitscore)
        self.assertEqual(0.81, hsp.evalue)
        self.assertEqual(63, hsp.sw_score)
        self.assertAlmostEqual(26.6, hsp.ident_pct)
        self.assertAlmostEqual(65.6, hsp.pos_pct)
        self.assertEqual(64, hsp.aln_span)
        self.assertEqual(31, hsp.query_start)
        self.assertEqual(94, hsp.query_end)
        self.assertEqual('AAECGKTVSGFLRAAALGKKVNSLTDDRVLKEV-MRLGALQKKLFIDGKRVGDREYAEVLIAIT', str(hsp.query.seq))
        self.assertEqual(190, hsp.hit_start)
        self.assertEqual(248, hsp.hit_end)
        self.assertEqual('ASRQGCTVGG--KMDSVQDKASDKDKERVMKNINIMWNALSKNRLFDG----NKELKEFIMTLT', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('gi|10955264|ref|NP_052605.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('35.03', qresult.version)
        self.assertEqual('NC_009649.faa', qresult.target)
        self.assertEqual(126, qresult.seq_len)
        self.assertEqual('hypothetical protein pOSAK1_02 [Escherichia coli O157:H7 s 126 aa', qresult.description)
        self.assertEqual(1, len(qresult))
        # second qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|152973462|ref|YP_001338513.1|', hit.id)
        self.assertEqual('hypothetical protein KPN_pKPN3p05904 [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(101, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(50, hsp.initn_score)
        self.assertEqual(50, hsp.init1_score)
        self.assertEqual(58, hsp.opt_score)
        self.assertEqual(91.6, hsp.z_score)
        self.assertEqual(22.2, hsp.bitscore)
        self.assertEqual(0.49, hsp.evalue)
        self.assertEqual(58, hsp.sw_score)
        self.assertAlmostEqual(28.9, hsp.ident_pct)
        self.assertAlmostEqual(63.2, hsp.pos_pct)
        self.assertEqual(38, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(38, hsp.query_end)
        self.assertEqual('MKKDKKYQIEAIKNKDKTLFIVYATDIYSPSEFFSKIE', str(hsp.query.seq))
        self.assertEqual(43, hsp.hit_start)
        self.assertEqual(81, hsp.hit_end)
        self.assertEqual('IKKDLGVSFLKLKNREKTLIVDALKKKYPVAELLSVLQ', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('gi|10955265|ref|NP_052606.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('35.03', qresult.version)
        self.assertEqual('NC_009649.faa', qresult.target)
        self.assertEqual(346, qresult.seq_len)
        self.assertEqual('hypothetical protein pOSAK1_03 [Escherichia coli O157:H7 s 346 aa', qresult.description)
        self.assertEqual(1, len(qresult))
        # third qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|152973545|ref|YP_001338596.1|', hit.id)
        self.assertEqual('putative plasmid SOS inhibition protein A [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(242, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(52, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(70, hsp.opt_score)
        self.assertEqual(94.0, hsp.z_score)
        self.assertEqual(25.3, hsp.bitscore)
        self.assertEqual(0.36, hsp.evalue)
        self.assertEqual(70, hsp.sw_score)
        self.assertAlmostEqual(27.9, hsp.ident_pct)
        self.assertAlmostEqual(65.1, hsp.pos_pct)
        self.assertEqual(43, hsp.aln_span)
        self.assertEqual(196, hsp.query_start)
        self.assertEqual(238, hsp.query_end)
        self.assertEqual('SELHSKLPKSIDKIHEDIKKQLSC-SLIMKKIDVEMEDYSTYC', str(hsp.query.seq))
        self.assertEqual(51, hsp.hit_start)
        self.assertEqual(94, hsp.hit_end)
        self.assertEqual('SRINSDVARRIPGIHRDPKDRLSSLKQVEEALDMLISSHGEYC', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

    def test_output004(self):
        """Test parsing fasta35 output (output004.m10)"""

        m10_file = get_file('output004.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(3, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('ref|NC_002127.1|:413-736', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('35.04', qresult.version)
        self.assertEqual('NC_002695.ffn', qresult.target)
        self.assertEqual(324, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(0, len(qresult))

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('ref|NC_002127.1|:c1351-971', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('35.04', qresult.version)
        self.assertEqual('NC_002695.ffn', qresult.target)
        self.assertEqual(381, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(1, len(qresult))
        # second qresult, first hit
        hit = qresult[0]
        self.assertEqual('ref|NC_002695.1|:1970775-1971404', hit.id)
        self.assertEqual('', hit.description)
        self.assertEqual(630, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(54, hsp.initn_score)
        self.assertEqual(54, hsp.init1_score)
        self.assertEqual(91, hsp.opt_score)
        self.assertEqual(139.3, hsp.z_score)
        self.assertEqual(35.2, hsp.bitscore)
        self.assertEqual(0.045, hsp.evalue)
        self.assertAlmostEqual(57.8, hsp.ident_pct)
        self.assertAlmostEqual(57.8, hsp.pos_pct)
        self.assertEqual(102, hsp.aln_span)
        self.assertEqual(3, hsp.query_start)
        self.assertEqual(105, hsp.query_end)
        self.assertEqual('AAAAAAGATAAAAAATATCAAATAGAAGCAATAAAAAATAAAGATAAAACTTTATTTATTGTCTATGCTACTGATATTTATAGCCCGAGCGAATTTTTCTCA', str(hsp.query.seq))
        self.assertEqual(312, hsp.hit_start)
        self.assertEqual(414, hsp.hit_end)
        self.assertEqual('AGAGAAAATAAAACAAGTAATAAAATATTAATGGAAAAAATAAATTCTTGTTTATTTAGACCTGATTCTAATCACTTTTCTTGCCCGGAGTCATTTTTGACA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        self.assertEqual({'similarity': ': : :: :::::: :  : : : :  :  :::  :::: : : ::     ::::::::      :: ::: : :  ::: : :::::     ::::::  ::'}, hsp.aln_annotation)

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('ref|NC_002127.1|:c2388-1348', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('35.04', qresult.version)
        self.assertEqual('NC_002695.ffn', qresult.target)
        self.assertEqual(1041, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(0, len(qresult))

    def test_output005(self):
        """Test parsing ssearch35 output (output005.m10)"""

        m10_file = get_file('output005.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(3, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('gi|10955263|ref|NP_052604.1|', qresult.id)
        self.assertEqual('ssearch', qresult.program)
        self.assertEqual('35.03', qresult.version)
        self.assertEqual('NC_002128.faa', qresult.target)
        self.assertEqual(107, qresult.seq_len)
        self.assertEqual('plasmid mobilization [Escherichia coli O157:H7 s 107 aa', qresult.description)
        self.assertEqual(0, len(qresult))

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('gi|10955264|ref|NP_052605.1|', qresult.id)
        self.assertEqual('ssearch', qresult.program)
        self.assertEqual('35.03', qresult.version)
        self.assertEqual('NC_002128.faa', qresult.target)
        self.assertEqual(126, qresult.seq_len)
        self.assertEqual('hypothetical protein pOSAK1_02 [Escherichia coli O157:H7 s 126 aa', qresult.description)
        self.assertEqual(1, len(qresult))
        # second qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|10955282|ref|NP_052623.1|', hit.id)
        self.assertEqual('hemolysin C [Escherichia coli O157:H7 str. Sakai]', hit.description)
        self.assertEqual(163, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(69, hsp.opt_score)
        self.assertEqual(108.8, hsp.z_score)
        self.assertEqual(26.0, hsp.bitscore)
        self.assertEqual(0.025, hsp.evalue)
        self.assertEqual(69, hsp.sw_score)
        self.assertAlmostEqual(20.9, hsp.ident_pct)
        self.assertAlmostEqual(55.5, hsp.pos_pct)
        self.assertEqual(110, hsp.aln_span)
        self.assertEqual(11, hsp.query_start)
        self.assertEqual(114, hsp.query_end)
        self.assertEqual('IKNKDKTLFIVYAT-DIYSPSEFFSKIESDLKKKKSKGDV--FFDLIIPNGGKKD--RYVYTSFNGEKFSSYTLNKVTKTDEYNDL--SELSASFFKKNFDKINVNLLSK', str(hsp.query.seq))
        self.assertEqual(38, hsp.hit_start)
        self.assertEqual(148, hsp.hit_end)
        self.assertEqual('IKDELPVAFCSWASLDLECEVKYINDVTSLYAKDWMSGERKWFIDWIAPFGHNMELYKYMRKKYPYELFRAIRLDESSKTGKIAEFHGGGIDKKLASKIFRQYHHELMSE', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({}, hsp.aln_annotation)

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('gi|10955265|ref|NP_052606.1|', qresult.id)
        self.assertEqual('ssearch', qresult.program)
        self.assertEqual('35.03', qresult.version)
        self.assertEqual('NC_002128.faa', qresult.target)
        self.assertEqual(346, qresult.seq_len)
        self.assertEqual('hypothetical protein pOSAK1_03 [Escherichia coli O157:H7 s 346 aa', qresult.description)
        self.assertEqual(0, len(qresult))

    def test_output006(self):
        """Test parsing fasta35 output (output006.m10)"""

        m10_file = get_file('output006.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(1, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('query', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('35.04', qresult.version)
        self.assertEqual('orchid_cds.txt', qresult.target)
        self.assertEqual(131, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(1, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|116660610|gb|EG558221.1|EG558221', hit.id)
        self.assertEqual('CR03001A07 Root CR03 cDNA library Catharanthus roseus cDNA clone CR03001A07 5\', mRNA sequence', hit.description)
        self.assertEqual(573, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(646, hsp.initn_score)
        self.assertEqual(646, hsp.init1_score)
        self.assertEqual(646, hsp.opt_score)
        self.assertEqual(712.3, hsp.z_score)
        self.assertEqual(139.6, hsp.bitscore)
        self.assertEqual(7.2e-38, hsp.evalue)
        self.assertAlmostEqual(99.2, hsp.ident_pct)
        self.assertAlmostEqual(99.2, hsp.pos_pct)
        self.assertEqual(131, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(131, hsp.query_end)
        self.assertEqual('GCAACGCTTCAAGAACTGGAATTAGGAACCGTGACAACGATTAATGAGGAGATTTATGAAGAGGGTTCTTCGATTTTAGGCCAATCGGAAGGAATTATGTAGCAAGTCCATCAGAAAATGGAAGAAGTCAT', str(hsp.query.seq))
        self.assertEqual(359, hsp.hit_start)
        self.assertEqual(490, hsp.hit_end)
        self.assertEqual('GCAACGCTTCAAGAACTGGAATTAGGAACCGTGACAACGATTAATGAGGAGATTTATGAAGAGGGTTCTTCGATTTTAGGCCAATCGGAAGGAATTATGTAGCAAGTCCATCAGAAAATGGAAGTAGTCAT', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)
        self.assertEqual({'similarity': ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::'}, hsp.aln_annotation)


class Fasta36Cases(unittest.TestCase):

    def test_output007(self):
        """Test parsing fasta36 output (output007.m10)"""

        m10_file = get_file('output007.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(3, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('gi|10955263|ref|NP_052604.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.4', qresult.version)
        self.assertEqual('NC_009649.faa', qresult.target)
        self.assertEqual(107, qresult.seq_len)
        self.assertEqual('plasmid mobilization [Escherichia coli O157:H7 s', qresult.description)
        self.assertEqual(3, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|152973457|ref|YP_001338508.1|', hit.id)
        self.assertEqual('ATPase with chaperone activity, ATP-binding subunit [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(931, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(97, hsp.initn_score)
        self.assertEqual(43, hsp.init1_score)
        self.assertEqual(71, hsp.opt_score)
        self.assertEqual(109.6, hsp.z_score)
        self.assertEqual(28.5, hsp.bitscore)
        self.assertEqual(0.048, hsp.evalue)
        self.assertEqual(71, hsp.sw_score)
        self.assertAlmostEqual(25.0, hsp.ident_pct)
        self.assertAlmostEqual(57.4, hsp.pos_pct)
        self.assertEqual(108, hsp.aln_span)
        self.assertEqual(4, hsp.query_start)
        self.assertEqual(103, hsp.query_end)
        self.assertEqual('SGSNT-RRRAISRPVRLTAEED---QEIRKRAAECGKTVSGFLRAAALGKKVNSLTDDRVLKEVM-----RLGALQKKLFIDGKRVGDREYAEVLIAITEYHRALLSR', str(hsp.query.seq))
        self.assertEqual(95, hsp.hit_start)
        self.assertEqual(195, hsp.hit_end)
        self.assertEqual('AGSGAPRRRGSGLASRISEQSEALLQEAAKHAAEFGRS------EVDTEHLLLALADSDVVKTILGQFKIKVDDLKRQIESEAKR-GDKPF-EGEIGVSPRVKDALSR', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': '.::..-:::. .   :.. . .---::  :.::: :..------ .   . . .:.:. :.: ..-----..  :....  ..::-::. .-:  :...   .  :::'}, hsp.aln_annotation)
        # first qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|152973588|ref|YP_001338639.1|', hit.id)
        self.assertEqual('F pilus assembly protein [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(459, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(66, hsp.initn_score)
        self.assertEqual(33, hsp.init1_score)
        self.assertEqual(63, hsp.opt_score)
        self.assertEqual(101.4, hsp.z_score)
        self.assertEqual(25.9, hsp.bitscore)
        self.assertEqual(0.14, hsp.evalue)
        self.assertEqual(63, hsp.sw_score)
        self.assertAlmostEqual(26.6, hsp.ident_pct)
        self.assertAlmostEqual(65.6, hsp.pos_pct)
        self.assertEqual(64, hsp.aln_span)
        self.assertEqual(31, hsp.query_start)
        self.assertEqual(94, hsp.query_end)
        self.assertEqual('AAECGKTVSGFLRAAALGKKVNSLTDDRVLKEV-MRLGALQKKLFIDGKRVGDREYAEVLIAIT', str(hsp.query.seq))
        self.assertEqual(190, hsp.hit_start)
        self.assertEqual(248, hsp.hit_end)
        self.assertEqual('ASRQGCTVGG--KMDSVQDKASDKDKERVMKNINIMWNALSKNRLFDG----NKELKEFIMTLT', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': ':.. : ::.:--.  ..  :...   .::.:..-.  .::.:. ..::----..:  : ....:'}, hsp.aln_annotation)
        # first qresult, third hit
        hit = qresult[2]
        self.assertEqual('gi|152973480|ref|YP_001338531.1|', hit.id)
        self.assertEqual('Arsenate reductase (Arsenical pump modifier) [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(141, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, third hit, first hsp
        hsp = qresult[2].hsps[0]
        self.assertEqual(45, hsp.initn_score)
        self.assertEqual(37, hsp.init1_score)
        self.assertEqual(51, hsp.opt_score)
        self.assertEqual(89.6, hsp.z_score)
        self.assertEqual(22.0, hsp.bitscore)
        self.assertEqual(0.63, hsp.evalue)
        self.assertEqual(51, hsp.sw_score)
        self.assertAlmostEqual(26.7, hsp.ident_pct)
        self.assertAlmostEqual(62.2, hsp.pos_pct)
        self.assertEqual(45, hsp.aln_span)
        self.assertEqual(26, hsp.query_start)
        self.assertEqual(66, hsp.query_end)
        self.assertEqual('EIRKRAAECGKTVSGFLRAAA-----LGKKVNSLTDDRVLKEVMR', str(hsp.query.seq))
        self.assertEqual(42, hsp.hit_start)
        self.assertEqual(87, hsp.hit_end)
        self.assertEqual('ELVKLIADMGISVRALLRKNVEPYEELGLEEDKFTDDQLIDFMLQ', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': ':. :  :. : .: ..::  .-----:: . ...:::...  ...'}, hsp.aln_annotation)

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('gi|10955264|ref|NP_052605.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.4', qresult.version)
        self.assertEqual('NC_009649.faa', qresult.target)
        self.assertEqual(126, qresult.seq_len)
        self.assertEqual('hypothetical protein pOSAK1_02 [Escherichia coli O157:H7 s', qresult.description)
        self.assertEqual(4, len(qresult))
        # second qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|152973462|ref|YP_001338513.1|', hit.id)
        self.assertEqual('hypothetical protein KPN_pKPN3p05904 [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(101, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(78, hsp.initn_score)
        self.assertEqual(50, hsp.init1_score)
        self.assertEqual(58, hsp.opt_score)
        self.assertEqual(100.8, hsp.z_score)
        self.assertEqual(23.9, hsp.bitscore)
        self.assertEqual(0.15, hsp.evalue)
        self.assertEqual(58, hsp.sw_score)
        self.assertAlmostEqual(28.9, hsp.ident_pct)
        self.assertAlmostEqual(63.2, hsp.pos_pct)
        self.assertEqual(38, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(38, hsp.query_end)
        self.assertEqual('MKKDKKYQIEAIKNKDKTLFIVYATDIYSPSEFFSKIE', str(hsp.query.seq))
        self.assertEqual(43, hsp.hit_start)
        self.assertEqual(81, hsp.hit_end)
        self.assertEqual('IKKDLGVSFLKLKNREKTLIVDALKKKYPVAELLSVLQ', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': '.:::   ..  .::..:::..      :  .:..: ..'}, hsp.aln_annotation)
        # second qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|152973509|ref|YP_001338560.1|', hit.id)
        self.assertEqual('probable sensor kinase (silver resistance) [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(448, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(73, hsp.initn_score)
        self.assertEqual(56, hsp.init1_score)
        self.assertEqual(56, hsp.opt_score)
        self.assertEqual(89.9, hsp.z_score)
        self.assertEqual(24.0, hsp.bitscore)
        self.assertEqual(0.6, hsp.evalue)
        self.assertEqual(56, hsp.sw_score)
        self.assertAlmostEqual(72.7, hsp.ident_pct)
        self.assertAlmostEqual(81.8, hsp.pos_pct)
        self.assertEqual(11, hsp.aln_span)
        self.assertEqual(50, hsp.query_start)
        self.assertEqual(61, hsp.query_end)
        self.assertEqual('FFDLIIPNGGK', str(hsp.query.seq))
        self.assertEqual(407, hsp.hit_start)
        self.assertEqual(418, hsp.hit_end)
        self.assertEqual('FFDLVIENPGK', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': '::::.: : ::'}, hsp.aln_annotation)
        # second qresult, third hit
        hit = qresult[2]
        self.assertEqual('gi|152973581|ref|YP_001338632.1|', hit.id)
        self.assertEqual('inner membrane protein [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(84, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, third hit, first hsp
        hsp = qresult[2].hsps[0]
        self.assertEqual(61, hsp.initn_score)
        self.assertEqual(46, hsp.init1_score)
        self.assertEqual(48, hsp.opt_score)
        self.assertEqual(88.5, hsp.z_score)
        self.assertEqual(21.3, hsp.bitscore)
        self.assertEqual(0.72, hsp.evalue)
        self.assertEqual(48, hsp.sw_score)
        self.assertAlmostEqual(30.0, hsp.ident_pct)
        self.assertAlmostEqual(67.5, hsp.pos_pct)
        self.assertEqual(40, hsp.aln_span)
        self.assertEqual(15, hsp.query_start)
        self.assertEqual(53, hsp.query_end)
        self.assertEqual('DKTLFIVYATDIYSPSE-FFSKIESDLKKKKSKGD-VFFD', str(hsp.query.seq))
        self.assertEqual(44, hsp.hit_start)
        self.assertEqual(84, hsp.hit_end)
        self.assertEqual('ESVVFILMAGFAMSVCYLFFSVLEKVINARKSKDESIYHD', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': '....::..:   .:   -::: .:. .. .::: .-.. :'}, hsp.aln_annotation)
        # second qresult, fourth hit
        hit = qresult[3]
        self.assertEqual('gi|152973536|ref|YP_001338587.1|', hit.id)
        self.assertEqual('putative inner membrane protein [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(84, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, fourth hit, first hsp
        hsp = qresult[3].hsps[0]
        self.assertEqual(63, hsp.initn_score)
        self.assertEqual(42, hsp.init1_score)
        self.assertEqual(48, hsp.opt_score)
        self.assertEqual(88.5, hsp.z_score)
        self.assertEqual(21.3, hsp.bitscore)
        self.assertEqual(0.72, hsp.evalue)
        self.assertEqual(48, hsp.sw_score)
        self.assertAlmostEqual(26.7, hsp.ident_pct)
        self.assertAlmostEqual(66.7, hsp.pos_pct)
        self.assertEqual(30, hsp.aln_span)
        self.assertEqual(96, hsp.query_start)
        self.assertEqual(126, hsp.query_end)
        self.assertEqual('ASFFKKNFDKINVNLLSKATSFALKKGIPI', str(hsp.query.seq))
        self.assertEqual(6, hsp.hit_start)
        self.assertEqual(36, hsp.hit_end)
        self.assertEqual('ASFSKEEQDKVAVDKVAADVAWQERMNKPV', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': '::: :.. ::. :. ..  ...  . . :.'}, hsp.aln_annotation)

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('gi|10955265|ref|NP_052606.1|', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.4', qresult.version)
        self.assertEqual('NC_009649.faa', qresult.target)
        self.assertEqual(346, qresult.seq_len)
        self.assertEqual('hypothetical protein pOSAK1_03 [Escherichia coli O157:H7 s', qresult.description)
        self.assertEqual(2, len(qresult))
        # third qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|152973545|ref|YP_001338596.1|', hit.id)
        self.assertEqual('putative plasmid SOS inhibition protein A [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(242, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(72, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(70, hsp.opt_score)
        self.assertEqual(110.9, hsp.z_score)
        self.assertEqual(28.4, hsp.bitscore)
        self.assertEqual(0.041, hsp.evalue)
        self.assertEqual(70, hsp.sw_score)
        self.assertAlmostEqual(27.9, hsp.ident_pct)
        self.assertAlmostEqual(65.1, hsp.pos_pct)
        self.assertEqual(43, hsp.aln_span)
        self.assertEqual(196, hsp.query_start)
        self.assertEqual(238, hsp.query_end)
        self.assertEqual('SELHSKLPKSIDKIHEDIKKQLSC-SLIMKKIDVEMEDYSTYC', str(hsp.query.seq))
        self.assertEqual(51, hsp.hit_start)
        self.assertEqual(94, hsp.hit_end)
        self.assertEqual('SRINSDVARRIPGIHRDPKDRLSSLKQVEEALDMLISSHGEYC', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': ':...: . . :  ::.: : .:: -. . . .:. . ... ::'}, hsp.aln_annotation)
        # third qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|152973505|ref|YP_001338556.1|', hit.id)
        self.assertEqual('putative membrane fusion protein SilB [Klebsiella pneumoniae subsp. pneumoniae MGH 78578]', hit.description)
        self.assertEqual(430, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(95, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(90.1, hsp.z_score)
        self.assertEqual(25.4, hsp.bitscore)
        self.assertEqual(0.59, hsp.evalue)
        self.assertEqual(57, hsp.sw_score)
        self.assertAlmostEqual(23.4, hsp.ident_pct)
        self.assertAlmostEqual(60.9, hsp.pos_pct)
        self.assertEqual(64, hsp.aln_span)
        self.assertEqual(39, hsp.query_start)
        self.assertEqual(101, hsp.query_end)
        self.assertEqual('ISGTYKGIDFLIKLMPSGGNTTIGRASGQNNTYFDEIALIIKENCLY--SDTKNFEYTIPKFSD', str(hsp.query.seq))
        self.assertEqual(221, hsp.hit_start)
        self.assertEqual(281, hsp.hit_end)
        self.assertEqual('IDGVITAFD-LRTGMNISKDKVVAQIQGMDPVW---ISAAVPESIAYLLKDTSQFEISVPAYPD', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': ':.:.  ..:-:   :  . . .... .:.. ..---:.  . :.  :--.::..:: ..: . :'}, hsp.aln_annotation)

    def test_output008(self):
        """Test parsing tfastx36 output (output008.m10)"""

        m10_file = get_file('output008.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(4, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('sp|Q9BS26|ERP44_HUMAN', qresult.id)
        self.assertEqual('tfastx', qresult.program)
        self.assertEqual('36.3.4', qresult.version)
        self.assertEqual('rhodopsin_nucs.fasta', qresult.target)
        self.assertEqual(406, qresult.seq_len)
        self.assertEqual('Endoplasmic reticulum resident protein 44 OS=Homo sapiens GN=ERP44', qresult.description)
        self.assertEqual(0, len(qresult))

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('sp|Q9NSY1|BMP2K_HUMAN', qresult.id)
        self.assertEqual('tfastx', qresult.program)
        self.assertEqual('36.3.4', qresult.version)
        self.assertEqual('rhodopsin_nucs.fasta', qresult.target)
        self.assertEqual(1161, qresult.seq_len)
        self.assertEqual('BMP-2-inducible protein kinase OS=Homo sapiens GN=BMP2K', qresult.description)
        self.assertEqual(2, len(qresult))
        # second qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|283855822|gb|GQ290312.1|', hit.id)
        self.assertEqual('Myotis ricketti voucher GQX10 rhodopsin (RHO) mRNA, partial cds', hit.description)
        self.assertEqual(983, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(106, hsp.initn_score)
        self.assertEqual(53, hsp.init1_score)
        self.assertEqual(70, hsp.opt_score)
        self.assertEqual(88.0, hsp.z_score)
        self.assertEqual(28.0, hsp.bitscore)
        self.assertEqual(0.026, hsp.evalue)
        self.assertEqual(70, hsp.sw_score)
        self.assertAlmostEqual(23.1, hsp.ident_pct)
        self.assertAlmostEqual(46.2, hsp.pos_pct)
        self.assertEqual(65, hsp.aln_span)
        self.assertEqual(452, hsp.query_start)
        self.assertEqual(514, hsp.query_end)
        self.assertEqual('LQHRHPHQQQQQQQQQQQQQQQQQQQQQQQQQQQH---HHHHHHHLLQDAYMQQYQHATQQQQML', str(hsp.query.seq))
        self.assertEqual(122, hsp.hit_start)
        self.assertEqual(317, hsp.hit_end)
        self.assertEqual('IPHQLPHALRHRPAQEAAHASQLHPAQPGCGQPLHGLWRLHHHPVYLYAWILRLRGHGMQSGGLL', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': '. :. ::  ...  :.  . .: .  :    :  :---. :::   :    ..   :. :.  .:'}, hsp.aln_annotation)
        # second qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|57163782|ref|NM_001009242.1|', hit.id)
        self.assertEqual('Felis catus rhodopsin (RHO), mRNA', hit.description)
        self.assertEqual(1047, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(105, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(68, hsp.opt_score)
        self.assertEqual(85.8, hsp.z_score)
        self.assertEqual(27.7, hsp.bitscore)
        self.assertEqual(0.034, hsp.evalue)
        self.assertEqual(72, hsp.sw_score)
        self.assertAlmostEqual(23.5, hsp.ident_pct)
        self.assertAlmostEqual(45.0, hsp.pos_pct)
        self.assertEqual(201, hsp.aln_span)
        self.assertEqual(417, hsp.query_start)
        self.assertEqual(599, hsp.query_end)
        self.assertEqual('GPEIL---LGQ-GPPQQPPQQHRVLQQLQQGDWRLQQLH-------LQHRHPHQQQQQQQQQQQQQQQQQQQQQQQQQQQH-----HHHHHH-HLLQDAYMQQYQHATQQQQMLQQQF-LMHSVYQPQPSASQYPTMMPQYQQAFFQQQMLAQHQPSQQQASPEYLTSPQEFSPALVSYTSSLPA-QVGTIMDSSYSANRS', str(hsp.query.seq))
        self.assertEqual(14, hsp.hit_start)
        self.assertEqual(595, hsp.hit_end)
        self.assertEqual('GPELLRALLQQNGCGTQPLRVPTVLPG*AMAVLHAGRLHVPAHRAWLPHQLPHALRHGPAQEAAHASQLHPAQPGRG*PLHGLRWLHHHPLH/PLCMDTLSLGPQDAIWRASLPHWAVKLPCGLWWSWPLSGTWWCVSP*ATSA------LGRTMP*WASLSPGSWHWPALHPPSLVGPGTSLKACSVHAGSTTTHSSQKS', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': ':::.:---: :-:   :: .   ::    ..  .  .::-------: :. ::  ..   :.  . .: .  :  .    :-----:::  :- : .:.     : :  . .. .   -:  ...   : .. .  . :   .:------:.. .:   . ::     :    :.::.  .:: :-.: .   ...:...:'}, hsp.aln_annotation)

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('sp|P06213|INSR_HUMAN', qresult.id)
        self.assertEqual('tfastx', qresult.program)
        self.assertEqual('36.3.4', qresult.version)
        self.assertEqual('rhodopsin_nucs.fasta', qresult.target)
        self.assertEqual(1382, qresult.seq_len)
        self.assertEqual('Insulin receptor OS=Homo sapiens GN=INSR', qresult.description)
        self.assertEqual(0, len(qresult))

        # test fourth qresult
        qresult = qresults[3]
        self.assertEqual('sp|P08100|OPSD_HUMAN', qresult.id)
        self.assertEqual('tfastx', qresult.program)
        self.assertEqual('36.3.4', qresult.version)
        self.assertEqual('rhodopsin_nucs.fasta', qresult.target)
        self.assertEqual(348, qresult.seq_len)
        self.assertEqual('Rhodopsin OS=Homo sapiens GN=RHO', qresult.description)
        self.assertEqual(6, len(qresult))
        # fourth qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|57163782|ref|NM_001009242.1|', hit.id)
        self.assertEqual('Felis catus rhodopsin (RHO), mRNA', hit.description)
        self.assertEqual(1047, hit.seq_len)
        self.assertEqual(1, len(hit))
        # fourth qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(2298, hsp.initn_score)
        self.assertEqual(2298, hsp.init1_score)
        self.assertEqual(2298, hsp.opt_score)
        self.assertEqual(3150.5, hsp.z_score)
        self.assertEqual(593.0, hsp.bitscore)
        self.assertEqual(6.7e-173, hsp.evalue)
        self.assertEqual(2298, hsp.sw_score)
        self.assertAlmostEqual(96.6, hsp.ident_pct)
        self.assertAlmostEqual(99.4, hsp.pos_pct)
        self.assertEqual(348, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(348, hsp.query_end)
        self.assertEqual('MNGTEGPNFYVPFSNATGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVLGGFTSTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLAGWSRYIPEGLQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIIIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIAFLICWVPYASVAFYIFTHQGSNFGPIFMTIPAFFAKSAAIYNPVIYIMMNKQFRNCMLTTICCGKNPLGDDEASATVSKTETSQVAPA', str(hsp.query.seq))
        self.assertEqual(0, hsp.hit_start)
        self.assertEqual(1044, hsp.hit_end)
        self.assertEqual('MNGTEGPNFYVPFSNKTGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVFGGFTTTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLVGWSRYIPEGMQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIAFLICWVPYASVAFYIFTHQGSNFGPIFMTLPAFFAKSSSIYNPVIYIMMNKQFRNCMLTTLCCGKNPLGDDEASTTGSKTETSQVAPA', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': '::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.::::.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.:::::::::.::::::::::::::::::::::::::::::::::.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.:::::::..:::::::::::::::::::::.:::::::::::::.: :::::::::::'}, hsp.aln_annotation)
        # fourth qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|18148870|dbj|AB062417.1|', hit.id)
        self.assertEqual('Synthetic construct Bos taurus gene for rhodopsin, complete cds', hit.description)
        self.assertEqual(1047, hit.seq_len)
        self.assertEqual(1, len(hit))
        # fourth qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(2237, hsp.initn_score)
        self.assertEqual(2237, hsp.init1_score)
        self.assertEqual(2237, hsp.opt_score)
        self.assertEqual(3067.2, hsp.z_score)
        self.assertEqual(577.6, hsp.bitscore)
        self.assertEqual(2.9e-168, hsp.evalue)
        self.assertEqual(2237, hsp.sw_score)
        self.assertAlmostEqual(93.4, hsp.ident_pct)
        self.assertAlmostEqual(98.6, hsp.pos_pct)
        self.assertEqual(348, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(348, hsp.query_end)
        self.assertEqual('MNGTEGPNFYVPFSNATGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVLGGFTSTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLAGWSRYIPEGLQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIIIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIAFLICWVPYASVAFYIFTHQGSNFGPIFMTIPAFFAKSAAIYNPVIYIMMNKQFRNCMLTTICCGKNPLGDDEASATVSKTETSQVAPA', str(hsp.query.seq))
        self.assertEqual(0, hsp.hit_start)
        self.assertEqual(1044, hsp.hit_end)
        self.assertEqual('MNGTEGPNFYVPFSNKTGVVRSPFEAPQYYLAEPWQFSMLAAYMFLLIMLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVFGGFTTTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLVGWSRYIPEGMQCSCGIDYYTPHEETNNESFVIYMFVVHFIIPLIVIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIAFLICWLPYAGVAFYIFTHQGSDFGPIFMTIPAFFAKTSAVYNPVIYIMMNKQFRNCMVTTLCCGKNPLGDDEASTTVSKTETSQVAPA', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # fourth qresult, third hit
        hit = qresult[2]
        self.assertEqual('gi|283855822|gb|GQ290312.1|', hit.id)
        self.assertEqual('Myotis ricketti voucher GQX10 rhodopsin (RHO) mRNA, partial cds', hit.description)
        self.assertEqual(983, hit.seq_len)
        self.assertEqual(2, len(hit))
        self.assertEqual({'similarity': '::::::::::::::: ::::::::: ::::::::::::::::::::::.::::::::::::::::::::::::::::::::::::::.::::.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.:::::::::.:::::::::: . :.:::::::::::::: ::.:.:::::::::::::::::::::::::::::::::::::::::::::::.:::.:::::::::::.::::::::::::::..:.:::::::::::::::::.::.:::::::::::::.:::::::::::::'}, hsp.aln_annotation)
        # fourth qresult, third hit, first hsp
        hsp = qresult[2].hsps[0]
        self.assertEqual(2138, hsp.initn_score)
        self.assertEqual(2138, hsp.init1_score)
        self.assertEqual(2143, hsp.opt_score)
        self.assertEqual(2939.0, hsp.z_score)
        self.assertEqual(553.8, hsp.bitscore)
        self.assertEqual(4.1e-161, hsp.evalue)
        self.assertEqual(2143, hsp.sw_score)
        self.assertAlmostEqual(95.1, hsp.ident_pct)
        self.assertAlmostEqual(99.4, hsp.pos_pct)
        self.assertEqual(326, hsp.aln_span)
        self.assertEqual(10, hsp.query_start)
        self.assertEqual(336, hsp.query_end)
        self.assertEqual('VPFSNATGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVLGGFTSTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLAGWSRYIPEGLQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIIIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIAFLICWVPYASVAFYIFTHQGSNFGPIFMTIPAFFAKSAAIYNPVIYIMMNKQFRNCMLTTICCGKNPLGDDEASAT', str(hsp.query.seq))
        self.assertEqual(0, hsp.hit_start)
        self.assertEqual(978, hsp.hit_end)
        self.assertEqual('VPFSNKTGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVANLFMVFGGFTTTLYTSMHGYFVFGATGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGLAFTWVMALACAAPPLAGWSRYIPEGMQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVVAFLICWLPYASVAFYIFTHQGSNFGPVFMTIPAFFAKSSSIYNPVIYIMMNKQFRNCMLTTLCCGKNPLGDDEASTT', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        self.assertEqual({'similarity': '::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.::::.::::.:::::.::::::: :::::::::::::::::::::::::::::::::::::::::::::::::.:::::::::::::::::::::::::.::::::::::::::::::::::::::::::::::.::::::::::::::::::::::::::::::::::::::::.::::::.:::::::::::::::::::.:::::::::::..:::::::::::::::::::::.:::::::::::::.:'}, hsp.aln_annotation)
        # fourth qresult, third hit, second hsp
        hsp = qresult[2].hsps[1]
        self.assertEqual(74, hsp.initn_score)
        self.assertEqual(58, hsp.init1_score)
        self.assertEqual(59, hsp.opt_score)
        self.assertEqual(91.3, hsp.z_score)
        self.assertEqual(26.9, hsp.bitscore)
        self.assertEqual(0.017, hsp.evalue)
        self.assertEqual(59, hsp.sw_score)
        self.assertAlmostEqual(35.5, hsp.ident_pct)
        self.assertAlmostEqual(61.3, hsp.pos_pct)
        self.assertEqual(31, hsp.aln_span)
        self.assertEqual(234, hsp.query_start)
        self.assertEqual(265, hsp.query_end)
        self.assertEqual('AQQQESATTQKAEKEVTRMVIIMVIAFLICW', str(hsp.query.seq))
        self.assertEqual(674, hsp.hit_start)
        self.assertEqual(767, hsp.hit_end)
        self.assertEqual('SQQIRNATTMMMTMRVTSFSAFWVVADSCCW', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # fourth qresult, fourth hit
        hit = qresult[3]
        self.assertEqual('gi|2734705|gb|U59921.1|BBU59921', hit.id)
        self.assertEqual('Bufo bufo rhodopsin mRNA, complete cds', hit.description)
        self.assertEqual(1574, hit.seq_len)
        self.assertEqual(1, len(hit))
        # fourth qresult, fourth hit, first hsp
        hsp = qresult[3].hsps[0]
        self.assertEqual(2080, hsp.initn_score)
        self.assertEqual(2031, hsp.init1_score)
        self.assertEqual(2057, hsp.opt_score)
        self.assertEqual(2819.6, hsp.z_score)
        self.assertEqual(532.4, hsp.bitscore)
        self.assertEqual(1.8e-154, hsp.evalue)
        self.assertEqual(2057, hsp.sw_score)
        self.assertAlmostEqual(83.3, hsp.ident_pct)
        self.assertAlmostEqual(95.2, hsp.pos_pct)
        self.assertEqual(354, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(348, hsp.query_end)
        self.assertEqual('MNGTEGPNFYVPFSNATGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVLGGFTSTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLAGWSRYIPEGLQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIIIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIAFLICWVPYASVAFYIFTHQGSNFGPIFMTIPAFFAKSAAIYNPVIYIMMNKQFRNCMLTTICCGKNPLGDDEAS-ATVSKTE-----TSQVAPA', str(hsp.query.seq))
        self.assertEqual(41, hsp.hit_start)
        self.assertEqual(1103, hsp.hit_end)
        self.assertEqual('MNGTEGPNFYIPMSNKTGVVRSPFEYPQYYLAEPWQYSILCAYMFLLILLGFPINFMTLYVTIQHKKLRTPLNYILLNLAFANHFMVLCGFTVTMYSSMNGYFILGATGCYVEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFSENHAVMGVAFTWIMALSCAVPPLLGWSRYIPEGMQCSCGVDYYTLKPEVNNESFVIYMFVVHFTIPLIIIFFCYGRLVCTVKEAAAQQQESATTQKAEKEVTRMVIIMVVFFLICWVPYASVAFFIFSNQGSEFGPIFMTVPAFFAKSSSIYNPVIYIMLNKQFRNCMITTLCCGKNPFGEDDASSAATSKTEASSVSSSQVSPA', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # fourth qresult, fifth hit
        hit = qresult[4]
        self.assertEqual('gi|12583664|dbj|AB043817.1|', hit.id)
        self.assertEqual('Conger myriaster conf gene for fresh water form rod opsin, complete cds', hit.description)
        self.assertEqual(1344, hit.seq_len)
        self.assertEqual(1, len(hit))
        # fourth qresult, fifth hit, first hsp
        hsp = qresult[4].hsps[0]
        self.assertEqual(1975, hsp.initn_score)
        self.assertEqual(1951, hsp.init1_score)
        self.assertEqual(1993, hsp.opt_score)
        self.assertEqual(2732.8, hsp.z_score)
        self.assertEqual(516.1, hsp.bitscore)
        self.assertEqual(1.2e-149, hsp.evalue)
        self.assertEqual(1993, hsp.sw_score)
        self.assertAlmostEqual(81.6, hsp.ident_pct)
        self.assertAlmostEqual(93.9, hsp.pos_pct)
        self.assertEqual(347, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(346, hsp.query_end)
        self.assertEqual('MNGTEGPNFYVPFSNATGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVLGGFTSTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLAGWSRYIPEGLQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIIIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIAFLICWVPYASVAFYIFTHQGSNFGPIFMTIPAFFAKSAAIYNPVIYIMMNKQFRNCMLTTICCGKNPLGD-DEASATVSKTETSQVA', str(hsp.query.seq))
        self.assertEqual(22, hsp.hit_start)
        self.assertEqual(1063, hsp.hit_end)
        self.assertEqual('MNGTEGPNFYIPMSNATGVVRSPFEYPQYYLAEPWAFSALSAYMFFLIIAGFPINFLTLYVTIEHKKLRTPLNYILLNLAVADLFMVFGGFTTTMYTSMHGYFVFGPTGCNIEGFFATLGGEIALWCLVVLAIERWMVVCKPVTNFRFGESHAIMGVMVTWTMALACALPPLFGWSRYIPEGLQCSCGIDYYTRAPGINNESFVIYMFTCHFSIPLAVISFCYGRLVCTVKEAAAQQQESETTQRAEREVTRMVVIMVISFLVCWVPYASVAWYIFTHQGSTFGPIFMTIPSFFAKSSALYNPMIYICMNKQFRHCMITTLCCGKNPFEEEDGASATSSKTEASSVS', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # fourth qresult, sixth hit
        hit = qresult[5]
        self.assertEqual('gi|283855845|gb|GQ290303.1|', hit.id)
        self.assertEqual('Cynopterus brachyotis voucher 20020434 rhodopsin (RHO) gene, exons 1 through 5 and partial cds', hit.description)
        self.assertEqual(4301, hit.seq_len)
        self.assertEqual(4, len(hit))
        # fourth qresult, sixth hit, first hsp
        hsp = qresult[5].hsps[0]
        self.assertEqual(2094, hsp.initn_score)
        self.assertEqual(723, hsp.init1_score)
        self.assertEqual(723, hsp.opt_score)
        self.assertEqual(992.9, hsp.z_score)
        self.assertEqual(195.8, hsp.bitscore)
        self.assertEqual(1e-52, hsp.evalue)
        self.assertEqual(723, hsp.sw_score)
        self.assertAlmostEqual(96.4, hsp.ident_pct)
        self.assertAlmostEqual(99.1, hsp.pos_pct)
        self.assertEqual(111, hsp.aln_span)
        self.assertEqual(10, hsp.query_start)
        self.assertEqual(121, hsp.query_end)
        self.assertEqual('VPFSNATGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVLGGFTSTLYTSLHGYFVFGPTGCNLEGFFATLGG', str(hsp.query.seq))
        self.assertEqual(0, hsp.hit_start)
        self.assertEqual(333, hsp.hit_end)
        self.assertEqual('VPFSNKTGVVRSPFEHPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRTPLNYILLNLAVADLFMVFGGFTTTLYTSLHGYFVFGPTGCNLEGFFATLGG', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # fourth qresult, sixth hit, second hsp
        hsp = qresult[5].hsps[1]
        self.assertEqual(1411, hsp.initn_score)
        self.assertEqual(499, hsp.init1_score)
        self.assertEqual(501, hsp.opt_score)
        self.assertEqual(992.9, hsp.z_score)
        self.assertEqual(195.8, hsp.bitscore)
        self.assertEqual(1e-52, hsp.evalue)
        self.assertEqual(783, hsp.sw_score)
        self.assertAlmostEqual(75.4, hsp.ident_pct)
        self.assertAlmostEqual(79.5, hsp.pos_pct)
        self.assertEqual(172, hsp.aln_span)
        self.assertEqual(176, hsp.query_start)
        self.assertEqual(312, hsp.query_end)
        self.assertEqual('RYIPEGLQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIIIFFCYGQLVFTVKE------------------------------------AAAQQQESATTQKAEKEVTRMVIIMVIAFLICWVPYASVAFYIFTHQGSNFGPIFMTIPAFFAKSAAIYNPVIYIMMNKQ', str(hsp.query.seq))
        self.assertEqual(2854, hsp.hit_start)
        self.assertEqual(3368, hsp.hit_end)
        self.assertEqual('RYIPEGMQCSCGIDYYTLKPEVNNESFVIYMFVVHFTIPMIVIFFCYGQLVFTVKEVRSCVGHWGHAH*VNGAQLHSQSCHSLDT*PCVPA\AAAQQQESATTQKAEKEVTRMVIIMVIAFLICWLPYAGVAFYIFTHQGSNFGPIFMTLPAFFAKSSSIYNPVIYIMMNKQ', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # fourth qresult, sixth hit, third hsp
        hsp = qresult[5].hsps[2]
        self.assertEqual(431, hsp.initn_score)
        self.assertEqual(379, hsp.init1_score)
        self.assertEqual(388, hsp.opt_score)
        self.assertEqual(992.9, hsp.z_score)
        self.assertEqual(195.8, hsp.bitscore)
        self.assertEqual(1e-52, hsp.evalue)
        self.assertEqual(388, hsp.sw_score)
        self.assertAlmostEqual(80.8, hsp.ident_pct)
        self.assertAlmostEqual(90.4, hsp.pos_pct)
        self.assertEqual(73, hsp.aln_span)
        self.assertEqual(118, hsp.query_start)
        self.assertEqual(189, hsp.query_end)
        self.assertEqual('LGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFTWVMALACAAPPLAGWSR--YIPEGLQCSCGI', str(hsp.query.seq))
        self.assertEqual(1403, hsp.hit_start)
        self.assertEqual(1619, hsp.hit_end)
        self.assertEqual('LAGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGLALTWVMALACAAPPLVGWSR*WH*TEG-KCL*GL', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # fourth qresult, sixth hit, fourth hsp
        hsp = qresult[5].hsps[3]
        self.assertEqual(213, hsp.initn_score)
        self.assertEqual(171, hsp.init1_score)
        self.assertEqual(176, hsp.opt_score)
        self.assertEqual(992.9, hsp.z_score)
        self.assertEqual(195.8, hsp.bitscore)
        self.assertEqual(1e-52, hsp.evalue)
        self.assertEqual(176, hsp.sw_score)
        self.assertAlmostEqual(76.7, hsp.ident_pct)
        self.assertAlmostEqual(93.3, hsp.pos_pct)
        self.assertEqual(30, hsp.aln_span)
        self.assertEqual(306, hsp.query_start)
        self.assertEqual(336, hsp.query_end)
        self.assertEqual('IMMNKQFRNCMLTTICCGKNPLGDDEASAT', str(hsp.query.seq))
        self.assertEqual(4206, hsp.hit_start)
        self.assertEqual(4296, hsp.hit_end)
        self.assertEqual('MLLAFQFRNCMLTTLCCGKNPLGDDEASTT', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)

    def test_output009(self):
        """Test parsing fasta36 output (output009.m10)"""

        m10_file = get_file('output009.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(3, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('random_s00', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('mrnalib.fasta', qresult.target)
        self.assertEqual(15, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(0, len(qresult))

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('gi|255708421:1-99', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('mrnalib.fasta', qresult.target)
        self.assertEqual(99, qresult.seq_len)
        self.assertEqual('Mus musculus myoglobin (Mb), transcript varia', qresult.description)
        self.assertEqual(1, len(qresult))
        # second qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|23308614|ref|NM_152952.1|', hit.id)
        self.assertEqual('Danio rerio cytoglobin 1 (cygb1), mRNA', hit.description)
        self.assertEqual(5188, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(124, hsp.initn_score)
        self.assertEqual(74, hsp.init1_score)
        self.assertEqual(74, hsp.opt_score)
        self.assertEqual(70.3, hsp.z_score)
        self.assertEqual(23.6, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(81.8, hsp.ident_pct)
        self.assertAlmostEqual(81.8, hsp.pos_pct)
        self.assertEqual(22, hsp.aln_span)
        self.assertEqual(7, hsp.query_start)
        self.assertEqual(29, hsp.query_end)
        self.assertEqual('TGATGTTCTGTTTCTAAAACAG', str(hsp.query.seq))
        self.assertEqual(3483, hsp.hit_start)
        self.assertEqual(3505, hsp.hit_end)
        self.assertEqual('TGATTTTTTTTGTCTAAAACAG', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('gi|156718121:2361-2376', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('mrnalib.fasta', qresult.target)
        self.assertEqual(16, qresult.seq_len)
        self.assertEqual('Bos taurus nucleoporin 43kDa (NU', qresult.description)
        self.assertEqual(5, len(qresult))
        # third qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|47271416|ref|NM_131257.2|', hit.id)
        self.assertEqual('Danio rerio hemoglobin alpha adult-1 (hbaa1), mRNA', hit.description)
        self.assertEqual(597, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(52, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(52, hsp.opt_score)
        self.assertEqual(87.3, hsp.z_score)
        self.assertEqual(21.0, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(85.7, hsp.ident_pct)
        self.assertAlmostEqual(85.7, hsp.pos_pct)
        self.assertEqual(14, hsp.aln_span)
        self.assertEqual(2, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('AGAAGGAAAAAAAA', str(hsp.query.seq))
        self.assertEqual(572, hsp.hit_start)
        self.assertEqual(586, hsp.hit_end)
        self.assertEqual('AGAACTAAAAAAAA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # third qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|332859474|ref|XM_001156938.2|', hit.id)
        self.assertEqual('PREDICTED: Pan troglodytes myoglobin, transcript variant 11 (MB), mRNA', hit.description)
        self.assertEqual(762, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(52, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(52, hsp.opt_score)
        self.assertEqual(85.3, hsp.z_score)
        self.assertEqual(20.9, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(85.7, hsp.ident_pct)
        self.assertAlmostEqual(85.7, hsp.pos_pct)
        self.assertEqual(14, hsp.aln_span)
        self.assertEqual(2, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('AGAAGGAAAAAAAA', str(hsp.query.seq))
        self.assertEqual(84, hsp.hit_start)
        self.assertEqual(98, hsp.hit_end)
        self.assertEqual('AGAAGGTATAAAAA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # third qresult, third hit
        hit = qresult[2]
        self.assertEqual('gi|332211534|ref|XM_003254825.1|', hit.id)
        self.assertEqual('PREDICTED: Nomascus leucogenys hemoglobin subunit gamma-2-like (LOC100581638), mRNA', hit.description)
        self.assertEqual(805, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, third hit, first hsp
        hsp = qresult[2].hsps[0]
        self.assertEqual(52, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(52, hsp.opt_score)
        self.assertEqual(84.9, hsp.z_score)
        self.assertEqual(20.9, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(85.7, hsp.ident_pct)
        self.assertAlmostEqual(85.7, hsp.pos_pct)
        self.assertEqual(14, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(15, hsp.query_end)
        self.assertEqual('TTTTTTTCCTTCTT', str(hsp.query.seq))
        self.assertEqual(633, hsp.hit_start)
        self.assertEqual(647, hsp.hit_end)
        self.assertEqual('TTTTTTTACATCTT', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)
        # third qresult, fourth hit
        hit = qresult[3]
        self.assertEqual('gi|23308614|ref|NM_152952.1|', hit.id)
        self.assertEqual('Danio rerio cytoglobin 1 (cygb1), mRNA', hit.description)
        self.assertEqual(5188, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, fourth hit, first hsp
        hsp = qresult[3].hsps[0]
        self.assertEqual(52, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(52, hsp.opt_score)
        self.assertEqual(70.2, hsp.z_score)
        self.assertEqual(20.9, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(85.7, hsp.ident_pct)
        self.assertAlmostEqual(85.7, hsp.pos_pct)
        self.assertEqual(14, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(15, hsp.query_end)
        self.assertEqual('AAGAAGGAAAAAAA', str(hsp.query.seq))
        self.assertEqual(3547, hsp.hit_start)
        self.assertEqual(3561, hsp.hit_end)
        self.assertEqual('AATAAGTAAAAAAA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # third qresult, fifth hit
        hit = qresult[4]
        self.assertEqual('gi|297689475|ref|XM_002822130.1|', hit.id)
        self.assertEqual('PREDICTED: Pongo abelii hemoglobin subunit gamma-like (LOC100439631), mRNA', hit.description)
        self.assertEqual(1158, hit.seq_len)
        self.assertEqual(2, len(hit))
        # third qresult, fifth hit, first hsp
        hsp = qresult[4].hsps[0]
        self.assertEqual(52, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(52, hsp.opt_score)
        self.assertEqual(82.0, hsp.z_score)
        self.assertEqual(20.9, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(85.7, hsp.ident_pct)
        self.assertAlmostEqual(85.7, hsp.pos_pct)
        self.assertEqual(14, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(15, hsp.query_end)
        self.assertEqual('TTTTTTTCCTTCTT', str(hsp.query.seq))
        self.assertEqual(983, hsp.hit_start)
        self.assertEqual(997, hsp.hit_end)
        self.assertEqual('TTTTTTTACATCTT', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)
        # third qresult, fifth hit, second hsp
        hsp = qresult[4].hsps[1]
        self.assertEqual(52, hsp.initn_score)
        self.assertEqual(52, hsp.init1_score)
        self.assertEqual(52, hsp.opt_score)
        self.assertEqual(82.0, hsp.z_score)
        self.assertEqual(20.9, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(85.7, hsp.ident_pct)
        self.assertAlmostEqual(85.7, hsp.pos_pct)
        self.assertEqual(14, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(15, hsp.query_end)
        self.assertEqual('AAGAAGGAAAAAAA', str(hsp.query.seq))
        self.assertEqual(19, hsp.hit_start)
        self.assertEqual(33, hsp.hit_end)
        self.assertEqual('AAGAAGGTAAAAGA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)

    def test_output010(self):
        """Test parsing fasta36 output (output010.m10)"""

        m10_file = get_file('output010.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(1, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('random_s00', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('mrnalib.fasta', qresult.target)
        self.assertEqual(15, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(0, len(qresult))

    def test_output011(self):
        """Test parsing fasta36 output (output011.m10)"""

        m10_file = get_file('output011.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(1, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('gi|255708421:1-99', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('mrnalib.fasta', qresult.target)
        self.assertEqual(99, qresult.seq_len)
        self.assertEqual('Mus musculus myoglobin (Mb), transcript varia', qresult.description)
        self.assertEqual(5, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|284005422|ref|NM_001171502.1|', hit.id)
        self.assertEqual('Oryctolagus cuniculus hemoglobin, zeta (HBZ_2), mRNA', hit.description)
        self.assertEqual(429, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(79, hsp.initn_score)
        self.assertEqual(66, hsp.init1_score)
        self.assertEqual(99, hsp.opt_score)
        self.assertEqual(90.0, hsp.z_score)
        self.assertEqual(23.6, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(73.8, hsp.ident_pct)
        self.assertAlmostEqual(73.8, hsp.pos_pct)
        self.assertEqual(42, hsp.aln_span)
        self.assertEqual(33, hsp.query_start)
        self.assertEqual(75, hsp.query_end)
        self.assertEqual('CAACATCCAGAGGACTGTCATCCTTGTCCCTGTGGGTGAGGG', str(hsp.query.seq))
        self.assertEqual(11, hsp.hit_start)
        self.assertEqual(52, hsp.hit_end)
        self.assertEqual('CAAGAGCGAGAGGACCATCAT-CATGTCCCTCTGGGACAAGG', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|284005386|ref|NM_001171415.1|', hit.id)
        self.assertEqual('Oryctolagus cuniculus zeta globin (HBZ0), mRNA', hit.description)
        self.assertEqual(429, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(73, hsp.initn_score)
        self.assertEqual(66, hsp.init1_score)
        self.assertEqual(99, hsp.opt_score)
        self.assertEqual(90.0, hsp.z_score)
        self.assertEqual(23.6, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(73.8, hsp.ident_pct)
        self.assertAlmostEqual(73.8, hsp.pos_pct)
        self.assertEqual(42, hsp.aln_span)
        self.assertEqual(33, hsp.query_start)
        self.assertEqual(75, hsp.query_end)
        self.assertEqual('CAACATCCAGAGGACTGTCATCCTTGTCCCTGTGGGTGAGGG', str(hsp.query.seq))
        self.assertEqual(11, hsp.hit_start)
        self.assertEqual(52, hsp.hit_end)
        self.assertEqual('CAAGAGCGAGAGGACCATCAT-CATGTCCCTCTGGGACAAGG', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, third hit
        hit = qresult[2]
        self.assertEqual('gi|284005381|ref|NM_001171414.1|', hit.id)
        self.assertEqual('Oryctolagus cuniculus hemoglobin subunit zeta (RA_M008_JSM295ECF), mRNA', hit.description)
        self.assertEqual(429, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, third hit, first hsp
        hsp = qresult[2].hsps[0]
        self.assertEqual(90, hsp.initn_score)
        self.assertEqual(66, hsp.init1_score)
        self.assertEqual(99, hsp.opt_score)
        self.assertEqual(90.0, hsp.z_score)
        self.assertEqual(23.6, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(73.8, hsp.ident_pct)
        self.assertAlmostEqual(73.8, hsp.pos_pct)
        self.assertEqual(42, hsp.aln_span)
        self.assertEqual(33, hsp.query_start)
        self.assertEqual(75, hsp.query_end)
        self.assertEqual('CAACATCCAGAGGACTGTCATCCTTGTCCCTGTGGGTGAGGG', str(hsp.query.seq))
        self.assertEqual(11, hsp.hit_start)
        self.assertEqual(52, hsp.hit_end)
        self.assertEqual('CAAGAGCGAGAGGACCATCAT-CATGTCCCTCTGGGACAAGG', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, fourth hit
        hit = qresult[3]
        self.assertEqual('gi|23308614|ref|NM_152952.1|', hit.id)
        self.assertEqual('Danio rerio cytoglobin 1 (cygb1), mRNA', hit.description)
        self.assertEqual(5188, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, fourth hit, first hsp
        hsp = qresult[3].hsps[0]
        self.assertEqual(115, hsp.initn_score)
        self.assertEqual(78, hsp.init1_score)
        self.assertEqual(80, hsp.opt_score)
        self.assertEqual(70.4, hsp.z_score)
        self.assertEqual(23.6, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(80.0, hsp.ident_pct)
        self.assertAlmostEqual(80.0, hsp.pos_pct)
        self.assertEqual(25, hsp.aln_span)
        self.assertEqual(12, hsp.query_start)
        self.assertEqual(37, hsp.query_end)
        self.assertEqual('TTAGAAACAGAACATCATCTTCAAC', str(hsp.query.seq))
        self.assertEqual(415, hsp.hit_start)
        self.assertEqual(440, hsp.hit_end)
        self.assertEqual('TGACAAACTCAACACCATCTTCAAC', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, fifth hit
        hit = qresult[4]
        self.assertEqual('gi|291415427|ref|XM_002723908.1|', hit.id)
        self.assertEqual('PREDICTED: Oryctolagus cuniculus zeta globin-like (LOC100357627), mRNA', hit.description)
        self.assertEqual(423, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, fifth hit, first hsp
        hsp = qresult[4].hsps[0]
        self.assertEqual(91, hsp.initn_score)
        self.assertEqual(66, hsp.init1_score)
        self.assertEqual(99, hsp.opt_score)
        self.assertEqual(90.0, hsp.z_score)
        self.assertEqual(23.6, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(73.8, hsp.ident_pct)
        self.assertAlmostEqual(73.8, hsp.pos_pct)
        self.assertEqual(42, hsp.aln_span)
        self.assertEqual(33, hsp.query_start)
        self.assertEqual(75, hsp.query_end)
        self.assertEqual('CAACATCCAGAGGACTGTCATCCTTGTCCCTGTGGGTGAGGG', str(hsp.query.seq))
        self.assertEqual(11, hsp.hit_start)
        self.assertEqual(52, hsp.hit_end)
        self.assertEqual('CAAGAGCGAGAGGACCATCAT-CATGTCCCTCTGGGACAAGG', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)

    def test_output012(self):
        """Test parsing fasta36 output (output012.m10)"""

        m10_file = get_file('output012.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(1, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('gi|156718121:2361-2376', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('mrnalib.fasta', qresult.target)
        self.assertEqual(16, qresult.seq_len)
        self.assertEqual('Bos taurus nucleoporin 43kDa (NU', qresult.description)
        self.assertEqual(8, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|77681427|ref|NM_001016495.2|', hit.id)
        self.assertEqual('Xenopus (Silurana) tropicalis hemoglobin, epsilon 1 (hbe1), mRNA', hit.description)
        self.assertEqual(554, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(88.1, hsp.z_score)
        self.assertEqual(21.0, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('AAGAAGGAAAAAAAA', str(hsp.query.seq))
        self.assertEqual(529, hsp.hit_start)
        self.assertEqual(544, hsp.hit_end)
        self.assertEqual('AAGAATAAAAAAAAA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|53749657|ref|NM_182940.2|', hit.id)
        self.assertEqual('Danio rerio hemoglobin alpha embryonic-1 (hbae1), mRNA', hit.description)
        self.assertEqual(564, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(87.9, hsp.z_score)
        self.assertEqual(21.0, hsp.bitscore)
        self.assertEqual(1.4, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('AAGAAGGAAAAAAAA', str(hsp.query.seq))
        self.assertEqual(531, hsp.hit_start)
        self.assertEqual(546, hsp.hit_end)
        self.assertEqual('AAGAAAAAAAAAAAA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, third hit
        hit = qresult[2]
        self.assertEqual('gi|158508631|ref|NM_030206.4|', hit.id)
        self.assertEqual('Mus musculus cytoglobin (Cygb), mRNA', hit.description)
        self.assertEqual(2331, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, third hit, first hsp
        hsp = qresult[2].hsps[0]
        self.assertEqual(62, hsp.initn_score)
        self.assertEqual(62, hsp.init1_score)
        self.assertEqual(62, hsp.opt_score)
        self.assertEqual(76.3, hsp.z_score)
        self.assertEqual(20.9, hsp.bitscore)
        self.assertEqual(1.5, hsp.evalue)
        self.assertAlmostEqual(87.5, hsp.ident_pct)
        self.assertAlmostEqual(87.5, hsp.pos_pct)
        self.assertEqual(16, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('GAAGAAGGAAAAAAAA', str(hsp.query.seq))
        self.assertEqual(1781, hsp.hit_start)
        self.assertEqual(1797, hsp.hit_end)
        self.assertEqual('GAAGAAAAAAAAAAAA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, fourth hit
        hit = qresult[3]
        self.assertEqual('gi|296217287|ref|XM_002754912.1|', hit.id)
        self.assertEqual('PREDICTED: Callithrix jacchus hemoglobin subunit gamma-like (LOC100389093), mRNA', hit.description)
        self.assertEqual(627, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, fourth hit, first hsp
        hsp = qresult[3].hsps[0]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(86.3, hsp.z_score)
        self.assertEqual(20.8, hsp.bitscore)
        self.assertEqual(1.5, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(15, hsp.query_end)
        self.assertEqual('GAAGAAGGAAAAAAA', str(hsp.query.seq))
        self.assertEqual(131, hsp.hit_start)
        self.assertEqual(146, hsp.hit_end)
        self.assertEqual('GAAGAAGGTAAAACA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, fifth hit
        hit = qresult[4]
        self.assertEqual('gi|332211540|ref|XM_003254828.1|', hit.id)
        self.assertEqual('PREDICTED: Nomascus leucogenys hemoglobin subunit gamma-1-like, transcript variant 2 (LOC100582529), mRNA', hit.description)
        self.assertEqual(640, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, fifth hit, first hsp
        hsp = qresult[4].hsps[0]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(86.0, hsp.z_score)
        self.assertEqual(20.8, hsp.bitscore)
        self.assertEqual(1.5, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('TTTTTTTTCCTTCTT', str(hsp.query.seq))
        self.assertEqual(589, hsp.hit_start)
        self.assertEqual(604, hsp.hit_end)
        self.assertEqual('TTTTTTTTACATCTT', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)
        # first qresult, sixth hit
        hit = qresult[5]
        self.assertEqual('gi|147903656|ref|NM_001086277.1|', hit.id)
        self.assertEqual('Xenopus laevis hemoglobin, alpha 2 (hba2), mRNA', hit.description)
        self.assertEqual(677, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, sixth hit, first hsp
        hsp = qresult[5].hsps[0]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(85.2, hsp.z_score)
        self.assertEqual(20.8, hsp.bitscore)
        self.assertEqual(1.6, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('AAGAAGGAAAAAAAA', str(hsp.query.seq))
        self.assertEqual(642, hsp.hit_start)
        self.assertEqual(657, hsp.hit_end)
        self.assertEqual('AAAAAAGAAAAAAAA', str(hsp.hit.seq))
        self.assertEqual(1, hsp.query_strand)
        # first qresult, seventh hit
        hit = qresult[6]
        self.assertEqual('gi|380013536|ref|XM_003690762.1|', hit.id)
        self.assertEqual('PREDICTED: Apis florea globin-like (LOC100870092), mRNA', hit.description)
        self.assertEqual(707, hit.seq_len)
        self.assertEqual(3, len(hit))
        # first qresult, seventh hit, first hsp
        hsp = qresult[6].hsps[0]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(84.6, hsp.z_score)
        self.assertEqual(20.7, hsp.bitscore)
        self.assertEqual(1.7, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('TTTTTTTTCCTTCTT', str(hsp.query.seq))
        self.assertEqual(6, hsp.hit_start)
        self.assertEqual(21, hsp.hit_end)
        self.assertEqual('TTTTTTTTTTTTCTT', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)
        # first qresult, seventh hit, second hsp
        hsp = qresult[6].hsps[1]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(84.6, hsp.z_score)
        self.assertEqual(20.7, hsp.bitscore)
        self.assertEqual(1.7, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('TTTTTTTTCCTTCTT', str(hsp.query.seq))
        self.assertEqual(45, hsp.hit_start)
        self.assertEqual(60, hsp.hit_end)
        self.assertEqual('TTTTTTTTTTTTCTT', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)
        # first qresult, seventh hit, third hsp
        hsp = qresult[6].hsps[2]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(84.6, hsp.z_score)
        self.assertEqual(20.7, hsp.bitscore)
        self.assertEqual(1.7, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(15, hsp.query_end)
        self.assertEqual('TTTTTTTCCTTCTTC', str(hsp.query.seq))
        self.assertEqual(644, hsp.hit_start)
        self.assertEqual(659, hsp.hit_end)
        self.assertEqual('TTTTTTTCCTCCTCC', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)
        # first qresult, eigth hit
        hit = qresult[7]
        self.assertEqual('gi|332211538|ref|XM_003254827.1|', hit.id)
        self.assertEqual('PREDICTED: Nomascus leucogenys hemoglobin subunit gamma-1-like, transcript variant 1 (LOC100582529), mRNA', hit.description)
        self.assertEqual(713, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, eigth hit, first hsp
        hsp = qresult[7].hsps[0]
        self.assertEqual(57, hsp.initn_score)
        self.assertEqual(57, hsp.init1_score)
        self.assertEqual(57, hsp.opt_score)
        self.assertEqual(84.5, hsp.z_score)
        self.assertEqual(20.7, hsp.bitscore)
        self.assertEqual(1.7, hsp.evalue)
        self.assertAlmostEqual(86.7, hsp.ident_pct)
        self.assertAlmostEqual(86.7, hsp.pos_pct)
        self.assertEqual(15, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(16, hsp.query_end)
        self.assertEqual('TTTTTTTTCCTTCTT', str(hsp.query.seq))
        self.assertEqual(662, hsp.hit_start)
        self.assertEqual(677, hsp.hit_end)
        self.assertEqual('TTTTTTTTACATCTT', str(hsp.hit.seq))
        self.assertEqual(-1, hsp.query_strand)

    def test_output013(self):
        """Test parsing fasta36 output (output013.m10)"""

        m10_file = get_file('output013.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(3, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('random_s00', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('protlib.fasta', qresult.target)
        self.assertEqual(16, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(0, len(qresult))

        # test second qresult
        qresult = qresults[1]
        self.assertEqual('sp|Q9Y2H6|68-133', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('protlib.fasta', qresult.target)
        self.assertEqual(66, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(1, len(qresult))
        # second qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|291391832|ref|XP_002712264.1|', hit.id)
        self.assertEqual('PREDICTED: titin [Oryctolagus cuniculus]', hit.description)
        self.assertEqual(33406, hit.seq_len)
        self.assertEqual(1, len(hit))
        # second qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(98, hsp.initn_score)
        self.assertEqual(98, hsp.init1_score)
        self.assertEqual(109, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(30.2, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(109, hsp.sw_score)
        self.assertAlmostEqual(26.8, hsp.ident_pct)
        self.assertAlmostEqual(54.9, hsp.pos_pct)
        self.assertEqual(71, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(66, hsp.query_end)
        self.assertEqual('PNGSVPPIY-----VPPGYAPQVIEDNGVRRVVVVPQAPEFHPGSHTVLHRSPHPPLPGFIPVPTMMPPPP', str(hsp.query.seq))
        self.assertEqual(10704, hsp.hit_start)
        self.assertEqual(10775, hsp.hit_end)
        self.assertEqual('PEKKVPPAVPKKPEAPPAKVPEAPKEVVPEKKIAVPKKPEVPPAKVPEVPKKPVIEEKPVIPVPKKVESPP', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)

        # test third qresult
        qresult = qresults[2]
        self.assertEqual('sp|Q9Y2H6|265-345', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('protlib.fasta', qresult.target)
        self.assertEqual(81, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(4, len(qresult))
        # third qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|260806189|ref|XP_002597967.1|', hit.id)
        self.assertEqual('hypothetical protein BRAFLDRAFT_79792 [Branchiostoma floridae]', hit.description)
        self.assertEqual(23830, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(220, hsp.initn_score)
        self.assertEqual(62, hsp.init1_score)
        self.assertEqual(92, hsp.opt_score)
        self.assertEqual(97.4, hsp.z_score)
        self.assertEqual(30.5, hsp.bitscore)
        self.assertEqual(0.32, hsp.evalue)
        self.assertEqual(92, hsp.sw_score)
        self.assertAlmostEqual(31.6, hsp.ident_pct)
        self.assertAlmostEqual(60.8, hsp.pos_pct)
        self.assertEqual(79, hsp.aln_span)
        self.assertEqual(1, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('LSNIVKPVASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVG-EETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(22430, hsp.hit_start)
        self.assertEqual(22499, hsp.hit_end)
        self.assertEqual('VSNI-RPAASDISPHTLTLTWDTP------EDDGGSLITSYVVEMFDVS---DGKWQTLTTTCRRPPYPVKGLNPSATY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # third qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|348553521|ref|XP_003462575.1|', hit.id)
        self.assertEqual('PREDICTED: receptor-type tyrosine-protein phosphatase F isoform 1 [Cavia porcellus]', hit.description)
        self.assertEqual(1899, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(104, hsp.initn_score)
        self.assertEqual(75, hsp.init1_score)
        self.assertEqual(75, hsp.opt_score)
        self.assertEqual(96.6, hsp.z_score)
        self.assertEqual(26.7, hsp.bitscore)
        self.assertEqual(0.36, hsp.evalue)
        self.assertEqual(75, hsp.sw_score)
        self.assertAlmostEqual(32.4, hsp.ident_pct)
        self.assertAlmostEqual(64.9, hsp.pos_pct)
        self.assertEqual(37, hsp.aln_span)
        self.assertEqual(43, hsp.query_start)
        self.assertEqual(80, hsp.query_end)
        self.assertEqual('YEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDYH', str(hsp.query.seq))
        self.assertEqual(542, hsp.hit_start)
        self.assertEqual(579, hsp.hit_end)
        self.assertEqual('YELVYWAAEEEGQQRKVTFDPTSSYTLEDLKPDTLYH', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # third qresult, third hit
        hit = qresult[2]
        self.assertEqual('gi|348553523|ref|XP_003462576.1|', hit.id)
        self.assertEqual('PREDICTED: receptor-type tyrosine-protein phosphatase F isoform 2 [Cavia porcellus]', hit.description)
        self.assertEqual(1908, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, third hit, first hsp
        hsp = qresult[2].hsps[0]
        self.assertEqual(104, hsp.initn_score)
        self.assertEqual(75, hsp.init1_score)
        self.assertEqual(75, hsp.opt_score)
        self.assertEqual(96.6, hsp.z_score)
        self.assertEqual(26.7, hsp.bitscore)
        self.assertEqual(0.36, hsp.evalue)
        self.assertEqual(75, hsp.sw_score)
        self.assertAlmostEqual(32.4, hsp.ident_pct)
        self.assertAlmostEqual(64.9, hsp.pos_pct)
        self.assertEqual(37, hsp.aln_span)
        self.assertEqual(43, hsp.query_start)
        self.assertEqual(80, hsp.query_end)
        self.assertEqual('YEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDYH', str(hsp.query.seq))
        self.assertEqual(542, hsp.hit_start)
        self.assertEqual(579, hsp.hit_end)
        self.assertEqual('YELVYWAAEEEGQQRKVTFDPTSSYTLEDLKPDTLYH', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # third qresult, fourth hit
        hit = qresult[3]
        self.assertEqual('gi|221124183|ref|XP_002154464.1|', hit.id)
        self.assertEqual('PREDICTED: similar to FAD104 [Hydra magnipapillata]', hit.description)
        self.assertEqual(860, hit.seq_len)
        self.assertEqual(1, len(hit))
        # third qresult, fourth hit, first hsp
        hsp = qresult[3].hsps[0]
        self.assertEqual(85, hsp.initn_score)
        self.assertEqual(66, hsp.init1_score)
        self.assertEqual(70, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(25.3, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(70, hsp.sw_score)
        self.assertAlmostEqual(27.1, hsp.ident_pct)
        self.assertAlmostEqual(58.6, hsp.pos_pct)
        self.assertEqual(70, hsp.aln_span)
        self.assertEqual(9, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('ASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(615, hsp.hit_start)
        self.assertEqual(673, hsp.hit_end)
        self.assertEqual('ASSISYHSIKLKWGHQSS-------KKSI-----LNHTLQMQNKSGSFNTVYSGMDTSFTLSKLKELTPY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)

    def test_output014(self):
        """Test parsing fasta36 output (output014.m10)"""

        m10_file = get_file('output014.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(1, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('random_s00', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('protlib.fasta', qresult.target)
        self.assertEqual(16, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(0, len(qresult))

    def test_output015(self):
        """Test parsing fasta36 output (output015.m10)"""

        m10_file = get_file('output015.m10')
        qresults = list(parse(m10_file, FMT))
        self.assertEqual(1, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('sp|Q9Y2H6|68-133', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('protlib.fasta', qresult.target)
        self.assertEqual(66, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(2, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|194762369|ref|XP_001963317.1|', hit.id)
        self.assertEqual('GF14002 [Drosophila ananassae]', hit.description)
        self.assertEqual(1761, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(88, hsp.initn_score)
        self.assertEqual(68, hsp.init1_score)
        self.assertEqual(85, hsp.opt_score)
        self.assertEqual(95.3, hsp.z_score)
        self.assertEqual(26.0, hsp.bitscore)
        self.assertEqual(0.42, hsp.evalue)
        self.assertEqual(85, hsp.sw_score)
        self.assertAlmostEqual(31.0, hsp.ident_pct)
        self.assertAlmostEqual(49.3, hsp.pos_pct)
        self.assertEqual(71, hsp.aln_span)
        self.assertEqual(5, hsp.query_start)
        self.assertEqual(66, hsp.query_end)
        self.assertEqual('PPIY----VPPGYA---PQVIEDNGVRRVVVVPQAPEFH---PGSHTVLHRSPHPPLPGFIPVPTMMPPPP', str(hsp.query.seq))
        self.assertEqual(128, hsp.hit_start)
        self.assertEqual(195, hsp.hit_end)
        self.assertEqual('PPLLQQTATPPQGAQIVPPVCALHHPQQQLALMAAMQHHHPLPPPHA-LHHAPLPPPP---PLPLNPGPPP', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|77812697|ref|NP_035782.3|', hit.id)
        self.assertEqual('titin isoform N2-A [Mus musculus]', hit.description)
        self.assertEqual(33467, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(104, hsp.initn_score)
        self.assertEqual(92, hsp.init1_score)
        self.assertEqual(106, hsp.opt_score)
        self.assertEqual(94.9, hsp.z_score)
        self.assertEqual(30.2, hsp.bitscore)
        self.assertEqual(0.45, hsp.evalue)
        self.assertEqual(106, hsp.sw_score)
        self.assertAlmostEqual(29.4, hsp.ident_pct)
        self.assertAlmostEqual(57.4, hsp.pos_pct)
        self.assertEqual(68, hsp.aln_span)
        self.assertEqual(0, hsp.query_start)
        self.assertEqual(66, hsp.query_end)
        self.assertEqual('PNGSVPPIY--VPPGYAPQVIEDNGVRRVVVVPQAPEFHPGSHTVLHRSPHPPLPGFIPVPTMMPPPP', str(hsp.query.seq))
        self.assertEqual(10780, hsp.hit_start)
        self.assertEqual(10848, hsp.hit_end)
        self.assertEqual('PEKKVPPKKPEAPPAKVPEVPKEVVTEKKVAVPKKPEVPPAKVPEVPKKPVIEEKPAIPVVEKVASPP', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)

    def test_output016(self):
        """Test parsing fasta36 output (output016.m10)"""

        m10_file = get_file('output016.m10')
        # only check 8, 10 is too many
        qresults = list(parse(m10_file, FMT))[:8]
        self.assertEqual(1, len(qresults))
        # check common attributes
        for qresult in qresults:
            for hit in qresult:
                self.assertEqual(qresult.id, hit.query_id)
                for hsp in hit:
                    self.assertEqual(hit.id, hsp.hit_id)
                    self.assertEqual(qresult.id, hsp.query_id)

        # test first qresult
        qresult = qresults[0]
        self.assertEqual('sp|Q9Y2H6|265-345', qresult.id)
        self.assertEqual('fasta', qresult.program)
        self.assertEqual('36.3.5c', qresult.version)
        self.assertEqual('protlib.fasta', qresult.target)
        self.assertEqual(81, qresult.seq_len)
        self.assertEqual('', qresult.description)
        self.assertEqual(17, len(qresult))
        # first qresult, first hit
        hit = qresult[0]
        self.assertEqual('gi|167518632|ref|XP_001743656.1|', hit.id)
        self.assertEqual('hypothetical protein [Monosiga brevicollis MX1]', hit.description)
        self.assertEqual(1145, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, first hit, first hsp
        hsp = qresult[0].hsps[0]
        self.assertEqual(88, hsp.initn_score)
        self.assertEqual(68, hsp.init1_score)
        self.assertEqual(68, hsp.opt_score)
        self.assertEqual(97.5, hsp.z_score)
        self.assertEqual(26.1, hsp.bitscore)
        self.assertEqual(0.32, hsp.evalue)
        self.assertEqual(68, hsp.sw_score)
        self.assertAlmostEqual(43.5, hsp.ident_pct)
        self.assertAlmostEqual(65.2, hsp.pos_pct)
        self.assertEqual(23, hsp.aln_span)
        self.assertEqual(56, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('YKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(424, hsp.hit_start)
        self.assertEqual(447, hsp.hit_end)
        self.assertEqual('FRPVYTGIDTNYKVVDLTPNCDY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, second hit
        hit = qresult[1]
        self.assertEqual('gi|9507013|ref|NP_062122.1|', hit.id)
        self.assertEqual('receptor-type tyrosine-protein phosphatase F precursor [Rattus norvegicus]', hit.description)
        self.assertEqual(1898, hit.seq_len)
        self.assertEqual(2, len(hit))
        # first qresult, second hit, first hsp
        hsp = qresult[1].hsps[0]
        self.assertEqual(83, hsp.initn_score)
        self.assertEqual(43, hsp.init1_score)
        self.assertEqual(72, hsp.opt_score)
        self.assertEqual(96.2, hsp.z_score)
        self.assertEqual(26.6, hsp.bitscore)
        self.assertEqual(0.37, hsp.evalue)
        self.assertEqual(72, hsp.sw_score)
        self.assertAlmostEqual(26.8, hsp.ident_pct)
        self.assertAlmostEqual(54.9, hsp.pos_pct)
        self.assertEqual(71, hsp.aln_span)
        self.assertEqual(8, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('VASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(325, hsp.hit_start)
        self.assertEqual(385, hsp.hit_end)
        self.assertEqual('VVTETTATSVTLTWD------SGNTEPVS---FYG--IQYRAAGTDGPFQEVDGVASTRYSIGGLSPFSEY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, second hit, second hsp
        hsp = qresult[1].hsps[1]
        self.assertEqual(98, hsp.initn_score)
        self.assertEqual(70, hsp.init1_score)
        self.assertEqual(70, hsp.opt_score)
        self.assertEqual(96.2, hsp.z_score)
        self.assertEqual(26.6, hsp.bitscore)
        self.assertEqual(0.37, hsp.evalue)
        self.assertEqual(70, hsp.sw_score)
        self.assertAlmostEqual(32.4, hsp.ident_pct)
        self.assertAlmostEqual(62.2, hsp.pos_pct)
        self.assertEqual(37, hsp.aln_span)
        self.assertEqual(43, hsp.query_start)
        self.assertEqual(80, hsp.query_end)
        self.assertEqual('YEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDYH', str(hsp.query.seq))
        self.assertEqual(542, hsp.hit_start)
        self.assertEqual(579, hsp.hit_end)
        self.assertEqual('YELVYWAAEDEGQQHKVTFDPTSSYTLEDLKPDTLYH', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, third hit
        hit = qresult[2]
        self.assertEqual('gi|115648048|ref|NP_035343.2|', hit.id)
        self.assertEqual('receptor-type tyrosine-protein phosphatase F precursor [Mus musculus]', hit.description)
        self.assertEqual(1898, hit.seq_len)
        self.assertEqual(2, len(hit))
        # first qresult, third hit, first hsp
        hsp = qresult[2].hsps[0]
        self.assertEqual(98, hsp.initn_score)
        self.assertEqual(70, hsp.init1_score)
        self.assertEqual(73, hsp.opt_score)
        self.assertEqual(96.2, hsp.z_score)
        self.assertEqual(26.6, hsp.bitscore)
        self.assertEqual(0.37, hsp.evalue)
        self.assertEqual(73, hsp.sw_score)
        self.assertAlmostEqual(25.6, hsp.ident_pct)
        self.assertAlmostEqual(54.9, hsp.pos_pct)
        self.assertEqual(82, hsp.aln_span)
        self.assertEqual(7, hsp.query_start)
        self.assertEqual(80, hsp.query_end)
        self.assertEqual('PVASDIQARTVVLTWSPPSSL-INGETDESS-----VP---ELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDYH', str(hsp.query.seq))
        self.assertEqual(497, hsp.hit_start)
        self.assertEqual(579, hsp.hit_end)
        self.assertEqual('PPSPTIQVKTQQGVPAQPADFQANAESDTRIQLSWLLPPQERIVKYELVYWAAEDEGQQHKVTFDPTSSYTLEDLKPDTLYH', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, third hit, second hsp
        hsp = qresult[2].hsps[1]
        self.assertEqual(76, hsp.initn_score)
        self.assertEqual(43, hsp.init1_score)
        self.assertEqual(72, hsp.opt_score)
        self.assertEqual(96.2, hsp.z_score)
        self.assertEqual(26.6, hsp.bitscore)
        self.assertEqual(0.37, hsp.evalue)
        self.assertEqual(72, hsp.sw_score)
        self.assertAlmostEqual(26.8, hsp.ident_pct)
        self.assertAlmostEqual(54.9, hsp.pos_pct)
        self.assertEqual(71, hsp.aln_span)
        self.assertEqual(8, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('VASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(325, hsp.hit_start)
        self.assertEqual(385, hsp.hit_end)
        self.assertEqual('VVTETTATSVTLTWD------SGNTEPVS---FYG--IQYRAAGTDGPFQEVDGVASTRYSIGGLSPFSEY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, fourth hit
        hit = qresult[3]
        self.assertEqual('gi|354481005|ref|XP_003502693.1|', hit.id)
        self.assertEqual('PREDICTED: LOW QUALITY PROTEIN: receptor-type tyrosine-protein phosphatase F-like [Cricetulus griseus]', hit.description)
        self.assertEqual(1898, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, fourth hit, first hsp
        hsp = qresult[3].hsps[0]
        self.assertEqual(98, hsp.initn_score)
        self.assertEqual(70, hsp.init1_score)
        self.assertEqual(70, hsp.opt_score)
        self.assertEqual(96.2, hsp.z_score)
        self.assertEqual(26.6, hsp.bitscore)
        self.assertEqual(0.37, hsp.evalue)
        self.assertEqual(70, hsp.sw_score)
        self.assertAlmostEqual(32.4, hsp.ident_pct)
        self.assertAlmostEqual(62.2, hsp.pos_pct)
        self.assertEqual(37, hsp.aln_span)
        self.assertEqual(43, hsp.query_start)
        self.assertEqual(80, hsp.query_end)
        self.assertEqual('YEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDYH', str(hsp.query.seq))
        self.assertEqual(542, hsp.hit_start)
        self.assertEqual(579, hsp.hit_end)
        self.assertEqual('YELVYWAAEDEGQQHKVTFDPTSSYTLEDLKPDTVYH', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, fifth hit
        hit = qresult[4]
        self.assertEqual('gi|328789682|ref|XP_003251305.1|', hit.id)
        self.assertEqual('PREDICTED: LOW QUALITY PROTEIN: twitchin [Apis mellifera]', hit.description)
        self.assertEqual(8619, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, fifth hit, first hsp
        hsp = qresult[4].hsps[0]
        self.assertEqual(70, hsp.initn_score)
        self.assertEqual(70, hsp.init1_score)
        self.assertEqual(78, hsp.opt_score)
        self.assertEqual(95.2, hsp.z_score)
        self.assertEqual(28.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(78, hsp.sw_score)
        self.assertAlmostEqual(28.6, hsp.ident_pct)
        self.assertAlmostEqual(54.3, hsp.pos_pct)
        self.assertEqual(70, hsp.aln_span)
        self.assertEqual(9, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('ASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(4760, hsp.hit_start)
        self.assertEqual(4823, hsp.hit_end)
        self.assertEqual('ASDVHAEGCTLTWKPP------EDDGGQPIDKYVVEKMDEATGRWVPAGETD-GPQTSLQVEGLTPGHKY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, sixth hit
        hit = qresult[5]
        self.assertEqual('gi|260828627|ref|XP_002609264.1|', hit.id)
        self.assertEqual('hypothetical protein BRAFLDRAFT_124749 [Branchiostoma floridae]', hit.description)
        self.assertEqual(4389, hit.seq_len)
        self.assertEqual(7, len(hit))
        # first qresult, sixth hit, first hsp
        hsp = qresult[5].hsps[0]
        self.assertEqual(81, hsp.initn_score)
        self.assertEqual(73, hsp.init1_score)
        self.assertEqual(97, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(27.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(97, hsp.sw_score)
        self.assertAlmostEqual(21.4, hsp.ident_pct)
        self.assertAlmostEqual(67.1, hsp.pos_pct)
        self.assertEqual(70, hsp.aln_span)
        self.assertEqual(9, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('ASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(2241, hsp.hit_start)
        self.assertEqual(2302, hsp.hit_end)
        self.assertEqual('ANAVDSQSIRINWQPPTE-PNGN--------VLGYNIFYTTEGESGNNQQTVGPDDTTYVIEGLRPATQY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, sixth hit, second hsp
        hsp = qresult[5].hsps[1]
        self.assertEqual(177, hsp.initn_score)
        self.assertEqual(55, hsp.init1_score)
        self.assertEqual(90, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(27.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(90, hsp.sw_score)
        self.assertAlmostEqual(30.6, hsp.ident_pct)
        self.assertAlmostEqual(56.9, hsp.pos_pct)
        self.assertEqual(72, hsp.aln_span)
        self.assertEqual(8, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('VASDIQA-RTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(2818, hsp.hit_start)
        self.assertEqual(2881, hsp.hit_end)
        self.assertEqual('VTADGQAPDTVVVTWQSPAET-NGD--------LLGYYIYYQVVGSTETSQAETGPDETTYSISGLRPATEY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, sixth hit, third hsp
        hsp = qresult[5].hsps[2]
        self.assertEqual(196, hsp.initn_score)
        self.assertEqual(61, hsp.init1_score)
        self.assertEqual(84, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(27.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(84, hsp.sw_score)
        self.assertAlmostEqual(27.8, hsp.ident_pct)
        self.assertAlmostEqual(56.9, hsp.pos_pct)
        self.assertEqual(72, hsp.aln_span)
        self.assertEqual(8, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('VASDIQA-RTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(3300, hsp.hit_start)
        self.assertEqual(3363, hsp.hit_end)
        self.assertEqual('VTAEGQAPDTITVTWQSPAET-NGD--------LLGYYIYYQVVGSTEDVRAEAGPEETTYSISGLRPATEY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, sixth hit, fourth hsp
        hsp = qresult[5].hsps[3]
        self.assertEqual(79, hsp.initn_score)
        self.assertEqual(49, hsp.init1_score)
        self.assertEqual(83, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(27.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(83, hsp.sw_score)
        self.assertAlmostEqual(27.9, hsp.ident_pct)
        self.assertAlmostEqual(57.4, hsp.pos_pct)
        self.assertEqual(68, hsp.aln_span)
        self.assertEqual(12, hsp.query_start)
        self.assertEqual(80, hsp.query_end)
        self.assertEqual('IQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDYH', str(hsp.query.seq))
        self.assertEqual(3686, hsp.hit_start)
        self.assertEqual(3747, hsp.hit_end)
        self.assertEqual('IDSTTIELQWMPPSP------DEQN-GVIKGYKILYKKVGEEGENEEDAGLLDLMYTLSDLEKWTEYN', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, sixth hit, fifth hsp
        hsp = qresult[5].hsps[4]
        self.assertEqual(100, hsp.initn_score)
        self.assertEqual(50, hsp.init1_score)
        self.assertEqual(81, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(27.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(81, hsp.sw_score)
        self.assertAlmostEqual(25.7, hsp.ident_pct)
        self.assertAlmostEqual(57.1, hsp.pos_pct)
        self.assertEqual(70, hsp.aln_span)
        self.assertEqual(9, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('ASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(3398, hsp.hit_start)
        self.assertEqual(3459, hsp.hit_end)
        self.assertEqual('ASSLGSEAIEVSWQPPPQS-NGE--------ILGYRLHYQIVGEESASTQEVEGYETFYLLRGLRPVTEY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, sixth hit, sixth hsp
        hsp = qresult[5].hsps[5]
        self.assertEqual(178, hsp.initn_score)
        self.assertEqual(58, hsp.init1_score)
        self.assertEqual(81, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(27.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(81, hsp.sw_score)
        self.assertAlmostEqual(27.1, hsp.ident_pct)
        self.assertAlmostEqual(55.7, hsp.pos_pct)
        self.assertEqual(70, hsp.aln_span)
        self.assertEqual(9, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('ASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(2145, hsp.hit_start)
        self.assertEqual(2206, hsp.hit_end)
        self.assertEqual('ATPVDPRTVRVEWQPPQQ-PNGE--------IQGYNIYYRTTESDEDALQQAGAQDIFLTLTGLSPFTEY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, sixth hit, seventh hsp
        hsp = qresult[5].hsps[6]
        self.assertEqual(102, hsp.initn_score)
        self.assertEqual(48, hsp.init1_score)
        self.assertEqual(79, hsp.opt_score)
        self.assertEqual(95.1, hsp.z_score)
        self.assertEqual(27.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(79, hsp.sw_score)
        self.assertAlmostEqual(29.4, hsp.ident_pct)
        self.assertAlmostEqual(54.4, hsp.pos_pct)
        self.assertEqual(68, hsp.aln_span)
        self.assertEqual(12, hsp.query_start)
        self.assertEqual(79, hsp.query_end)
        self.assertEqual('IQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGE-ETNITLNDLKPAMDY', str(hsp.query.seq))
        self.assertEqual(3497, hsp.hit_start)
        self.assertEqual(3555, hsp.hit_end)
        self.assertEqual('VEPTTITVDWQPPLE-INGV--------LLGYKVIYMPENA-AEFSTVELGPAELSTMLLDLEPATTY', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, seventh hit
        hit = qresult[6]
        self.assertEqual('gi|119220552|ref|NP_689957.3|', hit.id)
        self.assertEqual('protein sidekick-1 isoform 1 [Homo sapiens]', hit.description)
        self.assertEqual(2213, hit.seq_len)
        self.assertEqual(1, len(hit))
        # first qresult, seventh hit, first hsp
        hsp = qresult[6].hsps[0]
        self.assertEqual(87, hsp.initn_score)
        self.assertEqual(51, hsp.init1_score)
        self.assertEqual(70, hsp.opt_score)
        self.assertEqual(95.0, hsp.z_score)
        self.assertEqual(26.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(70, hsp.sw_score)
        self.assertAlmostEqual(29.9, hsp.ident_pct)
        self.assertAlmostEqual(58.2, hsp.pos_pct)
        self.assertEqual(67, hsp.aln_span)
        self.assertEqual(8, hsp.query_start)
        self.assertEqual(73, hsp.query_end)
        self.assertEqual('VASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYV-GEETNITL-NDL', str(hsp.query.seq))
        self.assertEqual(775, hsp.hit_start)
        self.assertEqual(835, hsp.hit_end)
        self.assertEqual('VASGRTNQSIMVQWQPPP-----ETEHNGV--LRGYILRYRLAGLPGEYQQRNITSPEVNYCLVTDL', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, eigth hit
        hit = qresult[7]
        self.assertEqual('gi|332864595|ref|XP_518946.3|', hit.id)
        self.assertEqual('PREDICTED: protein sidekick-1 [Pan troglodytes]', hit.description)
        self.assertEqual(2213, hit.seq_len)
        self.assertEqual(2, len(hit))
        # first qresult, eigth hit, first hsp
        hsp = qresult[7].hsps[0]
        self.assertEqual(68, hsp.initn_score)
        self.assertEqual(45, hsp.init1_score)
        self.assertEqual(76, hsp.opt_score)
        self.assertEqual(95.0, hsp.z_score)
        self.assertEqual(26.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(76, hsp.sw_score)
        self.assertAlmostEqual(32.5, hsp.ident_pct)
        self.assertAlmostEqual(61.0, hsp.pos_pct)
        self.assertEqual(77, hsp.aln_span)
        self.assertEqual(4, hsp.query_start)
        self.assertEqual(80, hsp.query_end)
        self.assertEqual('IVKPVASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYVGEE-TNITLNDLKPAMDYH', str(hsp.query.seq))
        self.assertEqual(674, hsp.hit_start)
        self.assertEqual(740, hsp.hit_end)
        self.assertEqual('LASPNSS--HSHAVVLSWVRP---FDGNS-----PILY-YIVELSENNSPWKVHLSNVGPEMTGITVSGLTPARTYQ', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)
        # first qresult, eigth hit, second hsp
        hsp = qresult[7].hsps[1]
        self.assertEqual(87, hsp.initn_score)
        self.assertEqual(51, hsp.init1_score)
        self.assertEqual(70, hsp.opt_score)
        self.assertEqual(95.0, hsp.z_score)
        self.assertEqual(26.6, hsp.bitscore)
        self.assertEqual(0.43, hsp.evalue)
        self.assertEqual(70, hsp.sw_score)
        self.assertAlmostEqual(29.9, hsp.ident_pct)
        self.assertAlmostEqual(58.2, hsp.pos_pct)
        self.assertEqual(67, hsp.aln_span)
        self.assertEqual(8, hsp.query_start)
        self.assertEqual(73, hsp.query_end)
        self.assertEqual('VASDIQARTVVLTWSPPSSLINGETDESSVPELYGYEVLISSTGKDGKYKSVYV-GEETNITL-NDL', str(hsp.query.seq))
        self.assertEqual(775, hsp.hit_start)
        self.assertEqual(835, hsp.hit_end)
        self.assertEqual('VASGRTNQSIMVQWQPPP-----ETEHNGV--LRGYILRYRLAGLPGEYQQRNITSPEVNYCLVTDL', str(hsp.hit.seq))
        self.assertEqual(0, hsp.query_strand)


if __name__ == "__main__":
    runner = unittest.TextTestRunner(verbosity=2)
    unittest.main(testRunner=runner)
