from __future__ import with_statement
import sys
from warnings import warn # TODO - catch known warnings
from unittest import TestCase, TestLoader, TextTestRunner
from tempfile import gettempdir
from os import unlink
from os.path import join
try: #skipIf is not in python 2.6 / 2.5
from unittest import skipIf
except:
try: # should we make unittest2 an absolute requirement and use skipIf
from unittest2 import skipIf
except:
skipIf = None
# deal with absolute imports by adding the appropriate directory to the path
if __name__ == "__main__":
sys.path.insert(0, "../..")
from cobra.test import data_directory, create_test_model
from cobra.test import salmonella_sbml as test_sbml_file
from cobra.test import salmonella_pickle as test_pickle
from cobra import Object, Model, Metabolite, Reaction, io, DictList
sys.path.pop(0)
assert 0
else:
from . import data_directory, create_test_model
from . import salmonella_sbml as test_sbml_file
from . import salmonella_pickle as test_pickle
from .. import Object, Model, Metabolite, Reaction, io, DictList
# libraries which may or may not be installed
libraries = ["glpk", "gurobipy", "cplex"]
for library in libraries:
try:
exec("import %s" % library)
except ImportError:
exec("%s = None" % library)
[docs]class TestDictList(TestCase):
[docs] def setUp(self):
self.obj = Object("test1")
self.list = DictList()
self.list.append(self.obj)
[docs] def testAppend(self):
obj2 = Object("test2")
self.list.append(obj2)
self.assertRaises(ValueError, self.list.append,
Object("test1"))
self.assertEqual(self.list.index(obj2), 1)
self.assertEqual(self.list[1], obj2)
self.assertEqual(self.list.get_by_id("test2"), obj2)
self.assertEqual(len(self.list), 2)
[docs] def testExtend(self):
obj_list = [Object("test%d" % (i)) for i in range(2, 10)]
self.list.extend(obj_list)
self.assertEqual(self.list[1].id, "test2")
self.assertEqual(self.list.get_by_id("test2"), obj_list[0])
self.assertEqual(self.list[8].id, "test9")
self.assertEqual(len(self.list), 9)
[docs] def testIadd(self):
obj_list = [Object("test%d" % (i)) for i in range(2, 10)]
self.list += obj_list
self.assertEqual(self.list[1].id, "test2")
self.assertEqual(self.list.get_by_id("test2"), obj_list[0])
self.assertEqual(self.list[8].id, "test9")
self.assertEqual(len(self.list), 9)
[docs] def testAdd(self):
from os import name as __name
if __name == 'java':
warn('\t\n**cobra.test.unit_tests.testAdd does not yet work with %s'%__name)
return
obj_list = [Object("test%d" % (i)) for i in range(2, 10)]
sum = self.list + obj_list
self.assertEqual(self.list[0].id, "test1")
self.assertEqual(sum[1].id, "test2")
self.assertEqual(sum.get_by_id("test2"), obj_list[0])
self.assertEqual(sum[8].id, "test9")
self.assertEqual(len(self.list), 1)
self.assertEqual(len(sum), 9)
[docs]class CobraTestCase(TestCase):
[docs] def setUp(self):
self.model = create_test_model(test_pickle)
[docs]class TestCobraCore(CobraTestCase):
"""test core cobra functions"""
[docs] def test_add_reaction(self):
"""test adding and deleting reactions"""
old_reaction_count = len(self.model.reactions)
old_metabolite_count = len(self.model.metabolites)
dummy_metabolite_1 = Metabolite("test_foo_1")
dummy_metabolite_2 = Metabolite("test_foo_2")
dummy_reaction = Reaction("test_foo_reaction")
dummy_reaction.add_metabolites({dummy_metabolite_1: -1,
dummy_metabolite_2: 1})
self.model.add_reaction(dummy_reaction)
self.assertEqual(self.model.reactions._object_dict[dummy_reaction.id],
dummy_reaction)
for x in [dummy_metabolite_1, dummy_metabolite_2]:
self.assertEqual(self.model.metabolites._object_dict[x.id],
x)
[docs] def test_copy(self):
"""modifying copy should not modify the original"""
# test that deleting reactions in the copy does not change the
# number of reactions in the original model
model_copy = self.model.copy()
old_reaction_count = len(self.model.reactions)
self.assertEqual(len(self.model.reactions), len(model_copy.reactions))
self.assertEqual(len(self.model.metabolites),
len(model_copy.metabolites))
model_copy.remove_reactions(model_copy.reactions[0:5])
self.assertEqual(old_reaction_count, len(self.model.reactions))
self.assertNotEqual(len(self.model.reactions),
len(model_copy.reactions))
[docs]class TestCobraIO(CobraTestCase):
try:
from cobra.io.sbml import SBMLReader as __SBMLReader
__test_sbml = True
except:
__test_sbml = False
if __test_sbml:
def test_sbml_read(self):
## with catch_warnings(record=True) as w:
model = io.read_sbml_model(test_sbml_file)
self.assertEqual(len(model.reactions), len(self.model.reactions))
# make sure that an error is raised when given a nonexistent file
self.assertRaises(IOError, io.read_sbml_model,
"fake_file_which_does_not_exist")
def test_sbml_write(self):
test_output_filename = join(gettempdir(), 'test_sbml_write.xml')
io.write_sbml_model(self.model, test_output_filename)
#cleanup the test file
unlink(test_output_filename)
try:
from cobra.io import save_matlab_model
__test_matlab = True
except:
__test_matlab = False
if __test_matlab:
[docs] def test_mat_read_write(self):
test_output_filename = join(gettempdir(), "test_mat_write.mat")
io.save_matlab_model(self.model, test_output_filename)
reread = io.load_matlab_model(test_output_filename)
self.assertEqual(len(self.model.reactions), len(reread.reactions))
self.assertEqual(len(self.model.metabolites), len(reread.metabolites))
for i in range(len(self.model.reactions)):
self.assertEqual(len(self.model.reactions[i]._metabolites), \
len(reread.reactions[i]._metabolites))
self.assertEqual(self.model.reactions[i].id, reread.reactions[i].id)
unlink(test_output_filename)
# make a test suite to run all of the tests
loader = TestLoader()
suite = loader.loadTestsFromModule(sys.modules[__name__])
[docs]def test_all():
TextTestRunner(verbosity=2).run(suite)
if __name__ == "__main__":
test_all()