File: test_array_jy.py

package info (click to toggle)
jython 2.7.3%2Brepack1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 62,820 kB
  • sloc: python: 641,384; java: 306,981; xml: 2,066; sh: 514; ansic: 126; makefile: 77
file content (169 lines) | stat: -rw-r--r-- 6,300 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# The jarray module is mostly phased out, but it is still has one
# constructor function - zeros - that is not directly available in the
# array module.
#
# The equivalent of
# jarray.zeros(n, typecode)
# is
# array.array(typecode, itertools.repeat(0, n))
#
# however itertools.repeat does not define __len__ and therefore we
# have to first build out the zero sequence separately, then copy
# over. This overhead could be significant for large arrays.

import jarray
import itertools
import os
import unittest
from array import array
from test import test_support
from java.lang import String as JString
from java.util import Arrays


class ArrayJyTestCase(unittest.TestCase):

    def test_jarray(self):
        from java.lang import String
        
        self.assertEqual(sum(jarray.array(range(5), 'i')), 10)
        self.assertEqual(','.join(jarray.array([String("a"), String("b"), String("c")], String)), u'a,b,c')
        self.assertEqual(sum(jarray.zeros(5, 'i')), 0)
        self.assertEqual([x for x in jarray.zeros(5, String)], [None, None, None, None, None])

    def test_java_object_arrays(self):
        from array import zeros
        from java.lang import String
        from java.lang.reflect import Array
        jStringArr = array(String, [String("a"), String("b"), String("c")])
        self.assert_(
            Arrays.equals(jStringArr.typecode, 'java.lang.String'),
               "String array typecode of wrong type, expected %s, found %s" %
               (jStringArr.typecode, str(String)))
        self.assertEqual(zeros(String, 5), Array.newInstance(String, 5))

        import java.lang.String # require for eval to work
        self.assertEqual(jStringArr, eval(str(jStringArr)))

    def test_java_compat(self):
        from array import zeros
        from java.awt import Color
        hsb = Color.RGBtoHSB(0,255,255, None)
        self.assertEqual(hsb, array('f', [0.5,1,1]),
                         "output hsb float array does not correspond to input rgb values")

        rgb = apply(Color.HSBtoRGB, tuple(hsb))
        self.assertEqual(rgb, -0xff0001,
                         "output rgb bytes don't match input hsb floats")
        hsb1 = zeros('f', 3)
        Color.RGBtoHSB(0, 255, 255, hsb1)
        self.assertEqual(hsb, hsb1, "hsb float arrays were not equal")

    def test_java_roundtrip(self):
        # bug 1543
        from java.lang import Object
        x = array(Object, [0,1,2])
        x.append(3)
        y = array(Object, [x]) # forces an implicit __tojava__
        self.assertEqual(x, y[0], "Did not shrink to fit")


class ToFromfileTestCase(unittest.TestCase):

    def tearDown(self):
        if os.path.exists(test_support.TESTFN):
            os.remove(test_support.TESTFN)

    def test_tofromfile(self):
        # http://bugs.jython.org/issue1457
        x = array('i', range(5))
        with open(test_support.TESTFN, 'wb') as f:
            x.tofile(f)

        x = array('i', [])
        with open(test_support.TESTFN, 'r+b') as f:
            x.fromfile(f, 5)
            x *= 2
            x.tofile(f)

        with open(test_support.TESTFN, 'rb') as f:
            x.fromfile(f, 10)
            self.assertEqual(x, array('i', range(5) * 4))


class ArrayOpsTestCase(unittest.TestCase):

    def test_ops(self):
        # http://bugs.jython.org/issue1622
        class Foo(object):
            def __radd__(self, that):
                return '__radd__'
        ar = array('i', range(5))
        self.assertEqual('__radd__', ar + Foo())
        ar += Foo()
        self.assertEqual('__radd__', ar)

    def test_nonhashability(self):
        "array.array objects are not hashable"
        # http://bugs.jython.org/issue2451
        a = array('b', itertools.repeat(0, 100))
        with self.assertRaisesRegexp(TypeError, r"unhashable type: 'array.array'"):
            hash(a)


class ArrayConversionTestCase(unittest.TestCase):
    
    # Covers bugs raised in
    # http://bugs.jython.org/issue1780,
    # http://bugs.jython.org/issue2423

    def assertAsList(self, a, b):
        self.assertEqual(Arrays.asList(a), b)

    def test_boxing_conversion(self):
        "array objects support boxing, as they did in Jython 2.1"
        from java.lang import Integer

        self.assertAsList(jarray.array([1, 2, 3, 4, 5], Integer), [1, 2, 3, 4, 5])
        self.assertAsList(array(Integer, [1, 2, 3, 4, 5]), [1, 2, 3, 4, 5])
        self.assertAsList(jarray.array([1, 2, 3, 4, 5], "i"), [1, 2, 3, 4, 5])
        self.assertAsList(array("i", [1, 2, 3, 4, 5]), [1, 2, 3, 4, 5])

    def test_auxillary_boxing(self):
        "PyArray is internally used to support boxing of iterators/iterables"
        self.assertAsList(xrange(5), [0, 1, 2, 3, 4])
        self.assertAsList(iter(xrange(5)), [0, 1, 2, 3, 4])
        self.assertAsList(list(xrange(5)), [0, 1, 2, 3, 4])
        self.assertAsList((i * 2 for i in xrange(5)), [0, 2, 4, 6, 8])
        self.assertAsList(iter((i * 2 for i in xrange(5))), [0, 2, 4, 6, 8])
        self.assertAsList(iter((i * 2 for i in xrange(5))), [0, 2, 4, 6, 8])
        self.assertAsList(itertools.chain('ABC', 'DEF'), ['A', 'B', 'C', 'D', 'E', 'F'])

    def test_object_varargs(self):
        "array.array objects can be used in the varargs position, with primitive boxing"
        a = array('i', range(5, 10))
        self.assertEqual(
            'arg 0=5, arg 1=6, arg 2=7, arg 3=8, arg 4=9',
            JString.format('arg 0=%d, arg 1=%d, arg 2=%d, arg 3=%d, arg 4=%d', [5, 6, 7, 8, 9]))

    def test_assignable_varargs(self):
        "array.array objects can be used in the varargs position"
        # modified from test case in http://bugs.jython.org/issue2423;
        from java.lang import Class
        from java.net import URL, URLClassLoader
        params = jarray.array([URL], Class)
        # URLClassLoader.addURL is protected, so workaround via reflection
        method = URLClassLoader.getDeclaredMethod('addURL', params)
        # and verify we got the right method after all
        self.assertEqual(method.name, "addURL")


def test_main():
    tests = [ToFromfileTestCase, ArrayOpsTestCase, ArrayConversionTestCase]
    if test_support.is_jython:
        tests.extend([ArrayJyTestCase])
    test_support.run_unittest(*tests)


if __name__ == "__main__":
    test_main()