[pypy-svn] r54885 - pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test

tverwaes at codespeak.net tverwaes at codespeak.net
Sun May 18 14:52:32 CEST 2008


Author: tverwaes
Date: Sun May 18 14:52:31 2008
New Revision: 54885

Added:
   pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_wrapper.py
Log:
(tverwaes, cfbolz): thank god nobody is watching our commits, otherwise she
would have thought that we didn't write any tests.


Added: pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_wrapper.py
==============================================================================
--- (empty file)
+++ pypy/branch/smalltalk-shadow-changes/pypy/lang/smalltalk/test/test_wrapper.py	Sun May 18 14:52:31 2008
@@ -0,0 +1,180 @@
+import py
+from pypy.lang.smalltalk import wrapper
+from pypy.lang.smalltalk import model
+from pypy.lang.smalltalk import objtable, utility
+from pypy.lang.smalltalk import interpreter
+
+def test_simpleread():
+    w_o = model.W_PointersObject(None, 2)
+    w = wrapper.Wrapper(w_o)
+    w_o._vars[0] = "hello"
+    assert w.read(0) == "hello"
+    w.write(1, "b")
+    assert w.read(1) == "b"
+    py.test.raises(IndexError, "w.read(2)")
+    py.test.raises(IndexError, "w.write(2, \"test\")")
+
+def test_accessor_generators():
+    w_o = model.W_PointersObject(None, 1)
+    w = wrapper.LinkWrapper(w_o)
+    w_o._vars[0] = "hello"
+    assert w.next_link() == "hello"
+    w.store_next_link("boe")
+    assert w.next_link() == "boe"
+
+def link(w_next='foo'):
+    w_object = model.W_PointersObject(None, 1)
+    wrapper.LinkWrapper(w_object).store_next_link(w_next)
+    return w_object
+
+def test_linked_list():
+    w_object = model.W_PointersObject(None,2)
+    w_last = link(objtable.w_nil)
+    w_lb1 = link(w_last)
+    w_lb2 = link(w_lb1)
+    w_lb3 = link(w_lb2)
+    w_lb4 = link(w_lb3)
+    w_first = link(w_lb4)
+    linkedlist = wrapper.LinkedListWrapper(w_object)
+    linkedlist.store_first_link(w_first)
+    linkedlist.store_last_link(w_last)
+    assert w_first is linkedlist.first_link()
+    assert w_last is linkedlist.last_link()
+    assert linkedlist.remove_first_link_of_list() is w_first
+    assert linkedlist.remove_first_link_of_list() is w_lb4
+    assert linkedlist.remove_first_link_of_list() is w_lb3
+    assert not linkedlist.is_empty_list()
+    assert linkedlist.remove_first_link_of_list() is w_lb2
+    assert linkedlist.remove_first_link_of_list() is w_lb1
+    assert linkedlist.remove_first_link_of_list() is w_last
+    assert linkedlist.is_empty_list()
+    linkedlist.add_last_link(w_first)
+    assert linkedlist.first_link() is w_first
+    assert linkedlist.last_link() is w_first
+    linkedlist.add_last_link(w_last)
+    assert linkedlist.first_link() is w_first
+    assert linkedlist.last_link() is w_last
+
+def new_process(w_next=objtable.w_nil,
+                w_my_list=objtable.w_nil,
+                w_suspended_context=objtable.w_nil,
+                priority=0):
+    w_priority = utility.wrap_int(priority)
+    w_process = model.W_PointersObject(None, 4)
+    process = wrapper.ProcessWrapper(w_process)
+    process.store_next_link(w_next)
+    process.store_my_list(w_my_list)
+    process.store_suspended_context(w_suspended_context)
+    process.write(2, w_priority)
+    return process
+
+def new_processlist(processes_w=[]):
+    w_processlist = model.W_PointersObject(None, 2)
+    w_first = objtable.w_nil
+    w_last = objtable.w_nil
+    for w_process in processes_w[::-1]:
+        w_first = newprocess(w_first, w_processlist).w_self
+        if w_last is objtable.w_nil:
+            w_last = w_first
+    pl = wrapper.ProcessListWrapper(w_processlist)
+    pl.store_first_link(w_first)
+    pl.store_last_link(w_last)
+    return pl
+
+def new_prioritylist(prioritydict=None):
+    if prioritydict is not None:
+        maxpriority = max(prioritydict.keys())
+    else:
+        maxpriority = 5
+        prioritydict = {}
+    w_prioritylist = model.W_PointersObject(None, maxpriority)
+    prioritylist = wrapper.Wrapper(w_prioritylist)
+    for i in range(maxpriority):
+        prioritylist.write(i, new_processlist(prioritydict.get(i, [])).w_self)
+    
+    return prioritylist
+
+def new_scheduler(w_process=objtable.w_nil, prioritydict=None):
+    priority_list = new_prioritylist(prioritydict)
+    w_scheduler = model.W_PointersObject(None, 2)
+    scheduler = wrapper.SchedulerWrapper(w_scheduler)
+    scheduler.store_active_process(w_process)
+    scheduler.write(0, priority_list.w_self)
+    return scheduler
+
+
+
+class TestScheduler(object):
+    def setup_method(self, meth):
+        self.old_scheduler = wrapper.scheduler
+        wrapper.scheduler = lambda: scheduler
+        scheduler = new_scheduler()
+
+    def teardown_method(self, meth):
+        wrapper.scheduler = self.old_scheduler
+
+    def test_suspend(self):
+        process = new_process(priority=2)
+        process.put_to_sleep()
+        process_list = wrapper.scheduler().get_process_list(2)
+        assert process_list.first_link() is process_list.last_link()
+        assert process_list.first_link() is process.w_self
+
+    def test_activate(self):
+        interp = interpreter.Interpreter()
+        scheduler = wrapper.scheduler()
+        process = new_process(priority=2, w_suspended_context=objtable.w_false)
+        process.put_to_sleep()
+        old_process = new_process(priority=3)
+        scheduler.store_active_process(old_process.w_self)
+        interp.store_w_active_context(objtable.w_true)
+        process.activate(interp)
+        
+        assert old_process.suspended_context() is objtable.w_true
+        priority_list = wrapper.scheduler().get_process_list(old_process.priority())
+        assert priority_list.first_link() is old_process.w_self
+        assert interp.w_active_context() is objtable.w_false
+        assert scheduler.active_process() is process.w_self
+        priority_list = wrapper.scheduler().get_process_list(process.priority())
+        assert priority_list.first_link() is priority_list.last_link()
+        # activate does not remove the process from the process_list.
+        # The caller of activate is responsible
+        assert priority_list.first_link() is process.w_self
+
+    def test_resume(self):
+        interp = interpreter.Interpreter()
+        scheduler = wrapper.scheduler()
+        process = new_process(priority=4, w_suspended_context=objtable.w_false)
+        process.put_to_sleep()
+        old_process = new_process(priority=2)
+        scheduler.store_active_process(old_process.w_self)
+        interp.store_w_active_context(objtable.w_true)
+
+        process.resume(interp)
+
+        assert old_process.suspended_context() is objtable.w_true
+        priority_list = wrapper.scheduler().get_process_list(old_process.priority())
+        assert priority_list.first_link() is old_process.w_self
+        assert interp.w_active_context() is objtable.w_false
+        assert scheduler.active_process() is process.w_self
+        priority_list = wrapper.scheduler().get_process_list(process.priority())
+        assert priority_list.first_link() is priority_list.last_link()
+        # activate does not remove the process from the process_list.
+        # The caller of activate is responsible
+        assert priority_list.first_link() is process.w_self
+
+        # Does not reactivate old_process because lower priority
+        old_process.resume(interp)
+
+        assert old_process.suspended_context() is objtable.w_true
+        priority_list = wrapper.scheduler().get_process_list(old_process.priority())
+        assert priority_list.first_link() is old_process.w_self
+        assert interp.w_active_context() is objtable.w_false
+        assert scheduler.active_process() is process.w_self
+        priority_list = wrapper.scheduler().get_process_list(process.priority())
+        assert priority_list.first_link() is priority_list.last_link()
+        # activate does not remove the process from the process_list.
+        # The caller of activate is responsible
+        assert priority_list.first_link() is process.w_self
+
+



More information about the Pypy-commit mailing list