@@ -36,6 +36,59 @@ test('primitive: should rerender used on promise resolve', async () => {
3636 expect ( result . current . get ( ) ) . toEqual ( 100 ) ;
3737} ) ;
3838
39+ test ( 'primitive: should rerender used on promise resolve immediately' , async ( ) => {
40+ let renderTimes = 0
41+ const { result } = renderHook ( ( ) => {
42+ renderTimes += 1 ;
43+ return useState ( 0 )
44+ } ) ;
45+ expect ( renderTimes ) . toStrictEqual ( 1 ) ;
46+ expect ( result . current . get ( ) ) . toStrictEqual ( 0 ) ;
47+
48+ const promise = Promise . resolve ( 100 ) ;
49+ act ( ( ) => {
50+ result . current . set ( promise ) ;
51+ } ) ;
52+ expect ( renderTimes ) . toStrictEqual ( 2 ) ;
53+ expect ( result . current . promised ) . toStrictEqual ( true ) ;
54+ expect ( ( ) => result . current . keys )
55+ . toThrow ( 'Error: HOOKSTATE-103 [path: /]. See https://hookstate.js.org/docs/exceptions#hookstate-103' ) ;
56+ expect ( ( ) => result . current . get ( ) )
57+ . toThrow ( 'Error: HOOKSTATE-103 [path: /]. See https://hookstate.js.org/docs/exceptions#hookstate-103' ) ;
58+
59+ expect ( ( ) => result . current . set ( 200 ) )
60+ . toThrow ( 'Error: HOOKSTATE-104 [path: /]. See https://hookstate.js.org/docs/exceptions#hookstate-104' )
61+
62+ await act ( async ( ) => {
63+ await promise ;
64+ } )
65+ expect ( renderTimes ) . toStrictEqual ( 3 ) ;
66+ expect ( result . current . promised ) . toStrictEqual ( false ) ;
67+ expect ( result . current . error ) . toEqual ( undefined ) ;
68+ expect ( result . current . get ( ) ) . toEqual ( 100 ) ;
69+ } ) ;
70+
71+ test ( 'primitive: should rerender used on promise resolve immediately global' , async ( ) => {
72+ let renderTimes = 0
73+ let state = createState ( async ( ) => {
74+ return 100
75+ } ) ;
76+ const { result } = renderHook ( ( ) => {
77+ renderTimes += 1 ;
78+ return useState ( state )
79+ } ) ;
80+ expect ( renderTimes ) . toStrictEqual ( 1 ) ;
81+ expect ( result . current . promised ) . toStrictEqual ( true ) ;
82+
83+ await act ( async ( ) => {
84+ await new Promise ( ( resolve , ) => setTimeout ( resolve , 0 ) ) ;
85+ } )
86+ expect ( renderTimes ) . toStrictEqual ( 2 ) ;
87+ expect ( result . current . promised ) . toStrictEqual ( false ) ;
88+ expect ( result . current . error ) . toEqual ( undefined ) ;
89+ expect ( result . current . get ( ) ) . toEqual ( 100 ) ;
90+ } ) ;
91+
3992test ( 'array: should rerender used on promise resolve' , async ( ) => {
4093 let renderTimes = 0
4194 const { result } = renderHook ( ( ) => {
0 commit comments