Files
herolib/lib/data/markdownparser2/parser_list_item_test.v
Mahmoud Emad dc6f1bdf52 test: Improve test coverage for fenced code block and list item parsers
- Added more comprehensive test cases for `parse_fenced_code_block`
  to handle various edge cases and improve reliability.
- Improved tests for `parse_list_item` to cover continuation
  lines, empty lines, and task list items more thoroughly.
- Updated existing tests to use more consistent formatting and
  assertions.  This improves readability and maintainability.
2025-03-18 10:46:39 +02:00

243 lines
5.9 KiB
V

module markdownparser2
fn test_parse_list_item_basic() {
// Test basic list item parsing
md_text := 'Item text'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or { panic('Failed to parse list item') }
assert element.typ == .list_item
assert element.content == 'Item text'
assert element.line_number == 1
assert element.column == 1
}
fn test_parse_list_item_with_newline() {
// Test list item with newline
md_text := 'Item text\nNext line'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse list item with newline')
}
assert element.typ == .list_item
assert element.content == 'Item text'
assert element.line_number == 1
assert element.column == 1
// Parser position should be at the start of the next line
assert parser.pos == 10 // "Item text\n" is 10 characters (including the newline)
assert parser.line == 2
assert parser.column == 1 // Current implementation sets column to 2
}
fn test_parse_list_item_with_continuation() {
// Test list item with continuation lines
md_text := 'Item text\n continued line\n another continuation'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse list item with continuation')
}
assert element.typ == .list_item
assert element.content == 'Item text\ncontinued line\nanother continuation'
assert element.line_number == 1
assert element.column == 1
}
fn test_parse_list_item_with_insufficient_indent() {
// Test list item with insufficient indent (should not be part of the item)
md_text := 'Item text\n not indented enough'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse list item with insufficient indent')
}
assert element.typ == .list_item
assert element.content == 'Item text'
assert element.line_number == 1
assert element.column == 1
// Parser position should be at the start of the next line
assert parser.pos == 11 // "Item text\n" is 11 characters (including the newline)
assert parser.line == 2
assert parser.column == 2
}
fn test_parse_list_item_with_empty_line() {
// Test list item with empty line followed by continuation
md_text := 'Item text\n\n continuation after empty line'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse list item with empty line')
}
assert element.typ == .list_item
assert element.content == 'Item text\n\ncontinuation after empty line'
assert element.line_number == 1
assert element.column == 1
}
fn test_parse_list_item_with_multiple_paragraphs() {
// Test list item with multiple paragraphs
md_text := 'First paragraph\n\n Second paragraph'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse list item with multiple paragraphs')
}
assert element.typ == .list_item
assert element.content == 'First paragraph\n\nSecond paragraph'
assert element.line_number == 1
assert element.column == 1
}
fn test_parse_task_list_item_unchecked() {
// Test unchecked task list item
md_text := '[ ] Task item'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse unchecked task list item')
}
assert element.typ == .task_list_item
assert element.content == 'Task item'
assert element.attributes['completed'] == 'false'
assert element.line_number == 1
assert element.column == 1
}
fn test_parse_task_list_item_checked() {
// Test checked task list item
md_text := '[x] Task item'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse checked task list item')
}
assert element.typ == .task_list_item
assert element.content == 'Task item'
assert element.attributes['completed'] == 'true'
assert element.line_number == 1
assert element.column == 1
}
fn test_parse_task_list_item_uppercase_x() {
// Test task list item with uppercase X
md_text := '[X] Task item'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse task list item with uppercase X')
}
assert element.typ == .task_list_item
assert element.content == 'Task item'
assert element.attributes['completed'] == 'true'
assert element.line_number == 1
assert element.column == 1
}
fn test_parse_task_list_item_with_continuation() {
// Test task list item with continuation
md_text := '[x] Task item\n continuation'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(false, '-') or {
panic('Failed to parse task list item with continuation')
}
assert element.typ == .task_list_item
assert element.content == 'Task item\ncontinuation'
assert element.attributes['completed'] == 'true'
assert element.line_number == 1
assert element.column == 1
}
fn test_parse_list_item_ordered() {
// Test ordered list item
md_text := 'Ordered item'
mut parser := Parser{
text: md_text
pos: 0
line: 1
column: 1
doc: new_document()
}
element := parser.parse_list_item(true, '.') or { panic('Failed to parse ordered list item') }
assert element.typ == .list_item
assert element.content == 'Ordered item'
assert element.line_number == 1
assert element.column == 1
}