import json
import pytest
import las_rs
def item(mnemonic, unit="", value="", descr=""):
return las_rs.HeaderItem(mnemonic=mnemonic, unit=unit, value=value, descr=descr)
def well_section():
sec = las_rs.SectionItems()
sec.append(item("WELL", value="WILDCAT-12"))
sec.append(item("FLD", value="BLOCK_22"))
sec.append(item("LOC", value="55.123 N, 4.567 W"))
sec.append(item("PROV", value="NORTH_SEA"))
return sec
def curve_section():
sec = las_rs.SectionItems()
sec.append(item("DEPT", unit="M", descr="Measured depth"))
sec.append(item("GR", unit="GAPI", descr="Gamma ray"))
sec.append(item("RHOB", unit="G/CC", descr="Bulk density"))
return sec
@pytest.mark.xfail(reason="not yet implemented")
def test_create_empty():
sec = las_rs.SectionItems()
assert len(sec) == 0
@pytest.mark.xfail(reason="not yet implemented")
def test_append_and_length():
sec = las_rs.SectionItems()
sec.append(item("STRT", unit="M", value=500.0, descr="Start depth"))
sec.append(item("STOP", unit="M", value=1500.0, descr="Stop depth"))
assert len(sec) == 2
@pytest.mark.xfail(reason="not yet implemented")
def test_getitem_by_mnemonic():
sec = well_section()
retrieved = sec["WELL"]
assert retrieved.mnemonic == "WELL"
assert retrieved.value == "WILDCAT-12"
@pytest.mark.xfail(reason="not yet implemented")
def test_getitem_by_index():
sec = well_section()
first = sec[0]
assert first.mnemonic == "WELL"
@pytest.mark.xfail(reason="not yet implemented")
def test_getitem_by_slice():
sec = well_section()
subset = sec[1:3]
assert isinstance(subset, las_rs.SectionItems)
assert len(subset) == 2
assert subset[0].mnemonic == "FLD"
assert subset[1].mnemonic == "LOC"
@pytest.mark.xfail(reason="not yet implemented")
def test_getitem_missing_raises():
sec = well_section()
with pytest.raises(KeyError):
_ = sec["NONEXISTENT_KEY"]
@pytest.mark.xfail(reason="not yet implemented")
def test_contains_by_mnemonic():
sec = curve_section()
assert "GR" in sec
@pytest.mark.xfail(reason="not yet implemented")
def test_contains_by_item():
sec = curve_section()
gr_item = sec["GR"]
assert gr_item in sec
@pytest.mark.xfail(reason="not yet implemented")
def test_setitem_replaces_value():
sec = well_section()
sec["WELL"] = "WILDCAT-99"
assert sec["WELL"].value == "WILDCAT-99"
assert sec["WELL"].mnemonic == "WELL"
@pytest.mark.xfail(reason="not yet implemented")
def test_setitem_replaces_item():
sec = well_section()
new_item = las_rs.HeaderItem(
mnemonic="WELL",
unit="",
value="REPLACEMENT-3",
descr="Updated well name",
)
sec["WELL"] = new_item
assert sec["WELL"].value == "REPLACEMENT-3"
assert sec["WELL"].descr == "Updated well name"
@pytest.mark.xfail(reason="not yet implemented")
def test_delitem_by_mnemonic():
sec = well_section()
original_len = len(sec)
del sec["PROV"]
assert len(sec) == original_len - 1
assert "PROV" not in sec
@pytest.mark.xfail(reason="not yet implemented")
def test_delitem_by_index():
sec = well_section()
original_len = len(sec)
del sec[0]
assert len(sec) == original_len - 1
assert "WELL" not in sec
@pytest.mark.xfail(reason="not yet implemented")
def test_keys_returns_mnemonics():
sec = curve_section()
assert list(sec.keys()) == ["DEPT", "GR", "RHOB"]
@pytest.mark.xfail(reason="not yet implemented")
def test_values_returns_items():
sec = curve_section()
vals = list(sec.values())
assert all(isinstance(v, las_rs.HeaderItem) for v in vals)
assert vals[0].mnemonic == "DEPT"
@pytest.mark.xfail(reason="not yet implemented")
def test_items_returns_pairs():
sec = curve_section()
pairs = list(sec.items())
assert pairs[0] == ("DEPT", sec["DEPT"])
assert pairs[1] == ("GR", sec["GR"])
assert pairs[2] == ("RHOB", sec["RHOB"])
@pytest.mark.xfail(reason="not yet implemented")
def test_duplicate_mnemonic_suffixes():
sec = las_rs.SectionItems()
sec.append(item("RETN", value="first"))
sec.append(item("RETN", value="second"))
mnemonics = list(sec.keys())
assert "RETN:1" in mnemonics
assert "RETN:2" in mnemonics
@pytest.mark.xfail(reason="not yet implemented")
def test_attr_access_read():
sec = curve_section()
assert sec.GR.mnemonic == "GR"
assert sec.GR.unit == "GAPI"
@pytest.mark.xfail(reason="not yet implemented")
def test_attr_access_write():
sec = curve_section()
sec.GR = "150.0"
assert sec["GR"].value == "150.0"
@pytest.mark.xfail(reason="not yet implemented")
def test_mnemonic_case_insensitive():
sec = las_rs.SectionItems(mnemonic_transforms=True)
sec.append(item("GR", unit="GAPI", descr="Gamma ray"))
assert sec["gr"].mnemonic == "GR"
@pytest.mark.xfail(reason="not yet implemented")
def test_mnemonic_case_sensitive():
sec = las_rs.SectionItems(mnemonic_transforms=False)
sec.append(item("GR", unit="GAPI", descr="Gamma ray"))
with pytest.raises(KeyError):
_ = sec["gr"]
@pytest.mark.xfail(reason="not yet implemented")
def test_get_existing():
sec = curve_section()
result = sec.get("GR")
assert result.mnemonic == "GR"
@pytest.mark.xfail(reason="not yet implemented")
def test_get_missing_string_default():
sec = well_section()
result = sec.get("MISSING", "fallback_val")
assert isinstance(result, las_rs.HeaderItem)
assert result.value == "fallback_val"
@pytest.mark.xfail(reason="not yet implemented")
def test_get_missing_add():
sec = well_section()
original_len = len(sec)
result = sec.get("NEWFIELD", add=True)
assert isinstance(result, las_rs.HeaderItem)
assert len(sec) == original_len + 1
assert "NEWFIELD" in sec
@pytest.mark.xfail(reason="not yet implemented")
def test_dictview():
sec = well_section()
view = sec.dictview()
assert isinstance(view, dict)
assert view["WELL"] == "WILDCAT-12"
assert view["FLD"] == "BLOCK_22"
@pytest.mark.xfail(reason="not yet implemented")
def test_str_table_format():
sec = curve_section()
table = str(sec)
assert "DEPT" in table
assert "GR" in table
assert "RHOB" in table
lines = [l for l in table.splitlines() if l.strip()]
assert len(lines) >= 3
@pytest.mark.xfail(reason="not yet implemented")
def test_json_property():
sec = curve_section()
raw = sec.json
parsed = json.loads(raw)
assert isinstance(parsed, list)
assert len(parsed) == 3
mnemonics = [entry["mnemonic"] for entry in parsed]
assert "DEPT" in mnemonics
assert "GR" in mnemonics
assert "RHOB" in mnemonics