- 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.
243 lines
5.9 KiB
V
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
|
|
}
|