github.com/zaolin/u-root@v0.0.0-20200428085104-64aaafd46c6d/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  }