GenericMappingTools / pygmt

A Python interface for the Generic Mapping Tools.
https://www.pygmt.org
BSD 3-Clause "New" or "Revised" License
747 stars 216 forks source link

x2sys_cross tests fail on macOS-14 #3194

Open seisman opened 5 months ago

seisman commented 5 months ago

https://github.blog/changelog/2024-04-01-macos-14-sonoma-is-generally-available-and-the-latest-macos-runner-image/

macos-latest has migrated from macOS-12 to macOS-14 in a few hours ago. All tests are good except x2sys_cross tests.

The failures are:

=================================== FAILURES ===================================
_________________ test_x2sys_cross_input_file_output_dataframe _________________

    @pytest.mark.usefixtures("mock_x2sys_home")
    @pytest.mark.xfail(
        condition=Version(__gmt_version__) < Version("6.5.0"),
        reason="Upstream bug fixed in https://github.com/GenericMappingTools/gmt/pull/8188",
    )
    def test_x2sys_cross_input_file_output_dataframe():
        """
        Run x2sys_cross by passing in a filename, and output internal crossovers to a
        pandas.DataFrame.
        """
        with TemporaryDirectory(prefix="X2SYS", dir=Path.cwd()) as tmpdir:
            tag = Path(tmpdir).name
            x2sys_init(tag=tag, fmtfile="xyz", force=True)
            output = x2sys_cross(tracks=["@tut_ship.xyz"], tag=tag, coe="i")

            assert isinstance(output, pd.DataFrame)
>           assert output.shape == (14338, 12)
E           assert (14374, 12) == (14338, 12)
E             
E             At index 0 diff: 14374 != 14338
E             
E             Full diff:
E               (
E             -     14338,
E             ?        ^^
E             +     14374,
E             ?        ^^
E                   12,
E               )

../pygmt/tests/test_x2sys_cross.py:76: AssertionError
----------------------------- Captured stderr call -----------------------------
Warning: ss [WARNING]: No time column, use dummy times
_______________ test_x2sys_cross_region_interpolation_numpoints ________________

    @pytest.mark.usefixtures("mock_x2sys_home")
    @pytest.mark.xfail(
        condition=Version(__gmt_version__) < Version("6.5.0"),
        reason="Upstream bug fixed in https://github.com/GenericMappingTools/gmt/pull/8188",
    )
    def test_x2sys_cross_region_interpolation_numpoints():
        """
        Test that x2sys_cross's region (R), interpolation (l) and numpoints (W) arguments
        work.
        """
        with TemporaryDirectory(prefix="X2SYS", dir=Path.cwd()) as tmpdir:
            tag = Path(tmpdir).name
            x2sys_init(tag=tag, fmtfile="xyz", force=True)
            output = x2sys_cross(
                tracks=["@tut_ship.xyz"],
                tag=tag,
                coe="i",
                region=[245, 250, 20, 25],
                interpolation="a",  # Akima spline interpolation
                numpoints=5,  # Use up to 5 data points in interpolation
            )

            assert isinstance(output, pd.DataFrame)
>           assert output.shape == (3882, 12)
E           assert (3894, 12) == (3882, 12)
E             
E             At index 0 diff: 3894 != 3882
E             
E             Full diff:
E               (
E             -     3882,
E             ?       ^^
E             +     3894,
E             ?       ^^
E                   12,
E               )

../pygmt/tests/test_x2sys_cross.py:224: AssertionError
----------------------------- Captured stderr call -----------------------------
Warning: ss [WARNING]: No time column, use dummy times
_________________________ test_x2sys_cross_trackvalues _________________________

    @pytest.mark.usefixtures("mock_x2sys_home")
    @pytest.mark.xfail(
        condition=Version(__gmt_version__) < Version("6.5.0"),
        reason="Upstream bug fixed in https://github.com/GenericMappingTools/gmt/pull/8188",
    )
    def test_x2sys_cross_trackvalues():
        """
        Test that x2sys_cross's trackvalues (Z) argument work.
        """
        with TemporaryDirectory(prefix="X2SYS", dir=Path.cwd()) as tmpdir:
            tag = Path(tmpdir).name
            x2sys_init(tag=tag, fmtfile="xyz", force=True)
            output = x2sys_cross(tracks=["@tut_ship.xyz"], tag=tag, trackvalues=True)

            assert isinstance(output, pd.DataFrame)
>           assert output.shape == (14338, 12)
E           assert (14374, 12) == (14338, 12)
E             
E             At index 0 diff: 14374 != 14338
E             
E             Full diff:
E               (
E             -     14338,
E             ?        ^^
E             +     14374,
E             ?        ^^
E                   12,
E               )

For reference, the data shapes were updated in PR https://github.com/GenericMappingTools/pygmt/pull/2986 after the upstream fix https://github.com/GenericMappingTools/gmt/pull/8188.

In https://github.com/GenericMappingTools/gmt/pull/8188, if (tx_a < ta_stop && tx_b < tb_stop) was changed to if (tx_a < ta_stop && tx_b <= tb_stop). I guess the floating-point comparison may be tricky and depend on the C compiler.

weiji14 commented 5 months ago

Yeah, seems like these same tests were failing in our GMT Dev Tests since we bumped to macos-14 as mentioned at https://github.com/GenericMappingTools/pygmt/pull/3024#pullrequestreview-1858990667, see https://github.com/GenericMappingTools/pygmt/actions/runs/7764289384/job/21177511396.

In GenericMappingTools/gmt#8188, if (tx_a < ta_stop && tx_b < tb_stop) was changed to if (tx_a < ta_stop && tx_b <= tb_stop). I guess the floating-point comparison may be tricky and depend on the C compiler.

Should we xfail this then on macOS, since the floating point comparison is consistent on Linux and Windows? Or pin to e.g. macos-13 for now (though this only delays the issue).

seisman commented 5 months ago

Should we xfail this then on macOS,

i think yes