import os import sys import shutil import unittest from random import randint, uniform, choice import string from obitools3.obidms._obidms import OBIDMS LINE_COUNT_FOR_TEST_COLUMN = 10000 # TODO randomize? SMALLER_LINE_COUNT_FOR_TEST_COLUMN = 1000 # TODO randomize? NB_ELEMENTS_PER_LINE = 10 # TODO randomize? DMS_NAME = "unit_test_dms" def create_test_obidms(): dms_name = DMS_NAME dms_dir_name = dms_name+'.obidms' dms = OBIDMS(dms_name) return (dms, dms_name, dms_dir_name) def create_test_column(dms, data_type, multiple_elements_per_line=False): col_name = "unit_test_"+data_type if multiple_elements_per_line : elts_names = elements_names() col = dms.open_column(col_name, create=True, type=data_type, nb_elements_per_line=NB_ELEMENTS_PER_LINE, elements_names=elts_names) return (col, col_name, elts_names) else : col = dms.open_column(col_name, create=True, type=data_type) return (col, col_name) def elements_names(): names = [str(i) for i in range(NB_ELEMENTS_PER_LINE)] return names def random_obivalue(data_type): r = 1000000 if data_type == "OBI_INT" : return randint(-r,r) elif data_type == "OBI_FLOAT" : return uniform(-r,r) elif data_type == "OBI_BOOL" : return randint(0,1) elif data_type == "OBI_CHAR" : return choice(string.ascii_lowercase) elif data_type == "OBI_STR" : length = randint(1,200) randoms = ''.join(choice(string.ascii_lowercase) for i in range(length)) return randoms elif data_type == "OBI_SEQ" : length = randint(1,200) randoms = ''.join(choice("atgcryswkmdbhvn") for i in range(length)) return randoms class OBIDMS_Column_TestCase(unittest.TestCase): def tearDown(self): self.col.close() self.dms.close() shutil.rmtree(self.dms_dir_name, ignore_errors=True) def test_OBIDMS_column_type(self): assert self.col.get_data_type() == self.data_type, 'Wrong data type associated with column' def test_OBIDMS_column_cloning(self): for i in range(LINE_COUNT_FOR_TEST_COLUMN): self.col[i]= random_obivalue(self.data_type) self.col.close() clone = self.dms.open_column(self.col_name, clone=True) self.col = self.dms.open_column(self.col_name) assert clone.get_nb_lines_used() == self.col.get_nb_lines_used(), "Cloned column doesn't have the same number of lines used" i=0 for i in range(clone.get_nb_lines_used()) : assert clone[i] == self.col[i], "Different value in original column and cloned column" assert clone[i] is not None, "None value" clone.close() def test_OBIDMS_column_set_and_get(self): for i in range(LINE_COUNT_FOR_TEST_COLUMN): v = random_obivalue(self.data_type) self.col[i] = v assert self.col[i] == v, "Different value than the set value" assert self.col[i] is not None, "None value" def test_OBIDMS_referring_column(self): for i in range(LINE_COUNT_FOR_TEST_COLUMN): self.col[i] = random_obivalue(self.data_type) ref_col = self.dms.open_column(self.col_name, referring=True) j = 0 for i in range(LINE_COUNT_FOR_TEST_COLUMN): if i%2 : # TODO randomize ref_col.grep_line(i) assert ref_col[j] == self.col[i], "Different value in original column and returned by referring column" assert ref_col[j] is not None, "None value" j+=1 class OBIDMS_Column_multiple_elements_TestCase(OBIDMS_Column_TestCase): def test_OBIDMS_column_cloning(self): pass for i in range(SMALLER_LINE_COUNT_FOR_TEST_COLUMN): v = {} for e in self.elts_names : v[e] = random_obivalue(self.data_type) self.col[i] = v self.col.close() clone = self.dms.open_column(self.col_name, clone=True) self.col = self.dms.open_column(self.col_name) assert clone.get_nb_lines_used() == self.col.get_nb_lines_used(), "Cloned column doesn't have the same number of lines used" i=0 for i in range(SMALLER_LINE_COUNT_FOR_TEST_COLUMN): assert self.col[i] == clone[i], "Different value in original column and cloned column" assert self.col[i] is not None, "None value" clone.close() def test_OBIDMS_column_set_and_get_with_elements_names(self): for i in range(SMALLER_LINE_COUNT_FOR_TEST_COLUMN): for e in range(NB_ELEMENTS_PER_LINE) : v = random_obivalue(self.data_type) self.col.set_item(i, self.elts_names[e], v) assert self.col.get_item(i, self.elts_names[e]) == v, "Different value than the set value" assert self.col.get_item(i, self.elts_names[e]) is not None, "None value" def test_OBIDMS_column_set_and_get(self): for i in range(SMALLER_LINE_COUNT_FOR_TEST_COLUMN): v = {} for e in self.elts_names : v[e] = random_obivalue(self.data_type) self.col[i] = v assert self.col[i] == v, "Different value than the set value" assert self.col[i] is not None, "None value" def test_OBIDMS_referring_column(self): for i in range(SMALLER_LINE_COUNT_FOR_TEST_COLUMN): v = {} for e in self.elts_names : v[e] = random_obivalue(self.data_type) self.col[i] = v ref_col = self.dms.open_column(self.col_name, referring=True) j = 0 for i in range(SMALLER_LINE_COUNT_FOR_TEST_COLUMN): if i%2 : # TODO randomize ref_col.grep_line(i) assert ref_col[j] == self.col[i], "Different value in original column and returned by referring column" assert ref_col[j] is not None, "None value" j+=1 ref_col.close() class OBIDMS_Column_OBI_INT_TestCase(OBIDMS_Column_TestCase): def setUp(self): self.data_type = 'OBI_INT' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name = create_test_column(self.dms, self.data_type) class OBIDMS_Column_OBI_INT_multiple_elements_TestCase(OBIDMS_Column_multiple_elements_TestCase): def setUp(self): self.data_type = 'OBI_INT' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name, \ self.elts_names = create_test_column(self.dms, self.data_type, multiple_elements_per_line=True) class OBIDMS_Column_OBI_FLOAT_TestCase(OBIDMS_Column_TestCase): def setUp(self): self.data_type = 'OBI_FLOAT' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name = create_test_column(self.dms, self.data_type) class OBIDMS_Column_OBI_FLOAT_multiple_elements_TestCase(OBIDMS_Column_multiple_elements_TestCase): def setUp(self): self.data_type = 'OBI_FLOAT' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name, \ self.elts_names = create_test_column(self.dms, self.data_type, multiple_elements_per_line=True) class OBIDMS_Column_OBI_BOOL_TestCase(OBIDMS_Column_TestCase): def setUp(self): self.data_type = 'OBI_BOOL' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name = create_test_column(self.dms, self.data_type) class OBIDMS_Column_OBI_BOOL_multiple_elements_TestCase(OBIDMS_Column_multiple_elements_TestCase): def setUp(self): self.data_type = 'OBI_BOOL' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name, \ self.elts_names = create_test_column(self.dms, self.data_type, multiple_elements_per_line=True) class OBIDMS_Column_OBI_CHAR_TestCase(OBIDMS_Column_TestCase): def setUp(self): self.data_type = 'OBI_CHAR' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name = create_test_column(self.dms, self.data_type) class OBIDMS_Column_OBI_CHAR_multiple_elements_TestCase(OBIDMS_Column_multiple_elements_TestCase): def setUp(self): self.data_type = 'OBI_CHAR' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name, \ self.elts_names = create_test_column(self.dms, self.data_type, multiple_elements_per_line=True) class OBIDMS_Column_OBI_STR_TestCase(OBIDMS_Column_TestCase): def setUp(self): self.data_type = 'OBI_STR' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name = create_test_column(self.dms, self.data_type) class OBIDMS_Column_OBI_STR_multiple_elements_TestCase(OBIDMS_Column_multiple_elements_TestCase): def setUp(self): self.data_type = 'OBI_STR' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name, \ self.elts_names = create_test_column(self.dms, self.data_type, multiple_elements_per_line=True) class OBIDMS_Column_OBI_SEQ_TestCase(OBIDMS_Column_TestCase): def setUp(self): self.data_type = 'OBI_SEQ' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name = create_test_column(self.dms, self.data_type) class OBIDMS_Column_OBI_SEQ_multiple_elements_TestCase(OBIDMS_Column_multiple_elements_TestCase): def setUp(self): self.data_type = 'OBI_SEQ' self.dms, \ self.dms_name, \ self.dms_dir_name = create_test_obidms() self.col, \ self.col_name, \ self.elts_names = create_test_column(self.dms, self.data_type, multiple_elements_per_line=True) if __name__ == '__main__': unittest.main(verbosity=2, defaultTest=["OBIDMS_Column_OBI_INT_TestCase", "OBIDMS_Column_OBI_INT_multiple_elements_TestCase", "OBIDMS_Column_OBI_FLOAT_TestCase", "OBIDMS_Column_OBI_FLOAT_multiple_elements_TestCase", "OBIDMS_Column_OBI_BOOL_TestCase", "OBIDMS_Column_OBI_BOOL_multiple_elements_TestCase", "OBIDMS_Column_OBI_CHAR_TestCase", "OBIDMS_Column_OBI_CHAR_multiple_elements_TestCase", "OBIDMS_Column_OBI_STR_TestCase", "OBIDMS_Column_OBI_STR_multiple_elements_TestCase", "OBIDMS_Column_OBI_SEQ_TestCase", "OBIDMS_Column_OBI_SEQ_multiple_elements_TestCase"])