@@ -7,6 +7,7 @@ local UInput = evdev.uinput.create
77local normalize = evdev .uinput ._normalize --- @diagnostic disable-line : undefined-field
88local ecodes = evdev .ecodes
99local sleep = system .sleep
10+ local fmt = string.format
1011
1112describe (" evdev.uinput()" , function ()
1213 describe (" validations" , function ()
@@ -182,24 +183,31 @@ describe("evdev.uinput()", function()
182183 end )
183184
184185 describe (" UInput object" , function ()
186+ local ui
187+
188+ before_each (function ()
189+ if not (ui and ui :is_open ()) then
190+ ui = assert (UInput ({ name = " Lua Virtual Device" }))
191+ sleep (0.1 )
192+ end
193+ end )
194+
195+ teardown (function ()
196+ ui :close ()
197+ end )
198+
185199 it (" loads metadata fields" , function ()
186- local ui = assert (UInput ({ name = " cached mock device" }))
187- sleep (0.1 )
188200 assert .Match (" ^/dev/input/event%d+$" , ui .path )
189- assert .Equal (" cached mock device" , ui .name )
190- assert .True (ui :close ())
201+ assert .Equal (" Lua Virtual Device" , ui .name )
191202 end )
192203
193204 it (" reports open state and closes cleanly" , function ()
194- local ui = assert (UInput ({ name = " mock open state" }))
195205 assert .True (ui :is_open ())
196206 assert .True (ui :close ())
197207 assert .False (ui :is_open ())
198- assert .True (ui :close ())
199208 end )
200209
201210 it (" returns a closed-device error for emit after close" , function ()
202- local ui = assert (UInput ({ name = " closed emit test" }))
203211 assert .True (ui :close ())
204212
205213 local ok , err = ui :emit (ecodes .EV_KEY , ecodes .KEY_A , 1 )
@@ -208,14 +216,76 @@ describe("evdev.uinput()", function()
208216 end )
209217
210218 it (" returns a closed-device error for sync after close" , function ()
211- local ui = assert (UInput ({ name = " closed sync test" }))
212219 assert .True (ui :close ())
213220
214221 local ok , err = ui :sync ()
215222 assert .Nil (ok )
216223 assert .Equal (" uinput device is closed" , err )
217224 end )
218225
226+ it (" returns repeat settings for repeat-capable devices" , function ()
227+ local delay , period , err = ui :get_repeat ()
228+ assert .Number (delay )
229+ assert .Number (period )
230+ assert .Nil (err )
231+ end )
232+
233+ it (" updates repeat settings for repeat-capable devices" , function ()
234+ local delay , period , err = ui :get_repeat ()
235+ assert .Number (delay )
236+ assert .Number (period )
237+ assert .Nil (err )
238+ assert .True (ui :set_repeat (delay , period ))
239+ end )
240+
241+ it (" returns an unsupported get_repeat error for non-repeat devices" , function ()
242+ local ui = assert (UInput ({
243+ name = " uinput unsupported get repeat test" ,
244+ keys = { ecodes .BTN_LEFT },
245+ rels = { ecodes .REL_X },
246+ }))
247+
248+ sleep (0.1 )
249+
250+ local delay , period , err = ui :get_repeat ()
251+ assert .Nil (delay )
252+ assert .Nil (period )
253+ assert .Equal (fmt (" get repeat %s: device does not support repeat settings" , ui .path ), err )
254+ assert .True (ui :close ())
255+ end )
256+
257+ it (" returns an unsupported set_repeat error for non-repeat devices" , function ()
258+ local ui = assert (UInput ({
259+ name = " uinput unsupported set repeat test" ,
260+ keys = { ecodes .BTN_RIGHT },
261+ rels = { ecodes .REL_Y },
262+ }))
263+ sleep (0.1 )
264+ local ok , err = ui :set_repeat (300 , 40 )
265+ assert .Nil (ok )
266+ assert .Equal (fmt (" set repeat %s: device does not support repeat settings" , ui .path ), err )
267+ assert .True (ui :close ())
268+ end )
269+
270+ it (" returns a closed-device error for get_repeat after close" , function ()
271+ local ui = assert (UInput ({ name = " closed get repeat test" }))
272+ assert .True (ui :close ())
273+
274+ local delay , period , err = ui :get_repeat ()
275+ assert .Nil (delay )
276+ assert .Nil (period )
277+ assert .Equal (" uinput device is closed" , err )
278+ end )
279+
280+ it (" returns a closed-device error for set_repeat after close" , function ()
281+ local ui = assert (UInput ({ name = " closed set repeat test" }))
282+ assert .True (ui :close ())
283+
284+ local ok , err = ui :set_repeat (300 , 40 )
285+ assert .Nil (ok )
286+ assert .Equal (" uinput device is closed" , err )
287+ end )
288+
219289 it (" validates emit argument types before using the handle" , function ()
220290 local ui = assert (UInput ({ name = " emit validation test" }))
221291
@@ -233,5 +303,19 @@ describe("evdev.uinput()", function()
233303
234304 ui :close ()
235305 end )
306+
307+ it (" validates set_repeat argument types before using the handle" , function ()
308+ local ui = assert (UInput ({ name = " set repeat validation test" }))
309+
310+ assert .Error (function ()
311+ ui :set_repeat (" fast" , 40 )
312+ end , " delay: (number expected, got string)" )
313+
314+ assert .Error (function ()
315+ ui :set_repeat (300 , " slow" )
316+ end , " period: (number expected, got string)" )
317+
318+ ui :close ()
319+ end )
236320 end )
237321end )
0 commit comments