def test_no_data(self): model = ArrayDataModel(value_type=FloatValue()) self.assertEqual(model.data.ndim, 2) self.assertEqual(model.data.shape, (0, 0)) self.assertEqual(model.data.dtype, float) self.assertEqual(model.get_column_count(), 0) self.assertTrue(model.can_have_children(())) self.assertEqual(model.get_row_count(()), 0)
class TestArrayDataModel(UnittestTools, TestCase): def setUp(self): super().setUp() self.array = np.arange(30.0).reshape(5, 2, 3) self.model = ArrayDataModel(data=self.array, value_type=FloatValue()) self.values_changed_event = None self.structure_changed_event = None self.model.observe(self.model_values_changed, 'values_changed') self.model.observe(self.model_structure_changed, 'structure_changed') def tearDown(self): self.model.observe(self.model_values_changed, 'values_changed', remove=True) self.model.observe(self.model_structure_changed, 'structure_changed', remove=True) self.values_changed_event = None self.structure_changed_event = None super().tearDown() def model_values_changed(self, event): self.values_changed_event = event def model_structure_changed(self, event): self.structure_changed_event = event def test_no_data(self): model = ArrayDataModel(value_type=FloatValue()) self.assertEqual(model.data.ndim, 2) self.assertEqual(model.data.shape, (0, 0)) self.assertEqual(model.data.dtype, float) self.assertEqual(model.get_column_count(), 0) self.assertTrue(model.can_have_children(())) self.assertEqual(model.get_row_count(()), 0) def test_data_1d(self): array = np.arange(30.0) model = ArrayDataModel(data=array, value_type=FloatValue()) self.assertEqual(model.data.ndim, 2) self.assertEqual(model.data.shape, (30, 1)) def test_data_list(self): data = list(range(30)) model = ArrayDataModel(data=data, value_type=FloatValue()) self.assertEqual(model.data.ndim, 2) self.assertEqual(model.data.shape, (30, 1)) def test_set_data_1d(self): with self.assertTraitChanges(self.model, 'structure_changed'): self.model.data = np.arange(30.0) self.assertEqual(self.model.data.ndim, 2) self.assertEqual(self.model.data.shape, (30, 1)) def test_set_data_list(self): with self.assertTraitChanges(self.model, 'structure_changed'): self.model.data = list(range(30)) self.assertEqual(self.model.data.ndim, 2) self.assertEqual(self.model.data.shape, (30, 1)) def test_get_column_count(self): result = self.model.get_column_count() self.assertEqual(result, 3) def test_can_have_children(self): for row in self.model.iter_rows(): with self.subTest(row=row): result = self.model.can_have_children(row) if len(row) <= 1: self.assertEqual(result, True) else: self.assertEqual(result, False) def test_get_row_count(self): for row in self.model.iter_rows(): with self.subTest(row=row): result = self.model.get_row_count(row) if len(row) == 0: self.assertEqual(result, 5) elif len(row) == 1: self.assertEqual(result, 2) else: self.assertEqual(result, 0) def test_get_value(self): for row, column in self.model.iter_items(): with self.subTest(row=row, column=column): result = self.model.get_value(row, column) if len(row) == 0 and len(column) == 0: self.assertIsNone(result) elif len(row) == 0: self.assertEqual(result, column[0]) elif len(column) == 0: self.assertEqual(result, row[-1]) elif len(row) == 1: self.assertIsNone(result) else: self.assertEqual(result, self.array[row[0], row[1], column[0]]) def test_set_value(self): for row, column in self.model.iter_items(): with self.subTest(row=row, column=column): if len(row) == 0 and len(column) == 0: with self.assertRaises(DataViewSetError): self.model.set_value(row, column, 0) elif len(row) == 0: with self.assertRaises(DataViewSetError): self.model.set_value(row, column, column[0] + 1) elif len(column) == 0: with self.assertRaises(DataViewSetError): self.model.set_value(row, column, row[-1] + 1) elif len(row) == 1: value = 6.0 * row[-1] + 2 * column[0] with self.assertTraitDoesNotChange(self.model, "values_changed"): with self.assertRaises(DataViewSetError): self.model.set_value(row, column, value) else: value = 6.0 * row[-1] + 2 * column[0] with self.assertTraitChanges(self.model, "values_changed"): self.model.set_value(row, column, value) self.assertEqual( self.array[row[0], row[1], column[0]], value, ) self.assertEqual(self.values_changed_event.new, (row, column, row, column)) def test_get_value_type(self): for row, column in self.model.iter_items(): with self.subTest(row=row, column=column): result = self.model.get_value_type(row, column) if len(row) == 0 and len(column) == 0: self.assertIsInstance(result, AbstractValueType) self.assertIs(result, self.model.label_header_type) elif len(row) == 0: self.assertIsInstance(result, AbstractValueType) self.assertIs(result, self.model.column_header_type) elif len(column) == 0: self.assertIsInstance(result, AbstractValueType) self.assertIs(result, self.model.row_header_type) elif len(row) == 1: self.assertIs(result, no_value) else: self.assertIsInstance(result, AbstractValueType) self.assertIs(result, self.model.value_type) def test_data_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.data = 2 * self.array self.assertEqual(self.values_changed_event.new, ((0, ), (0, ), (4, ), (2, ))) def test_data_updated_new_shape(self): with self.assertTraitChanges(self.model, "structure_changed"): self.model.data = 2 * self.array.T self.assertTrue(self.structure_changed_event.new) def test_type_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.value_type = IntValue() self.assertEqual(self.values_changed_event.new, ((0, ), (0, ), (4, ), (2, ))) def test_type_updated_empty(self): self.model.data = np.empty((0, 0, 0), dtype='int') with self.assertTraitDoesNotChange(self.model, "values_changed"): self.model.value_type = IntValue() def test_type_attribute_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.value_type.is_editable = False self.assertEqual(self.values_changed_event.new, ((0, ), (0, ), (4, ), (2, ))) def test_type_attribute_updated_empty(self): self.model.data = np.empty((0, 0, 0), dtype='int') with self.assertTraitDoesNotChange(self.model, "values_changed"): self.model.value_type.is_editable = False def test_row_header_type_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.row_header_type = no_value self.assertEqual(self.values_changed_event.new, ((0, ), (), (4, ), ())) def test_row_header_type_updated_empty(self): self.model.data = np.empty((0, 4, 2), dtype='int') with self.assertTraitDoesNotChange(self.model, "values_changed"): self.model.row_header_type = no_value def test_row_header_attribute_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.row_header_type.format = str self.assertEqual(self.values_changed_event.new, ((0, ), (), (4, ), ())) def test_row_header_attribute_updated_empty(self): self.model.data = np.empty((0, 4, 2), dtype='int') with self.assertTraitDoesNotChange(self.model, "values_changed"): self.model.row_header_type.format = str def test_column_header_type_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.column_header_type = no_value self.assertEqual(self.values_changed_event.new, ((), (0, ), (), (2, ))) def test_column_header_type_updated_empty(self): self.model.data = np.empty((2, 4, 0), dtype='int') with self.assertTraitDoesNotChange(self.model, "values_changed"): self.model.column_header_type = no_value def test_column_header_type_attribute_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.column_header_type.format = str self.assertEqual(self.values_changed_event.new, ((), (0, ), (), (2, ))) def test_column_header_attribute_updated_empty(self): self.model.data = np.empty((2, 4, 0), dtype='int') with self.assertTraitDoesNotChange(self.model, "values_changed"): self.model.column_header_type.format = str def test_label_header_type_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.label_header_type = no_value self.assertEqual(self.values_changed_event.new, ((), (), (), ())) def test_label_header_type_attribute_updated(self): with self.assertTraitChanges(self.model, "values_changed"): self.model.label_header_type.text = "My Table" self.assertEqual(self.values_changed_event.new, ((), (), (), ())) def test_is_row_valid(self): # valid rows are valid for row in self.model.iter_rows(): with self.subTest(row=row): result = self.model.is_row_valid(row) self.assertTrue(result) def test_is_row_valid_big(self): result = self.model.is_row_valid((5, )) self.assertFalse(result) def test_is_row_valid_long(self): result = self.model.is_row_valid((1, 1, 1)) self.assertFalse(result) def test_is_column_valid(self): # valid columns are valid columns = [()] + [(i, ) for i in range(3)] for column in columns: with self.subTest(column=column): result = self.model.is_column_valid(column) self.assertTrue(result) def test_is_column_valid_big(self): result = self.model.is_column_valid((3, )) self.assertFalse(result) def test_is_column_valid_long(self): result = self.model.is_column_valid((1, 1)) self.assertFalse(result) def test_iter_rows(self): result = list(self.model.iter_rows()) self.assertEqual(result, [ (), (0, ), (0, 0), (0, 1), (1, ), (1, 0), (1, 1), (2, ), (2, 0), (2, 1), (3, ), (3, 0), (3, 1), (4, ), (4, 0), (4, 1), ]) def test_iter_rows_start(self): result = list(self.model.iter_rows((2, ))) self.assertEqual(result, [(2, ), (2, 0), (2, 1)]) def test_iter_rows_leaf(self): result = list(self.model.iter_rows([2, 0])) self.assertEqual(result, [(2, 0)]) def test_iter_items(self): result = list(self.model.iter_items()) self.assertEqual(result, [ ((), ()), ((), (0, )), ((), (1, )), ((), (2, )), ((0, ), ()), ((0, ), (0, )), ((0, ), (1, )), ((0, ), (2, )), ((0, 0), ()), ((0, 0), (0, )), ((0, 0), (1, )), ((0, 0), (2, )), ((0, 1), ()), ((0, 1), (0, )), ((0, 1), (1, )), ((0, 1), (2, )), ((1, ), ()), ((1, ), (0, )), ((1, ), (1, )), ((1, ), (2, )), ((1, 0), ()), ((1, 0), (0, )), ((1, 0), (1, )), ((1, 0), (2, )), ((1, 1), ()), ((1, 1), (0, )), ((1, 1), (1, )), ((1, 1), (2, )), ((2, ), ()), ((2, ), (0, )), ((2, ), (1, )), ((2, ), (2, )), ((2, 0), ()), ((2, 0), (0, )), ((2, 0), (1, )), ((2, 0), (2, )), ((2, 1), ()), ((2, 1), (0, )), ((2, 1), (1, )), ((2, 1), (2, )), ((3, ), ()), ((3, ), (0, )), ((3, ), (1, )), ((3, ), (2, )), ((3, 0), ()), ((3, 0), (0, )), ((3, 0), (1, )), ((3, 0), (2, )), ((3, 1), ()), ((3, 1), (0, )), ((3, 1), (1, )), ((3, 1), (2, )), ((4, ), ()), ((4, ), (0, )), ((4, ), (1, )), ((4, ), (2, )), ((4, 0), ()), ((4, 0), (0, )), ((4, 0), (1, )), ((4, 0), (2, )), ((4, 1), ()), ((4, 1), (0, )), ((4, 1), (1, )), ((4, 1), (2, )), ]) def test_iter_items_start(self): result = list(self.model.iter_items((2, ))) self.assertEqual(result, [ ((2, ), ()), ((2, ), (0, )), ((2, ), (1, )), ((2, ), (2, )), ((2, 0), ()), ((2, 0), (0, )), ((2, 0), (1, )), ((2, 0), (2, )), ((2, 1), ()), ((2, 1), (0, )), ((2, 1), (1, )), ((2, 1), (2, )), ]) def test_iter_items_leaf(self): result = list(self.model.iter_items((2, 0))) self.assertEqual(result, [ ((2, 0), ()), ((2, 0), (0, )), ((2, 0), (1, )), ((2, 0), (2, )), ])