123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- /*
- * Public Domain Software
- *
- * I (Matthias Ladkau) am the author of the source code in this file.
- * I have placed the source code in this file in the public domain.
- *
- * For further information see: http://creativecommons.org/publicdomain/zero/1.0/
- */
- package termutil
- import (
- "bytes"
- "fmt"
- "testing"
- "devt.de/krotik/common/termutil/getch"
- )
- func TestConsoleLineTerminal(t *testing.T) {
- var out bytes.Buffer
- // Take over the low-level input interface
- stdin = bytes.NewBufferString("test line\n")
- // First test the fallback mode
- getchStart = func() error { return fmt.Errorf("Something is wrong") }
- getchGetch = func() (*getch.KeyEvent, error) { return nil, fmt.Errorf("baa") }
- ct, err := NewConsoleLineTerminal(&out)
- if err != nil {
- t.Error("Console terminal should go into fallback without error:", err)
- return
- }
- ct.StartTerm()
- if !ct.(*consoleLineTerminal).fallback {
- t.Error("Console terminal should be in fallback mode")
- return
- }
- l, err := ct.NextLine()
- if err != nil || l != "test line" {
- t.Error("Unexpected result:", l, err)
- return
- }
- l, err = ct.NextLinePrompt("", '*')
- if err == nil || err.Error() != "Cannot mask input characters" {
- t.Error("Unexpected result:", l, err)
- return
- }
- // Now do the proper getch supported backend
- getchStart = func() error { return nil }
- var getchbuffer []*getch.KeyEvent
- addTestKeyEvent := func(kc getch.KeyCode, r rune) {
- getchbuffer = append(getchbuffer, &getch.KeyEvent{
- Code: kc,
- Rune: r,
- })
- }
- getchGetch = func() (*getch.KeyEvent, error) {
- e := getchbuffer[0]
- getchbuffer = getchbuffer[1:]
- if e.Code == getch.KeyQuote { // Special case for tests
- return nil, &getch.ErrUnknownEscapeSequence{}
- }
- return e, nil
- }
- if ct, err = NewConsoleLineTerminal(&out); err != nil {
- t.Error(err)
- return
- }
- if ct.(*consoleLineTerminal).fallback {
- t.Error("Console terminal should NOT be in fallback mode")
- return
- }
- // Now do a normal line parsing
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyE, 'e')
- addTestKeyEvent(getch.KeyS, 's')
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyEnter, 0x00)
- if line, err := ct.NextLine(); err != nil || line != "test" {
- t.Error("Unexpected result:", "#"+line+"#", err)
- return
- }
- if res := string(out.Bytes()[60:67]); res != `>>>test` {
- t.Error("Unexpected result:", "#"+res+"#")
- return
- }
- out.Reset()
- // Now do a line parsing with masked line
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyE, 'e')
- addTestKeyEvent(getch.KeyS, 's')
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyEnter, 0x00)
- if line, err := ct.NextLinePrompt(">", '*'); err != nil || line != "test" {
- t.Error("Unexpected result:", "#"+line+"#", err)
- return
- }
- if res := string(out.Bytes()[39:44]); res != `>****` {
- t.Error("Unexpected result:", "#"+res+"#")
- return
- }
- // Now do a line parsing with pasted text
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyE, 'e')
- addTestKeyEvent(getch.KeyS, 's')
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent("", 0x0)
- addTestKeyEvent(getch.KeyEnter, 0x00)
- getchbuffer[2].RawBuf = []byte("s1s")
- if line, err := ct.NextLine(); err != nil || line != "tes1st " {
- t.Error("Unexpected result:", "#"+line+"#", err)
- return
- }
- // Test backspace
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyE, 'e')
- addTestKeyEvent(getch.KeyS, 's')
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyBackspace, 0x0)
- addTestKeyEvent(getch.KeyBackspace, 0x0)
- addTestKeyEvent(getch.KeyEnter, 0x00)
- if line, err := ct.NextLine(); err != nil || line != "te" {
- t.Error("Unexpected result:", "#"+line+"#", err)
- return
- }
- // Test cursor movement and delete
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyQuote, 0x00) // Generates an unknown escape sequence error
- addTestKeyEvent(getch.KeyE, 'e')
- addTestKeyEvent(getch.KeyS, 's')
- addTestKeyEvent(getch.KeyT, 't')
- addTestKeyEvent(getch.KeyArrowLeft, 0x0)
- addTestKeyEvent(getch.KeyArrowLeft, 0x0)
- addTestKeyEvent(getch.KeyDelete, 0x0)
- addTestKeyEvent(getch.KeyT, 'x')
- addTestKeyEvent(getch.KeyArrowRight, 0x0)
- addTestKeyEvent(getch.KeyArrowRight, 0x0)
- addTestKeyEvent(getch.KeyT, 'e')
- addTestKeyEvent(getch.KeyT, 'r')
- addTestKeyEvent(getch.KeyHome, 0x0)
- addTestKeyEvent(getch.KeyT, '-')
- addTestKeyEvent(getch.KeyEnd, 0x0)
- addTestKeyEvent(getch.KeyT, '-')
- addTestKeyEvent(getch.KeyEnter, 0x00)
- // The unknown escape sequence error should have been ignored
- if line, err := ct.NextLine(); err != nil || line != "-texter-" {
- t.Error("Unexpected result:", "#"+line+"#", err)
- return
- }
- // Calling the actual stop function in getch should always be ok
- ct.StopTerm()
- }
|