Skip to content

Commit 2c9f6b5

Browse files
committed
test use_ref and use_callback
1 parent 268d301 commit 2c9f6b5

File tree

2 files changed

+56
-8
lines changed

2 files changed

+56
-8
lines changed

idom/core/hooks.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def use_callback(
188188

189189
def use_callback(
190190
function: Optional[_CallbackFunc] = None,
191-
args: Optional[Sequence[Any]] = None,
191+
args: Optional[Sequence[Any]] = (),
192192
) -> Union[_CallbackFunc, Callable[[_CallbackFunc], _CallbackFunc]]:
193193
"""See the full :ref:`use_callback` docs for details
194194
@@ -252,6 +252,7 @@ def use_memo(
252252
memo.args = () if args is None else args
253253
elif args is None:
254254
changed = True
255+
memo.args = ()
255256
elif (
256257
len(memo.args) != len(args)
257258
# if args are same length check identity for each item

tests/test_core/test_hooks.py

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from idom.core.element import element
21
import re
32

43
import pytest
@@ -519,12 +518,46 @@ async def ElementWithUseReduce():
519518
assert first_dispatch is d
520519

521520

522-
def test_use_callback_identity():
523-
assert False
521+
async def test_use_callback_identity():
522+
element_hook = HookCatcher()
523+
used_callbacks = []
524524

525+
@idom.element
526+
async def ElementWithRef():
527+
used_callbacks.append(idom.hooks.use_callback(lambda: None))
528+
return idom.html.div()
525529

526-
def test_use_callback_memoization():
527-
assert False
530+
async with idom.Layout(ElementWithRef()) as layout:
531+
await layout.render()
532+
element_hook.schedule_render()
533+
await layout.render()
534+
535+
assert used_callbacks[0] is used_callbacks[1]
536+
assert len(used_callbacks) == 2
537+
538+
539+
async def test_use_callback_memoization():
540+
element_hook = HookCatcher()
541+
set_state_hook = idom.Ref(None)
542+
used_callbacks = []
543+
544+
@idom.element
545+
@element_hook.capture
546+
async def ElementWithRef():
547+
state, set_state_hook.current = idom.hooks.use_state(0)
548+
used_callbacks.append(idom.hooks.use_callback(lambda: None, [state]))
549+
return idom.html.div()
550+
551+
async with idom.Layout(ElementWithRef()) as layout:
552+
await layout.render()
553+
set_state_hook.current(1)
554+
await layout.render()
555+
element_hook.schedule_render()
556+
await layout.render()
557+
558+
assert used_callbacks[0] is not used_callbacks[1]
559+
assert used_callbacks[1] is used_callbacks[2]
560+
assert len(used_callbacks) == 3
528561

529562

530563
def test_use_memo():
@@ -543,5 +576,19 @@ def test_use_memo_decorator_and_non_decorator_usage():
543576
assert False
544577

545578

546-
def test_use_ref():
547-
assert False
579+
async def test_use_ref():
580+
element_hook = HookCatcher()
581+
used_refs = []
582+
583+
@idom.element
584+
async def ElementWithRef():
585+
used_refs.append(idom.hooks.use_ref(1))
586+
return idom.html.div()
587+
588+
async with idom.Layout(ElementWithRef()) as layout:
589+
await layout.render()
590+
element_hook.schedule_render()
591+
await layout.render()
592+
593+
assert used_refs[0] is used_refs[1]
594+
assert len(used_refs) == 2

0 commit comments

Comments
 (0)