aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThijs <thijs@thijsschreijer.nl>2024-05-21 22:09:28 +0200
committerThijs <thijs@thijsschreijer.nl>2024-05-21 22:19:15 +0200
commit96e278e67729f1897496916b650e6be337a571d6 (patch)
tree270f628431fd75fa0de0137f58f3b2772c1c7d7c
parent1ed4a7325932192da7ec98318a4841752d2a952a (diff)
downloadluasystem-96e278e67729f1897496916b650e6be337a571d6.tar.gz
luasystem-96e278e67729f1897496916b650e6be337a571d6.tar.bz2
luasystem-96e278e67729f1897496916b650e6be337a571d6.zip
add tests for readkey and readansi
-rw-r--r--spec/04-term_spec.lua147
1 files changed, 142 insertions, 5 deletions
diff --git a/spec/04-term_spec.lua b/spec/04-term_spec.lua
index 83750ec..b6e0daf 100644
--- a/spec/04-term_spec.lua
+++ b/spec/04-term_spec.lua
@@ -324,9 +324,12 @@ describe("Terminal:", function()
324 324
325 325
326 326
327 pending("termsize()", function() 327 describe("termsize() #manual", function()
328 328
329 pending("sets the consoleflags, if called with flags", function() 329 it("gets the terminal size", function()
330 local w, h = system.termsize()
331 assert.is_number(w)
332 assert.is_number(h)
330 end) 333 end)
331 334
332 end) 335 end)
@@ -407,13 +410,147 @@ describe("Terminal:", function()
407 410
408 411
409 412
410 pending("readkey()", function() 413 describe("keyboard input", function()
414
415 local old_readkey = system._readkey
416 local current_buffer
417 local function setbuffer(str)
418 assert(type(str) == "string", "setbuffer() expects a string")
419 if str == "" then
420 current_buffer = nil
421 else
422 current_buffer = str
423 end
424 end
425
426
427 setup(function()
428 system._readkey = function()
429 if not current_buffer then
430 return nil
431 end
432 local ch = current_buffer:byte(1, 1)
433 if #current_buffer == 1 then
434 current_buffer = nil
435 else
436 current_buffer = current_buffer:sub(2, -1)
437 end
438 return ch
439 end
440 end)
441
442
443 teardown(function()
444 system._readkey = old_readkey
445 end)
446
447
448
449 describe("readkey()", function()
450
451 it("fails without a timeout", function()
452 assert.has.error(function()
453 system.readkey()
454 end, "arg #1 to readkey, expected timeout in seconds, got nil")
455 end)
456
457
458 it("reads a single byte for single-byte characters", function()
459 setbuffer("abc")
460 assert.equals(string.byte("a"), system.readkey(0))
461 assert.equals(string.byte("b"), system.readkey(0))
462 assert.equals(string.byte("c"), system.readkey(0))
463 end)
464
465
466 it("reads a single byte for multi-byte chars", function()
467 setbuffer(string.char(226, 130, 172) .. -- "€" single
468 string.char(240, 159, 154, 128)) -- "🚀" double
469 assert.equals(226, system.readkey(0))
470 assert.equals(130, system.readkey(0))
471 assert.equals(172, system.readkey(0))
472 assert.equals(240, system.readkey(0))
473 assert.equals(159, system.readkey(0))
474 assert.equals(154, system.readkey(0))
475 assert.equals(128, system.readkey(0))
476 end)
477
478
479 it("times out", function()
480 setbuffer("")
481 local timing = system.gettime()
482 assert.same({ nil, "timeout" }, { system.readkey(0.5) })
483
484 timing = system.gettime() - timing
485 -- assert.is.near(0.5, timing, 0.1) -- this works in CI for Unix and Windows, but not MacOS (locally it passes)
486 assert.is.near(1, timing, 0.5) -- this also works for MacOS in CI
487 end)
488
489 end)
490
491
492
493 describe("readansi()", function()
494
495 it("fails without a timeout", function()
496 assert.has.error(function()
497 system.readansi()
498 end, "arg #1 to readansi, expected timeout in seconds, got nil")
499 end)
500
501
502 it("reads a single byte for single-byte characters", function()
503 setbuffer("abc")
504 assert.are.same({"a", "char"}, {system.readansi(0)})
505 assert.are.same({"b", "char"}, {system.readansi(0)})
506 assert.are.same({"c", "char"}, {system.readansi(0)})
507 end)
508
509
510 it("reads a multi-byte characters one at a time", function()
511 setbuffer(string.char(226, 130, 172) .. -- "€" single
512 string.char(240, 159, 154, 128)) -- "🚀" double
513 assert.are.same({"€", "char"}, {system.readansi(0)})
514 assert.are.same({"🚀", "char"}, {system.readansi(0)})
515 end)
411 516
412 end)
413 517
518 it("reads ANSI escape sequences, marked by '<esc>['", function()
519 setbuffer("\27[A\27[B\27[C\27[D")
520 assert.are.same({"\27[A", "ansi"}, {system.readansi(0)})
521 assert.are.same({"\27[B", "ansi"}, {system.readansi(0)})
522 assert.are.same({"\27[C", "ansi"}, {system.readansi(0)})
523 assert.are.same({"\27[D", "ansi"}, {system.readansi(0)})
524 end)
414 525
415 526
416 pending("readansi()", function() 527 it("reads ANSI escape sequences, marked by '<esc>O'", function()
528 setbuffer("\27OA\27OB\27OC\27OD")
529 assert.are.same({"\27OA", "ansi"}, {system.readansi(0)})
530 assert.are.same({"\27OB", "ansi"}, {system.readansi(0)})
531 assert.are.same({"\27OC", "ansi"}, {system.readansi(0)})
532 assert.are.same({"\27OD", "ansi"}, {system.readansi(0)})
533 end)
534
535
536 it("returns a single <esc> character if no sequence is found", function()
537 setbuffer("\27\27[A")
538 assert.are.same({"\27", "char"}, {system.readansi(0)})
539 assert.are.same({"\27[A", "ansi"}, {system.readansi(0)})
540 end)
541
542
543 it("times out", function()
544 setbuffer("")
545 local timing = system.gettime()
546 assert.same({ nil, "timeout" }, { system.readansi(0.5) })
547
548 timing = system.gettime() - timing
549 -- assert.is.near(0.5, timing, 0.1) -- this works in CI for Unix and Windows, but not MacOS (locally it passes)
550 assert.is.near(1, timing, 0.5) -- this also works for MacOS in CI
551 end)
552
553 end)
417 554
418 end) 555 end)
419 556