From 820a6c24627344d495ecffe611d6532953aba84d Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Tue, 16 Sep 2025 01:25:27 +0100 Subject: [PATCH] copy new file order from shf.mlb to shf-tests.mlb, and remove split-string tests because we have tried to refactor string-search logic to be separate from the data structure --- fcore/app-with.sml | 2 + shf-tests.mlb | 16 +- test/normal-move.sml | 355 ------------------------------------------- 3 files changed, 13 insertions(+), 360 deletions(-) diff --git a/fcore/app-with.sml b/fcore/app-with.sml index 5e81dcc..1412380 100644 --- a/fcore/app-with.sml +++ b/fcore/app-with.sml @@ -15,6 +15,7 @@ struct , windowWidth , windowHeight , msgs + , visualScrollColumn , cursorIdx = _ } = app in @@ -27,6 +28,7 @@ struct , windowWidth = windowWidth , windowHeight = windowHeight , msgs = msgs + , visualScrollColumn = visualScrollColumn , cursorIdx = newIdx } end diff --git a/shf-tests.mlb b/shf-tests.mlb index 6a619bf..b007167 100644 --- a/shf-tests.mlb +++ b/shf-tests.mlb @@ -3,11 +3,12 @@ $(SML_LIB)/basis/basis.mlb (* LIBRARIES *) lib/brolib-sml/src/line_gap.sml lib/brolib-sml/src/gap_set.sml -lib/cozette-sml/fonts/cozette-ascii.mlb +lib/cozette-sml/fonts-with-z-index/cozette-ascii.mlb (* FUNCTIONAL CORE *) message-types/input-msg.sml message-types/draw-msg.sml +message-types/search-msg.sml message-types/mailbox-type.sml ann @@ -29,16 +30,21 @@ fcore/text-constants.sml ann "allowVectorExps true" in - fcore/rect.sml - fcore/pipe-cursor.sml - fcore/text-builder.sml fcore/cursor-dfa/make-dfa-loop.sml fcore/cursor-dfa/vi-word-dfa.sml fcore/cursor-dfa/vi-caps-word-dfa.sml fcore/cursor-dfa/vi-dlr-dfa.sml + fcore/rect.sml + fcore/pipe-cursor.sml end +fcore/text-builder/text-builder-utils.sml +fcore/text-builder/text-builder-with-cursor.sml +fcore/text-builder/text-builder-with-highlight.sml +fcore/text-builder/normal-mode-text-builder.sml +fcore/text-builder/search-bar.sml + fcore/cursor.sml -fcore/text-window.sml +fcore/text-scroll.sml fcore/normal-mode/normal-finish.sml fcore/normal-mode/normal-search-finish.sml diff --git a/test/normal-move.sml b/test/normal-move.sml index 1535126..be9d427 100644 --- a/test/normal-move.sml +++ b/test/normal-move.sml @@ -4,47 +4,6 @@ struct open Railroad.Test open InputMsg - local - fun helpCountLineBreaks (pos, acc, str) = - if pos < 0 then - Vector.fromList acc - else - let - val chr = String.sub (str, pos) - in - if chr = #"\n" then - (* Is this a \r\n pair? Then the position of \r should be consed. *) - if pos = 0 then - Vector.fromList (0 :: acc) - else - let - val prevChar = String.sub (str, pos - 1) - in - if prevChar = #"\r" then - helpCountLineBreaks (pos - 2, (pos - 1) :: acc, str) - else - helpCountLineBreaks (pos - 1, pos :: acc, str) - end - else if chr = #"\r" then - helpCountLineBreaks (pos - 1, pos :: acc, str) - else - helpCountLineBreaks (pos - 1, acc, str) - end - - fun countLineBreaks str = - helpCountLineBreaks (String.size str - 1, [], str) - in - (* creates a LineGap.t with valid metadata from a list of strings *) - fun fromList lst = - { idx = 0 - , line = 0 - , leftStrings = [] - , leftLines = [] - , rightStrings = lst - , rightLines = List.map countLineBreaks lst - } - end - fun getChr (app: AppType.app_type) = let val {cursorIdx, buffer, ...} = app @@ -68,20 +27,6 @@ struct (* assert *) Expect.isTrue (cursorIdx = 0) end) - , test "moves cursor left by one in split string when cursorIdx > 0" - (fn _ => - let - (* arrange *) - val buffer = fromList ["hello", " world"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 5) - - (* act *) - val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"h") - in - (* assert *) - Expect.isTrue (cursorIdx = 4) - end) , test "does not move cursor when cursorIdx = 0" (fn _ => let (* arrange *) @@ -103,20 +48,6 @@ struct val app = TestUtils.init buffer val app = AppWith.idx (app, 6) - (* act *) - val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"h") - in - (* assert *) - Expect.isTrue (cursorIdx = 4) - end) - , test "moves cursor left by two in split string when prev chr is \\n" - (fn _ => - let - (* arrange *) - val buffer = fromList ["hello\n", " world"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 6) - (* act *) val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"h") in @@ -135,20 +66,6 @@ struct val app = TestUtils.init buffer val {cursorIdx = oldCursorIdx, ...} = app - (* act *) - val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"l") - in - (* assert *) - Expect.isTrue (oldCursorIdx = 0 andalso cursorIdx = 1) - end) - , test "moves cursor right by one in split string when cursorIdx < length" - (fn _ => - let - (* arrange *) - val buffer = fromList ["hello ", "world"] - val app = TestUtils.init buffer - val {cursorIdx = oldCursorIdx, ...} = app - (* act *) val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"l") in @@ -177,20 +94,6 @@ struct val app = TestUtils.init buffer val app = AppWith.idx (app, 4) - (* act *) - val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"l") - in - (* assert *) - Expect.isTrue (cursorIdx = 6) - end) - , test "moves right by two in split string when char is followed by \\n" - (fn _ => - let - (* arrange *) - val buffer = fromList ["hello\n", "world"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 4) - (* act *) val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"l") in @@ -216,26 +119,6 @@ struct val app2 = TestUtils.update (app1, CHAR_EVENT #"j") val app3 = TestUtils.update (app2, CHAR_EVENT #"j") - (* assert *) - val c1 = getChr app1 = #"w" - val c2 = getChr app2 = #"g" - val c3 = getChr app3 = #"q" - in - Expect.isTrue (c1 andalso c2 andalso c3) - end) - , test "moves cursur down one column in split string when column = 0" - (fn _ => - let - (* arrange *) - val buffer = - fromList ["hello \n", "world \n", "goodbye \n", "qorld"] - val app = TestUtils.init buffer - - (* act *) - val app1 = TestUtils.update (app, CHAR_EVENT #"j") - val app2 = TestUtils.update (app1, CHAR_EVENT #"j") - val app3 = TestUtils.update (app2, CHAR_EVENT #"j") - (* assert *) val c1 = getChr app1 = #"w" val c2 = getChr app2 = #"g" @@ -256,27 +139,6 @@ struct val app2 = TestUtils.update (app1, CHAR_EVENT #"j") val app3 = TestUtils.update (app2, CHAR_EVENT #"j") - (* assert *) - val c1 = getChr app1 = #"o" - val c2 = getChr app2 = #"y" - val c3 = getChr app3 = #"r" - in - Expect.isTrue (c1 andalso c2 andalso c3) - end) - , test "moves cursur down one column in split string when column = 1" - (fn _ => - let - (* arrange *) - val buffer = - fromList ["hello \n", "world ", "\nb", "ye \nfriends \n"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 1) - - (* act *) - val app1 = TestUtils.update (app, CHAR_EVENT #"j") - val app2 = TestUtils.update (app1, CHAR_EVENT #"j") - val app3 = TestUtils.update (app2, CHAR_EVENT #"j") - (* assert *) val c1 = getChr app1 = #"o" val c2 = getChr app2 = #"y" @@ -297,27 +159,6 @@ struct val app2 = TestUtils.update (app1, CHAR_EVENT #"j") val app3 = TestUtils.update (app2, CHAR_EVENT #"j") - (* assert *) - val c1 = getChr app1 = #"r" - val c2 = getChr app2 = #"e" - val c3 = getChr app3 = #"i" - in - Expect.isTrue (c1 andalso c2 andalso c3) - end) - , test "moves cursur down one column in split string when column = 2" - (fn _ => - let - (* arrange *) - val buffer = - fromList ["hello \n", "world ", "\nb", "ye \nfriends \n"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 2) - - (* act *) - val app1 = TestUtils.update (app, CHAR_EVENT #"j") - val app2 = TestUtils.update (app1, CHAR_EVENT #"j") - val app3 = TestUtils.update (app2, CHAR_EVENT #"j") - (* assert *) val c1 = getChr app1 = #"r" val c2 = getChr app2 = #"e" @@ -404,25 +245,6 @@ struct in Expect.isTrue (c1 andalso c2 andalso c3) end) - , test "moves cursur up one column in split string when column = 0" (fn _ => - let - (* arrange *) - val buffer = fromList ["0__", "\n4__", "_\n9_", "__\n14_"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 14) - - (* act *) - val app1 = TestUtils.update (app, CHAR_EVENT #"k") - val app2 = TestUtils.update (app1, CHAR_EVENT #"k") - val app3 = TestUtils.update (app2, CHAR_EVENT #"k") - - (* assert *) - val c1 = getChr app1 = #"9" - val c2 = getChr app2 = #"4" - val c3 = getChr app3 = #"0" - in - Expect.isTrue (c1 andalso c2 andalso c3) - end) , test "moves cursur up one column in contiguous string when column = 1" (fn _ => let @@ -443,25 +265,6 @@ struct in Expect.isTrue (c1 andalso c2 andalso c3) end) - , test "moves cursur up one column in split string when column = 1" (fn _ => - let - (* arrange *) - val buffer = fromList ["_w_\n", "_5__", "\n_10_\n", "_15"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 15) - - (* act *) - val app1 = TestUtils.update (app, CHAR_EVENT #"k") - val app2 = TestUtils.update (app1, CHAR_EVENT #"k") - val app3 = TestUtils.update (app2, CHAR_EVENT #"k") - - (* assert *) - val c1 = getChr app1 = #"1" - val c2 = getChr app2 = #"5" - val c3 = getChr app3 = #"w" - in - Expect.isTrue (c1 andalso c2 andalso c3) - end) , test "moves cursur up one column in contiguous string when column = 2" (fn _ => let @@ -482,25 +285,6 @@ struct in Expect.isTrue (c1 andalso c2 andalso c3) end) - , test "moves cursur up one column in split string when column = 2" (fn _ => - let - (* arrange *) - val buffer = fromList ["__", "2\n", "__6", "\n__10", "\n__1", "5\n"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 15) - - (* act *) - val app1 = TestUtils.update (app, CHAR_EVENT #"k") - val app2 = TestUtils.update (app1, CHAR_EVENT #"k") - val app3 = TestUtils.update (app2, CHAR_EVENT #"k") - - (* assert *) - val c1 = getChr app1 = #"1" - val c2 = getChr app2 = #"6" - val c3 = getChr app3 = #"2" - in - Expect.isTrue (c1 andalso c2 andalso c3) - end) , test "skips '\\n' when cursor is on '\\n',\ \prev-char is '\\n' and prev-prev char is not '\\n'" @@ -568,20 +352,6 @@ struct (* act *) val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"w") - (* assert *) - val chr = String.sub ("hello world", cursorIdx) - in - Expect.isTrue (chr = #"w") - end) - , test "moves cursor to start of next word in split string" (fn _ => - let - (* arrange *) - val buffer = fromList ["hello ", "world"] - val app = TestUtils.init buffer - - (* act *) - val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"w") - (* assert *) val chr = String.sub ("hello world", cursorIdx) in @@ -718,20 +488,6 @@ struct (* act *) val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"W") - (* assert *) - val chr = String.sub ("hello world", cursorIdx) - in - Expect.isTrue (chr = #"w") - end) - , test "moves cursor to start of next WORD in split string" (fn _ => - let - (* arrange *) - val buffer = fromList ["hello ", "world"] - val app = TestUtils.init buffer - - (* act *) - val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"W") - (* assert *) val chr = String.sub ("hello world", cursorIdx) in @@ -833,22 +589,6 @@ struct Expect.isTrue (getChr app = #"o") end) , test - "moves cursor to last alphanumeric char in split string\ - \when in alphanumeric word and there is at least one\ - \alphanumeric char after cursor" - (fn _ => - let - (* arrange *) - val buffer = fromList ["hello ", "world", "\n"] - val app = TestUtils.init buffer - - (* act *) - val app = TestUtils.update (app, CHAR_EVENT #"e") - in - (* assert *) - Expect.isTrue (getChr app = #"o") - end) - , test "moves cursor to last punctuation char in contiguous string\ \when in punctuation word and there is at least one\ \punctuation char after cursor" @@ -865,22 +605,6 @@ struct Expect.isTrue (getChr app = #"^") end) , test - "moves cursor to last punctuation char in split string\ - \when in punctuation word and there is at least one\ - \punctuation char after cursor" - (fn _ => - let - (* arrange *) - val buffer = fromList ["#$", "%!^ ", "world", "\n"] - val app = TestUtils.init buffer - - (* act *) - val app = TestUtils.update (app, CHAR_EVENT #"e") - in - (* assert *) - Expect.isTrue (getChr app = #"^") - end) - , test "moves cursor to last char of next word,\ \when cursor is on last char of current word" (fn _ => @@ -1017,18 +741,6 @@ struct (* assert *) Expect.isTrue (getChr app = #"o") end) - , test "moves cursor to last char in WORD when in split string" (fn _ => - let - (* arrange *) - val buffer = fromList ["hel", "!!!", "lo ", "world", "\n"] - val app = TestUtils.init buffer - - (* act *) - val app = TestUtils.update (app, CHAR_EVENT #"E") - in - (* assert *) - Expect.isTrue (getChr app = #"o") - end) , test "moves cursor to last char of next WORD,\ \when cursor is on last char of current WORD" @@ -1326,19 +1038,6 @@ struct val app = TestUtils.init buffer val app = AppWith.idx (app, 7) - (* act *) - val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"0") - in - (* assert *) - Expect.isTrue (cursorIdx = 0) - end) - , test "moves cursor to 0 in split string when on first line" (fn _ => - let - (* arrange *) - val buffer = fromList ["hel", "lo ", "w7r", "ld\n"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 7) - (* act *) val {cursorIdx, ...} = TestUtils.update (app, CHAR_EVENT #"0") in @@ -1386,27 +1085,6 @@ struct (* act *) val app = TestUtils.update (app, CHAR_EVENT #"0") - (* assert *) - val chr = getChr app - in - (* assert *) - Expect.isTrue (chr = #"#") - end) - , test - "moves cursor to first char after '\\n' in split string\ - \when cursor is after first line" - (fn _ => - let - (* arrange *) - val buffer = fromList - ["hel", "lo ", "wor", "ld\n", "#el", "lo ", "aga", "in\n"] - val buffer = LineGap.fromString "hello world\n#ello again\n" - val app = TestUtils.init buffer - val app = AppWith.idx (app, 21) - - (* act *) - val app = TestUtils.update (app, CHAR_EVENT #"0") - (* assert *) val chr = getChr app in @@ -1422,18 +1100,6 @@ struct val buffer = LineGap.fromString "hello wor9\n" val app = TestUtils.init buffer - (* act *) - val app = TestUtils.update (app, CHAR_EVENT #"$") - in - (* assert *) - Expect.isTrue (getChr app = #"9") - end) - , test "moves cursor to char before '\\n' in split string" (fn _ => - let - (* arrange *) - val buffer = fromList ["hel", "lo ", " wor9\n"] - val app = TestUtils.init buffer - (* act *) val app = TestUtils.update (app, CHAR_EVENT #"$") in @@ -1455,27 +1121,6 @@ struct val app = TestUtils.update (app, CHAR_EVENT #"$") val newIdx = #cursorIdx app - val nchr = getChr app - val nchr = Char.toString nchr ^ "\n" - in - (* assert *) - Expect.isTrue (oldIdx = newIdx) - end) - , test - "leaves cursor at same idx in split string\ - \when char after cursor is '\\n'" - (fn _ => - let - (* arrange *) - val buffer = fromList ["hel", "lo\n", " wo", "rld", "\n"] - val app = TestUtils.init buffer - val app = AppWith.idx (app, 11) - val oldIdx = #cursorIdx app - - (* act *) - val app = TestUtils.update (app, CHAR_EVENT #"$") - val newIdx = #cursorIdx app - val nchr = getChr app val nchr = Char.toString nchr ^ "\n" in