1+ from idom .core .element import element
12import re
23
34import 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
579668async 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