use super::super::{AnchorKind, Ast2Error, CommandKind, Content};
use super::content::parse_content;
use super::document::parse_document;
use super::parser::Parser;
use serde_json::json;
use uuid::Uuid;
#[test]
fn test_parse_content_mixed() {
let uuid_str = "123e4567-e89b-12d3-a456-426614174000";
let doc = format!(
"Some text\n@tag {{param=1}} 'arg1'\n<!-- include-{}:begin -->\nmore text",
uuid_str
);
let parser = Parser::new(&doc);
let (content_vec, p_next) = parse_content(parser).unwrap();
assert_eq!(content_vec.len(), 4);
if let Content::Text(text) = &content_vec[0] {
assert_eq!(text.range.begin.offset, 0);
assert_eq!(text.range.end.offset, "Some text\n".len());
} else {
panic!("Expected Text");
}
if let Content::Tag(tag) = &content_vec[1] {
assert_eq!(tag.command, CommandKind::Tag);
assert_eq!(tag.arguments.arguments[0].value, "arg1");
let tag_str = "@tag {param=1} 'arg1'\n";
assert_eq!(tag.range.begin.offset, "Some text ".len());
assert_eq!(tag.range.end.offset, "Some text ".len() + tag_str.len());
} else {
panic!("Expected Tag");
}
if let Content::Anchor(anchor) = &content_vec[2] {
assert_eq!(anchor.command, CommandKind::Include);
assert_eq!(anchor.uuid, Uuid::parse_str(uuid_str).unwrap());
assert_eq!(anchor.kind, AnchorKind::Begin);
let anchor_str = format!("<!-- include-{}:begin -->\n", uuid_str);
assert_eq!(
anchor.range.begin.offset,
"Some text\n@tag {param=1} 'arg1'\n".len()
);
assert_eq!(
anchor.range.end.offset,
"Some text\n@tag {param=1} 'arg1'\n".len() + anchor_str.len()
);
} else {
panic!("Expected Anchor");
}
if let Content::Text(text) = &content_vec[3] {
assert_eq!(text.range.begin.offset, doc.len() - "more text".len());
assert_eq!(text.range.end.offset, doc.len());
} else {
panic!("Expected Text");
}
assert!(p_next.is_eod());
}
#[test]
fn test_parse_document_simple() {
let doc = "hello world";
let document = parse_document(doc).unwrap();
assert_eq!(document.content.len(), 1);
if let Content::Text(text) = &document.content[0] {
assert_eq!(text.range.begin.offset, 0);
assert_eq!(text.range.end.offset, doc.len());
} else {
panic!("Expected Text");
}
assert_eq!(document.range.begin.offset, 0);
assert_eq!(document.range.end.offset, doc.len());
}
#[test]
fn test_parse_document_empty() {
let doc = "";
let document = parse_document(doc).unwrap();
assert!(document.content.is_empty());
assert_eq!(document.range.begin.offset, 0);
assert_eq!(document.range.end.offset, 0);
}
#[test]
fn test_parse_document_with_error() {
let doc = "@tag {param=} rest"; let result = parse_document(doc);
assert!(matches!(
result,
Err(Ast2Error::MissingParameterValue { .. })
));
}