def subvec(v, start, end): from clojure.lang.persistentvector import EMPTY as EMPTY_VECTOR from clojure.lang.apersistentvector import SubVec if end < start or start < 0 or end > len(v): raise Exception("Index out of range") if start == end: return EMPTY_VECTOR return SubVec(None, v, start, end)
def setUp(self): # [0 1 2 3 4 5 6 7 8 9] # [4 5 6] self.parent = pv.vec(range(10)) self.sv = SubVec(pseudoMetaData, self.parent, 4, 7) self.oneItemSv = SubVec(None, self.parent, 0, 1)
class TestSubVec(unittest.TestCase): def setUp(self): # [0 1 2 3 4 5 6 7 8 9] # [4 5 6] self.parent = pv.vec(range(10)) self.sv = SubVec(pseudoMetaData, self.parent, 4, 7) self.oneItemSv = SubVec(None, self.parent, 0, 1) # nth() def testNth_PASS(self): self.assertEqual(self.sv.nth(0), 4) self.assertEqual(self.sv.nth(1), 5) self.assertEqual(self.sv.nth(2), 6) def testNth_FAIL(self): # below lower bound # These are accepted in Clojure, but I think it's a bug. self.assertRaises(IndexOutOfBoundsException, self.sv.nth, -4) self.assertRaises(IndexOutOfBoundsException, self.sv.nth, -3) self.assertRaises(IndexOutOfBoundsException, self.sv.nth, -2) self.assertRaises(IndexOutOfBoundsException, self.sv.nth, -1) # beyond upper bound self.assertRaises(IndexOutOfBoundsException, self.sv.nth, 3) def testAssocN_PASS(self): # mod v1 = self.sv.assocN(1, "foo") self.assertTrue(isinstance(v1, SubVec)) self.assertEqual(len(v1), 3) self.assertEqual(v1.nth(1), "foo") # append v2 = self.sv.assocN(3, "foo") self.assertTrue(isinstance(v2, SubVec)) self.assertEqual(len(v2), 4) self.assertEqual(v2.nth(3), "foo") def testAssocN_FAIL(self): self.assertRaises(IndexOutOfBoundsException, self.sv.assocN, -1, "foo") self.assertRaises(IndexOutOfBoundsException, self.sv.assocN, 4, "foo") # __len__() def test__len___PASS(self): self.assertEqual(len(self.sv), 3) # empty() def testEmpty_PASS(self): v = self.sv.empty() self.assertEqual(v.meta(), self.sv.meta()) # pop() def testtPop_PASS(self): emptyV = self.oneItemSv.pop() self.assertTrue(isinstance(emptyV, PersistentVector)) self.assertEqual(len(emptyV), 0) oneLessSv = self.sv.pop() self.assertTrue(isinstance(oneLessSv, SubVec)) self.assertEqual(len(oneLessSv), 2) # No pop fail test because pop returns an empty PersistentVector. # There is no empty SubVec. # meta() def testMeta_PASS(self): self.assertEqual(pseudoMetaData, self.sv.meta()) # withMeta() def testWithMeta_PASS(self): # return self outsv = self.sv.withMeta(pseudoMetaData) print id(outsv), id(self.sv) self.assertTrue(outsv is self.sv) # return new SubVec meta = object() outsv = self.sv.withMeta(meta) self.assertTrue(meta, outsv.meta())