def test_reverse_single_notification(self): # Regression test for double notification. notifier = unittest.mock.Mock() tl = TraitList([1, 2, 3, 4, 5], notifiers=[notifier]) notifier.assert_not_called() tl.reverse() self.assertEqual(notifier.call_count, 1)
def test_invalid_entry(self): tl = TraitList([1, 2, 3, 4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) with self.assertRaises(TraitError): tl.append("A")
def test_clear(self): tl = TraitList([1, 2, 3, 4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.clear() self.assertEqual(self.index, 0) self.assertEqual(self.removed, [1, 2, 3, 4, 5]) self.assertEqual(self.added, [])
def test_extend(self): tl = TraitList([1], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.extend([1, 2]) self.assertEqual(self.index, 1) self.assertEqual(self.removed, []) self.assertEqual(self.added, [1, 2])
def test_reverse_empty_list(self): tl = TraitList([], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.reverse() self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added)
def test_insert_index_matches_python_interpretation(self): for insertion_index in range(-10, 10): with self.subTest(insertion_index=insertion_index): tl = TraitList([5, 6, 7]) pl = [5, 6, 7] tl.insert(insertion_index, 1729) pl.insert(insertion_index, 1729) self.assertEqual(tl, pl)
def test_extend_iterable(self): tl = TraitList([1], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.extend(x**2 for x in range(10, 13)) self.assertEqual(tl, [1, 100, 121, 144]) self.assertEqual(self.index, 1) self.assertEqual(self.removed, []) self.assertEqual(self.added, [100, 121, 144])
def test_clear_empty_list(self): tl = TraitList([], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.clear() self.assertEqual(tl, []) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added)
def test_reverse(self): tl = TraitList([1, 2, 3, 4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.reverse() self.assertEqual(tl, [5, 4, 3, 2, 1]) self.assertEqual(self.index, 0) self.assertEqual(self.removed, [1, 2, 3, 4, 5]) self.assertEqual(self.added, [5, 4, 3, 2, 1])
def test_extend_empty(self): tl = TraitList([1], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.extend([]) self.assertEqual(tl, [1]) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added)
def test_extend_validates(self): tl = TraitList([5], item_validator=int_item_validator, notifiers=[self.notification_handler]) with self.assertRaises(TraitError): tl.extend([2, 3, 4.0]) self.assertEqual(tl, [5]) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added)
def test_insert_validates(self): tl = TraitList([2], item_validator=int_item_validator, notifiers=[self.notification_handler]) with self.assertRaises(TraitError): tl.insert(0, 1.0) self.assertEqual(tl, [2]) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added)
def test_sort(self): tl = TraitList([2, 3, 1, 4, 5, 0], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.sort() self.assertEqual(tl, [0, 1, 2, 3, 4, 5]) self.assertEqual(self.index, 0) self.assertEqual(self.removed, [2, 3, 1, 4, 5, 0]) self.assertEqual(self.added, [0, 1, 2, 3, 4, 5])
def test_sort_already_sorted(self): tl = TraitList([10, 11, 12, 13, 14], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.sort() self.assertEqual(tl, [10, 11, 12, 13, 14]) self.assertEqual(self.index, 0) self.assertEqual(self.removed, [10, 11, 12, 13, 14]) self.assertEqual(self.added, [10, 11, 12, 13, 14])
def test_data_items_updated_item_replaced_negative(self): self.model.data = TraitList([ DataItem(a=i, b=10*i, c=str(i)) for i in range(10) ]) with self.assertTraitChanges(self.model, "values_changed"): self.model.data[-2] = DataItem(a=100, b=200, c="a string") self.assertEqual(self.values_changed_event.new, ((8,), (), (8,), ()))
def test_imul(self): tl = TraitList([1, 2], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl *= 1 self.assertListEqual(tl, [1, 2]) self.assertEqual(self.index, None) self.assertEqual(self.removed, None) self.assertEqual(self.added, None) tl *= 2 self.assertEqual(self.index, 2) self.assertEqual(self.removed, []) self.assertEqual(self.added, [1, 2]) with self.assertRaises(TypeError): tl *= "5" with self.assertRaises(TypeError): tl *= 2.5 tl *= -1 self.assertEqual(self.index, 0) self.assertEqual(self.removed, [1, 2, 1, 2]) self.assertEqual(self.added, [])
def test_setitem_validation_error(self): tl = TraitList([1, 2, 3], item_validator=int_item_validator, notifiers=[self.notification_handler]) with self.assertRaises(TraitError): tl[0] = 4.5 self.assertEqual(tl, [1, 2, 3]) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added) with self.assertRaises(TraitError): tl[0:2] = [1, "a string"] self.assertEqual(tl, [1, 2, 3]) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added) with self.assertRaises(TraitError): tl[2:0:-1] = [1, "a string"] self.assertEqual(tl, [1, 2, 3]) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added)
def test_data_items_updated_item_added(self): self.model.data = TraitList([ DataItem(a=i, b=10*i, c=str(i)) for i in range(10) ]) with self.assertTraitChanges(self.model, "structure_changed"): self.model.data += [DataItem(a=100, b=200, c="a string")] self.assertTrue(self.structure_changed_event.new)
def test_setitem_converts(self): tl = TraitList([9, 8, 7], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl[1] = False self.assertEqual(tl, [9, 0, 7]) self.assertEqual(self.index, 1) self.assertEqual(self.removed, [8]) self.assertEqual(self.added, [0]) self.assertTrue( all(type(item) is int for item in tl), msg="Non-integers found in int-only list", ) self.assertTrue( all(type(item) is int for item in self.added), msg="Event contains non-integers for int-only list", ) tl[::2] = [True, True] self.assertEqual(tl, [1, 0, 1]) self.assertEqual(self.index, slice(0, 3, 2)) self.assertEqual(self.removed, [9, 7]) self.assertEqual(self.added, [1, 1]) self.assertTrue( all(type(item) is int for item in tl), msg="Non-integers found in int-only list", ) self.assertTrue( all(type(item) is int for item in self.added), msg="Event contains non-integers for int-only list", )
def test_init_converts(self): tl = TraitList([True, False], item_validator=int_item_validator) self.assertEqual(tl, [1, 0]) self.assertTrue( all(type(item) is int for item in tl), msg="Non-integers found in int-only list", )
def test_imul_does_not_revalidate(self): item_validator = unittest.mock.Mock(wraps=int_item_validator) tl = TraitList([1, 1], item_validator=item_validator) item_validator.reset_mock() tl *= 3 item_validator.assert_not_called()
def test_data_items_updated_reverse_slice_replaced(self): self.model.data = TraitList( [DataItem(a=i, b=10 * i, c=str(i)) for i in range(10)]) with self.assertTraitChanges(self.model, "values_changed"): self.model.data[3:1:-1] = [ DataItem(a=100, b=200, c="a string"), DataItem(a=200, b=300, c="another string"), ] self.assertEqual(self.values_changed_event.new, ((2, ), (), (3, ), ()))
def test_iadd(self): tl = TraitList([4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl += [6, 7] self.assertEqual(self.index, 2) self.assertEqual(self.removed, []) self.assertEqual(self.added, [6, 7])
def test_insert_converts(self): tl = TraitList([2, 3], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl.insert(1, True) self.assertEqual(tl, [2, 1, 3]) self.assertEqual(self.index, 1) self.assertEqual(self.removed, []) self.assertEqual(self.added, [1]) self.assertTrue( all(type(item) is int for item in tl), msg="Non-integers found in int-only list", ) self.assertTrue( all(type(item) is int for item in self.added), msg="Event contains non-integers for int-only list", )
def test_setitem_negative_one_step(self): tl = TraitList([1, 2, 3, 4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl[:1:-1] = [10, 11, 12] self.assertEqual(tl, [1, 2, 12, 11, 10]) self.assertEqual(self.index, 2) self.assertEqual(self.removed, [3, 4, 5]) self.assertEqual(self.added, [12, 11, 10])
def test_delitem_extended_slice_normalization(self): tl = TraitList([1, 2, 3, 4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) del tl[2:10:2] self.assertEqual(tl, [1, 2, 4]) self.assertEqual(self.index, slice(2, 5, 2)) self.assertEqual(self.removed, [3, 5]) self.assertEqual(self.added, [])
def test_delitem_negative_step(self): tl = TraitList([1, 2, 3, 4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) del tl[::-2] self.assertEqual(tl, [2, 4]) self.assertEqual(self.index, slice(0, 5, 2)) self.assertEqual(self.removed, [1, 3, 5]) self.assertEqual(self.added, [])
def test_delitem_nochange(self): tl = TraitList([1, 2, 3], item_validator=int_item_validator, notifiers=[self.notification_handler]) del tl[3:] self.assertEqual(tl, [1, 2, 3]) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added)
def test_iadd_empty(self): tl = TraitList([4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl += [] self.assertEqual(tl, [4, 5]) self.assertIsNone(self.index) self.assertIsNone(self.removed) self.assertIsNone(self.added)
def test_iadd_iterable(self): tl = TraitList([4, 5], item_validator=int_item_validator, notifiers=[self.notification_handler]) tl += (x**2 for x in range(3)) self.assertEqual(tl, [4, 5, 0, 1, 4]) self.assertEqual(self.index, 2) self.assertEqual(self.removed, []) self.assertEqual(self.added, [0, 1, 4])