use crate::parser::tests::cst::{ExpectedNode, assert_equivalent};
use crate::{SyntaxKind, parse};
#[test]
fn inline_multiline_conditional() {
assert_equivalent(
parse("Hello {\n- x:\n Yes.\n- else:\n No.\n}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
TEXT
INLINE_LOGIC {
MULTILINE_CONDITIONAL {
MULTILINE_BRANCH_COND {
PATH
MULTILINE_BRANCH_BODY {
TEXT
}
}
MULTILINE_BRANCH_COND {
MULTILINE_BRANCH_BODY {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn inline_multiline_bare_branches() {
assert_equivalent(
parse("Hello {\n- One.\n- Two.\n}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
TEXT
INLINE_LOGIC {
MULTILINE_CONDITIONAL {
MULTILINE_BRANCH_COND {
MULTILINE_BRANCH_BODY {
TEXT
}
}
MULTILINE_BRANCH_COND {
MULTILINE_BRANCH_BODY {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn branchless_body_simple() {
assert_equivalent(
parse("{\n x:\n Content here.\n}\n"),
cst!(SOURCE_FILE {
MULTILINE_BLOCK {
CONDITIONAL_WITH_EXPR {
PATH
BRANCHLESS_COND_BODY {
TEXT
}
}
}
}),
);
}
#[test]
fn branchless_body_with_else() {
assert_equivalent(
parse("{\n x:\n Content.\n- else:\n Other.\n}\n"),
cst!(SOURCE_FILE {
MULTILINE_BLOCK {
CONDITIONAL_WITH_EXPR {
PATH
BRANCHLESS_COND_BODY {
TEXT
ELSE_BRANCH {
MULTILINE_BRANCH_COND {
MULTILINE_BRANCH_BODY {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn branchless_body_with_choice_then_else() {
assert_equivalent(
parse("{\n x:\n * Choice A\n- else:\n * Choice B\n}\n"),
cst!(SOURCE_FILE {
MULTILINE_BLOCK {
CONDITIONAL_WITH_EXPR {
PATH
BRANCHLESS_COND_BODY {
CHOICE {
CHOICE_BULLETS
CHOICE_START_CONTENT {
TEXT
}
}
ELSE_BRANCH {
MULTILINE_BRANCH_COND {
MULTILINE_BRANCH_BODY {
CHOICE {
CHOICE_BULLETS
CHOICE_START_CONTENT {
TEXT
}
}
}
}
}
}
}
}
}),
);
}
#[test]
fn nested_cond_in_cond_true() {
assert_equivalent(
parse("{x: {y: inner}|no}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
TEXT
}
}
}
}
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn nested_expr_in_branch() {
assert_equivalent(
parse("{a|{x}|c}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
IMPLICIT_SEQUENCE {
BRANCH_CONTENT {
TEXT
}
BRANCH_CONTENT {
INLINE_LOGIC {
INNER_EXPRESSION {
PATH
}
}
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}),
);
}
#[test]
fn nested_seq_in_cond() {
assert_equivalent(
parse("{x: {&a|b}|no}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
INLINE_LOGIC {
SEQUENCE_WITH_ANNOTATION {
SEQUENCE_SYMBOL_ANNOTATION
INLINE_BRANCHES_SEQ {
BRANCH_CONTENT {
TEXT
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn deeply_nested() {
assert_equivalent(
parse("{x: {y: {z: deep}}}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}),
);
}
#[test]
fn branch_with_divert() {
assert_equivalent(
parse("{x: -> target|no}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
DIVERT_NODE {
SIMPLE_DIVERT {
DIVERT_TARGET_WITH_ARGS {
PATH
}
}
}
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn branch_with_glue() {
assert_equivalent(
parse("{x: <>glued|no}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
GLUE_NODE
TEXT
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn branch_with_escape() {
assert_equivalent(
parse("{x: hello\\|world|no}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
TEXT
ESCAPE
TEXT
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn branch_with_thread() {
assert_equivalent(
parse("{x: <- thread|no}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
DIVERT_NODE {
THREAD_START {
PATH
}
}
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn branch_divert_in_seq() {
assert_equivalent(
parse("{&-> a|-> b}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
SEQUENCE_WITH_ANNOTATION {
SEQUENCE_SYMBOL_ANNOTATION
INLINE_BRANCHES_SEQ {
BRANCH_CONTENT {
DIVERT_NODE {
SIMPLE_DIVERT {
DIVERT_TARGET_WITH_ARGS {
PATH
}
}
}
}
BRANCH_CONTENT {
DIVERT_NODE {
SIMPLE_DIVERT {
DIVERT_TARGET_WITH_ARGS {
PATH
}
}
}
}
}
}
}
}
}
}),
);
}
#[test]
fn inline_in_content_line() {
assert_equivalent(
parse("Hello {x} world\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
TEXT
INLINE_LOGIC {
INNER_EXPRESSION {
PATH
}
}
TEXT
}
}
}),
);
}
#[test]
fn inline_in_choice() {
assert_equivalent(
parse("* Choice {x: yes|no}\n"),
cst!(SOURCE_FILE {
CHOICE {
CHOICE_BULLETS
CHOICE_START_CONTENT {
TEXT
INLINE_LOGIC {
CONDITIONAL_WITH_EXPR {
PATH
INLINE_BRANCHES_COND {
BRANCH_CONTENT {
TEXT
}
BRANCH_CONTENT {
TEXT
}
}
}
}
}
}
}),
);
}
#[test]
fn inline_in_gather() {
assert_equivalent(
parse("- Gathered {x}\n"),
cst!(SOURCE_FILE {
GATHER {
GATHER_DASHES
MIXED_CONTENT {
TEXT
INLINE_LOGIC {
INNER_EXPRESSION {
PATH
}
}
}
}
}),
);
}
#[test]
fn multiple_inline_in_line() {
assert_equivalent(
parse("{x} and {y}\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
INNER_EXPRESSION {
PATH
}
}
TEXT
INLINE_LOGIC {
INNER_EXPRESSION {
PATH
}
}
}
}
}),
);
}
#[test]
fn inline_before_divert() {
assert_equivalent(
parse("{x} -> target\n"),
cst!(SOURCE_FILE {
CONTENT_LINE {
MIXED_CONTENT {
INLINE_LOGIC {
INNER_EXPRESSION {
PATH
}
}
}
DIVERT_NODE {
SIMPLE_DIVERT {
DIVERT_TARGET_WITH_ARGS {
PATH
}
}
}
}
}),
);
}