mirror of
https://github.com/go-sylixos/elvish.git
synced 2024-12-14 19:27:58 +08:00
newedit/highlight: Test that out-of-order updates are dropped correctly.
This package now has 100% test coverage!
This commit is contained in:
parent
10ef6ccc5f
commit
c47df5ea18
|
@ -107,6 +107,61 @@ func TestHighlighter_HasCommand_LateResult(t *testing.T) {
|
||||||
&styled.Segment{styled.Style{Foreground: "red"}, "echo"}})
|
&styled.Segment{styled.Style{Foreground: "red"}, "echo"}})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// The delay to deliver the result for the first highlight after the second
|
||||||
|
// highlight has been requested.
|
||||||
|
hlDelay = 10 * time.Millisecond
|
||||||
|
// The duration to wait to make sure that the first highlight has completed
|
||||||
|
// and there is nothing delivered on LateUpdates. The test will wait this
|
||||||
|
// long to make sure that the late update is dropped, so it shouldn't be too
|
||||||
|
// large.
|
||||||
|
hlWait = 50 * time.Millisecond
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHighlighter_HasCommand_LateResultOutOfOrder(t *testing.T) {
|
||||||
|
// When late results are delivered out of order, the ones that do not match
|
||||||
|
// the current code are dropped. In this test, hl.Get is called with "l"
|
||||||
|
// first and then "ls". The late result for "l" is delivered after that of
|
||||||
|
// "ls" and is dropped.
|
||||||
|
|
||||||
|
hlSecond := make(chan struct{})
|
||||||
|
hl := NewHighlighter(Dep{
|
||||||
|
HasCommand: func(cmd string) bool {
|
||||||
|
if cmd == "l" {
|
||||||
|
// Make sure that the second highlight has been requested before
|
||||||
|
// returning.
|
||||||
|
<-hlSecond
|
||||||
|
time.Sleep(hlDelay)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
close(hlSecond)
|
||||||
|
return cmd == "ls"
|
||||||
|
}})
|
||||||
|
|
||||||
|
hl.Get("l")
|
||||||
|
|
||||||
|
initial, _ := hl.Get("ls")
|
||||||
|
late := <-hl.LateUpdates()
|
||||||
|
|
||||||
|
wantInitial := styled.Unstyled("ls")
|
||||||
|
wantLate := styled.Text{
|
||||||
|
&styled.Segment{styled.Style{Foreground: "green"}, "ls"}}
|
||||||
|
if !reflect.DeepEqual(wantInitial, initial) {
|
||||||
|
t.Errorf("want %v from initial Get, got %v", wantInitial, initial)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(wantLate, late) {
|
||||||
|
t.Errorf("want %v from late Get, got %v", wantLate, late)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that no more late updates are delivered.
|
||||||
|
select {
|
||||||
|
case late := <-hl.LateUpdates():
|
||||||
|
t.Errorf("want nothing from LateUpdates, got %v", late)
|
||||||
|
case <-time.After(hlWait):
|
||||||
|
// No late updates; test passed.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Matchers.
|
// Matchers.
|
||||||
|
|
||||||
type anyMatcher struct{}
|
type anyMatcher struct{}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user