class TestCopy(unittest.TestCase): def setUp(self): self.suite = TestSuiteBuilder().build(MISC_DIR) def test_copy(self): self.assert_copy(self.suite, self.suite.copy()) def assert_copy(self, original, copied): assert_not_equal(id(original), id(copied)) self.assert_same_attrs_and_values(original, copied) for attr in ['suites', 'tests', 'keywords']: for child in getattr(original, attr, []): self.assert_copy(child, child.copy()) def assert_same_attrs_and_values(self, model1, model2): assert_equal(dir(model1), dir(model2)) for attr, value1, value2 in self.get_non_property_attrs( model1, model2): if callable(value1) and callable(value2): continue assert_equal(id(value1), id(value2), attr) if isinstance(value1, ModelObject): self.assert_same_attrs_and_values(value1, value2) def get_non_property_attrs(self, model1, model2): for attr in dir(model1): if isinstance(getattr(type(model1), attr, None), property): continue value1 = getattr(model1, attr) value2 = getattr(model2, attr) yield attr, value1, value2 def test_deepcopy(self): self.assert_deepcopy(self.suite, self.suite.deepcopy()) def assert_deepcopy(self, original, copied): assert_not_equal(id(original), id(copied)) self.assert_same_attrs_and_different_values(original, copied) # It would be too slow to test deepcopy recursively like we test copy. def assert_same_attrs_and_different_values(self, model1, model2): assert_equal(dir(model1), dir(model2)) for attr, value1, value2 in self.get_non_property_attrs( model1, model2): if attr.startswith('__') or self.cannot_differ(value1, value2): continue assert_not_equal(id(value1), id(value2), attr) if isinstance(value1, ModelObject): self.assert_same_attrs_and_different_values(value1, value2) def cannot_differ(self, value1, value2): if isinstance(value1, ModelObject): return False if type(value1) is not type(value2): return False # None, Booleans, small numbers, etc. are singletons. try: return id(value1) == id(copy.deepcopy(value1)) except TypeError: # Got in some cases at least with Python 2.6 return True
class TestCopy(unittest.TestCase): def setUp(self): path = os.path.normpath(os.path.join(__file__, '..', '..', '..', 'atest', 'testdata', 'misc')) self.suite = TestSuiteBuilder().build(path) def test_copy(self): self.assert_copy(self.suite, self.suite.copy()) def assert_copy(self, original, copied): assert_not_equal(id(original), id(copied)) self.assert_same_attrs_and_values(original, copied) for attr in ['suites', 'tests', 'keywords']: for child in getattr(original, attr, []): self.assert_copy(child, child.copy()) def assert_same_attrs_and_values(self, model1, model2): assert_equal(dir(model1), dir(model2)) for attr, value1, value2 in self.get_non_property_attrs(model1, model2): if callable(value1) and callable(value2): continue assert_equal(id(value1), id(value2), attr) if isinstance(value1, ModelObject): self.assert_same_attrs_and_values(value1, value2) def get_non_property_attrs(self, model1, model2): for attr in dir(model1): if isinstance(getattr(type(model1), attr, None), property): continue value1 = getattr(model1, attr) value2 = getattr(model2, attr) yield attr, value1, value2 def test_deepcopy(self): self.assert_deepcopy(self.suite, self.suite.deepcopy()) def assert_deepcopy(self, original, copied): assert_not_equal(id(original), id(copied)) self.assert_same_attrs_and_different_values(original, copied) # It would be too slow to test deepcopy recursively like we test copy. def assert_same_attrs_and_different_values(self, model1, model2): assert_equal(dir(model1), dir(model2)) for attr, value1, value2 in self.get_non_property_attrs(model1, model2): if attr.startswith('__') or self.cannot_differ(value1, value2): continue assert_not_equal(id(value1), id(value2), attr) if isinstance(value1, ModelObject): self.assert_same_attrs_and_different_values(value1, value2) def cannot_differ(self, value1, value2): if isinstance(value1, ModelObject): return False if type(value1) is not type(value2): return False # None, Booleans, small numbers, etc. are singletons. try: return id(value1) == id(copy.deepcopy(value1)) except TypeError: # Got in some cases at least with Python 2.6 return True