async def test_exception_propagation(self): a = var(None) b = var() res = my_sum(a=a, b=b) await wait_for_var(res) self.assertIsNotNone(unwrap_exception(res)) with self.assertRaisesRegex(Exception, r'.*b.*'): unwrap(res)
async def test_var_changes(self): a = var(2) b = var(5) res = my_sum(a=a, b=b) a @= 6 await wait_for_var(res) self.assertEqual(unwrap(res), 11) # 6+5 b @= 3 await wait_for_var(res) self.assertEqual(unwrap(res), 9) # 6+3
async def test_var_changes(self): a = var(2) b = var(5) res = await async_sum(a=a, b=b) a.set(6) await wait_for_var(res) self.assertEqual(11, unwrap(res)) # 6+5 b.set(3) await wait_for_var(res) self.assertEqual(9, unwrap(res)) # 6+3
async def test_exception_propagation(self): b = var() res = await async_sum_with_yield(2, b=b) # type: Wrapped await wait_for_var(res) self.assertEqual(inside, 0) self.assertIsNotNone(unwrap_exception(res)) with self.assertRaisesRegex(Exception, r'.*b.*'): unwrap(res) b @= 5 await wait_for_var(res)
async def test_with_const_arg(self): global some_observable res = func_with_default(5) self.assertTrue(isinstance(res, Wrapped)) await wait_for_var(res) self.assertEqual(1, called_times2) self.assertEqual(8, unwrap(res)) some_observable @= 100 await wait_for_var(res) unwrap(res) self.assertEqual(2, called_times2) self.assertEqual(105, unwrap(res))
async def test_a(self): b = var(5) res = await async_sum_with_yield(2, b=b) self.assertIsInstance(res, Wrapped) self.assertEqual(unwrap(res), 7) self.assertEqual(inside, 1) b @= 1 await wait_for_var(res) self.assertEqual(unwrap(res), 3) self.assertEqual(inside, 1) del res await asyncio.sleep((0.1))
async def test_vars(self): global called_times called_times = 0 a = var(None) res = inc_called_times(a) await wait_for_var(res) unwrap(res) self.assertEqual(1, called_times) a @= 55 await wait_for_var(res) await asyncio.sleep(0.1) unwrap(res) self.assertEqual(2, called_times) some_observable.__notifier__.notify_observers() await wait_for_var(res) await asyncio.sleep(1) unwrap(res) self.assertEqual(3, called_times) some_observable.__notifier__.notify_observers() await wait_for_var(res) await asyncio.sleep(1) unwrap(res) self.assertEqual(4, called_times)
async def test_var_var(self): a = var(2) b = var(5) res = my_sum(a=a, b=b) await wait_for_var(res) self.assertIsInstance(res, Wrapped) self.assertEqual(unwrap(res), 7)
async def test_a(self): queue = asyncio.Queue() res = await var_from_gen(appender(queue)) self.assertIsInstance(res, Wrapped) await asyncio.sleep(0) self.assertEqual(unwrap(res), []) await queue.put(5) await asyncio.sleep(0.1) self.assertEqual(unwrap(res), [5]) await queue.put(1) await asyncio.sleep(0) self.assertEqual(unwrap(res), [5, 1]) self.assertEqual(inside, 1) await res.dispose() del res self.assertEqual(inside, 0)
async def test_1(self): global some_observable a = var(5) b = var(3) res = pass_args(a, b) self.assertTrue(isinstance(res, Wrapped)) await wait_for_var(res) self.assertEqual(8, unwrap(res)) self.assertEqual(1, called_times2) a @= 10 await wait_for_var(res) self.assertEqual(8, unwrap(res)) self.assertEqual(1, called_times2) b @= 100 await wait_for_var(res) self.assertEqual(110, unwrap(res)) self.assertEqual(2, called_times2)
async def test_exception_propagation(self): b = var() res = sum_with_yield(2, b=b) self.assertIsInstance(res, Wrapped) await wait_for_var(res) gc.collect() self.assertIsNotNone(unwrap_exception(res)) self.assertEqual(0, inside) with self.assertRaisesRegex(Exception, r'.*b.*'): unwrap(res) b.set(5) await wait_for_var(res) await asyncio.sleep(0.1) gc.collect() self.assertIsNone(unwrap_exception(res)) self.assertEqual(7, unwrap(res)) self.assertEqual(1, inside)
async def test_with_raw(self): res = sum_with_yield(2, 5) # in this case we must return something that finalizes the function when destroyed self.assertIsInstance(res, Wrapped) self.assertEqual(unwrap(res), 7) self.assertEqual(inside, 1) await wait_for_var(res) del res await wait_for_var() await asyncio.sleep(0.5) gc.collect() self.assertEqual(inside, 0)
async def test_a(self): b = var(5) res = sum_with_yield(2, b=b) self.assertIsInstance(res, Wrapped) self.assertEqual(unwrap(res), 7) gc.collect() self.assertEqual(inside, 1) b.set(1) print("w1") await wait_for_var(res) self.assertEqual(unwrap(res), 3) self.assertEqual(inside, 1) # await res.dispose() del b gc.collect() # weak_res = weakref.ref(res) # print(gc.get_referrers(res)) del res gc.collect() await wait_for_var() await asyncio.sleep(0.5) self.assertEqual(inside, 0) print("finished)")
async def test_var_val_positional(self): a = var(2) res = my_sum(a, 5) await wait_for_var(res) self.assertIsInstance(res, Wrapped) self.assertEqual(unwrap(res), 7)
async def test_var_val_keyword(self): a = var(2) res = await async_sum(a=a, b=5) self.assertIsInstance(res, Wrapped) self.assertEqual(unwrap(res), 7)
def dump_state(self): return dict( # min=self._min, # max=self._max, # step=self._step, value=unwrap(self._var))
def wrapped(self, *args, **kwargs): res = unbound_method(unwrap(self), *args, **kwargs) for observable in notified: get_subnotifier(self, observable).notify_observers() return res