github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/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  }