@@ -136,12 +136,93 @@ async def on_click(event):
136136 assert count .get_attribute ("innerHTML" ) == "1"
137137
138138
139- def test_set_state_with_reducer_instead_of_value ():
140- assert False
139+ def test_set_state_with_reducer_instead_of_value (driver , display ):
140+ def increment (count ):
141+ return count + 1
141142
143+ @idom .element
144+ async def Counter ():
145+ count , set_count = idom .hooks .use_state (0 )
146+ return idom .html .button (
147+ {
148+ "id" : "counter" ,
149+ "onClick" : lambda event : set_count (increment ),
150+ },
151+ f"Count: { count } " ,
152+ )
142153
143- def test_set_state_checks_identity_not_equality ():
144- assert False
154+ display (Counter )
155+
156+ client_counter = driver .find_element_by_id ("counter" )
157+
158+ for i in range (3 ):
159+ assert client_counter .get_attribute ("innerHTML" ) == f"Count: { i } "
160+ client_counter .click ()
161+
162+
163+ def test_set_state_checks_identity_not_equality (driver , display , driver_wait ):
164+ r_1 = idom .Ref ("value" )
165+ r_2 = idom .Ref ("value" )
166+
167+ # refs are equal but not identical
168+ assert r_1 == r_2
169+ assert r_1 is not r_2
170+
171+ render_count = idom .Ref (0 )
172+ event_count = idom .Ref (0 )
173+
174+ def event_count_tracker (function ):
175+ def tracker (* args , ** kwargs ):
176+ event_count .current += 1
177+ return function (* args , ** kwargs )
178+
179+ return tracker
180+
181+ @idom .element
182+ async def TestElement ():
183+ state , set_state = idom .hooks .use_state (r_1 )
184+
185+ render_count .current += 1
186+ return idom .html .div (
187+ idom .html .button (
188+ {
189+ "id" : "r_1" ,
190+ "onClick" : event_count_tracker (lambda event : set_state (r_1 )),
191+ },
192+ "r_1" ,
193+ ),
194+ idom .html .button (
195+ {
196+ "id" : "r_2" ,
197+ "onClick" : event_count_tracker (lambda event : set_state (r_2 )),
198+ },
199+ "r_2" ,
200+ ),
201+ f"Last state: { 'r_1' if state is r_1 else 'r_2' } " ,
202+ )
203+
204+ display (TestElement )
205+
206+ client_r_1_button = driver .find_element_by_id ("r_1" )
207+ client_r_2_button = driver .find_element_by_id ("r_2" )
208+
209+ assert render_count .current == 1
210+ assert event_count .current == 0
211+
212+ client_r_1_button .click ()
213+
214+ driver_wait .until (lambda d : event_count .current == 1 )
215+ assert render_count .current == 1
216+
217+ client_r_2_button .click ()
218+
219+ driver_wait .until (lambda d : event_count .current == 2 )
220+ assert render_count .current == 2
221+
222+ client_r_2_button .click ()
223+
224+ driver_wait .until (lambda d : event_count .current == 3 )
225+ assert render_count .current == 2
145226
146227
147228def test_simple_input_with_use_state (driver , display ):
0 commit comments