use crate::{
SafeMode,
parser::{Fidelity, ModificationContext, Origin, Transform},
tests::prelude::{inline_file_handler::InlineFileHandler, *},
};
#[test]
fn root_content_is_verbatim_with_column() {
let doc = Parser::default().parse("= Title\n\nA paragraph.\n");
assert_eq!(
doc.source_map().origin_at(3, 3),
Origin {
file: None,
line: 3,
col: Some(3),
fidelity: Fidelity::Verbatim,
}
);
}
#[test]
fn tab_expanded_include_line_is_transformed() {
let handler = InlineFileHandler::from_pairs([("code.rb", "\ttabbed\nplain\n")]);
let doc = Parser::default()
.with_safe_mode(SafeMode::Server)
.with_intrinsic_attribute("tabsize", "4", ModificationContext::Anywhere)
.with_include_file_handler(handler)
.parse("before\n\n----\ninclude::code.rb[]\n----\n");
assert_eq!(
doc.source_map().origin_at(4, 1),
Origin {
file: Some("code.rb"),
line: 1,
col: None,
fidelity: Fidelity::Transformed(Transform::TabExpansion),
}
);
assert_eq!(
doc.source_map().origin_at(5, 1),
Origin {
file: Some("code.rb"),
line: 2,
col: Some(1),
fidelity: Fidelity::Verbatim,
}
);
assert_eq!(
doc.source_map().origin_at(6, 1),
Origin {
file: None,
line: 5,
col: Some(1),
fidelity: Fidelity::Verbatim,
}
);
}
#[test]
fn plain_include_is_verbatim() {
let handler = InlineFileHandler::from_pairs([("chapter.adoc", "Chapter body.\n")]);
let doc = Parser::default()
.with_safe_mode(SafeMode::Server)
.with_include_file_handler(handler)
.parse("Intro.\n\ninclude::chapter.adoc[]\n");
assert_eq!(
doc.source_map().origin_at(3, 9),
Origin {
file: Some("chapter.adoc"),
line: 1,
col: Some(9),
fidelity: Fidelity::Verbatim,
}
);
}
#[test]
fn root_resumes_after_verbatim_include() {
let handler = InlineFileHandler::from_pairs([("inc.adoc", "alpha\nbeta\n")]);
let doc = Parser::default()
.with_safe_mode(SafeMode::Server)
.with_include_file_handler(handler)
.parse("one\ntwo\ninclude::inc.adoc[]\nfour\nfive\n");
assert_eq!(
doc.source_map().origin_at(4, 1),
Origin {
file: Some("inc.adoc"),
line: 2,
col: Some(1),
fidelity: Fidelity::Verbatim,
}
);
assert_eq!(
doc.source_map().origin_at(5, 1),
Origin {
file: None,
line: 4,
col: Some(1),
fidelity: Fidelity::Verbatim,
}
);
assert_eq!(
doc.source_map().origin_at(6, 3),
Origin {
file: None,
line: 5,
col: Some(3),
fidelity: Fidelity::Verbatim,
}
);
}
#[test]
fn unresolved_include_is_synthetic() {
let handler = InlineFileHandler::from_pairs([]);
let doc = Parser::default()
.with_safe_mode(SafeMode::Server)
.with_include_file_handler(handler)
.parse("include::missing.adoc[]\n");
let origin = doc.source_map().origin_at(1, 1);
assert_eq!(origin.file, None);
assert_eq!(origin.line, 1);
assert_eq!(origin.col, None);
assert_eq!(
origin.fidelity,
Fidelity::Synthetic(Transform::UnresolvedDirective)
);
}
#[test]
fn origin_of_block_span() {
let handler = InlineFileHandler::from_pairs([("code.rb", "puts 1\n")]);
let doc = Parser::default()
.with_safe_mode(SafeMode::Server)
.with_include_file_handler(handler)
.parse("intro\n\n----\ninclude::code.rb[]\n----\n");
let listing = doc.child_blocks().nth(1).unwrap();
let origin = doc.origin_of(listing.span());
assert_eq!(origin.file, None);
assert_eq!(origin.line, 3);
assert_eq!(origin.fidelity, Fidelity::Verbatim);
assert_eq!(origin.col, Some(1));
}