import json
import os
import numpy as np
import pytest
import las_rs
test_dir = os.path.dirname(__file__)
def fixture(*parts):
return os.path.join(test_dir, "fixtures", *parts)
_LAS_SRC = """\
~VERSION INFORMATION
VERS. 2.0 : LAS VERSION 2.0
WRAP. NO : ONE LINE PER DEPTH STEP
~WELL INFORMATION
STRT.M 1500.0 : START DEPTH
STOP.M 1503.0 : STOP DEPTH
STEP.M 1.0 : STEP VALUE
NULL. -999.25 : NULL VALUE
COMP. PETRA RESOURCES : COMPANY
WELL. SILVERTIP-2 #1 : WELL NAME
FLD . SILVERTIP FIELD : FIELD
~CURVE INFORMATION
DEPT.M : MEASURED DEPTH
GR .GAPI : GAMMA RAY
NPHI.V/V : NEUTRON POROSITY
RHOB.G/CC : BULK DENSITY
SP .MV : SPONTANEOUS POTENTIAL
~PARAMETER INFORMATION
BHT .DEGC 88.5 : BOTTOM HOLE TEMPERATURE
MWT .G/CC 1.2 : MUD WEIGHT
~ASCII LOG DATA
1500.0 42.31 0.2940 2.512 -53.11
1501.0 67.85 0.2150 2.631 -64.77
1502.0 55.22 0.2580 2.571 -999.25
1503.0 -999.25 0.3010 2.488 -49.03
"""
def _read_inline():
return las_rs.read(_LAS_SRC)
@pytest.mark.xfail(reason="not yet implemented")
def test_json_property_valid():
las = _read_inline()
raw = las.json
assert isinstance(raw, str)
parsed = json.loads(raw)
assert isinstance(parsed, dict)
@pytest.mark.xfail(reason="not yet implemented")
def test_json_has_metadata():
las = _read_inline()
parsed = json.loads(las.json)
assert "metadata" in parsed
meta = parsed["metadata"]
section_keys = {k.lower() for k in meta.keys()}
assert section_keys & {"version", "well", "curves", "curve", "parameter", "params"}
@pytest.mark.xfail(reason="not yet implemented")
def test_json_has_data():
las = _read_inline()
parsed = json.loads(las.json)
assert "data" in parsed
data = parsed["data"]
if isinstance(data, dict):
assert "DEPT" in data
assert "GR" in data
@pytest.mark.xfail(reason="not yet implemented")
def test_json_data_values():
las = _read_inline()
n_rows = len(las.curves["DEPT"].data) parsed = json.loads(las.json)
data = parsed["data"]
if isinstance(data, dict):
for mnemonic, samples in data.items():
assert len(samples) == n_rows, (
f"Curve {mnemonic!r}: expected {n_rows} samples, got {len(samples)}"
)
@pytest.mark.xfail(reason="not yet implemented")
def test_json_nan_as_null():
las = _read_inline()
parsed = json.loads(las.json)
data = parsed["data"]
if isinstance(data, dict) and "GR" in data:
assert data["GR"][3] is None
assert "NaN" not in las.json
@pytest.mark.xfail(reason="not yet implemented")
def test_json_setter_blocked():
las = _read_inline()
with pytest.raises(Exception):
las.json = '{"mnemonic": "FAKE"}'
@pytest.mark.xfail(reason="not yet implemented")
def test_json_encoder_class():
las = _read_inline()
raw = json.dumps(las, cls=las_rs.JSONEncoder)
assert isinstance(raw, str)
parsed = json.loads(raw)
assert "metadata" in parsed or "data" in parsed