github.com/jhump/golang-x-tools@v0.0.0-20220218190644-4958d6d39439/internal/lsp/debounce_test.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package lsp 6 7 import ( 8 "testing" 9 "time" 10 ) 11 12 func TestDebouncer(t *testing.T) { 13 t.Parallel() 14 15 type event struct { 16 key string 17 order uint64 18 wantFired bool 19 } 20 tests := []struct { 21 label string 22 events []*event 23 }{ 24 { 25 label: "overridden", 26 events: []*event{ 27 {key: "a", order: 1, wantFired: false}, 28 {key: "a", order: 2, wantFired: true}, 29 }, 30 }, 31 { 32 label: "distinct labels", 33 events: []*event{ 34 {key: "a", order: 1, wantFired: true}, 35 {key: "b", order: 2, wantFired: true}, 36 }, 37 }, 38 { 39 label: "reverse order", 40 events: []*event{ 41 {key: "a", order: 2, wantFired: true}, 42 {key: "a", order: 1, wantFired: false}, 43 }, 44 }, 45 { 46 label: "multiple overrides", 47 events: []*event{ 48 {key: "a", order: 1, wantFired: false}, 49 {key: "a", order: 2, wantFired: false}, 50 {key: "a", order: 3, wantFired: false}, 51 {key: "a", order: 4, wantFired: false}, 52 {key: "a", order: 5, wantFired: true}, 53 }, 54 }, 55 } 56 for _, test := range tests { 57 test := test 58 t.Run(test.label, func(t *testing.T) { 59 d := newDebouncer() 60 61 delays := make([]chan time.Time, len(test.events)) 62 okcs := make([]<-chan bool, len(test.events)) 63 64 // Register the events in deterministic order, synchronously. 65 for i, e := range test.events { 66 delays[i] = make(chan time.Time, 1) 67 okcs[i] = d.debounce(e.key, e.order, delays[i]) 68 } 69 70 // Now see which event fired. 71 for i, okc := range okcs { 72 event := test.events[i] 73 delays[i] <- time.Now() 74 fired := <-okc 75 if fired != event.wantFired { 76 t.Errorf("[key: %q, order: %d]: fired = %t, want %t", event.key, event.order, fired, event.wantFired) 77 } 78 } 79 }) 80 } 81 }