[pypy-commit] pypy py3.7-bpo-31333: Added tests and fixed _reset_registry and _reset_caches

Yannick_Jadoul pypy.commits at gmail.com
Thu Oct 31 13:42:31 EDT 2019


Author: Yannick Jadoul <yannick.jadoul at belgacom.net>
Branch: py3.7-bpo-31333
Changeset: r97916:1e2d3e37d725
Date: 2019-10-20 23:15 +0200
http://bitbucket.org/pypy/pypy/changeset/1e2d3e37d725/

Log:	Added tests and fixed _reset_registry and _reset_caches

diff --git a/pypy/module/_abc/app_abc.py b/pypy/module/_abc/app_abc.py
--- a/pypy/module/_abc/app_abc.py
+++ b/pypy/module/_abc/app_abc.py
@@ -36,6 +36,9 @@
     def add(self, item):
         self.data.add(ref(item, self._remove))
 
+    def clear(self):
+        self.data.clear()
+
 
 abc_invalidation_counter = 0
 
diff --git a/pypy/module/_abc/test/test_abc.py b/pypy/module/_abc/test/test_abc.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_abc/test/test_abc.py
@@ -0,0 +1,84 @@
+class AppTestAbcModule:
+    def test_import_builtin(self):
+        from _abc import (get_cache_token, _abc_init, _abc_register,
+                          _abc_instancecheck, _abc_subclasscheck, _get_dump,
+                          _reset_registry, _reset_caches)
+
+    def test_basic(self):
+        import _abc
+
+        class SomeABC: pass
+        
+        _abc._abc_init(SomeABC)
+        assert hasattr(SomeABC, '__abstractmethods__')
+
+        class SomeConcreteSubClass: pass
+        _abc._abc_register(SomeABC, SomeConcreteSubClass)
+        
+        # _abc._abc_instancecheck calls cls.__subclasscheck__, but since
+        # we've only called _abc_init and haven't set the metaclass, we
+        # need to monkeypatch SomeABC before calling _abc_instancecheck
+        from types import MethodType
+        SomeABC.__subclasscheck__ = MethodType(_abc._abc_subclasscheck, SomeABC)
+        assert _abc._abc_instancecheck(SomeABC, SomeConcreteSubClass())
+        assert _abc._abc_subclasscheck(SomeABC, SomeConcreteSubClass)
+
+        class SomeOtherClass: pass
+        assert not _abc._abc_instancecheck(SomeABC, SomeOtherClass())
+        assert not _abc._abc_subclasscheck(SomeABC, SomeOtherClass)
+
+        _abc._reset_registry(SomeABC)
+        _abc._reset_caches(SomeABC)
+        assert not _abc._abc_instancecheck(SomeABC, SomeConcreteSubClass())
+        assert not _abc._abc_subclasscheck(SomeABC, SomeConcreteSubClass)
+    
+    def test_cache(self):
+        import _abc
+
+        class SomeABC:
+            pass
+
+        token_before = _abc.get_cache_token()
+        assert _abc.get_cache_token() == token_before
+
+        _abc._abc_init(SomeABC)
+        assert _abc.get_cache_token() == token_before
+
+        class SomeConcreteSubClass: pass
+        _abc._abc_register(SomeABC, SomeConcreteSubClass)
+        assert _abc.get_cache_token() != token_before
+
+        registry, cache, negative_cache, negative_cache_version = _abc._get_dump(SomeABC)
+        assert len(registry) == 1
+        assert len(cache) == 0
+        assert len(negative_cache) == 0
+        assert negative_cache_version == token_before
+
+        assert _abc._abc_subclasscheck(SomeABC, SomeConcreteSubClass)
+        registry, cache, negative_cache, negative_cache_version = _abc._get_dump(SomeABC)
+        assert len(registry) == 1
+        assert len(cache) == 1
+        assert len(negative_cache) == 0
+        assert negative_cache_version == _abc.get_cache_token()
+
+        class SomeOtherClass: pass
+        assert not _abc._abc_subclasscheck(SomeABC, SomeOtherClass)
+        registry, cache, negative_cache, negative_cache_version = _abc._get_dump(SomeABC)
+        assert len(registry) == 1
+        assert len(cache) == 1
+        assert len(negative_cache) == 1
+        assert negative_cache_version == _abc.get_cache_token()
+
+        _abc._reset_caches(SomeABC)
+        registry, cache, negative_cache, negative_cache_version = _abc._get_dump(SomeABC)
+        assert len(registry) == 1
+        assert len(cache) == 0
+        assert len(negative_cache) == 0
+        assert negative_cache_version == _abc.get_cache_token()
+
+        _abc._reset_registry(SomeABC)
+        registry, cache, negative_cache, negative_cache_version = _abc._get_dump(SomeABC)
+        assert len(registry) == 0
+        assert len(cache) == 0
+        assert len(negative_cache) == 0
+        assert negative_cache_version == _abc.get_cache_token()


More information about the pypy-commit mailing list