Ignore:
Timestamp:
01/02/13 16:45:16 (16 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Children:
11049:f4dd8dbc57bb, 11051:04009d17e84e
Message:

Fixed 'TExampleTable.clone' method (erroneous copy constructor for TExampleTable).

The 'clone' method calls the C++ copy constructor to copy the table,
but the default copy constructor fails to properly copy the instances
(both tables end up claiming ownership of the same memory space).

Fixed by implementing a copy constructor to make a deep copy of
the instances.

Fixes #1260

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/testing/unit/tests/test_table.py

    r10655 r11048  
    99    import unittest 
    1010from Orange.testing import testing 
     11 
    1112import Orange 
    1213import cPickle 
     14import tempfile 
     15import gc 
     16 
    1317 
    1418def native(table): 
     
    1822    return table 
    1923 
     24 
    2025def names_iter(): 
    2126    for name in testing.ALL_DATASETS: 
    2227        yield name.replace(" ", "_").replace("-", "_"), (name,) 
    2328 
     29 
    2430@testing.data_driven(data_iter=names_iter()) 
    2531class TestLoading(unittest.TestCase): 
     
    3036        """ 
    3137        table = Orange.data.Table(name) 
    32         self.assertIsNotNone(getattr(table, "attributeLoadStatus"), "No attributeLoadStatus") 
     38        self.assertIsNotNone(getattr(table, "attributeLoadStatus"), 
     39                             "No attributeLoadStatus") 
    3340 
    3441    @testing.test_on_data 
     
    4148#        self.assertEqual(table.domain, table_clone.domain) 
    4249#        self.assertEqual(table.domain.class_var, table_clone.domain.class_var) 
    43         self.assertEqual(native(table), native(table_clone), "Native representation is not equal!") 
    44          
    45      
    46  
    47  
    48 import tempfile 
     50        self.assertEqual(native(table), native(table_clone), 
     51                         "Native representation is not equal!") 
     52 
    4953 
    5054@testing.datasets_driven 
     
    6771            f.flush() 
    6872            data_arff = Orange.data.Table(f.name) 
     73 
    6974    @testing.test_on_datasets(datasets=testing.CLASSIFICATION_DATASETS + \ 
    7075                              testing.REGRESSION_DATASETS) 
     
    8792@testing.datasets_driven 
    8893class TestUnicodeFilenames(unittest.TestCase): 
    89      
     94 
    9095    @testing.test_on_data 
    9196    def test_tab_on(self, name): 
     
    97102            f.flush() 
    98103            table1 = Orange.data.Table(f.name) 
    99          
     104 
    100105    @testing.test_on_datasets(datasets=testing.CLASSIFICATION_DATASETS + \ 
    101106                              testing.REGRESSION_DATASETS) 
     
    108113            f.flush() 
    109114            table1 = Orange.data.Table(f.name) 
    110              
     115 
    111116    @testing.test_on_datasets(datasets=testing.CLASSIFICATION_DATASETS + \ 
    112117                              testing.REGRESSION_DATASETS) 
     
    119124            f.flush() 
    120125            table1 = Orange.data.Table(f.name) 
    121              
     126 
    122127    def test_basket(self): 
    123128        """ Test the loading and saving to/from unicode (utf-8) filenames. 
     
    156161 
    157162 
     163class TestDataOwnership(unittest.TestCase): 
     164    def test_clone(self): 
     165        """Test that `clone` method returns a table with it's own copy 
     166        of the data. 
     167 
     168        """ 
     169        iris = Orange.data.Table("iris") 
     170        clone = iris.clone() 
     171 
     172        self.assertTrue(iris.owns_instances and clone.owns_instances) 
     173        self.assertTrue(all(e1.reference() != e2.reference() 
     174                            for e1, e2 in zip(iris, clone))) 
     175 
     176        clone[0][0] = -1 
     177        self.assertTrue(iris[0][0] != clone[0][0]) 
     178 
     179        del clone 
     180        gc.collect() 
     181 
     182    def test_reference(self): 
     183        iris = Orange.data.Table("iris") 
     184 
     185        ref = Orange.data.Table(iris, True) 
     186 
     187        self.assertTrue(iris.owns_instances) 
     188        self.assertFalse(ref.owns_instances) 
     189 
     190        self.assertTrue(all(e1.reference() == e2.reference() 
     191                            for e1, e2 in zip(iris, ref))) 
     192 
     193        ref[0][0] = -1 
     194        self.assertEqual(iris[0][0], -1) 
     195 
     196        with self.assertRaises(TypeError): 
     197            ref.append( 
     198                Orange.data.Instance(ref.domain, 
     199                                     [0, 0, 0, 0, "Iris-setosa"]) 
     200            ) 
     201 
     202        del ref 
     203        gc.collect() 
     204 
     205 
    158206if __name__ == "__main__": 
    159207    unittest.main() 
Note: See TracChangeset for help on using the changeset viewer.