Permalink
Fetching contributors…
Cannot retrieve contributors at this time
229 lines (199 sloc) 8.53 KB
# 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.
#
"""Testing code for Restriction enzyme classes of Biopython.
"""
import unittest
from Bio.Restriction import *
from Bio.Seq import Seq
from Bio.Alphabet.IUPAC import IUPACAmbiguousDNA
class SimpleEnzyme(unittest.TestCase):
"""Tests for dealing with basic enzymes using the Restriction package.
"""
def setUp(self):
base_seq = Seq("AAAA", IUPACAmbiguousDNA())
self.ecosite_seq = base_seq + Seq(EcoRI.site,
IUPACAmbiguousDNA()) + base_seq
def test_eco_cutting(self):
"""Test basic cutting with EcoRI.
"""
self.assertEqual(EcoRI.site, 'GAATTC')
self.assertFalse(EcoRI.is_blunt())
self.assertTrue(EcoRI.is_5overhang())
self.assertFalse(EcoRI.is_3overhang())
self.assertEqual(EcoRI.elucidate(), "G^AATT_C")
self.assertEqual(EcoRI.search(self.ecosite_seq), [6])
parts = EcoRI.catalyse(self.ecosite_seq)
self.assertEqual(len(parts), 2)
self.assertEqual(str(parts[1]), "AATTCAAAA")
parts = EcoRI.catalyze(self.ecosite_seq)
self.assertEqual(len(parts), 2)
def test_circular_sequences(self):
"""Deal with cutting circular sequences.
"""
parts = EcoRI.catalyse(self.ecosite_seq, linear=False)
self.assertEqual(len(parts), 1)
locations = EcoRI.search(parts[0], linear=False)
self.assertEqual(locations, [1])
class EnzymeComparison(unittest.TestCase):
"""Tests for comparing various enzymes.
"""
def test_basic_isochizomers(self):
"""Test to be sure isochizomer and neoschizomers are as expected.
"""
self.assertEqual(Acc65I.isoschizomers(), [Asp718I, KpnI])
self.assertEqual(Acc65I.elucidate(), 'G^GTAC_C')
self.assertEqual(Asp718I.elucidate(), 'G^GTAC_C')
self.assertEqual(KpnI.elucidate(), 'G_GTAC^C')
def test_comparisons(self):
"""Comparison operators between iso and neoschizomers.
"""
self.assertEqual(Acc65I, Acc65I)
self.assertNotEqual(Acc65I, KpnI)
self.assertFalse(Acc65I == Asp718I)
self.assertFalse(Acc65I != Asp718I)
self.assertNotEqual(Acc65I, EcoRI)
self.assertTrue(Acc65I >> KpnI)
self.assertFalse(Acc65I >> Asp718I)
self.assertTrue(Acc65I % Asp718I)
self.assertTrue(Acc65I % Acc65I)
self.assertFalse(Acc65I % KpnI)
class RestrictionBatchPrintTest(unittest.TestCase):
"""Tests Restriction.Analysis printing functionality.
"""
def createAnalysis(self, seq_str, batch_ary):
"""Restriction.Analysis creation helper method."""
rb = Restriction.RestrictionBatch(batch_ary)
seq = Seq(seq_str)
return Restriction.Analysis(rb, seq)
def assertAnalysisFormat(self, analysis, expected):
"""Asserts that the Restriction.Analysis make_format(print_that) matches some string."""
dct = analysis.mapping
ls, nc = [], []
for k, v in dct.items():
if v:
ls.append((k, v))
else:
nc.append(k)
result = analysis.make_format(ls, '', [], '')
self.assertEqual(result.replace(' ', ''), expected.replace(' ', ''))
def test_make_format_map1(self):
"""Make sure print_as('map'); print_that() does not error on wrap round with no markers.
"""
analysis = self.createAnalysis(
'CCAGTCTATAATTCG' +
Restriction.BamHI.site +
'GCGGCATCATACTCGAATATCGCGTGATGATACGTAGTAATTACGCATG',
["BamHI"])
analysis.print_as('map')
expected = [
" 17 BamHI",
" | ",
"CCAGTCTATAATTCGGGATCCGCGGCATCATACTCGAATATCGCGTGATGATACGTAGTA",
"||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||",
"GGTCAGATATTAAGCCCTAGGCGCCGTAGTATGAGCTTATAGCGCACTACTATGCATCAT",
"1 60",
"",
"ATTACGCATG",
"||||||||||",
"TAATGCGTAC",
"61 70",
"", ""]
self.assertAnalysisFormat(analysis, '\n'.join(expected))
def test_make_format_map2(self):
"""Make sure print_as('map'); print_that() does not error on wrap round with marker.
"""
analysis = self.createAnalysis(
'CCAGTCTATAATTCG' +
Restriction.BamHI.site +
'GCGGCATCATACTCGA' +
Restriction.BamHI.site +
'ATATCGCGTGATGATA' +
Restriction.NdeI.site +
'CGTAGTAATTACGCATG',
["NdeI", "EcoRI", "BamHI", "BsmBI"])
analysis.print_as('map')
expected = [
" 17 BamHI",
" | ",
" | 39 BamHI",
" | | ",
"CCAGTCTATAATTCGGGATCCGCGGCATCATACTCGAGGATCCATATCGCGTGATGATAC",
"||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||",
"GGTCAGATATTAAGCCCTAGGCGCCGTAGTATGAGCTCCTAGGTATAGCGCACTACTATG",
"1 60",
"",
" 62 NdeI",
" | ",
"ATATGCGTAGTAATTACGCATG",
"||||||||||||||||||||||",
"TATACGCATCATTAATGCGTAC",
"61 82",
"", ""]
self.assertAnalysisFormat(analysis, '\n'.join(expected))
def test_make_format_map3(self):
"""Make sure print_as('map'); print_that() does not error on wrap round with marker restricted.
"""
analysis = self.createAnalysis(
'CCAGTCTATAATTCG' +
Restriction.BamHI.site +
'GCGGCATCATACTCGA' +
Restriction.BamHI.site +
'ATATCGCGTGATGATA' +
Restriction.EcoRV.site +
'CGTAGTAATTACGCATG',
["NdeI", "EcoRI", "BamHI", "BsmBI"])
analysis.print_as('map')
expected = [
" 17 BamHI",
" | ",
" | 39 BamHI",
" | | ",
"CCAGTCTATAATTCGGGATCCGCGGCATCATACTCGAGGATCCATATCGCGTGATGATAG",
"||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||",
"GGTCAGATATTAAGCCCTAGGCGCCGTAGTATGAGCTCCTAGGTATAGCGCACTACTATC",
"1 60",
"",
"ATATCCGTAGTAATTACGCATG",
"||||||||||||||||||||||",
"TATAGGCATCATTAATGCGTAC",
"61 82",
"", ""]
self.assertAnalysisFormat(analysis, '\n'.join(expected))
class RestrictionBatches(unittest.TestCase):
"""Tests for dealing with batches of restriction enzymes.
"""
def test_creating_batch(self):
"""Creating and modifying a restriction batch.
"""
batch = RestrictionBatch([EcoRI])
batch.add(KpnI)
batch += EcoRV
self.assertEqual(len(batch), 3)
# The usual way to test batch membership
self.assertTrue(EcoRV in batch)
self.assertTrue(EcoRI in batch)
self.assertTrue(KpnI in batch)
self.assertTrue(SmaI not in batch)
# Syntax sugar for the above
self.assertTrue('EcoRV' in batch)
self.assertFalse('SmaI' in batch)
batch.get(EcoRV)
self.assertRaises(ValueError, batch.get, SmaI)
batch.remove(EcoRV)
self.assertEqual(len(batch), 2)
self.assertTrue(EcoRV not in batch)
self.assertTrue('EcoRV' not in batch)
def test_batch_analysis(self):
"""Sequence analysis with a restriction batch.
"""
seq = Seq("AAAA" + EcoRV.site + "AAAA" + EcoRI.site + "AAAA",
IUPACAmbiguousDNA())
batch = RestrictionBatch([EcoRV, EcoRI])
hits = batch.search(seq)
self.assertEqual(hits[EcoRV], [8])
self.assertEqual(hits[EcoRI], [16])
if __name__ == "__main__":
runner = unittest.TextTestRunner(verbosity=2)
unittest.main(testRunner=runner)