Author: Anton Gulenko <anton.gule...@googlemail.com> Branch: storage Changeset: r707:b0835c943e0b Date: 2014-03-27 12:08 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/b0835c943e0b/
Log: Added and fixed test_strategies.py, added empty classes for special strategy storage. diff --git a/spyvm/shadow.py b/spyvm/shadow.py --- a/spyvm/shadow.py +++ b/spyvm/shadow.py @@ -46,6 +46,20 @@ for i in range(self.size()): self.copy_field_from(i, other_shadow) +class AllNilStorageShadow(AbstractShadow): + def fetch(self, n0): + raise NotImplementedError("Abstract class") + def store(self, n0, w_value): + raise NotImplementedError("Abstract class") + def size(self): + raise NotImplementedError("Abstract class") + +class SmallIntegerOrNilStorageShadow: + pass + +class FloatOrNilStorageShadow: + pass + class ListStorageShadow(AbstractShadow): _attrs_ = ['storage'] repr_classname = "ListStorageShadow" diff --git a/spyvm/test/test_strategies.py b/spyvm/test/test_strategies.py new file mode 100644 --- /dev/null +++ b/spyvm/test/test_strategies.py @@ -0,0 +1,195 @@ +import py +from spyvm import wrapper, model, interpreter, shadow +from spyvm.error import WrapperException, FatalError +from .util import read_image, copy_to_module, cleanup_module + +def setup_module(): + space, interp, _, _ = read_image('bootstrapped.image') + class_Array = space.classtable["w_Array"] + w_nil = space.w_nil + copy_to_module(locals(), __name__) + +def teardown_module(): + cleanup_module(__name__) + +def arr(size): + return model.W_PointersObject(space, class_Array, size) + +def list_arr(size): + a = arr(size) + a.store(space, 0, arr(1)) + return a + +def int_arr(size): + a = arr(size) + a.store(space, 0, space.wrap_int(12)) + return a + +def float_arr(size): + a = arr(size) + a.store(space, 0, space.wrap_float(1.2)) + return a + +def check_arr(arr, expected): + for i in range(arr.size()): + w_val = arr.fetch(space, i) + if expected[i] == w_nil: + assert w_val == w_nil + elif isinstance(expected[i], int): + assert isinstance(w_val, model.W_SmallInteger) + assert space.unwrap_int(w_val) == expected[i] + elif isinstance(expected[i], float): + assert isinstance(w_val, model.W_Float) + assert space.unwrap_float(w_val) == expected[i] + else: + assert False, "Unexpected array of expected values." + +# ====== AllNil StorageShadow + +def test_EmptyArray(): + a = arr(5) + assert isinstance(a.shadow, shadow.AllNilStorageShadow) + +def test_StoreNil(): + a = arr(5) + a.store(space, 0, w_nil) + a.store(space, 4, w_nil) + assert isinstance(a.shadow, shadow.AllNilStorageShadow) + +def test_FetchNil(): + a = arr(5) + assert a.fetch(space, 2) is w_nil + +def test_AllNilSize(): + a = arr(5) + assert a.size() == 5 + +# ====== List StorageShadow + +def test_AllNil_to_List(): + a = list_arr(5) + assert isinstance(a.shadow, shadow.ListStorageShadow) + +def test_List_store(): + a = list_arr(5) + a.store(space, 1, arr(1)) + a.store(space, 4, arr(1)) + assert isinstance(a.shadow, shadow.ListStorageShadow) + +def test_List_fetch(): + a = list_arr(5) + assert a.fetch(space, 0).getclass(space) == class_Array + assert a.fetch(space, 4) == w_nil + +def test_List_size(): + a = list_arr(5) + a.store(space, 1, arr(1)) + assert a.size() == 5 + +# ====== SmallIntegerOrNil StorageShadow + +def test_AllNil_to_Int(): + a = int_arr(5) + assert isinstance(a.shadow, shadow.SmallIntegerOrNilStorageShadow) + check_arr(a, [12, w_nil, w_nil, w_nil, w_nil]) + +def test_SmallInt_store(): + a = int_arr(5) + a.store(space, 1, space.wrap_int(20)) + a.store(space, 2, space.wrap_int(20)) + assert isinstance(a.shadow, shadow.SmallIntegerOrNilStorageShadow) + check_arr(a, [12, 20, 20, w_nil, w_nil]) + +def test_SmallInt_store_nil_to_nil(): + a = int_arr(5) + a.store(space, 1, w_nil) + check_arr(a, [12, w_nil, w_nil, w_nil, w_nil]) + +def test_SmallInt_overwrite(): + a = int_arr(5) + a.store(space, 1, space.wrap_int(1)) + a.store(space, 3, space.wrap_int(2)) + a.store(space, 0, space.wrap_int(100)) + a.store(space, 1, space.wrap_int(200)) + a.store(space, 3, space.wrap_int(300)) + check_arr(a, [100, 200, w_nil, 300, w_nil]) + +def test_SmallInt_delete(): + a = int_arr(5) + a.store(space, 1, space.wrap_int(1)) + a.store(space, 1, w_nil) + check_arr(a, [12, w_nil, w_nil, w_nil, w_nil]) + +def test_SmallInt_to_List(): + a = int_arr(5) + a.store(space, 1, arr(1)) + assert isinstance(a.shadow, shadow.ListStorageShadow) + +def test_SmallInt_store_Float_to_List(): + a = int_arr(5) + a.store(space, 1, space.wrap_float(2.2)) + assert isinstance(a.shadow, shadow.ListStorageShadow) + check_arr(a, [12, 2.2, w_nil, w_nil, w_nil]) + +# ====== FloatOrNil StorageShadow + +def test_AllNil_to_Float(): + a = float_arr(5) + assert isinstance(a.shadow, shadow.FloatOrNilStorageShadow) + check_arr(a, [1.2, w_nil, w_nil, w_nil, w_nil]) + +def test_Float_store(): + a = float_arr(5) + a.store(space, 1, space.wrap_float(20.0)) + a.store(space, 2, space.wrap_float(20.0)) + assert isinstance(a.shadow, shadow.FloatOrNilStorageShadow) + check_arr(a, [1.2, 20.0, 20.0, w_nil, w_nil]) + +def test_Float_store_nil_to_nil(): + a = float_arr(5) + a.store(space, 1, w_nil) + check_arr(a, [1.2, w_nil, w_nil, w_nil, w_nil]) + +def test_Float_overwrite(): + a = float_arr(5) + a.store(space, 1, space.wrap_float(1.0)) + a.store(space, 3, space.wrap_float(2.0)) + a.store(space, 0, space.wrap_float(100.0)) + a.store(space, 1, space.wrap_float(200.0)) + a.store(space, 3, space.wrap_float(300.0)) + check_arr(a, [100.0, 200.0, w_nil, 300.0, w_nil]) + +def test_Float_delete(): + a = float_arr(5) + a.store(space, 1, space.wrap_float(1.0)) + a.store(space, 1, w_nil) + check_arr(a, [1.2, w_nil, w_nil, w_nil, w_nil]) + +def test_Float_to_List(): + a = float_arr(5) + a.store(space, 1, arr(1)) + assert isinstance(a.shadow, shadow.ListStorageShadow) + +def test_Float_store_SmallInt_to_List(): + a = float_arr(5) + a.store(space, 1, space.wrap_int(2)) + assert isinstance(a.shadow, shadow.ListStorageShadow) + check_arr(a, [1.2, 2, w_nil, w_nil, w_nil]) + +def test_statistics(): + stats = model.StrategyStatistics() + stats.stat_operation("B", "old", "new", 3) + stats.stat_operation("B", "old", "new", 4) + stats.stat_operation("B", "old2", "new2", 20) + stats.stat_operation("B", "old", "new", 5) + stats.stat_operation("A", "old", "new", 1) + stats.stat_operation("A", "old", "new", 2) + stats.stat_operation("C", "old", "new", 10) + stats.stat_operation("C", "old", "new", 11) + keys = stats.sorted_keys() + assert keys == [ ("A", "old", "new"), ("B", "old", "new"), ("B", "old2", "new2"), ("C", "old", "new") ] + assert stats.stats[keys[0]] == [1, 2] + assert stats.stats[keys[1]] == [3, 4, 5] + assert stats.stats[keys[2]] == [20] + assert stats.stats[keys[3]] == [10, 11] + \ No newline at end of file _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit