Author: Lars Wassermann <lars.wasserm...@gmail.com>
Branch: 
Changeset: r241:a1b3c3b15d75
Date: 2013-03-26 21:31 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/a1b3c3b15d75/

Log:    tests for the changed primitive behavior

diff --git a/spyvm/test/test_largeinteger.py b/spyvm/test/test_largeinteger.py
new file mode 100644
--- /dev/null
+++ b/spyvm/test/test_largeinteger.py
@@ -0,0 +1,100 @@
+import py
+import operator
+from spyvm import squeakimage, model, constants, error
+from spyvm import interpreter, shadow, objspace, primitives
+from spyvm.test import test_miniimage as tools
+from spyvm.test.test_miniimage import perform, w
+from spyvm.test.test_primitives import MockFrame
+
+from rpython.rlib.rarithmetic import intmask, r_uint
+
+space, interp = tools.setup_module(tools, filename='bootstrapped.image')
+
+
+def find_symbol_in_methoddict_of(string, s_class):
+    s_methoddict = s_class.s_methoddict()
+    s_methoddict.sync_cache()
+    methoddict_w = s_methoddict.methoddict
+    for each in methoddict_w.keys():
+        if each.as_string() == string:
+            return each
+
+def initialize_class(w_class):
+    initialize_symbol = find_symbol_in_methoddict_of("initialize", 
+                        w_class.shadow_of_my_class(tools.space))
+    perform(w_class, initialize_symbol)
+
+def test_initialize_string_class():
+    interp.trace = False
+    #initialize String class, because equality testing requires a class var 
set.
+    initialize_class(w("string").getclass(tools.space))
+
+def perform_primitive(rcvr, w_selector, *args):
+
+    code = rcvr.getclass(space)._shadow.lookup(w_selector).primitive()
+    assert code
+    func = primitives.prim_holder.prim_table[code]
+    s_frame = MockFrame([rcvr] + list(args)).as_context_get_shadow(space)
+    func(interp, s_frame, len(args))
+    return s_frame.pop()
+
+def w_l(largeInteger):
+    if largeInteger >= 0 and largeInteger <= constants.TAGGED_MAXINT:
+        return space.wrap_int(intmask(largeInteger))
+    else:
+        return model.W_LargePositiveInteger1Word(intmask(largeInteger))
+
+# test that using W_LargePositiveInteger1Word yields the correct results.
+# we use this way of testing to have multiple different test which may fail
+def do_primitive(selector, operation, i=None, j=None, trace=False):
+    candidates = i if i is not None else [0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF]
+
+    try:
+        w_selector = space.get_special_selector(selector)
+    except Exception:
+        w_selector = find_symbol_in_methoddict_of(selector, 
w(intmask(candidates[0])).getclass(space)._shadow)
+
+    interp.trace=trace
+    for i, v in enumerate(candidates):
+        x = w_l(v)
+        if j is None:
+            y = x
+        else:
+            if isinstance(j, list):
+                y = w_l(j[i])
+            else:
+                y = w_l(j)
+        z = perform_primitive(x, w_selector, y)
+        assert r_uint(z.value) == r_uint(operation(v, y.value))
+    interp.trace=False
+
+def test_bitAnd():
+    do_primitive("bitAnd:", operator.and_)
+    do_primitive("bitAnd:", operator.and_, i=[0xFFFFFFFF, 5, 0], j=[5, 
0xFFFFFFFF, 0xFFFFFFFF])
+
+def test_bitOr():
+    do_primitive("bitOr:", operator.or_)
+    do_primitive("bitOr:", operator.or_, i=[2424328192], j=[34])
+
+def test_bitXor():
+    do_primitive("bitXor:", operator.xor)
+    do_primitive("bitXor:", operator.xor, i=[0xFFFFFFFF, 0x0F0F0F0F, 
0xFFFFFF], 
+                                          j=[0xF0F0F0F0, 0xFFFEFCF8, 
4294967295])
+
+def test_bitShift():
+    def shift(a, b):
+        if b < 0:
+            return a >> -b
+        else:
+            return a << b
+#    do_primitive("bitShift:", shift, j=-5)
+    do_primitive("bitShift:", shift, i=[9470032], j=[6]) # 8
+
+# def test_primitiveAdd():
+#     do_primitive("+", operator.add)
+
+# def test_primitiveSub():
+#     do_primitive("-", operator.sub, j=[0xFF, 0xFFFF, 0xF0E0D0C0], i=[-1, -1, 
-1])
+#     do_primitive("-", operator.sub)
+    # do_primitive("-", operator.sub, i=[0xFF], j=0x3FFFFFFF)
+
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to