67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								# Tests for caches in Utils.py
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import unittest
							 | 
						||
| 
								 | 
							
								from typing import Any
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from Utils import cache_argsless, cache_self1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestCacheArgless(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    def test_cache(self) -> None:
							 | 
						||
| 
								 | 
							
								        @cache_argsless
							 | 
						||
| 
								 | 
							
								        def func_argless() -> object:
							 | 
						||
| 
								 | 
							
								            return object()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.assertTrue(func_argless() is func_argless())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if __debug__:  # assert only available with __debug__
							 | 
						||
| 
								 | 
							
								        def test_invalid_decorator(self) -> None:
							 | 
						||
| 
								 | 
							
								            with self.assertRaises(Exception):
							 | 
						||
| 
								 | 
							
								                @cache_argsless  # type: ignore[arg-type]
							 | 
						||
| 
								 | 
							
								                def func_with_arg(_: Any) -> None:
							 | 
						||
| 
								 | 
							
								                    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestCacheSelf1(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								    def test_cache(self) -> None:
							 | 
						||
| 
								 | 
							
								        class Cls:
							 | 
						||
| 
								 | 
							
								            @cache_self1
							 | 
						||
| 
								 | 
							
								            def func(self, _: Any) -> object:
							 | 
						||
| 
								 | 
							
								                return object()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        o1 = Cls()
							 | 
						||
| 
								 | 
							
								        o2 = Cls()
							 | 
						||
| 
								 | 
							
								        self.assertTrue(o1.func(1) is o1.func(1))
							 | 
						||
| 
								 | 
							
								        self.assertFalse(o1.func(1) is o1.func(2))
							 | 
						||
| 
								 | 
							
								        self.assertFalse(o1.func(1) is o2.func(1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_gc(self) -> None:
							 | 
						||
| 
								 | 
							
								        # verify that we don't keep a global reference
							 | 
						||
| 
								 | 
							
								        import gc
							 | 
						||
| 
								 | 
							
								        import weakref
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        class Cls:
							 | 
						||
| 
								 | 
							
								            @cache_self1
							 | 
						||
| 
								 | 
							
								            def func(self, _: Any) -> object:
							 | 
						||
| 
								 | 
							
								                return object()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        o = Cls()
							 | 
						||
| 
								 | 
							
								        _ = o.func(o)  # keep a hard ref to the result
							 | 
						||
| 
								 | 
							
								        r = weakref.ref(o)  # keep weak ref to the cache
							 | 
						||
| 
								 | 
							
								        del o  # remove hard ref to the cache
							 | 
						||
| 
								 | 
							
								        gc.collect()
							 | 
						||
| 
								 | 
							
								        self.assertFalse(r())  # weak ref should be dead now
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if __debug__:  # assert only available with __debug__
							 | 
						||
| 
								 | 
							
								        def test_no_self(self) -> None:
							 | 
						||
| 
								 | 
							
								            with self.assertRaises(Exception):
							 | 
						||
| 
								 | 
							
								                @cache_self1  # type: ignore[arg-type]
							 | 
						||
| 
								 | 
							
								                def func() -> Any:
							 | 
						||
| 
								 | 
							
								                    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def test_too_many_args(self) -> None:
							 | 
						||
| 
								 | 
							
								            with self.assertRaises(Exception):
							 | 
						||
| 
								 | 
							
								                @cache_self1  # type: ignore[arg-type]
							 | 
						||
| 
								 | 
							
								                def func(_1: Any, _2: Any, _3: Any) -> Any:
							 | 
						||
| 
								 | 
							
								                    pass
							 |