summaryrefslogtreecommitdiff
path: root/internal/viinput/model_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/viinput/model_test.go')
-rw-r--r--internal/viinput/model_test.go164
1 files changed, 164 insertions, 0 deletions
diff --git a/internal/viinput/model_test.go b/internal/viinput/model_test.go
index 9289854..dbbfe4b 100644
--- a/internal/viinput/model_test.go
+++ b/internal/viinput/model_test.go
@@ -124,6 +124,170 @@ func TestModelInsertModeEditing(t *testing.T) {
}
}
+func TestModelNormalModeDeletes(t *testing.T) {
+ t.Parallel()
+
+ tests := []struct {
+ name string
+ value string
+ cursor int
+ steps []string
+ wantValue string
+ wantCursor int
+ wantMode Mode
+ }{
+ {
+ name: "x deletes character at cursor",
+ value: "alpha beta",
+ cursor: 0,
+ steps: []string{"x"},
+ wantValue: "lpha beta",
+ wantCursor: 0,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "X deletes character before cursor",
+ value: "alpha beta",
+ cursor: 1,
+ steps: []string{"X"},
+ wantValue: "lpha beta",
+ wantCursor: 0,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "D deletes to line end",
+ value: "alpha beta",
+ cursor: 6,
+ steps: []string{"D"},
+ wantValue: "alpha ",
+ wantCursor: 6,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "dd clears line",
+ value: "alpha beta",
+ cursor: 4,
+ steps: []string{"d", "d"},
+ wantValue: "",
+ wantCursor: 0,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "dw deletes forward by word",
+ value: "alpha beta",
+ cursor: 0,
+ steps: []string{"d", "w"},
+ wantValue: "beta",
+ wantCursor: 0,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "de deletes to word end",
+ value: "alpha beta",
+ cursor: 0,
+ steps: []string{"d", "e"},
+ wantValue: " beta",
+ wantCursor: 0,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "db deletes backward by word",
+ value: "alpha beta",
+ cursor: 6,
+ steps: []string{"d", "b"},
+ wantValue: "beta",
+ wantCursor: 0,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "d0 deletes from line start",
+ value: "alpha beta",
+ cursor: 6,
+ steps: []string{"d", "0"},
+ wantValue: "beta",
+ wantCursor: 0,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "d$ deletes from cursor to line end",
+ value: "alpha beta",
+ cursor: 0,
+ steps: []string{"d", "$"},
+ wantValue: "",
+ wantCursor: 0,
+ wantMode: ModeNormal,
+ },
+ {
+ name: "C deletes to line end and enters insert mode",
+ value: "alpha beta",
+ cursor: 6,
+ steps: []string{"C"},
+ wantValue: "alpha ",
+ wantCursor: 6,
+ wantMode: ModeInsert,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
+
+ model := New()
+ model.Focus()
+ model.SetValue(tt.value)
+ model.mode = ModeNormal
+ model.cursor = tt.cursor
+
+ for _, step := range tt.steps {
+ model, _ = model.Update(key(step))
+ }
+
+ if got := model.Value(); got != tt.wantValue {
+ t.Fatalf("value = %q, want %q", got, tt.wantValue)
+ }
+ if got := model.cursor; got != tt.wantCursor {
+ t.Fatalf("cursor = %d, want %d", got, tt.wantCursor)
+ }
+ if got := model.Mode(); got != tt.wantMode {
+ t.Fatalf("mode = %v, want %v", got, tt.wantMode)
+ }
+ })
+ }
+}
+
+func TestModelUndoRestoresPriorState(t *testing.T) {
+ t.Parallel()
+
+ model := New()
+ model.Focus()
+ model.SetValue("alpha beta")
+ model.mode = ModeNormal
+ model.cursor = 0
+
+ model, _ = model.Update(key("x"))
+ model, _ = model.Update(key("u"))
+ if got := model.Value(); got != "alpha beta" {
+ t.Fatalf("undo after x value = %q, want %q", got, "alpha beta")
+ }
+ if got := model.cursor; got != 0 {
+ t.Fatalf("undo after x cursor = %d, want 0", got)
+ }
+
+ model, _ = model.Update(key("d"))
+ model, _ = model.Update(key("w"))
+ if got := model.Value(); got != "beta" {
+ t.Fatalf("dw value = %q, want %q", got, "beta")
+ }
+
+ model, _ = model.Update(key("u"))
+ if got := model.Value(); got != "alpha beta" {
+ t.Fatalf("undo after dw value = %q, want %q", got, "alpha beta")
+ }
+ if got := model.cursor; got != 0 {
+ t.Fatalf("undo after dw cursor = %d, want 0", got)
+ }
+}
+
func key(value string) tea.KeyPressMsg {
return tea.KeyPressMsg{Code: 0, Text: value}
}