182 lines
5.0 KiB
Python
182 lines
5.0 KiB
Python
|
from java.util import ArrayList, List, Vector
|
||
|
|
||
|
from copy import copy
|
||
|
|
||
|
import unittest
|
||
|
import test.test_support
|
||
|
|
||
|
class CollectionProxyTest(unittest.TestCase):
|
||
|
def _perform_op(self, value, op_func):
|
||
|
"""
|
||
|
Perform an operation
|
||
|
|
||
|
value - the value to operate on
|
||
|
op_func - the function that applies the operation to value
|
||
|
|
||
|
Returns:
|
||
|
the result of calling op_func, OR the exception that was raised in op_func
|
||
|
"""
|
||
|
try:
|
||
|
return op_func(value)
|
||
|
except Exception, e:
|
||
|
return type(e)
|
||
|
|
||
|
def check_list(self, control, results, initial):
|
||
|
for result in results:
|
||
|
try:
|
||
|
len(result)
|
||
|
except:
|
||
|
print result
|
||
|
self.assertEquals(len(control), len(result), "%s is wrong for %s" % (type(result), initial))
|
||
|
for pvalue, jvalue in zip(control, result):
|
||
|
self.assertEquals(pvalue, jvalue)
|
||
|
|
||
|
def _list_op_test(self, initial_value, op_func, check_value):
|
||
|
"""
|
||
|
Tests a list operation
|
||
|
|
||
|
Ensures that performing an operation on:
|
||
|
- a python list
|
||
|
- a java.util.List instance
|
||
|
|
||
|
givens the same result in both cases
|
||
|
"""
|
||
|
lists = [list(initial_value), ArrayList(initial_value), Vector(initial_value)]
|
||
|
|
||
|
results = [self._perform_op(l, op_func) for l in lists]
|
||
|
self.check_list(lists[0], lists[1:], initial_value)
|
||
|
if check_value or not isinstance(results[0], list):
|
||
|
for r in results[1:]:
|
||
|
self.assertEquals(results[0], r)
|
||
|
else:
|
||
|
self.check_list(results[0], results[1:], initial_value)
|
||
|
|
||
|
def test_get_integer(self):
|
||
|
initial_value = range(0, 5)
|
||
|
|
||
|
for i in xrange(-7, 7):
|
||
|
self._list_op_test(initial_value, lambda xs: xs[i], True)
|
||
|
|
||
|
def test_set_integer(self):
|
||
|
initial_value = range(0, 5)
|
||
|
|
||
|
def make_op_func(index):
|
||
|
def _f(xs):
|
||
|
xs[index] = 100
|
||
|
return _f
|
||
|
|
||
|
for i in xrange(-7, 7):
|
||
|
self._list_op_test(initial_value, make_op_func(i), True)
|
||
|
|
||
|
def test_set_slice(self):
|
||
|
initial_value = range(0, 10)
|
||
|
|
||
|
def make_op_func(i, j, k, v):
|
||
|
def _f(xs):
|
||
|
xs[i:j:k] = v
|
||
|
return _f
|
||
|
|
||
|
for i in xrange(-12, 12):
|
||
|
for j in xrange(-12, 12):
|
||
|
for k in xrange(-12, 12):
|
||
|
self._list_op_test(initial_value, make_op_func(i, j, k, []), True)
|
||
|
self._list_op_test(initial_value, make_op_func(i, j, k, range(0,2)), True)
|
||
|
self._list_op_test(initial_value, make_op_func(i, j, k, range(0,4)), True)
|
||
|
self._list_op_test(initial_value, make_op_func(i, j, k, xrange(0,2)), True)
|
||
|
|
||
|
def test_del_integer(self):
|
||
|
initial_value = range(0,5)
|
||
|
|
||
|
def make_op_func(index):
|
||
|
def _f(xs):
|
||
|
del xs[index]
|
||
|
return _f
|
||
|
|
||
|
for i in xrange(-7, 7):
|
||
|
self._list_op_test(initial_value, make_op_func(i), True)
|
||
|
|
||
|
def test_del_slice(self):
|
||
|
initial_value = range(0,10)
|
||
|
|
||
|
def make_op_func(i, j, k):
|
||
|
def _f(xs):
|
||
|
del xs[i:j:k]
|
||
|
return _f
|
||
|
|
||
|
for i in xrange(-12, 12):
|
||
|
for j in xrange(-12, 12):
|
||
|
for k in xrange(-12, 12):
|
||
|
self._list_op_test(initial_value, make_op_func(i, j, k), True)
|
||
|
|
||
|
def test_len(self):
|
||
|
jlist = ArrayList()
|
||
|
jlist.addAll(range(0, 10))
|
||
|
|
||
|
self.assert_(len(jlist) == 10)
|
||
|
|
||
|
def test_iter(self):
|
||
|
jlist = ArrayList()
|
||
|
jlist.addAll(range(0, 10))
|
||
|
|
||
|
i = iter(jlist)
|
||
|
|
||
|
x = list(i)
|
||
|
|
||
|
self.assert_(x == range(0, 10))
|
||
|
|
||
|
def test_override_len(self):
|
||
|
class MyList (ArrayList):
|
||
|
def __len__(self):
|
||
|
return self.size() + 1;
|
||
|
|
||
|
m = MyList()
|
||
|
m.addAll(range(0,10))
|
||
|
|
||
|
self.assert_(len(m) == 11)
|
||
|
|
||
|
def test_override_iter(self):
|
||
|
class MyList (ArrayList):
|
||
|
def __iter__(self):
|
||
|
return iter(self.subList(0, self.size() - 1));
|
||
|
|
||
|
|
||
|
m = MyList()
|
||
|
m.addAll(range(0,10))
|
||
|
i = iter(m)
|
||
|
x = list(i)
|
||
|
|
||
|
self.assert_(x == range(0, 9))
|
||
|
|
||
|
def test_override_getsetdelitem(self):
|
||
|
# Create an ArrayList subclass that provides some silly overrides for get/set/del item
|
||
|
class MyList (ArrayList):
|
||
|
def __getitem__(self, key):
|
||
|
return self.get(key) * 2;
|
||
|
|
||
|
def __setitem__(self, key, value):
|
||
|
return self.set(key, value * 2);
|
||
|
|
||
|
def __delitem__(self, key):
|
||
|
self.add(84)
|
||
|
|
||
|
|
||
|
m = MyList()
|
||
|
m.addAll(range(0,10))
|
||
|
|
||
|
self.assert_(m[1] == 2)
|
||
|
self.assert_(m.get(1) == 1)
|
||
|
|
||
|
m[0] = 3
|
||
|
self.assert_(m.get(0) == 6)
|
||
|
self.assert_(m[0] == 12)
|
||
|
|
||
|
del m[0]
|
||
|
self.assert_(m.size() == 11)
|
||
|
self.assert_(m.get(10) == 84)
|
||
|
|
||
|
def test_main():
|
||
|
test.test_support.run_unittest(CollectionProxyTest)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
test_main()
|