github.com/ladydascalie/elvish@v0.0.0-20170703214355-2964dd3ece7f/edit/history/walker_test.go (about)

     1  package history
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	"github.com/elves/elvish/store/storedefs"
     8  )
     9  
    10  func TestWalker(t *testing.T) {
    11  	mockError := errors.New("mock error")
    12  	walkerStore := &mockStore{
    13  		//              0       1        2         3        4         5
    14  		cmds: []string{"echo", "ls -l", "echo a", "ls -a", "echo a", "ls a"},
    15  	}
    16  
    17  	var w *Walker
    18  
    19  	// Going back and forth.
    20  	w = NewWalker(walkerStore, -1, nil, nil, "")
    21  	wantCurrent(t, w, -1, "")
    22  	wantCmd(t, w.Prev, 5, "ls a")
    23  	wantCurrent(t, w, 5, "ls a")
    24  	wantErr(t, w.Next, ErrEndOfHistory)
    25  	wantErr(t, w.Next, ErrEndOfHistory)
    26  	wantCmd(t, w.Prev, 5, "ls a")
    27  
    28  	wantCmd(t, w.Prev, 4, "echo a")
    29  	wantCmd(t, w.Next, 5, "ls a")
    30  	wantCmd(t, w.Prev, 4, "echo a")
    31  
    32  	wantCmd(t, w.Prev, 3, "ls -a")
    33  	// "echo a" should be skipped
    34  	wantCmd(t, w.Prev, 1, "ls -l")
    35  	wantCmd(t, w.Prev, 0, "echo")
    36  	wantErr(t, w.Prev, ErrEndOfHistory)
    37  
    38  	// With an upper bound on the storage.
    39  	w = NewWalker(walkerStore, 2, nil, nil, "")
    40  	wantCmd(t, w.Prev, 1, "ls -l")
    41  	wantCmd(t, w.Prev, 0, "echo")
    42  	wantErr(t, w.Prev, ErrEndOfHistory)
    43  
    44  	// Prefix matching 1.
    45  	w = NewWalker(walkerStore, -1, nil, nil, "echo")
    46  	if w.Prefix() != "echo" {
    47  		t.Errorf("got prefix %q, want %q", w.Prefix(), "echo")
    48  	}
    49  	wantCmd(t, w.Prev, 4, "echo a")
    50  	wantCmd(t, w.Prev, 0, "echo")
    51  	wantErr(t, w.Prev, ErrEndOfHistory)
    52  
    53  	// Prefix matching 2.
    54  	w = NewWalker(walkerStore, -1, nil, nil, "ls")
    55  	wantCmd(t, w.Prev, 5, "ls a")
    56  	wantCmd(t, w.Prev, 3, "ls -a")
    57  	wantCmd(t, w.Prev, 1, "ls -l")
    58  	wantErr(t, w.Prev, ErrEndOfHistory)
    59  
    60  	// Walker with session history.
    61  	w = NewWalker(walkerStore, -1,
    62  		[]string{"ls -l", "ls -v", "echo haha"}, []int{7, 10, 12}, "ls")
    63  	wantCmd(t, w.Prev, 10, "ls -v")
    64  
    65  	wantCmd(t, w.Prev, 7, "ls -l")
    66  	wantCmd(t, w.Next, 10, "ls -v")
    67  	wantCmd(t, w.Prev, 7, "ls -l")
    68  
    69  	wantCmd(t, w.Prev, 5, "ls a")
    70  	wantCmd(t, w.Next, 7, "ls -l")
    71  	wantCmd(t, w.Prev, 5, "ls a")
    72  
    73  	wantCmd(t, w.Prev, 3, "ls -a")
    74  	wantErr(t, w.Prev, ErrEndOfHistory)
    75  
    76  	// Backend error.
    77  	w = NewWalker(walkerStore, -1, nil, nil, "")
    78  	wantCmd(t, w.Prev, 5, "ls a")
    79  	wantCmd(t, w.Prev, 4, "echo a")
    80  	walkerStore.oneOffError = mockError
    81  	wantErr(t, w.Prev, mockError)
    82  
    83  	// storedefs.ErrNoMatchingCmd is turned into ErrEndOfHistory.
    84  	w = NewWalker(walkerStore, -1, nil, nil, "")
    85  	walkerStore.oneOffError = storedefs.ErrNoMatchingCmd
    86  	wantErr(t, w.Prev, ErrEndOfHistory)
    87  }
    88  
    89  func wantCurrent(t *testing.T, w *Walker, wantSeq int, wantCmd string) {
    90  	seq, cmd := w.CurrentSeq(), w.CurrentCmd()
    91  	if seq != wantSeq {
    92  		t.Errorf("got seq %d, want %d", seq, wantSeq)
    93  	}
    94  	if cmd != wantCmd {
    95  		t.Errorf("got cmd %q, want %q", cmd, wantCmd)
    96  	}
    97  }
    98  
    99  func wantCmd(t *testing.T, f func() (int, string, error), wantSeq int, wantCmd string) {
   100  	seq, cmd, err := f()
   101  	if seq != wantSeq {
   102  		t.Errorf("got seq %d, want %d", seq, wantSeq)
   103  	}
   104  	if cmd != wantCmd {
   105  		t.Errorf("got cmd %q, want %q", cmd, wantCmd)
   106  	}
   107  	if err != nil {
   108  		t.Errorf("got err %v, want nil", err)
   109  	}
   110  }
   111  
   112  func wantErr(t *testing.T, f func() (int, string, error), want error) {
   113  	_, _, err := f()
   114  	if err != want {
   115  		t.Errorf("got err %v, want %v", err, want)
   116  	}
   117  }