示例#1
0
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)
示例#2
0
 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)
示例#3
0
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())
示例#4
0
 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)
示例#5
0
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())