import math
import numpy as np
import pytest
import las_rs
def hitem(mnemonic, unit="", value="", descr=""):
return las_rs.HeaderItem(mnemonic=mnemonic, unit=unit, value=value, descr=descr)
def citem(mnemonic, unit="", value="", descr="", data=None):
if data is None:
data = np.array([])
return las_rs.CurveItem(mnemonic=mnemonic, unit=unit, value=value, descr=descr, data=data)
def header_section():
sec = las_rs.SectionItems()
sec.append(hitem("WELL", value="RIDGE-5"))
sec.append(hitem("FLD", value="NORTHBLOCK"))
sec.append(hitem("LOC", value="60.00 N, 2.50 E"))
return sec
def curve_section_with_data():
sec = las_rs.SectionItems()
sec.append(citem("DEPT", unit="M", descr="Depth", data=np.array([1000.0, 1001.0, 1002.0, 1003.0])))
sec.append(citem("GR", unit="GAPI", descr="Gamma ray", data=np.array([55.3, 62.1, 48.7, 71.0])))
sec.append(citem("RHOB", unit="G/CC", descr="Density", data=np.array([2.50, 2.48, 2.53, 2.45])))
return sec
@pytest.mark.xfail(reason="not yet implemented")
def test_dict_style_setitem_mnemonic_blocked():
sec = header_section()
original_mnemonic = sec["WELL"].mnemonic
try:
sec["WELL"]["mnemonic"] = "ZZZ"
except (TypeError, KeyError, AttributeError):
pass
assert "WELL" in sec
assert sec["WELL"].mnemonic == original_mnemonic
@pytest.mark.xfail(reason="not yet implemented")
def test_get_missing_curveitem_default():
sec = curve_section_with_data()
result = sec.get("MISSING")
assert isinstance(result, las_rs.CurveItem)
assert len(result.data) == 4
assert all(math.isnan(v) for v in result.data)
@pytest.mark.xfail(reason="not yet implemented")
def test_get_missing_headeritem_default_object():
sec = header_section()
default = las_rs.HeaderItem(mnemonic="X", unit="DEGC", value="99", descr="template")
result = sec.get("MISSING", default=default)
assert isinstance(result, las_rs.HeaderItem)
assert result.mnemonic == "MISSING"
assert result.unit == "DEGC"
assert result.value == "99"
assert result.descr == "template"
@pytest.mark.xfail(reason="not yet implemented")
def test_get_missing_int_default():
sec = header_section()
result = sec.get("MISSING", 42)
assert isinstance(result, las_rs.HeaderItem)
assert str(result.value) == "42"
@pytest.mark.xfail(reason="not yet implemented")
def test_assign_duplicate_suffixes_all():
sec = las_rs.SectionItems()
sec.append(hitem("GR", value="first"))
sec.append(hitem("GR", value="second"))
sec.append(hitem("SP", value="first_sp"))
sec.append(hitem("SP", value="second_sp"))
sec.assign_duplicate_suffixes(None)
keys = list(sec.keys())
assert len(set(keys)) == len(keys), "All mnemonics must be unique after re-check"
gr_keys = [k for k in keys if "GR" in k]
sp_keys = [k for k in keys if "SP" in k]
assert len(gr_keys) == 2
assert len(sp_keys) == 2
@pytest.mark.xfail(reason="not yet implemented")
def test_set_item_appends_if_missing():
sec = header_section()
original_len = len(sec)
new = hitem("NEW", value="brand_new")
sec.set_item("NEW", new)
assert len(sec) == original_len + 1
assert "NEW" in sec
assert sec["NEW"].value == "brand_new"
@pytest.mark.xfail(reason="not yet implemented")
def test_set_item_value_updates():
sec = curve_section_with_data()
sec.set_item_value("GR", 99.0)
assert sec["GR"].value == 99.0 or str(sec["GR"].value) == "99.0"
@pytest.mark.xfail(reason="not yet implemented")
def test_multiple_duplicate_suffixes():
sec = las_rs.SectionItems()
sec.append(hitem("GR", value="alpha"))
sec.append(hitem("GR", value="beta"))
sec.append(hitem("GR", value="gamma"))
keys = list(sec.keys())
assert "GR:1" in keys
assert "GR:2" in keys
assert "GR:3" in keys
@pytest.mark.xfail(reason="not yet implemented")
def test_insert_updates_duplicates():
sec = las_rs.SectionItems()
sec.append(hitem("RHOB", value="first"))
sec.append(hitem("NPHI", value="solo"))
sec.append(hitem("RHOB", value="second"))
keys = list(sec.keys())
rhob_keys = [k for k in keys if "RHOB" in k]
assert len(rhob_keys) == 2
assert len(set(rhob_keys)) == 2