File: test_refpkg_align.py

package info (click to toggle)
pplacer 1.1~alpha19-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 5,056 kB
  • sloc: ml: 20,927; ansic: 9,002; python: 1,641; makefile: 171; xml: 50; sh: 33
file content (144 lines) | stat: -rw-r--r-- 4,169 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
"""
Unit tests for alignment module
"""

from cStringIO import StringIO
import os
import os.path
import unittest

from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord

import refpkg_align

class ParseStockholmConsensus(unittest.TestCase):

    def setUp(self):
        self.value = """
#=GC RF                      xxx.xx
#=GC RF                      xx.xxx
#=GC RF                      xxx.x.
#=GF TT                      IGNORED
"""

        self.expected = [True, True, True, False, True, True,
                        True, True, False, True, True, True,
                        True, True, True, False, True, False]
        self.handle = StringIO(self.value)

    def _get_result(self):
        return refpkg_align._parse_stockholm_consensus(self.handle).mask

    def test_length(self):
        result = self._get_result()
        self.assertEqual(len(self.expected), len(result))

    def test_value(self):
        self.assertEqual(self.expected, self._get_result())

    def test_no_other_chars(self):
        handle = StringIO('#=GC RF                      xxxCx.x.\n')
        self.assertRaises(ValueError, refpkg_align._parse_stockholm_consensus,
                handle)


class AlignmentMaskTestCase(unittest.TestCase):

    def setUp(self):
        self.sequences = [
                SeqRecord(Seq('ACGTACGT')),
                SeqRecord(Seq('AAAAAAAT')),
                SeqRecord(Seq('ACGTAAAA')),
                ]

    def test_invalid_seq_length(self):
        mask = [True, True, False, True]
        instance = refpkg_align.AlignmentMask(mask)
        self.assertRaises(ValueError,
                instance.mask_records(self.sequences).next)

    def test_mask(self):
        mask = [True, False, True, True, False, False, False, True]
        instance = refpkg_align.AlignmentMask(mask)
        actual = list(instance.mask_records(self.sequences))
        # equality isn't defined for SeqRecord, so this is basic
        actual = [str(r.seq) for r in actual]
        expected = ['AGTT', 'AAAT', 'AGTA']
        self.assertEqual(expected, actual)

    def test_from_csv_file(self):
        value = """
        1, 2,5,
        8,  10,
         11

        """
        handle = StringIO(value)
        expected = [False, True, True, False, False, True,
                False, False, True, False, True, True, False]

        actual = refpkg_align.AlignmentMask.from_csv_file(handle, 13)
        self.assertEqual(expected, actual.mask)

    def test_len(self):
        mask = [True, True, False, True]
        instance = refpkg_align.AlignmentMask(mask)
        expected = 4
        self.assertEqual(expected, len(instance))

    def test_unmasked_count(self):
        mask = [True, True, False, True, False]
        instance = refpkg_align.AlignmentMask(mask)
        expected = 3
        self.assertEqual(expected, instance.unmasked_count)

class MockSubprocess(object):
    """
    Mock of the subprocess module to support Check Call
    """
    def __init__(self):
        self.commands = []
        pass

    def check_call(self, cmd, *args, **kwargs):
        self.commands.append(cmd)

class MockRefpkg(object):

    def __init__(self):
        self.contents = {'files': {}}

    def resource_path(self, path):
        return 'resource-' + path

class SubprocessMixIn(object):
    """
    Converts the subprocess.check_call function to a mock for the test
    """

    def setUp(self):
        self._old_subproc = refpkg_align.subprocess
        refpkg_align.subprocess = MockSubprocess()

    def tearDown(self):
        refpkg_align.subprocess = self._old_subproc

    @property
    def latest_command(self):
        return refpkg_align.subprocess.commands[-1]

class TempFileTestCase(unittest.TestCase):
    def test_close(self):
        with refpkg_align._temp_file() as tf:
            self.assertFalse(tf.closed)
            tf.close()
            self.assertTrue(os.path.isfile(tf.name))
        self.assertFalse(os.path.exists(tf.name))

    def test_remove_ok(self):
        """Test that the file can be removed without error"""
        with refpkg_align._temp_file() as tf:
            tf.close()
            os.unlink(tf.name)