Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace to tcell from termbox #32

Merged
merged 26 commits into from
Dec 25, 2020
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
run: go build

- name: Test
run: go test -v -coverpkg ./... -covermode atomic -coverprofile coverage.txt -tags fuzz -numCases 10 -numEvents 10 ./...
run: go test -v -coverpkg ./... -covermode atomic -coverprofile coverage.txt -tags fuzz -numCases 3000 -numEvents 10 ./...

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1
Expand Down
4 changes: 2 additions & 2 deletions example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func ExampleFindMulti() {

func ExampleTerminalMock() {
// Initialize a mocked terminal.
term := fuzzyfinder.UseMockedTerminal()
term := fuzzyfinder.UseMockedTerminalV2()
keys := "foo"
for _, r := range keys {
term.InjectKey(tcell.KeyRune, r, tcell.ModNone)
Expand All @@ -84,6 +84,6 @@ func ExampleTerminalMock() {
// We can test it by the golden files testing pattern.
//
// See https://speakerdeck.com/mitchellh/advanced-testing-with-go?slide=19
result := term.GetResult()
result := term.GetResultV2()
ioutil.WriteFile("ui.out", []byte(result), 0644)
}
11 changes: 6 additions & 5 deletions fuzzing_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ var (
var (
out = flag.String("fuzzout", "fuzz.out", "fuzzing error cases")
hotReload = flag.Bool("hotreload", false, "enable hot-reloading")
numCases = flag.Int("numCases", 10, "number of test cases")
numCases = flag.Int("numCases", 30, "number of test cases")
numEvents = flag.Int("numEvents", 10, "number of events")
)

Expand All @@ -93,8 +93,8 @@ func TestFuzz(t *testing.T) {
return b
}

// number of events in tcell.SimulationScreen is limited 10
for i := 0; i < rand.Intn(min(*numCases, 10)); i++ {
for i := 0; i < rand.Intn(*numCases)+10; i++ {
// number of events in tcell.SimulationScreen is limited 10
n := rand.Intn(min(*numEvents, 10))
events := make([]tcell.Event, n)
for i := 0; i < n; i++ {
Expand Down Expand Up @@ -127,9 +127,10 @@ func TestFuzz(t *testing.T) {
var mu sync.Mutex
tracks := tracks

f, term := fuzzyfinder.NewWithMockedTerminal()
f, term := fuzzyfinder.NewWithMockedTerminalV2()
events = append(events, key(input{tcell.KeyEsc, rune(tcell.KeyEsc), tcell.ModNone}))
term.SetEvents(events...)

term.SetEventsV2(events...)

var (
iface interface{}
Expand Down
8 changes: 5 additions & 3 deletions fuzzyfinder.go
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,10 @@ func (f *finder) find(slice interface{}, itemFunc func(i int) string, opts []Opt
return nil, errors.Wrap(err, "failed to initialize the fuzzy finder")
}

if !isInTesting() {
defer f.term.Fini()
}

close(inited)

go func() {
Expand Down Expand Up @@ -673,7 +677,7 @@ func (f *finder) find(slice interface{}, itemFunc func(i int) string, opts []Opt
}

// This method avoid tcell bug https://github.com/gdamore/tcell/issues/194
// Aditional EOL event is sent to ensure, consequent events, are correctly handled
// Additional EOL event is sent to ensure, consequent events, are correctly handled.
func sendExtraEventFix() error {
kb, err := keybd_event.NewKeyBonding()
if err != nil {
Expand Down Expand Up @@ -704,7 +708,6 @@ func Find(slice interface{}, itemFunc func(i int) string, opts ...Option) (int,
func (f *finder) Find(slice interface{}, itemFunc func(i int) string, opts ...Option) (int, error) {
res, err := f.find(slice, itemFunc, opts)
if !isInTesting() {
f.term.Fini()
if err := sendExtraEventFix(); err != nil {
return 0, err
}
Expand All @@ -726,7 +729,6 @@ func (f *finder) FindMulti(slice interface{}, itemFunc func(i int) string, opts
opts = append(opts, withMulti())
res, err := f.find(slice, itemFunc, opts)
if !isInTesting() {
f.term.Fini()
if err := sendExtraEventFix(); err != nil {
return nil, err
}
Expand Down
46 changes: 20 additions & 26 deletions fuzzyfinder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,9 +183,9 @@ func TestFind(t *testing.T) {
t.Run(name, func(t *testing.T) {
events := c.events

f, term := fuzzyfinder.NewWithMockedTerminal()
f, term := fuzzyfinder.NewWithMockedTerminalV2()
events = append(events, key(input{tcell.KeyEsc, rune(tcell.KeyEsc), tcell.ModNone}))
term.SetEvents(events...)
term.SetEventsV2(events...)

assertWithGolden(t, func(t *testing.T) string {
_, err := f.Find(
Expand All @@ -205,18 +205,17 @@ func TestFind(t *testing.T) {
t.Fatalf("Find must return ErrAbort, but got '%s'", err)
}

res := term.GetResult()
term.Fini()
res := term.GetResultV2()
return res
})
})
}
}

func TestFind_hotReload(t *testing.T) {
f, term := fuzzyfinder.NewWithMockedTerminal()
f, term := fuzzyfinder.NewWithMockedTerminalV2()
events := append(runes("adrena"), keys(input{tcell.KeyEsc, rune(tcell.KeyEsc), tcell.ModNone})...)
term.SetEvents(events...)
term.SetEventsV2(events...)

var mu sync.Mutex
assertWithGolden(t, func(t *testing.T) string {
Expand Down Expand Up @@ -244,8 +243,7 @@ func TestFind_hotReload(t *testing.T) {
t.Fatalf("Find must return ErrAbort, but got '%s'", err)
}

res := term.GetResult()
term.Fini()
res := term.GetResultV2()
return res
})
}
Expand All @@ -255,26 +253,18 @@ func TestFind_enter(t *testing.T) {
events []tcell.Event
expected int
}{
"initial": {events: keys(input{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone}), expected: 0},
"mode smart to case-sensitive": {events: append(runes("JI"), keys([]input{
{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone}, // tab earn time for filter
{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone},
{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone},
{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone},
{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone},
{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone},
{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone},
}...)...), expected: 7},
"initial": {events: keys(input{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone}), expected: 0},
"mode smart to case-sensitive": {events: append(runes("JI")), expected: 7},
}

for name, c := range cases {
t.Run(name, func(t *testing.T) {
c := c
events := c.events

f, term := fuzzyfinder.NewWithMockedTerminal()
f, term := fuzzyfinder.NewWithMockedTerminalV2()
events = append(events, key(input{tcell.KeyEnter, rune(tcell.KeyEnter), tcell.ModNone}))
term.SetEvents(events...)
term.SetEventsV2(events...)

idx, err := f.Find(
tracks,
Expand Down Expand Up @@ -342,9 +332,9 @@ func TestFindMulti(t *testing.T) {
c := c
events := c.events

f, term := fuzzyfinder.NewWithMockedTerminal()
f, term := fuzzyfinder.NewWithMockedTerminalV2()
events = append(events, key(input{tcell.KeyEnter, rune(tcell.KeyEnter), tcell.ModNone}))
term.SetEvents(events...)
term.SetEventsV2(events...)

idxs, err := f.FindMulti(
tracks,
Expand Down Expand Up @@ -380,8 +370,10 @@ func BenchmarkFind(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
f, term := fuzzyfinder.NewWithMockedTerminal()
term.SetEvents(append(runes("adrele!!"), key(input{tcell.KeyEsc, rune(tcell.KeyEsc), tcell.ModNone}))...)
f, term := fuzzyfinder.NewWithMockedTerminalV2()
events := append(runes("adrele!!"), key(input{tcell.KeyEsc, rune(tcell.KeyEsc), tcell.ModNone}))
term.SetEventsV2(events...)

f.Find(
tracks,
func(i int) string {
Expand All @@ -401,8 +393,10 @@ func BenchmarkFind(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
f, term := fuzzyfinder.NewWithMockedTerminal()
term.SetEvents(append(runes("adrele!!"), key(input{tcell.KeyEsc, rune(tcell.KeyEsc), tcell.ModNone}))...)
f, term := fuzzyfinder.NewWithMockedTerminalV2()
events := append(runes("adrele!!"), key(input{tcell.KeyEsc, rune(tcell.KeyEsc), tcell.ModNone}))
term.SetEventsV2(events...)

f.Find(
&tracks,
func(i int) string {
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ require (
github.com/google/gofuzz v1.2.0
github.com/mattn/go-runewidth v0.0.9
github.com/micmonay/keybd_event v1.1.0
github.com/nsf/termbox-go v0.0.0-20201124104050-ed494de23a00
github.com/pkg/errors v0.9.1
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect
golang.org/x/text v0.3.3 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/Qd
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/micmonay/keybd_event v1.1.0 h1:fQzkqiG/Siwji1Ju9NDkIb8FSFFlPU76YbJntrXdtQw=
github.com/micmonay/keybd_event v1.1.0/go.mod h1:QS2Kfz0PbPezFqMPEot+l/cK78/tHLZtZ7AbYUCRKsQ=
github.com/nsf/termbox-go v0.0.0-20201124104050-ed494de23a00 h1:Rl8NelBe+n7SuLbJyw13ho7CGWUt2BjGGKIoreCWQ/c=
github.com/nsf/termbox-go v0.0.0-20201124104050-ed494de23a00/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 h1:9nuHUbU8dRnRRfj9KjWUVrJeoexdbeMjttk6Oh1rD10=
Expand Down
8 changes: 8 additions & 0 deletions helper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,11 @@ func NewWithMockedTerminal() (*finder, *TerminalMock) {
m.SetSize(w, h)
return f, m
}

func NewWithMockedTerminalV2() (*finder, *TerminalMock) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no need to define a v2 function because helper_test.go is only for testing and it is referenced only from fuzzyfinder_test.go. So you can rename it to NewWithMockedTerminal and remove the old one.

Suggested change
func NewWithMockedTerminalV2() (*finder, *TerminalMock) {
func NewWithMockedTerminal() (*finder, *TerminalMock) {

f := New()
m := f.UseMockedTerminalV2()
w, h := 60, 10 // A normally value.
m.SetSizeV2(w, h)
return f, m
}
Loading