22/* eslint-disable @typescript-eslint/no-explicit-any */
33import { html } from '../helper/html'
44import { Hono } from '../hono'
5+ import { DOM_MEMO } from './constants'
56import { captureRenderContext } from './context'
67import { Suspense , renderToReadableStream } from './streaming'
78import DefaultExport , {
@@ -742,7 +743,7 @@ describe('className', () => {
742743} )
743744
744745describe ( 'memo' , ( ) => {
745- it ( 'memoized ' , ( ) => {
746+ it ( 'does not reuse the result of a previous render ' , ( ) => {
746747 let counter = 0
747748 const Header = memo ( ( ) => < title > Test Site { counter } </ title > )
748749 const Body = ( ) => < span > { counter } </ span >
@@ -773,10 +774,24 @@ describe('memo', () => {
773774 </ html >
774775 )
775776 expect ( template . toString ( ) ) . toBe (
776- '<html><head><title>Test Site 0 </title></head><body><span>1</span></body></html>'
777+ '<html><head><title>Test Site 1 </title></head><body><span>1</span></body></html>'
777778 )
778779 } )
779780
781+ it ( 'does not carry a context value into a later render' , ( ) => {
782+ const NameContext = createContext ( 'anonymous' )
783+ const Panel = memo ( ( ) => < p > { useContext ( NameContext ) } </ p > )
784+ const render = ( name : string ) =>
785+ (
786+ < NameContext . Provider value = { name } >
787+ < Panel />
788+ </ NameContext . Provider >
789+ ) . toString ( )
790+
791+ expect ( render ( 'alice' ) ) . toBe ( '<p>alice</p>' )
792+ expect ( render ( 'bob' ) ) . toBe ( '<p>bob</p>' )
793+ } )
794+
780795 it ( 'props are updated' , ( ) => {
781796 const Body = memo ( ( { counter } : { counter : number } ) => < span > { counter } </ span > )
782797
@@ -787,20 +802,15 @@ describe('memo', () => {
787802 expect ( template . toString ( ) ) . toBe ( '<span>1</span>' )
788803 } )
789804
790- it ( 'custom propsAreEqual' , ( ) => {
791- const Body = memo (
792- ( { counter } : { counter : number ; refresh ?: boolean } ) => < span > { counter } </ span > ,
793- ( _ , nextProps ) => ( typeof nextProps . refresh == 'undefined' ? true : ! nextProps . refresh )
794- )
795-
796- let template = < Body counter = { 0 } />
797- expect ( template . toString ( ) ) . toBe ( '<span>0</span>' )
805+ it ( 'custom propsAreEqual is handed to the DOM renderer' , ( ) => {
806+ const propsAreEqual = ( _ : { counter : number } , nextProps : { counter : number } ) =>
807+ nextProps . counter === 0
808+ const Body = memo ( ( { counter } : { counter : number } ) => < span > { counter } </ span > , propsAreEqual )
798809
799- template = < Body counter = { 1 } />
800- expect ( template . toString ( ) ) . toBe ( '<span>0</span>' )
810+ expect ( ( Body as any ) [ DOM_MEMO ] ) . toBe ( propsAreEqual )
801811
802- template = < Body counter = { 2 } refresh = { true } />
803- expect ( template . toString ( ) ) . toBe ( '<span>2 </span>' )
812+ expect ( ( < Body counter = { 0 } /> ) . toString ( ) ) . toBe ( '<span>0</span>' )
813+ expect ( ( < Body counter = { 1 } /> ) . toString ( ) ) . toBe ( '<span>1 </span>' )
804814 } )
805815} )
806816
0 commit comments