#![allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
use std::sync::Arc;
use brink_runtime::{DotNetRng, Step, Story};
fn play(source: &str) -> Vec<String> {
let output = brink_compiler::compile("story.ink", |_| Ok(source.to_owned()));
assert!(
output.is_ok(),
"compile failed: {:?}\n{source}",
output.as_ref().err()
);
let output = output.expect("just asserted above");
let (program, line_tables) = brink_runtime::link(&output.data).expect("link");
let mut story = Story::<DotNetRng>::new(Arc::new(program), line_tables);
let mut lines = Vec::new();
for _ in 0..200 {
match story.continue_single().expect("runtime") {
Step::Line(l) => lines.push(l.text.clone()),
Step::Choices(_) => panic!("unexpected choices in {source}"),
Step::Done | Step::End | Step::Suspended => return lines,
}
}
panic!("story did not reach a terminal step in 200 steps");
}
#[test]
fn spring_before_glue_at_function_end_is_trimmed() {
let src = "~ f()\na\n-> END\n\n=== function f() ===\n{0} <>\n";
assert_eq!(play(src), vec!["0a\n"]);
}
#[test]
fn text_space_before_glue_at_function_end_stays() {
let src = "~ f()\na\n-> END\n\n=== function f() ===\nx <>\n";
assert_eq!(play(src), vec!["x a\n"]);
}
#[test]
fn newline_under_glue_at_function_end_is_trimmed() {
let src = "~ f()\na\n-> END\n\n=== function f() ===\n{0}\n<>\n";
assert_eq!(play(src), vec!["0a\n"]);
}
#[test]
fn spring_before_glue_in_a_display_position_call() {
let src = "x{f()}y\n-> END\n\n=== function f() ===\n{0} <>\n";
assert_eq!(play(src), vec!["x0y\n"]);
}