Skip to content

Commit 33c37b5

Browse files
committed
finish hook tests
1 parent 2c9f6b5 commit 33c37b5

File tree

1 file changed

+99
-9
lines changed

1 file changed

+99
-9
lines changed

tests/test_core/test_hooks.py

Lines changed: 99 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from idom.core.element import element
12
import re
23

34
import pytest
@@ -523,6 +524,7 @@ async def test_use_callback_identity():
523524
used_callbacks = []
524525

525526
@idom.element
527+
@element_hook.capture
526528
async def ElementWithRef():
527529
used_callbacks.append(idom.hooks.use_callback(lambda: None))
528530
return idom.html.div()
@@ -545,7 +547,8 @@ async def test_use_callback_memoization():
545547
@element_hook.capture
546548
async def ElementWithRef():
547549
state, set_state_hook.current = idom.hooks.use_state(0)
548-
used_callbacks.append(idom.hooks.use_callback(lambda: None, [state]))
550+
cb = idom.hooks.use_callback(lambda: None, [state])
551+
used_callbacks.append(cb)
549552
return idom.html.div()
550553

551554
async with idom.Layout(ElementWithRef()) as layout:
@@ -560,27 +563,114 @@ async def ElementWithRef():
560563
assert len(used_callbacks) == 3
561564

562565

563-
def test_use_memo():
564-
assert False
566+
async def test_use_memo():
567+
element_hook = HookCatcher()
568+
set_state_hook = idom.Ref(None)
569+
used_values = []
565570

571+
@idom.element
572+
@element_hook.capture
573+
async def ElementWithMemo():
574+
state, set_state_hook.current = idom.hooks.use_state(0)
575+
value = idom.hooks.use_memo(
576+
lambda: idom.Ref(state), # use a Ref here just to ensure it's a unique obj
577+
[state],
578+
)
579+
used_values.append(value)
580+
return idom.html.div()
566581

567-
def test_use_memo_always_runs_if_args_are_none():
568-
assert False
582+
async with idom.Layout(ElementWithMemo()) as layout:
583+
await layout.render()
584+
set_state_hook.current(1)
585+
await layout.render()
586+
element_hook.schedule_render()
587+
await layout.render()
569588

589+
assert used_values[0] is not used_values[1]
590+
assert used_values[1] is used_values[2]
591+
assert len(used_values) == 3
570592

571-
def test_use_memo_never_runs_if_args_args_empty_list():
572-
assert False
573593

594+
async def test_use_memo_always_runs_if_args_are_none():
595+
element_hook = HookCatcher()
596+
used_values = []
574597

575-
def test_use_memo_decorator_and_non_decorator_usage():
576-
assert False
598+
iter_values = iter([1, 2, 3])
599+
600+
@idom.element
601+
@element_hook.capture
602+
async def ElementWithMemo():
603+
value = idom.hooks.use_memo(lambda: next(iter_values))
604+
used_values.append(value)
605+
return idom.html.div()
606+
607+
async with idom.Layout(ElementWithMemo()) as layout:
608+
await layout.render()
609+
element_hook.schedule_render()
610+
await layout.render()
611+
element_hook.schedule_render()
612+
await layout.render()
613+
614+
assert used_values == [1, 2, 3]
615+
616+
617+
async def test_use_memo_with_stored_args_is_empty_tuple_after_args_are_none():
618+
element_hook = HookCatcher()
619+
used_values = []
620+
621+
iter_values = iter([1, 2, 3])
622+
args_used_in_memo = idom.Ref(())
623+
624+
@idom.element
625+
@element_hook.capture
626+
async def ElementWithMemo():
627+
value = idom.hooks.use_memo(
628+
lambda: next(iter_values), args_used_in_memo.current
629+
)
630+
used_values.append(value)
631+
return idom.html.div()
632+
633+
async with idom.Layout(ElementWithMemo()) as layout:
634+
await layout.render()
635+
element_hook.schedule_render()
636+
args_used_in_memo.current = None
637+
await layout.render()
638+
element_hook.schedule_render()
639+
args_used_in_memo.current = ()
640+
await layout.render()
641+
642+
assert used_values == [1, 2, 2]
643+
644+
645+
async def test_use_memo_never_runs_if_args_args_empty_list():
646+
element_hook = HookCatcher()
647+
used_values = []
648+
649+
iter_values = iter([1, 2, 3])
650+
651+
@idom.element
652+
@element_hook.capture
653+
async def ElementWithMemo():
654+
value = idom.hooks.use_memo(lambda: next(iter_values), ())
655+
used_values.append(value)
656+
return idom.html.div()
657+
658+
async with idom.Layout(ElementWithMemo()) as layout:
659+
await layout.render()
660+
element_hook.schedule_render()
661+
await layout.render()
662+
element_hook.schedule_render()
663+
await layout.render()
664+
665+
assert used_values == [1, 1, 1]
577666

578667

579668
async def test_use_ref():
580669
element_hook = HookCatcher()
581670
used_refs = []
582671

583672
@idom.element
673+
@element_hook.capture
584674
async def ElementWithRef():
585675
used_refs.append(idom.hooks.use_ref(1))
586676
return idom.html.div()

0 commit comments

Comments
 (0)