"""Parser regression tests — pin down the ``rstrip("|")`` invariant that took us two debugging rounds to find (see docs/sources/easyeda_pro_source.md §3.1). """ from tools.epro2.parser import parse_line, Epro2ParseError def test_dochead_with_trailing_pipe(): ln = b'{"type":"DOCHEAD","ticket":2}||{"docType":"BOARD","uuid":"35086b7d90787675","editVersion":"3.2.127"}|' op = parse_line(ln) assert op.type == "DOCHEAD" assert op.ticket == 2 assert op.payload["docType"] == "BOARD" assert op.payload["uuid"] == "35086b7d90787675" assert op.payload["editVersion"] == "3.2.127" def test_three_part_message(): """Some types carry an `extra` third field after the second `||`.""" ln = b'{"type":"WIRE","ticket":1009,"id":"e3514"}||{"groupId":""}||{"meta":1}|' op = parse_line(ln) assert op.type == "WIRE" assert op.id == "e3514" assert op.payload == {"groupId": ""} assert op.extra == {"meta": 1} def test_id_only_no_payload_yields_none_payload(): ln = b'{"type":"COMPONENT","ticket":7,"id":"e1"}|' op = parse_line(ln) assert op.type == "COMPONENT" assert op.id == "e1" assert op.payload is None # downstream replay treats this as a delete def test_bad_head_raises(): try: parse_line(b"not json||{}|") except Epro2ParseError: return raise AssertionError("expected Epro2ParseError") def test_empty_line_raises(): try: parse_line(b"|") except Epro2ParseError: return raise AssertionError("expected Epro2ParseError") def test_payload_with_embedded_pipes(): """An embedded `|` inside a JSON string must NOT be treated as a separator.""" ln = b'{"type":"ATTR","ticket":3,"id":"e1"}||{"key":"Symbol","value":"a|b|c"}|' op = parse_line(ln) assert op.payload["value"] == "a|b|c"