diff --git a/python/resdata/grid/faults/fault_block.py b/python/resdata/grid/faults/fault_block.py index a74a4c17d..787d61037 100644 --- a/python/resdata/grid/faults/fault_block.py +++ b/python/resdata/grid/faults/fault_block.py @@ -139,7 +139,7 @@ def contains_polyline(self, polyline): """ Will return true if at least one point from the polyline is inside the block. """ - edge_polyline = self.getEdgePolygon() + edge_polyline = self.get_edge_polygon() for p in polyline: if GeometryTools.pointInPolygon(p, edge_polyline): return True diff --git a/python/resdata/grid/faults/fault_block_layer.py b/python/resdata/grid/faults/fault_block_layer.py index 3176456a9..79be79bf3 100644 --- a/python/resdata/grid/faults/fault_block_layer.py +++ b/python/resdata/grid/faults/fault_block_layer.py @@ -199,7 +199,7 @@ def add_fault_link(self, fault1, fault2): def join_faults(self, fault1, fault2): if not fault1.intersectsFault(fault2, self.getK()): - layer = self.getGeoLayer() + layer = self.get_geo_layer() try: layer.addIJBarrier(Fault.joinFaults(fault1, fault2, self.getK())) except ValueError: diff --git a/python/resdata/grid/faults/fault_segments.py b/python/resdata/grid/faults/fault_segments.py index b5ff6e91a..90c328ce2 100644 --- a/python/resdata/grid/faults/fault_segments.py +++ b/python/resdata/grid/faults/fault_segments.py @@ -68,7 +68,7 @@ def __str__(self): return self.__segment_map.__str__() def verify(self): - for C, count in self.__count_map.iteritems(): + for C, count in self.__count_map.items(): if count > 0: d = self.__segment_map[C] if len(d) != count: @@ -135,7 +135,7 @@ def pop_next(self, segment): def print_content(self): for d in self.__segment_map.values(): - for C, S in d.iteritems(): + for C, S in d.items(): print(S) diff --git a/python/resdata/grid/faults/layer.py b/python/resdata/grid/faults/layer.py index eaf263f42..9e5f6e8da 100644 --- a/python/resdata/grid/faults/layer.py +++ b/python/resdata/grid/faults/layer.py @@ -179,8 +179,8 @@ def add_ij_barrier(self, ij_list): if len(ij_list) < 2: raise ValueError("Must have at least two (i,j) points") - nx = self.getNX() - ny = self.getNY() + nx = self.get_nx() + ny = self.get_ny() p1 = ij_list[0] i1, j1 = p1 for p2 in ij_list[1:]: diff --git a/python/tests/rd_tests/test_fault_blocks.py b/python/tests/rd_tests/test_fault_blocks.py index 09c648e46..895af8711 100644 --- a/python/tests/rd_tests/test_fault_blocks.py +++ b/python/tests/rd_tests/test_fault_blocks.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -from unittest import skipIf import cwrap +import pytest from resdata import ResDataType from resdata.resfile import ResdataKW @@ -147,6 +147,7 @@ def test_neighbours2(self): f.write("FAULTS\n") f.write("'FY' 1 4 4 4 1 1 'Y' /\n") f.write("'FX' 4 4 1 8 1 1 'X' /\n") + f.write("'FXX' 6 6 1 8 1 1 'X' /\n") f.write("/") faults = FaultCollection(grid, "faults.grdecl") @@ -185,6 +186,10 @@ def test_neighbours2(self): nb = b1.getNeighbours() self.assertEqual(len(nb), 0) + layer.join_faults(faults["FX"], faults["FY"]) + with pytest.raises(ValueError, match="Failed to join faults FXX and FY"): + layer.join_faults(faults["FXX"], faults["FY"]) + def test_neighbours3(self): nx = 8 ny = 8 @@ -286,6 +291,9 @@ def test_fault_block_layer(self): polyline = Polyline(init_points=[(1.0, 0.0), (2.0, 1.0)]) assert l1.contains_polyline(polyline) + polyline2 = Polyline(init_points=[(10.5, 1.0), (11, 5)]) + assert not l1.contains_polyline(polyline2) + with self.assertRaises(KeyError): l = layer.getBlock(66) @@ -417,6 +425,11 @@ def test_internal_blocks(self): faults = FaultCollection(grid, "faults.grdecl") layer.loadKeyword(kw) + faulty_kw = ResdataKW("SOIL", 10000, ResDataType.RD_INT) + with pytest.raises( + ValueError, match="The fault block keyword had wrong type/size" + ): + layer.load_keyword(faulty_kw) layer.addFaultBarrier(faults["FX"]) b1 = layer.getBlock(1) b2 = layer.getBlock(2) diff --git a/python/tests/rd_tests/test_faults.py b/python/tests/rd_tests/test_faults.py index 048e68054..f8a6ff3c6 100644 --- a/python/tests/rd_tests/test_faults.py +++ b/python/tests/rd_tests/test_faults.py @@ -12,6 +12,7 @@ FaultLine, FaultSegment, FaultBlockLayer, + SegmentMap, ) from resdata.util.test import TestAreaContext from resdata.geometry import Polyline, CPolyline @@ -127,6 +128,36 @@ def test_faultLine_center(self): self.assertEqual(len(fl), 2) self.assertEqual(fl.center(), (0.50, 0.50)) + def test_fault_segments(self): + S1 = FaultSegment(0, 10) + S2 = FaultSegment(10, 20) + S3 = FaultSegment(0, 10) + S4 = FaultSegment(10, 0) + S5 = FaultSegment(30, 40) + S6 = FaultSegment(50, 40) + assert S1 != S2 + assert S1 == S3 + assert S3 == S4 + assert S1.joins(S2) + assert S2.joins(S4) + assert S1.joins(S4) + assert not S2.joins(S5) + assert not S5.joins(S2) + assert S6.joins(S5) + + def test_segment_map(self): + S1 = FaultSegment(0, 10) + S2 = FaultSegment(10, 20) + S5 = FaultSegment(30, 40) + SM = SegmentMap() + SM.add_segment(S1) + SM.add_segment(S2) + assert len(SM) == 3 + SM.verify() + SM.add_segment(S5) + assert len(SM) == 5 + SM.print_content() + def test_faultLine(self): fl = FaultLine(self.grid, 10) S1 = FaultSegment(0, 10) diff --git a/python/tests/rd_tests/test_grdecl.py b/python/tests/rd_tests/test_grdecl.py index f9e7c733a..cd77ef7bc 100644 --- a/python/tests/rd_tests/test_grdecl.py +++ b/python/tests/rd_tests/test_grdecl.py @@ -1,10 +1,12 @@ +import pytest + from numpy import allclose import cwrap from resdata.resfile import ResdataKW -def test_eclkw_read_grdecl(tmp_path): +def test_resdatakw_read_grdecl(tmp_path): block_size = 10 num_blocks = 5 value = 0.15 @@ -17,6 +19,8 @@ def test_eclkw_read_grdecl(tmp_path): with cwrap.open(str(tmp_path / "test.grdecl")) as f: kw = ResdataKW.read_grdecl(f, "COORD") assert ResdataKW.fseek_grdecl(f, "COORD", True) + with pytest.raises(TypeError, match="Sorry keyword:TOOLONGAKW"): + ResdataKW.read_grdecl(f, "TOOLONGAKW") assert kw.get_name() == "COORD" assert len(kw.numpy_view()) == block_size * num_blocks diff --git a/python/tests/rd_tests/test_grid.py b/python/tests/rd_tests/test_grid.py index 4d8e734c1..8d1e6421e 100644 --- a/python/tests/rd_tests/test_grid.py +++ b/python/tests/rd_tests/test_grid.py @@ -2,9 +2,10 @@ import os.path from unittest import skip import itertools +import pytest import functools -from numpy import linspace, allclose +import numpy as np import cwrap from resdata.util.util import IntVector, DoubleVector @@ -260,6 +261,13 @@ def test_dims(self): self.assertEqual(grid.getDims(), (10, 20, 30, 6000)) + def test_global_index(self): + grid = GridGen.createRectangular((10, 20, 30), (1, 1, 1)) + with pytest.raises( + IndexError, match=r"Invalid value global_index:7000 Range: \[0,6000\)" + ): + grid.get_active_index(global_index=7000) + def test_load_column(self): column = DoubleVector(2 * 3 * 4) grid = GridGen.createRectangular((2, 3, 4), (1, 1, 1)) @@ -455,7 +463,18 @@ def test_create_3d_is_create_kw_inverse(self): numpy_3d = grid.create3D(kw1) kw2 = grid.create_kw(numpy_3d, "SWAT", False) self.assertEqual(kw2.name, "SWAT") - assert allclose(grid.create3D(kw2), numpy_3d) + assert np.allclose(grid.create3D(kw2), numpy_3d) + + def test_create_kw(self): + rng = np.random.default_rng() + nx = 10 + ny = 7 + nz = 5 + grid = GridGen.create_rectangular((nx, ny, nz), (1, 1, 1)) + array1 = rng.integers(0, 100, size=(nx, ny, nz), dtype=np.int32) + array2 = rng.normal(10, 2, size=(nx, ny, nz)) + _ = grid.create_kw(array1, "SWAT1", False) + _ = grid.create_kw(array2, "SWAT2", False) def test_create_3d_agrees_with_get_value(self): nx = 5 @@ -539,13 +558,13 @@ def test_unique_containment(self): (xmin, xmax), (ymin, ymax), (zmin, zmax) = getMinMaxValue(wgrid) - x_space = linspace( + x_space = np.linspace( xmin - 1, xmax + 1, int(xmax - xmin + 2) * steps_per_unit + 1 ) - y_space = linspace( + y_space = np.linspace( ymin - 1, ymax + 1, int(ymax - ymin + 2) * steps_per_unit + 1 ) - z_space = linspace( + z_space = np.linspace( zmin - 1, zmax + 1, int(zmax - zmin + 2) * steps_per_unit + 1 ) diff --git a/python/tests/rd_tests/test_rd_file.py b/python/tests/rd_tests/test_rd_file.py index c4f08d270..ca649439b 100644 --- a/python/tests/rd_tests/test_rd_file.py +++ b/python/tests/rd_tests/test_rd_file.py @@ -247,6 +247,9 @@ def test_block_view(self): view = rd_file.blockView2(None, "DATA2", 0) + with pytest.raises(KeyError, match="The keyword:FAULTY is not in file"): + rd_file.block_view2("HEADER", "FAULTY", 0) + def test_report_list(tmpdir): with tmpdir.as_cwd(): diff --git a/python/tests/rd_tests/test_rd_kw.py b/python/tests/rd_tests/test_rd_kw.py index 4ff7b17e8..7adb45cef 100644 --- a/python/tests/rd_tests/test_rd_kw.py +++ b/python/tests/rd_tests/test_rd_kw.py @@ -1,4 +1,7 @@ #!/usr/bin/env python + +import pytest + import random import warnings import cwrap @@ -622,6 +625,25 @@ def test_iadd(): assert list(kw1) == list(kw2) + with pytest.raises(TypeError, match="Type mismatch"): + kw1 += "a" + + +def test_imul(): + kw1 = ResdataKW("KW1", 5, ResDataType.RD_INT) + for i in range(len(kw1)): + kw1[i] = 1 + kw1 *= 10 + + assert list(kw1) == [10] * 5 + + with pytest.raises(TypeError, match="Type mismatch"): + kw1 *= 3.2 + + kw2 = ResdataKW("KW2", 5, ResDataType.RD_FLOAT) + with pytest.raises(TypeError, match="Only muliplication with scalar supported"): + kw2 *= "a" + def test_get_ptr_data(): assert ResdataKW("KW1", 10, ResDataType.RD_INT).get_data_ptr() diff --git a/python/tests/rd_tests/test_rd_util.py b/python/tests/rd_tests/test_rd_util.py index 7343abb10..39a41c790 100644 --- a/python/tests/rd_tests/test_rd_util.py +++ b/python/tests/rd_tests/test_rd_util.py @@ -13,7 +13,10 @@ def test_enums(self): def test_file_type(self): file_type, fmt, report = ResdataUtil.inspectExtension("CASE.X0078") - self.assertEqual(file_type, FileType.RESTART) + assert file_type == FileType.RESTART + file_type, fmt, report = ResdataUtil.inspectExtension("CASE.UNRST") + assert file_type == FileType.UNIFIED_RESTART + assert report == None def test_file_report_nr(self): report_nr = ResdataUtil.reportStep("CASE.X0080") diff --git a/python/tests/rd_tests/test_region.py b/python/tests/rd_tests/test_region.py index 2196d829b..840c70e74 100644 --- a/python/tests/rd_tests/test_region.py +++ b/python/tests/rd_tests/test_region.py @@ -24,6 +24,12 @@ def test_equal(self): with self.assertRaises(ValueError): region.select_equal(kw_float, 1) + with pytest.raises( + ValueError, + match="The select_equal method must have an integer valued keyword", + ): + region.deselect_equal(kw_float, 2) + def test_sum(self): grid = GridGenerator.create_rectangular((10, 10, 1), (1, 1, 1)) kw_mask = ResdataKW("INT", grid.getGlobalSize(), ResDataType.RD_INT) @@ -220,6 +226,13 @@ def poro(grid): ) +@pytest.fixture +def poro_int(grid): + return grid.create_kw( + np.ones((grid.nx, grid.ny, grid.nz), dtype=np.int32), "PORO", True + ) + + def test_select_in_range(empty_region, active_region, poro): empty_region.select_in_range(poro, 0.9, 1.1) assert empty_region == active_region @@ -464,6 +477,12 @@ def test_idiv_kw_full(full_region, poro): assert list(poro) == [1.0] * len(poro) +def test_idiv_kw_int(full_region, poro_int): + poro_int += 1 + full_region.idiv_kw(poro_int, 10) + assert list(poro_int) == [0] * len(poro_int) # ??? + + def test_mul_kw_full(full_region, poro): poro += 1.0 poro.mul(poro, mask=full_region)