mirror of
https://github.com/redhat-developer/odo.git
synced 2025-10-19 03:06:19 +03:00
* POC for odo interactive testing
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* add interactive tests to make target test-integration
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* [WIP] use func to pass test instructions
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* cleanup comments/test
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* cleanup minor changes
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* fix unit test failure
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* skip for windows
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* skip for windows by not compiling, cleanup
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* cleanup, and add the make target to test files
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* incorporate review, adding comments, cleanup
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* fix failing make validate
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* update test dependency, and possible fix for windows
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
* Revert "update test dependency, and possible fix for windows"
This reverts commit 55580b7dc5.
* Final cleanup
Signed-off-by: anandrkskd <anandrkskd@gmail.com>
109 lines
1.9 KiB
Go
109 lines
1.9 KiB
Go
// +build linux darwin dragonfly solaris openbsd netbsd freebsd
|
|
|
|
package vt10x
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"io"
|
|
"unicode"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
type terminal struct {
|
|
*State
|
|
}
|
|
|
|
func newTerminal(info TerminalInfo) *terminal {
|
|
t := &terminal{newState(info.w)}
|
|
t.init(info.cols, info.rows)
|
|
return t
|
|
}
|
|
|
|
func (t *terminal) init(cols, rows int) {
|
|
t.numlock = true
|
|
t.state = t.parse
|
|
t.cur.Attr.FG = DefaultFG
|
|
t.cur.Attr.BG = DefaultBG
|
|
t.Resize(cols, rows)
|
|
t.reset()
|
|
}
|
|
|
|
// Write parses input and writes terminal changes to state.
|
|
func (t *terminal) Write(p []byte) (int, error) {
|
|
var written int
|
|
r := bytes.NewReader(p)
|
|
t.lock()
|
|
defer t.unlock()
|
|
for {
|
|
c, sz, err := r.ReadRune()
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
return written, err
|
|
}
|
|
written += sz
|
|
if c == unicode.ReplacementChar && sz == 1 {
|
|
if r.Len() == 0 {
|
|
// not enough bytes for a full rune
|
|
return written - 1, nil
|
|
}
|
|
t.logln("invalid utf8 sequence")
|
|
continue
|
|
}
|
|
t.put(c)
|
|
}
|
|
return written, nil
|
|
}
|
|
|
|
// TODO: add tests for expected blocking behavior
|
|
func (t *terminal) Parse(br *bufio.Reader) error {
|
|
var locked bool
|
|
defer func() {
|
|
if locked {
|
|
t.unlock()
|
|
}
|
|
}()
|
|
for {
|
|
c, sz, err := br.ReadRune()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if c == unicode.ReplacementChar && sz == 1 {
|
|
t.logln("invalid utf8 sequence")
|
|
break
|
|
}
|
|
if !locked {
|
|
t.lock()
|
|
locked = true
|
|
}
|
|
|
|
// put rune for parsing and update state
|
|
t.put(c)
|
|
|
|
// break if our buffer is empty, or if buffer contains an
|
|
// incomplete rune.
|
|
n := br.Buffered()
|
|
if n == 0 || (n < 4 && !fullRuneBuffered(br)) {
|
|
break
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func fullRuneBuffered(br *bufio.Reader) bool {
|
|
n := br.Buffered()
|
|
buf, err := br.Peek(n)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return utf8.FullRune(buf)
|
|
}
|
|
|
|
func (t *terminal) Resize(cols, rows int) {
|
|
t.lock()
|
|
defer t.unlock()
|
|
_ = t.resize(cols, rows)
|
|
}
|