Hi

This patch goes directly on top of current master. (I came into
conclusion that it is better to have some tests, before actually doing
such a big change as switching buffer management to piece table or gap
buffer. So I will rebase, fix, rework, etc etc... and hopefully
resubmit those when Im entirely sure its the way to go.)

Test file integrity after load, move, delete and save+exit. Drawing
of buffer is not tested yet.

Added -s script option, accept file that is run as startup script of
commands. File is parsed byte at time and handled as you had typed it.
If EOF has been reached without editor close command, editing is
continued normally using keyboard. This functionality is in vim and
neovim, but not in POSIX vi standard. nvi (vi used in some macs) has
-s with different meaning...

Some simple tests added, dw last line test fails, so test is disabled.

-Jarno
From bed6a72ff0ccb08499398402fd16b52baa1d91b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jarno=20M=C3=A4kip=C3=A4=C3=A4?= <[email protected]>
Date: Sat, 25 Jan 2020 20:16:49 +0200
Subject: [PATCH] vi: Add tests

Test file integrity after load, move, delete and save+exit. Drawing
of buffer is not tested yet.

Added -s script option, accept file that is run as startup script of
commands. File is parsed byte at time and handled as you had typed it.
If EOF has been reached without editor close command, editing is
continued normally using keyboard. This functionality is in vim and
neovim, but not in POSIX vi standard. nvi (vi used in some macs) has
-s with different meaning...

Some simple tests added, dw last line test fails, so test is disabled.
---
 tests/files/vi/D_first.in         |  3 ++
 tests/files/vi/D_last.in          |  4 ++
 tests/files/vi/ascii.txt          |  4 ++
 tests/files/vi/ascii_D_first.out  |  4 ++
 tests/files/vi/ascii_D_last.out   |  4 ++
 tests/files/vi/ascii_dd_first.out |  3 ++
 tests/files/vi/ascii_dd_last.out  |  3 ++
 tests/files/vi/ascii_dw_first.out |  4 ++
 tests/files/vi/ascii_dw_last.out  |  4 ++
 tests/files/vi/dd_first.in        |  3 ++
 tests/files/vi/dd_last.in         |  4 ++
 tests/files/vi/dw_first.in        |  3 ++
 tests/files/vi/dw_last.in         |  6 +++
 tests/vi.test                     | 72 +++++++++++++++++++++++++++++++
 toys/pending/vi.c                 | 20 +++++++--
 15 files changed, 138 insertions(+), 3 deletions(-)
 create mode 100644 tests/files/vi/D_first.in
 create mode 100644 tests/files/vi/D_last.in
 create mode 100644 tests/files/vi/ascii.txt
 create mode 100644 tests/files/vi/ascii_D_first.out
 create mode 100644 tests/files/vi/ascii_D_last.out
 create mode 100644 tests/files/vi/ascii_dd_first.out
 create mode 100644 tests/files/vi/ascii_dd_last.out
 create mode 100644 tests/files/vi/ascii_dw_first.out
 create mode 100644 tests/files/vi/ascii_dw_last.out
 create mode 100644 tests/files/vi/dd_first.in
 create mode 100644 tests/files/vi/dd_last.in
 create mode 100644 tests/files/vi/dw_first.in
 create mode 100644 tests/files/vi/dw_last.in
 create mode 100644 tests/vi.test

diff --git a/tests/files/vi/D_first.in b/tests/files/vi/D_first.in
new file mode 100644
index 00000000..0e3ce347
--- /dev/null
+++ b/tests/files/vi/D_first.in
@@ -0,0 +1,3 @@
+D
+:wq
+
diff --git a/tests/files/vi/D_last.in b/tests/files/vi/D_last.in
new file mode 100644
index 00000000..355c8c4f
--- /dev/null
+++ b/tests/files/vi/D_last.in
@@ -0,0 +1,4 @@
+G
+D
+:wq
+
diff --git a/tests/files/vi/ascii.txt b/tests/files/vi/ascii.txt
new file mode 100644
index 00000000..ee9f73ba
--- /dev/null
+++ b/tests/files/vi/ascii.txt
@@ -0,0 +1,4 @@
+abc def hij
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_D_first.out b/tests/files/vi/ascii_D_first.out
new file mode 100644
index 00000000..83a48a25
--- /dev/null
+++ b/tests/files/vi/ascii_D_first.out
@@ -0,0 +1,4 @@
+
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_D_last.out b/tests/files/vi/ascii_D_last.out
new file mode 100644
index 00000000..ee9f73ba
--- /dev/null
+++ b/tests/files/vi/ascii_D_last.out
@@ -0,0 +1,4 @@
+abc def hij
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_dd_first.out b/tests/files/vi/ascii_dd_first.out
new file mode 100644
index 00000000..3361750a
--- /dev/null
+++ b/tests/files/vi/ascii_dd_first.out
@@ -0,0 +1,3 @@
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_dd_last.out b/tests/files/vi/ascii_dd_last.out
new file mode 100644
index 00000000..dd43ed6d
--- /dev/null
+++ b/tests/files/vi/ascii_dd_last.out
@@ -0,0 +1,3 @@
+abc def hij
+klm nop qrs
+tuv wxy z
diff --git a/tests/files/vi/ascii_dw_first.out b/tests/files/vi/ascii_dw_first.out
new file mode 100644
index 00000000..400e1cb1
--- /dev/null
+++ b/tests/files/vi/ascii_dw_first.out
@@ -0,0 +1,4 @@
+def hij
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/ascii_dw_last.out b/tests/files/vi/ascii_dw_last.out
new file mode 100644
index 00000000..ee9f73ba
--- /dev/null
+++ b/tests/files/vi/ascii_dw_last.out
@@ -0,0 +1,4 @@
+abc def hij
+klm nop qrs
+tuv wxy z
+
diff --git a/tests/files/vi/dd_first.in b/tests/files/vi/dd_first.in
new file mode 100644
index 00000000..e1a138b8
--- /dev/null
+++ b/tests/files/vi/dd_first.in
@@ -0,0 +1,3 @@
+dd
+:wq
+
diff --git a/tests/files/vi/dd_last.in b/tests/files/vi/dd_last.in
new file mode 100644
index 00000000..821e7bf4
--- /dev/null
+++ b/tests/files/vi/dd_last.in
@@ -0,0 +1,4 @@
+G
+dd
+:wq
+
diff --git a/tests/files/vi/dw_first.in b/tests/files/vi/dw_first.in
new file mode 100644
index 00000000..919e2aad
--- /dev/null
+++ b/tests/files/vi/dw_first.in
@@ -0,0 +1,3 @@
+dw
+:wq
+
diff --git a/tests/files/vi/dw_last.in b/tests/files/vi/dw_last.in
new file mode 100644
index 00000000..dc69492f
--- /dev/null
+++ b/tests/files/vi/dw_last.in
@@ -0,0 +1,6 @@
+G
+$
+b
+dw
+:wq
+
diff --git a/tests/vi.test b/tests/vi.test
new file mode 100644
index 00000000..1c6ff241
--- /dev/null
+++ b/tests/vi.test
@@ -0,0 +1,72 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/dd_first.in cmd.txt
+cp $FILES/vi/ascii_dd_first.out out.txt
+
+
+testing "dd first line ascii" \
+  "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown 
+rm in.txt cmd.txt out.txt
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/dd_last.in cmd.txt
+cp $FILES/vi/ascii_dd_last.out out.txt
+
+testing "dd last line ascii" \
+  "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown 
+rm in.txt cmd.txt out.txt
+
+
+## setup
+#cp $FILES/vi/ascii.txt in.txt
+#cp $FILES/vi/dw_last.in cmd.txt
+#cp $FILES/vi/ascii_dw_last.out out.txt
+#
+#testing "dw last line ascii" \
+#  "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+#
+## teardown 
+#rm in.txt cmd.txt out.txt
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/dw_first.in cmd.txt
+cp $FILES/vi/ascii_dw_first.out out.txt
+
+testing "dw first line ascii" \
+  "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown 
+rm in.txt cmd.txt out.txt
+
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/D_first.in cmd.txt
+cp $FILES/vi/ascii_D_first.out out.txt
+
+testing "D first line ascii" \
+  "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown 
+rm in.txt cmd.txt out.txt
+
+# setup
+cp $FILES/vi/ascii.txt in.txt
+cp $FILES/vi/D_last.in cmd.txt
+cp $FILES/vi/ascii_D_last.out out.txt
+
+testing "D last line ascii" \
+  "vi -s cmd.txt in.txt 1>/dev/null 2>/dev/null && cmp in.txt out.txt && echo yes" "yes\n" "" ""
+
+# teardown 
+rm in.txt cmd.txt out.txt
diff --git a/toys/pending/vi.c b/toys/pending/vi.c
index 9c47a4c5..a21867b2 100644
--- a/toys/pending/vi.c
+++ b/toys/pending/vi.c
@@ -5,13 +5,14 @@
  *
  * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html
 
-USE_VI(NEWTOY(vi, "<1>1", TOYFLAG_USR|TOYFLAG_BIN))
+USE_VI(NEWTOY(vi, ">1s:", TOYFLAG_USR|TOYFLAG_BIN))
 
 config VI
   bool "vi"
   default n
   help
-    usage: vi FILE
+    usage: vi [-s script] FILE
+    -s script: run script file
     Visual text editor. Predates the existence of standardized cursor keys,
     so the controls are weird and historical.
 */
@@ -20,6 +21,7 @@ config VI
 #include "toys.h"
 
 GLOBALS(
+    char *s;
     int cur_col;
     int cur_row;
     int scr_row;
@@ -885,6 +887,8 @@ void vi_main(void)
   char vi_buf[16] = {0};
   char utf8_code[8] = {0};
   int utf8_dec_p = 0, vi_buf_pos = 0;
+  FILE *script = 0;
+  if (FLAG(s)) script = fopen(TT.s, "r");
 
   TT.il = xzalloc(sizeof(struct str_line));
   TT.il->data = xzalloc(80);
@@ -912,7 +916,15 @@ void vi_main(void)
 
   draw_page();
   for (;;) {
-    int key = scan_key(keybuf, -1);
+    int key = 0;
+    if (script) {
+      key = fgetc(script);
+      if (key == EOF) {
+        fclose(script);
+        script = 0;
+        key = scan_key(keybuf, -1);
+      }
+    } else key = scan_key(keybuf, -1);
 
     if (key == -1) goto cleanup_vi;
 
@@ -983,6 +995,7 @@ void vi_main(void)
           TT.il->len = 0;
           memset(TT.il->data, 0, TT.il->alloc);
           break;
+        case 0x0A:
         case 0x0D:
           if (run_ex_cmd(TT.il->data) == -1)
             goto cleanup_vi;
@@ -1018,6 +1031,7 @@ void vi_main(void)
             TT.il->len -= shrink;
           }
           break;
+        case 0x0A:
         case 0x0D:
           //insert newline
           //
-- 
2.19.1

_______________________________________________
Toybox mailing list
[email protected]
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to