use crate::data::PageInfo;
use crate::layout::Layout;
use crate::parsing::{ParseErrorKind, Token};
use crate::settings::{WikitextMode, WikitextSettings};
use crate::tree::{Element, SyntaxTree};
use std::borrow::Cow;
#[test]
fn recursion_depth() {
let page_info = PageInfo::dummy();
let settings = WikitextSettings::from_mode(WikitextMode::Page, Layout::Wikidot);
let mut input = String::new();
for _ in 0..101 {
input.push_str("[[div]]\n");
}
for _ in 0..101 {
input.push_str("[[/div]]\n");
}
crate::preprocess(&mut input);
let tokens = crate::tokenize(&input);
let (tree, errors) = crate::parse(&tokens, &page_info, &settings).into();
let error = errors.first().expect("No errors produced");
assert_eq!(error.token(), Token::LeftBlock);
assert_eq!(error.rule(), "block-div");
assert_eq!(error.span(), 800..802);
assert_eq!(error.kind(), ParseErrorKind::RecursionDepthExceeded);
let SyntaxTree { elements, .. } = tree;
assert_eq!(elements.len(), 1);
let element = elements.first().expect("No elements produced");
let input_cow = Cow::Borrowed(input.as_ref());
assert_eq!(element, &Element::Text(input_cow));
}
#[test]
#[ignore = "slow test"]
fn large_payload() {
const ITERATIONS: usize = 500;
let page_info = PageInfo::dummy();
let settings = WikitextSettings::from_mode(WikitextMode::Page, Layout::Wikidot);
let mut input = String::new();
for _ in 0..ITERATIONS {
input.push_str("
[[div]]
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Maecenas sed risus sed ex suscipit ultricies ac quis metus.
Mauris facilisis dui quam, in mollis velit ultrices vitae. Nam pretium accumsan arcu eu ultricies. Sed viverra eleifend elit at blandit. Aenean tempor vitae ipsum vitae lacinia.
Proin eu maximus nulla, id imperdiet libero. Duis convallis posuere arcu vitae sodales. Cras porta ac ligula non porttitor.
Proin et sodales arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris eget ante maximus, tincidunt enim nec, dignissim mi.
Quisque tincidunt convallis faucibus. Praesent vel semper dolor, vel tincidunt mi.
In hac habitasse platea dictumst. Vestibulum fermentum libero nec erat porttitor fermentum. Etiam at convallis odio, gravida commodo ipsum. Phasellus consequat nisl vitae ultricies pulvinar. Integer scelerisque eget nisl id fermentum. Pellentesque pretium, enim non molestie rhoncus, dolor diam porta mauris, eu cursus dolor est condimentum nisi. Phasellus tellus est, euismod non accumsan at, congue eget erat.
% ]] ! $ * -- @< _
[[/div]]
");
}
crate::preprocess(&mut input);
let tokens = crate::tokenize(&input);
let (_tree, errors) = crate::parse(&tokens, &page_info, &settings).into();
assert_eq!(errors.len(), ITERATIONS * 3);
}