70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
import pytest
|
|
from cyclone.parsers.exceptions import CycloneParseError
|
|
from cyclone.parsers.segments import Delimiters, tokenize
|
|
|
|
ISA_PREFIX = "ISA*00* *00* *ZZ*11525703 *ZZ*COMEDASSISTPROG*260611*0814*"
|
|
|
|
|
|
def test_tokenize_parses_isa_delimiters():
|
|
text = ISA_PREFIX + "*^00501*991102977*1*P*:~"
|
|
segments = tokenize(text)
|
|
assert segments[0][0] == "ISA"
|
|
assert len(segments) == 1
|
|
|
|
|
|
def test_tokenize_splits_segments():
|
|
text = ISA_PREFIX + "*^00501*991102977*1*P*:~ST*837*0001~SE*2*0001~"
|
|
segments = tokenize(text)
|
|
assert [s[0] for s in segments] == ["ISA", "ST", "SE"]
|
|
|
|
|
|
def test_tokenize_splits_elements():
|
|
text = ISA_PREFIX + "*^00501*991102977*1*P*:~NM1*85*2*Acme*****XX*1234567890~"
|
|
segments = tokenize(text)
|
|
nm1 = [s for s in segments if s[0] == "NM1"][0]
|
|
assert nm1[1] == "85"
|
|
assert nm1[8] == "XX"
|
|
assert nm1[9] == "1234567890"
|
|
|
|
|
|
def test_tokenize_preserves_empty_elements():
|
|
"""Empty elements (e.g. 'NM1*IL*1*Doe*John****MI*X') must stay as empty strings."""
|
|
text = ISA_PREFIX + "*^00501*991102977*1*P*:~NM1*IL*1*Doe*John****MI*X~"
|
|
segments = tokenize(text)
|
|
nm1 = [s for s in segments if s[0] == "NM1"][0]
|
|
assert nm1[5] == "" # position 5 is the 4th consecutive empty after suffix
|
|
assert nm1[6] == ""
|
|
|
|
|
|
def test_tokenize_handles_component_separator():
|
|
"""SV101 can be 'HC:99213' which is component-split at ':'."""
|
|
text = ISA_PREFIX + "*^00501*991102977*1*P*:~SV1*HC:99213*100*UN*1***1~"
|
|
segments = tokenize(text)
|
|
sv1 = [s for s in segments if s[0] == "SV1"][0]
|
|
# SV101 is element index 1; components 1, 2 are 'HC', '99213'
|
|
assert sv1[1] == "HC:99213"
|
|
|
|
|
|
def test_tokenize_strips_trailing_crlf():
|
|
text = ISA_PREFIX + "*^00501*991102977*1*P*:~\r\n"
|
|
segments = tokenize(text)
|
|
assert [s[0] for s in segments] == ["ISA"]
|
|
|
|
|
|
def test_tokenize_raises_on_missing_isa():
|
|
with pytest.raises(CycloneParseError, match="ISA segment not found"):
|
|
tokenize("hello world")
|
|
|
|
|
|
def test_tokenize_raises_on_short_isa():
|
|
with pytest.raises(CycloneParseError, match="ISA segment too short"):
|
|
tokenize("ISA*00*00~")
|
|
|
|
|
|
def test_delimiters_dataclass():
|
|
d = Delimiters(element="*", repetition="^", component=":", segment="~")
|
|
assert d.element == "*"
|
|
assert d.repetition == "^"
|
|
assert d.component == ":"
|
|
assert d.segment == "~"
|