from src.parser.parser import parse from src.parser.ast_nodes import Template, Text, PPPSet, PPPEcho, PPPIf, Variant, PPPSendToNegative, PPPExtraNetwork def test_ppp_set_parses(): result = parse("hello") assert len(result.parts) == 1 node = result.parts[0] assert isinstance(node, PPPSet) assert node.var_name == "x" assert node.modifiers == [] assert node.content.parts[0].value == "hello" def test_ppp_set_with_modifiers(): result = parse("hello") node = result.parts[0] assert isinstance(node, PPPSet) assert node.var_name == "x" assert node.modifiers == ["evaluate", "add"] def test_ppp_echo_self_closing(): result = parse("") assert len(result.parts) == 1 node = result.parts[0] assert isinstance(node, PPPEcho) assert node.var_name == "x" assert node.default is None def test_ppp_echo_with_default(): result = parse("fallback") node = result.parts[0] assert isinstance(node, PPPEcho) assert node.var_name == "x" assert node.default is not None assert node.default.parts[0].value == "fallback" def test_ppp_if_simple(): result = parse("matched") assert len(result.parts) == 1 node = result.parts[0] assert isinstance(node, PPPIf) assert len(node.branches) == 1 assert node.branches[0][0] == "x" assert node.branches[0][1].parts[0].value == "matched" assert node.else_content is None def test_ppp_if_with_else(): result = parse("ab") node = result.parts[0] assert isinstance(node, PPPIf) assert len(node.branches) == 1 assert node.else_content is not None assert node.else_content.parts[0].value == "b" def test_ppp_if_with_elif(): result = parse("ab") node = result.parts[0] assert isinstance(node, PPPIf) assert len(node.branches) == 2 assert node.branches[0][0] == "x eq 1" assert node.branches[1][0] == "x eq 2" assert node.else_content is None def test_ppp_if_with_elif_and_else(): result = parse("abc") node = result.parts[0] assert isinstance(node, PPPIf) assert len(node.branches) == 2 assert node.else_content is not None assert node.else_content.parts[0].value == "c" def test_ppp_tag_in_text(): result = parse("before hello after") assert len(result.parts) == 3 assert isinstance(result.parts[0], Text) assert isinstance(result.parts[1], PPPSet) assert isinstance(result.parts[2], Text) def test_ppp_nested_in_variant(): result = parse("{a|b}") v = result.parts[0] assert isinstance(v, Variant) assert len(v.options) == 2 assert isinstance(v.options[1].node.parts[0], PPPIf) def test_ppp_stn_paired(): result = parse("content") node = result.parts[0] assert isinstance(node, PPPSendToNegative) assert node.position == "e" assert node.content.parts[0].value == "content" assert not node.is_insertion_point def test_ppp_stn_self_closing(): result = parse("") node = result.parts[0] assert isinstance(node, PPPSendToNegative) assert node.position == "i0" assert node.is_insertion_point def test_ppp_stn_no_position(): result = parse("content") node = result.parts[0] assert isinstance(node, PPPSendToNegative) assert node.position is None assert node.content.parts[0].value == "content" def test_ppp_ext_paired(): result = parse("trigger") node = result.parts[0] assert isinstance(node, PPPExtraNetwork) assert node.ext_type == "lora" assert node.name == "test_lora" assert node.weight == "0.5" assert node.triggers.parts[0].value == "trigger" assert not node.is_mapping def test_ppp_ext_self_closing(): result = parse("") node = result.parts[0] assert isinstance(node, PPPExtraNetwork) assert node.ext_type == "lora" assert node.name == "test_lora" assert node.weight is None assert node.triggers is None def test_ppp_ext_with_condition(): result = parse('trigger') node = result.parts[0] assert isinstance(node, PPPExtraNetwork) assert node.ext_type == "lora" assert node.name == "test_lora" assert node.condition == "_is_pony" assert node.triggers.parts[0].value == "trigger" def test_ppp_ext_quoted_name(): result = parse("") node = result.parts[0] assert isinstance(node, PPPExtraNetwork) assert node.name == "test lora" assert node.weight == "0.5"