 efe2b7c539
			
		
	
	efe2b7c539
	
	
	
		
			
			* add cache_self1_default and tests * merge the two decorators * just change the defaults of the wrap lol * add test for default and default
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 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_cache_default(self) -> None:
 | |
|         class Cls:
 | |
|             @cache_self1
 | |
|             def func(self, _: Any = 1) -> object:
 | |
|                 return object()
 | |
| 
 | |
|         o1 = Cls()
 | |
|         o2 = Cls()
 | |
|         self.assertIs(o1.func(), o1.func())
 | |
|         self.assertIs(o1.func(1), o1.func())
 | |
|         self.assertIsNot(o1.func(2), o1.func())
 | |
|         self.assertIsNot(o1.func(), o2.func())
 | |
| 
 | |
|     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
 |