def test_setitem(self): """ConstrainedList setitem should work only if item in constraint""" a = ConstrainedList("12", "123") a[0] = "3" self.assertEqual(a, list("32")) self.assertRaises(ConstraintError, a.__setitem__, 0, 3) a = ConstrainedList("1" * 20, "123") self.assertRaises(ConstraintError, a.__setitem__, slice(0, 1, 1), [3]) self.assertRaises(ConstraintError, a.__setitem__, slice(0, 1, 1), ["111"]) a[2:9:2] = "3333" self.assertEqual(a, list("11313131311111111111"))
def test_iadd_prevents_bad_data(self): """ConstrainedList should allow in-place addition only of compliant data""" a = ConstrainedList("12", "123") a += "2" self.assertEqual(a, list("122")) self.assertEqual(a.constraint, "123") self.assertRaises(ConstraintError, a.__iadd__, "4")
def test_setslice(self): """ConstrainedList setslice should fail if slice has invalid chars""" a = ConstrainedList("123333", "12345") a[2:4] = ["2", "2"] self.assertEqual(a, list("122233")) self.assertRaises(ConstraintError, a.__setslice__, 2, 4, [2, 2]) a[:] = [] self.assertEqual(a, []) self.assertEqual(a.constraint, "12345")
def test_setitem_masks(self): """ConstrainedList setitem with masks should transform input""" a = ConstrainedList("12333", list(range(5)), lambda x: int(x) + 1) self.assertEqual(a, [2, 3, 4, 4, 4]) self.assertRaises(ConstraintError, a.append, 4) b = a[1:3] assert b.mask is a.mask assert "1" not in a assert "2" not in a assert 2 in a assert "x" not in a
def test_init_good_data(self): """ConstrainedList should init OK if list matches constraint""" self.assertEqual(ConstrainedList("abc", "abcd"), list("abc")) self.assertEqual(ConstrainedList("", "abcd"), list("")) items = [1, 2, 3.2234, (["a"], ["b"]), list("xyz")] # should accept anything str() does if no constraint is passed self.assertEqual(ConstrainedList(items), items) self.assertEqual(ConstrainedList(items, None), items) self.assertEqual(ConstrainedList("12345"), list("12345")) # check that list is formatted correctly and chars are all there test_list = list("12345") self.assertEqual(ConstrainedList(test_list, "12345"), test_list)
def test_add_prevents_bad_data(self): """ConstrainedList should allow addition only of compliant data""" a = ConstrainedList("123", "12345") b = ConstrainedList("444", "4") c = ConstrainedList("45", "12345") d = ConstrainedList("x") self.assertEqual(a + b, list("123444")) self.assertEqual(a + c, list("12345")) self.assertRaises(ConstraintError, b.__add__, c) self.assertRaises(ConstraintError, c.__add__, d) # should be OK if constraint removed b.constraint = None self.assertEqual(b + c, list("44445")) self.assertEqual(b + d, list("444x")) # should fail if we add the constraint back b.constraint = {"4": 1, 5: 2} self.assertRaises(ConstraintError, b.__add__, c)
def test_getslice(self): """ConstrainedList getslice should remember constraint""" a = ConstrainedList("123333", "12345") b = a[2:4] self.assertEqual(b, list("33")) self.assertEqual(b.constraint, "12345")
def test_insert(self): """ConstrainedList insert should work only if item in constraint""" a = ConstrainedList("12", "123") a.insert(0, "2") self.assertEqual(a, list("212")) self.assertRaises(ConstraintError, a.insert, 0, [2])
def test_extend(self): """ConstrainedList extend should work only if all items in constraint""" a = ConstrainedList("12", "123") a.extend("321") self.assertEqual(a, list("12321")) self.assertRaises(ConstraintError, a.extend, ["1", "2", 3])
def test_append(self): """ConstrainedList append should work only if item in constraint""" a = ConstrainedList("12", "123") a.append("3") self.assertEqual(a, list("123")) self.assertRaises(ConstraintError, a.append, 3)
def test_rmul(self): """ConstrainedList rmul should preserve constraint""" a = ConstrainedList("12", "123") b = 3 * a self.assertEqual(b, list("121212")) self.assertEqual(b.constraint, "123")
def test_imul(self): """ConstrainedList imul should preserve constraint""" a = ConstrainedList("12", "123") a *= 3 self.assertEqual(a, list("121212")) self.assertEqual(a.constraint, "123")