#![cfg(feature = "chunking")]
mod helpers;
use xberg::chunking::{ChunkerType, ChunkingConfig, chunk_text};
const MALFORMED_NESTED_LIST_MD: &str = "\
Title
* 1. Item 1
2. Item 2
3. Item 3
4. Item 4
5. Item 5
6. Item 6
7. Item 7
8. Item 8
9. Item 9
10. Item 10
11. Item 11
1. Item 1
2. Item 2
3. Item 3
Item 1
Item 2
Item 3
";
fn markdown_chunk_config() -> ChunkingConfig {
ChunkingConfig {
max_characters: 200,
overlap: 0,
chunker_type: ChunkerType::Markdown,
..Default::default()
}
}
#[test]
fn markdown_chunker_never_panics_on_malformed_nested_list() {
let result = chunk_text(MALFORMED_NESTED_LIST_MD, &markdown_chunk_config(), None);
let _ = result;
}
#[test]
fn markdown_chunker_empty_input_returns_empty_chunks() {
let result = chunk_text("", &markdown_chunk_config(), None);
assert!(result.is_ok());
assert!(result.unwrap().chunks.is_empty());
}
#[test]
fn markdown_chunker_single_char_input() {
let result = chunk_text("x", &markdown_chunk_config(), None);
let _ = result;
}
#[test]
fn markdown_chunker_only_newlines() {
let result = chunk_text("\n\n\n\n", &markdown_chunk_config(), None);
let _ = result;
}
#[test]
fn markdown_chunker_valid_nested_list() {
let valid_nested = "\
- outer 1
- mid 1
1. inner 1
2. inner 2
- mid 2
- outer 2
";
let result = chunk_text(valid_nested, &markdown_chunk_config(), None);
assert!(result.is_ok(), "valid nested list must chunk without error");
}
#[cfg(feature = "html")]
mod html_extraction {
use crate::helpers::extract_bytes_document_blocking;
use xberg::chunking::{ChunkerType, ChunkingConfig};
use xberg::core::config::{ExtractionConfig, OutputFormat};
fn config_with_markdown_chunking() -> ExtractionConfig {
ExtractionConfig {
output_format: OutputFormat::Markdown,
chunking: Some(ChunkingConfig {
max_characters: 300,
chunker_type: ChunkerType::Markdown,
..Default::default()
}),
..Default::default()
}
}
#[test]
fn html_nested_list_extraction_no_panic() {
let html = b"<ul><li>outer<ul><li>mid<ol><li>inner1</li><li>inner2</li></ol></li></ul></li></ul>";
let result = extract_bytes_document_blocking(html, "text/html", &ExtractionConfig::default());
assert!(result.is_ok(), "extraction must not error: {:?}", result.err());
}
#[test]
fn html_nested_list_no_content_duplication() {
let html = b"<ul><li>outer<ul><li>mid<ol><li>inner1</li><li>inner2</li></ol></li></ul></li></ul>";
let result = extract_bytes_document_blocking(html, "text/html", &ExtractionConfig::default())
.expect("extraction must not error");
let content = &result.content;
for word in ["outer", "mid", "inner1", "inner2"] {
assert_eq!(
content.matches(word).count(),
1,
"{word} must appear exactly once, got content:\n{content}"
);
}
}
#[test]
fn second_pass_markdown_chunking_no_panic() {
let first = extract_bytes_document_blocking(
b"<ul><li>outer<ul><li>mid<ol><li>inner1</li><li>inner2</li></ol></li></ul></li></ul>",
"text/html",
&ExtractionConfig::default(),
)
.expect("first extraction must not error");
let second =
extract_bytes_document_blocking(first.content.as_bytes(), "text/plain", &config_with_markdown_chunking());
let _ = second;
}
}