import math
import os
import numpy as np
import pytest
import las_rs
test_dir = os.path.dirname(__file__)
def fixture(fn):
return os.path.join(test_dir, "fixtures", fn)
@pytest.mark.xfail(reason="not yet implemented")
def test_missing_vers():
las = las_rs.read(fixture("edge_cases/missing_vers.las"))
assert isinstance(las, las_rs.LASFile)
@pytest.mark.xfail(reason="not yet implemented")
def test_missing_wrap():
las = las_rs.read(fixture("edge_cases/missing_wrap.las"))
assert isinstance(las, las_rs.LASFile)
@pytest.mark.xfail(reason="not yet implemented")
def test_missing_null():
las = las_rs.read(fixture("edge_cases/missing_null.las"))
assert isinstance(las, las_rs.LASFile)
@pytest.mark.xfail(reason="not yet implemented")
def test_missing_a_section():
las = las_rs.read(fixture("edge_cases/missing_a_section.las"))
assert isinstance(las, las_rs.LASFile)
assert las.data.size == 0 or las.data.shape[0] == 0
@pytest.mark.xfail(reason="not yet implemented")
def test_header_only():
las = las_rs.read(fixture("edge_cases/header_only.las"))
assert isinstance(las, las_rs.LASFile)
for curve in las.curves:
assert len(curve.data) == 0
@pytest.mark.xfail(reason="not yet implemented")
def test_blank_line_in_header():
las = las_rs.read(fixture("edge_cases/blank_line_in_header.las"))
assert isinstance(las, las_rs.LASFile)
assert len(las.curves) == 2
assert las.data.shape[0] == 3
@pytest.mark.xfail(reason="not yet implemented")
def test_blank_line_at_start():
las = las_rs.read(fixture("edge_cases/blank_line_at_start.las"))
assert isinstance(las, las_rs.LASFile)
assert float(las.version["VERS"].value) == pytest.approx(2.0)
@pytest.mark.xfail(reason="not yet implemented")
def test_duplicate_mnemonics():
las = las_rs.read(fixture("edge_cases/duplicate_mnemonics.las"))
curve_mnemonics = [c.mnemonic for c in las.curves]
assert "GR:1" in curve_mnemonics or curve_mnemonics.count("GR") == 1
assert len(curve_mnemonics) == len(set(curve_mnemonics))
@pytest.mark.xfail(reason="not yet implemented")
def test_empty_mnemonic():
las = las_rs.read(fixture("edge_cases/empty_mnemonic.las"))
curve_mnemonics = [c.mnemonic for c in las.curves]
assert "UNKNOWN" in curve_mnemonics
@pytest.mark.xfail(reason="not yet implemented")
def test_multiple_empty_mnemonics():
las = las_rs.read(fixture("edge_cases/multiple_empty_mnemonics.las"))
curve_mnemonics = [c.mnemonic for c in las.curves]
unknown_entries = [m for m in curve_mnemonics if "UNKNOWN" in m.upper()]
assert len(unknown_entries) == 2
assert len(set(unknown_entries)) == 2
@pytest.mark.xfail(reason="not yet implemented")
def test_non_standard_section():
las = las_rs.read(fixture("edge_cases/non_standard_section.las"))
section_keys = [k.upper() for k in las.sections.keys()]
custom_found = any("CUSTOM" in k for k in section_keys)
assert custom_found
@pytest.mark.xfail(reason="not yet implemented")
def test_dodgy_params_raises():
with pytest.raises(las_rs.LASHeaderError):
las_rs.read(fixture("edge_cases/dodgy_params.las"))
@pytest.mark.xfail(reason="not yet implemented")
def test_dodgy_params_ignore():
las = las_rs.read(
fixture("edge_cases/dodgy_params.las"),
ignore_header_errors=True,
)
param_mnemonics = [p.mnemonic for p in las.params]
assert "BHT" in param_mnemonics
assert "BS" in param_mnemonics
@pytest.mark.xfail(reason="not yet implemented")
def test_uwi_leading_zero():
las = las_rs.read(fixture("edge_cases/uwi_leading_zero.las"))
uwi_value = str(las.well["UWI"].value).strip()
assert uwi_value.startswith("0")
@pytest.mark.xfail(reason="not yet implemented")
def test_api_leading_zero():
las = las_rs.read(fixture("edge_cases/uwi_leading_zero.las"))
api_value = str(las.well["API"].value).strip()
assert api_value.startswith("0")
@pytest.mark.xfail(reason="not yet implemented")
def test_excess_data_columns():
las = las_rs.read(fixture("edge_cases/excess_data_columns.las"))
assert len(las.curves) > 2
curve_mnemonics = [c.mnemonic for c in las.curves]
assert "DEPT" in curve_mnemonics
assert "GR" in curve_mnemonics
@pytest.mark.xfail(reason="not yet implemented")
def test_single_data_row():
las = las_rs.read(fixture("edge_cases/single_data_row.las"))
assert las.data.shape[0] == 1
dept_val = las.curves["DEPT"].data[0]
assert dept_val == pytest.approx(250.0)
@pytest.mark.xfail(reason="not yet implemented")
def test_string_data_columns():
las = las_rs.read(fixture("edge_cases/string_data_columns.las"))
curve_mnemonics = [c.mnemonic for c in las.curves]
assert "LITHOLOGY" in curve_mnemonics
lith_data = las.curves["LITHOLOGY"].data
non_empty = [v for v in lith_data if v and str(v).strip() not in ("", "nan")]
assert len(non_empty) > 0
assert "SANDSTONE" in str(lith_data[0]).upper()