commit 82ecd977873a23eab49778e6ab66f2a0bac88b31
parent f7a2132a90c708d05f4ca5d06f5f84cd5031a34f
Author: Andrew Laack <andrew@laack.co>
Date: Tue, 1 Sep 2026 17:44:41 -0500
Basic testing in place for line-based parsing.
Diffstat:
4 files changed, 98 insertions(+), 19 deletions(-)
diff --git a/learning/lib/parser.ml b/learning/lib/parser.ml
@@ -19,7 +19,7 @@ let line_format_map format =
| HeaderL1 -> "HeaderL1", 2
| HeaderL2 -> "HeaderL2", 3
| HeaderL3 -> "HeaderL3", 4
- | Embedded -> "Embedded", 3
+ | Embedded -> "Embedded", 4
| Preformatted -> "Preformatted", 0
| Hidden -> "Hidden", 3
| Quote -> "Quote", 2
@@ -56,7 +56,8 @@ let is_link line preformatted =
if not preformatted && not (is_embedded_link line preformatted) && String.length(line) > 2 && line.[0] = '=' && line.[1] = '>' && line.[2] = ' ' then true else false
let header_count line preformatted =
- if not preformatted then Basic_functions.count_prefix '#' line else 0
+ let count = Basic_functions.count_prefix '#' line in
+ if not preformatted && String.length line > count && line.[count] = ' ' then count else 0
let is_h1 line preformatted = header_count line preformatted = 1 (* TODO: Make this more consistent with the others *)
let is_h2 line preformatted = header_count line preformatted = 2
@@ -110,16 +111,3 @@ let read_simple_learning_file fileName =
close_in_noerr ic;
if String.length acc != 0 then parse_simple_line acc true :: [] else []
in readAll false ""
-
-let readFile fileName =
- let ic = open_in fileName in
- let rec readAll acc =
- try
- readAll (acc ^ ((input_line ic)) ^ "\n")
- with End_of_file ->
- close_in_noerr ic;
- acc
- in readAll ""
-
-let get_pages page_arr =
- readFile page_arr.(0)
diff --git a/learning/test/test_learning.ml b/learning/test/test_learning.ml
@@ -1,4 +1 @@
-open Learning
-
-let () = assert (Parser.is_preformatted "" true)
-let () = assert (not (Parser.is_preformatted "" false))
+let () = Test_line_parsing.test_line_parsing ()
diff --git a/learning/test/test_line_parsing.ml b/learning/test/test_line_parsing.ml
@@ -0,0 +1,90 @@
+open Learning
+
+let test_line_parsing () =
+ assert (Parser.is_preformatted "" true);
+ assert (not (Parser.is_preformatted "" false));
+
+ (* Line-based type tests.*)
+ (* Only ``` is a format line, no additional characters.*)
+ assert (Parser.is_format_line "```");
+ assert (not (Parser.is_format_line "``` "));
+ assert (not (Parser.is_format_line "```a"));
+ assert (not (Parser.is_format_line "```0"));
+
+ (* Preformatted always overrides all line types *)
+ assert ((Parser.get_line_type "Test" true) = Preformatted);
+ assert ((Parser.get_line_type "# Test" true) = Preformatted);
+ assert ((Parser.get_line_type "## Test" true) = Preformatted);
+ assert ((Parser.get_line_type "### Test" true) = Preformatted);
+ assert ((Parser.get_line_type "=>e Test" true) = Preformatted);
+ assert ((Parser.get_line_type "```" true) = Preformatted);
+ assert ((Parser.get_line_type "?? Test" true) = Preformatted);
+ assert ((Parser.get_line_type "> Test" true) = Preformatted);
+ assert ((Parser.get_line_type "=> Test" true) = Preformatted);
+ assert ((Parser.get_line_type "* Test" true) = Preformatted);
+
+ (* Not preformatted, basic type assertions. *)
+ assert ((Parser.get_line_type "Test" false) = Normal);
+ assert ((Parser.get_line_type "# Test" false) = HeaderL1);
+ assert ((Parser.get_line_type "## Test" false) = HeaderL2);
+ assert ((Parser.get_line_type "### Test" false) = HeaderL3);
+ assert ((Parser.get_line_type "=>e Test" false) = Embedded);
+ assert ((Parser.get_line_type "?? Test" false) = Hidden);
+ assert ((Parser.get_line_type "> Test" false) = Quote);
+ assert ((Parser.get_line_type "=> Test" false) = Link);
+ assert ((Parser.get_line_type "* Test" false) = ListItem);
+
+ (* Special lines missing expected spacing *)
+ assert ((Parser.get_line_type "Test" false) = Normal);
+ assert ((Parser.get_line_type "#Test" false) = Normal);
+ assert ((Parser.get_line_type "##Test" false) = Normal);
+ assert ((Parser.get_line_type "###Test" false) = Normal);
+ assert ((Parser.get_line_type "=>eTest" false) = Normal);
+ assert ((Parser.get_line_type "??Test" false) = Normal);
+ assert ((Parser.get_line_type ">Test" false) = Normal);
+ assert ((Parser.get_line_type "=>Test" false) = Normal);
+ assert ((Parser.get_line_type "*Test" false) = Normal);
+
+ (* No weird error considerations / oboes. *)
+ assert ((Parser.get_line_type "" false) = Normal);
+ assert ((Parser.get_line_type "#" false) = Normal);
+ assert ((Parser.get_line_type "##" false) = Normal);
+ assert ((Parser.get_line_type "###" false) = Normal);
+ assert ((Parser.get_line_type "=>e" false) = Normal);
+ assert ((Parser.get_line_type "??" false) = Normal);
+ assert ((Parser.get_line_type ">" false) = Normal);
+ assert ((Parser.get_line_type "=>" false) = Normal);
+ assert ((Parser.get_line_type "*" false) = Normal);
+ assert ((Parser.get_line_type "# " false) = HeaderL1);
+ assert ((Parser.get_line_type "## " false) = HeaderL2);
+ assert ((Parser.get_line_type "### " false) = HeaderL3);
+ assert ((Parser.get_line_type "=>e " false) = Embedded);
+ assert ((Parser.get_line_type "?? " false) = Hidden);
+ assert ((Parser.get_line_type "> " false) = Quote);
+ assert ((Parser.get_line_type "=> " false) = Link);
+ assert ((Parser.get_line_type "* " false) = ListItem);
+
+ (*E2E Parsing of individual lines. *)
+ (* Character stripping expectations. *)
+ assert((Parser.parse_simple_line "Test" false).content = "Test");
+ assert((Parser.parse_simple_line "# Test" false).content = "Test");
+ assert((Parser.parse_simple_line "## Test" false).content = "Test");
+ assert((Parser.parse_simple_line "### Test" false).content = "Test");
+ assert((Parser.parse_simple_line "=>e Test" false).content = "Test");
+ assert((Parser.parse_simple_line "Test" true).content = "Test");
+ assert((Parser.parse_simple_line "?? Test" false).content = "Test");
+ assert((Parser.parse_simple_line "> Test" false).content = "Test");
+ assert((Parser.parse_simple_line "=> Test" false).content = "Test");
+ assert((Parser.parse_simple_line "* Test" false).content = "Test");
+
+ (* Character stripping doesn't break on empty line content. *)
+ assert((Parser.parse_simple_line "" false).content = "");
+ assert((Parser.parse_simple_line "# " false).content = "");
+ assert((Parser.parse_simple_line "## " false).content = "");
+ assert((Parser.parse_simple_line "### " false).content = "");
+ assert((Parser.parse_simple_line "=>e " false).content = "");
+ assert((Parser.parse_simple_line "" true).content = "");
+ assert((Parser.parse_simple_line "?? " false).content = "");
+ assert((Parser.parse_simple_line "> " false).content = "");
+ assert((Parser.parse_simple_line "=> " false).content = "");
+ assert((Parser.parse_simple_line "* " false).content = "");
diff --git a/learning/test/test_rendering.ml b/learning/test/test_rendering.ml
@@ -0,0 +1,4 @@
+open Learning
+
+let test_rendering () =
+ print_endline (Render.get_path_to_page "smt" "smt")