use super::*;
#[test]
fn choice_point_parses() {
let src = "flow garden() {\n {?\n * [Look] You look around.\n + (again) [Look again] Still a garden.\n else { Nothing left to do. }\n }\n}\n";
let p = assert_lossless(src);
assert!(p.errors().is_empty(), "errors: {:?}", p.errors());
}
#[test]
fn space_after_choice_bracket_close_survives_inside_the_text_node() {
let src = "flow f() {\n {?\n * 'A wager!'[] I returned.\n }\n}\n";
let p = assert_lossless(src);
assert!(p.errors().is_empty(), "errors: {:?}", p.errors());
let inner = p
.syntax()
.descendants()
.find(|n| n.kind() == SyntaxKind::CHOICE_INNER_CONTENT)
.expect("CHOICE_INNER_CONTENT");
let inner_text = text_run_concat(&inner);
assert_eq!(
inner_text, " I returned.",
"space after `]` must be folded into the inner TEXT node"
);
let choice = p
.syntax()
.descendants()
.find(|n| n.kind() == SyntaxKind::CHOICE)
.expect("CHOICE");
let start = choice
.descendants()
.find(|n| n.kind() == SyntaxKind::CHOICE_START_CONTENT)
.expect("CHOICE_START_CONTENT");
let display = format!("{}{}", text_run_concat(&start), inner_text);
assert_eq!(display, "'A wager!' I returned.");
}
#[test]
fn charter_wager_shape_preserves_space_after_bracket_close() {
let src = concat!(
"flow f() {\n",
" {?\n",
" * 'A wager!'[] I returned. {\n",
" -> f\n",
" }\n",
" }\n",
"}\n",
);
let p = assert_lossless(src);
assert!(p.errors().is_empty(), "errors: {:?}", p.errors());
let inner = p
.syntax()
.descendants()
.find(|n| n.kind() == SyntaxKind::CHOICE_INNER_CONTENT)
.expect("CHOICE_INNER_CONTENT");
assert_eq!(text_run_concat(&inner), " I returned. ");
assert!(has_node_kind(&p.syntax(), SyntaxKind::CHOICE_BODY));
}
#[test]
fn whitespace_only_inner_content_makes_no_spurious_text_node() {
let src = "flow f() {\n {?\n * choose[] \n }\n}\n";
let p = assert_lossless(src);
assert!(p.errors().is_empty(), "errors: {:?}", p.errors());
let inner = p
.syntax()
.descendants()
.find(|n| n.kind() == SyntaxKind::CHOICE_INNER_CONTENT)
.expect("CHOICE_INNER_CONTENT");
assert!(
!has_node_kind(&inner, SyntaxKind::TEXT),
"whitespace-only inner content must not create a TEXT node, tree: {inner:#?}"
);
}
#[test]
fn choice_line_interpolation_before_bracket_parses_as_interpolation() {
let src = "flow f() {\n {?\n * Gold: {gold}\n }\n}\n";
let p = assert_lossless(src);
assert!(p.errors().is_empty(), "errors: {:?}", p.errors());
let choice = p
.syntax()
.descendants()
.find(|n| n.kind() == SyntaxKind::CHOICE)
.expect("CHOICE");
assert!(has_node_kind(&choice, SyntaxKind::INTERPOLATION));
assert!(!has_node_kind(&choice, SyntaxKind::CHOICE_BODY));
}
#[test]
fn choice_line_interpolation_inside_bracket_inner_content_parses() {
let src = "flow f() {\n {?\n * [Buy] You have {gold} left.\n }\n}\n";
let p = assert_lossless(src);
assert!(p.errors().is_empty(), "errors: {:?}", p.errors());
let inner = p
.syntax()
.descendants()
.find(|n| n.kind() == SyntaxKind::CHOICE_INNER_CONTENT)
.expect("CHOICE_INNER_CONTENT");
assert!(has_node_kind(&inner, SyntaxKind::INTERPOLATION));
}
#[test]
fn choice_body_still_opens_as_a_body_not_interpolation() {
let src = "flow f() {\n {?\n * [Eat] {\n You eat. -> f\n }\n }\n}\n";
let p = assert_lossless(src);
assert!(p.errors().is_empty(), "errors: {:?}", p.errors());
assert!(has_node_kind(&p.syntax(), SyntaxKind::CHOICE_BODY));
}
#[test]
fn choice_line_conditional_guard_and_trailing_interpolation_coexist() {
let src = "flow f() {\n {?\n * {if hp > 0} Gold: {gold}\n }\n}\n";
let p = assert_lossless(src);
assert!(p.errors().is_empty(), "errors: {:?}", p.errors());
let choice = p
.syntax()
.descendants()
.find(|n| n.kind() == SyntaxKind::CHOICE)
.expect("CHOICE");
assert!(has_node_kind(&choice, SyntaxKind::CHOICE_GUARD));
assert!(has_node_kind(&choice, SyntaxKind::INTERPOLATION));
}