mirror of
https://github.com/Llewellynvdm/fzf.git
synced 2024-09-28 13:19:01 +00:00
487c8fe88f
Instead of notifying the event coordinator (EventBox) whenever a new line is arrived, start a background goroutine that periodically does the task. Atomic.StoreInt32 is much cheaper than mutex synchronization that happens during EventBox update.
65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package fzf
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/junegunn/fzf/src/util"
|
|
)
|
|
|
|
func TestReadFromCommand(t *testing.T) {
|
|
strs := []string{}
|
|
eb := util.NewEventBox()
|
|
reader := Reader{
|
|
pusher: func(s []byte) bool { strs = append(strs, string(s)); return true },
|
|
eventBox: eb,
|
|
event: int32(EvtReady)}
|
|
|
|
reader.startEventPoller()
|
|
|
|
// Check EventBox
|
|
if eb.Peek(EvtReadNew) {
|
|
t.Error("EvtReadNew should not be set yet")
|
|
}
|
|
|
|
// Normal command
|
|
reader.fin(reader.readFromCommand(`echo abc && echo def`))
|
|
if len(strs) != 2 || strs[0] != "abc" || strs[1] != "def" {
|
|
t.Errorf("%s", strs)
|
|
}
|
|
|
|
// Check EventBox again
|
|
eb.WaitFor(EvtReadFin)
|
|
|
|
// Wait should return immediately
|
|
eb.Wait(func(events *util.Events) {
|
|
events.Clear()
|
|
})
|
|
|
|
// EventBox is cleared
|
|
if eb.Peek(EvtReadNew) {
|
|
t.Error("EvtReadNew should not be set yet")
|
|
}
|
|
|
|
// Make sure that event poller is finished
|
|
time.Sleep(readerPollIntervalMax)
|
|
|
|
// Restart event poller
|
|
reader.startEventPoller()
|
|
|
|
// Failing command
|
|
reader.fin(reader.readFromCommand(`no-such-command`))
|
|
strs = []string{}
|
|
if len(strs) > 0 {
|
|
t.Errorf("%s", strs)
|
|
}
|
|
|
|
// Check EventBox again
|
|
if eb.Peek(EvtReadNew) {
|
|
t.Error("Command failed. EvtReadNew should not be set")
|
|
}
|
|
if !eb.Peek(EvtReadFin) {
|
|
t.Error("EvtReadFin should be set")
|
|
}
|
|
}
|