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 }