simple-learning

Simple learning web program
git clone git://git.laack.co/simple-learning.git
Log | Files | Refs | README | LICENSE

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:
Mlearning/lib/parser.ml | 18+++---------------
Mlearning/test/test_learning.ml | 5+----
Alearning/test/test_line_parsing.ml | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alearning/test/test_rendering.ml | 4++++
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")