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