mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-24 08:54:15 +00:00
Refactor WinePathConverter into PathResolver (#353)
* Refactor WinePathConverter into PathResolver * Run pytest in CI
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
from typing import Optional
|
||||
import pytest
|
||||
from isledecomp.parser.parser import (
|
||||
ReaderState as _rs,
|
||||
@@ -70,7 +71,7 @@ state_change_marker_cases = [
|
||||
"state, marker_type, new_state, expected_error", state_change_marker_cases
|
||||
)
|
||||
def test_state_change_by_marker(
|
||||
state: _rs, marker_type: str, new_state: _rs, expected_error: None | _pe
|
||||
state: _rs, marker_type: str, new_state: _rs, expected_error: Optional[_pe]
|
||||
):
|
||||
p = DecompParser()
|
||||
p.state = state
|
||||
|
||||
32
tools/isledecomp/tests/test_path_resolver_nt.py
Normal file
32
tools/isledecomp/tests/test_path_resolver_nt.py
Normal file
@@ -0,0 +1,32 @@
|
||||
from os import name as os_name
|
||||
import pytest
|
||||
from isledecomp.dir import PathResolver
|
||||
|
||||
|
||||
if os_name != "nt":
|
||||
pytest.skip(reason="Skip Windows-only tests", allow_module_level=True)
|
||||
|
||||
|
||||
@pytest.fixture(name="resolver")
|
||||
def fixture_resolver_win():
|
||||
yield PathResolver("C:\\isle")
|
||||
|
||||
|
||||
def test_identity(resolver):
|
||||
assert resolver.resolve_cvdump("C:\\isle\\test.h") == "C:\\isle\\test.h"
|
||||
|
||||
|
||||
def test_outside_basedir(resolver):
|
||||
assert resolver.resolve_cvdump("C:\\lego\\test.h") == "C:\\lego\\test.h"
|
||||
|
||||
|
||||
def test_relative(resolver):
|
||||
assert resolver.resolve_cvdump(".\\test.h") == "C:\\isle\\test.h"
|
||||
assert resolver.resolve_cvdump("..\\test.h") == "C:\\test.h"
|
||||
|
||||
|
||||
def test_intermediate_relative(resolver):
|
||||
"""These paths may not register as `relative` paths, but we want to
|
||||
produce a single absolute path for each."""
|
||||
assert resolver.resolve_cvdump("C:\\isle\\test\\..\\test.h") == "C:\\isle\\test.h"
|
||||
assert resolver.resolve_cvdump(".\\subdir\\..\\test.h") == "C:\\isle\\test.h"
|
||||
69
tools/isledecomp/tests/test_path_resolver_posix.py
Normal file
69
tools/isledecomp/tests/test_path_resolver_posix.py
Normal file
@@ -0,0 +1,69 @@
|
||||
from os import name as os_name
|
||||
from unittest.mock import patch
|
||||
import pytest
|
||||
from isledecomp.dir import PathResolver
|
||||
|
||||
|
||||
if os_name == "nt":
|
||||
pytest.skip(reason="Skip Posix-only tests", allow_module_level=True)
|
||||
|
||||
|
||||
@pytest.fixture(name="resolver")
|
||||
def fixture_resolver_posix():
|
||||
# Skip the call to winepath by using a patch, although this is not strictly necessary.
|
||||
with patch("isledecomp.dir.winepath_unix_to_win", return_value="Z:\\usr\\isle"):
|
||||
yield PathResolver("/usr/isle")
|
||||
|
||||
|
||||
@patch("isledecomp.dir.winepath_win_to_unix")
|
||||
def test_identity(winepath_mock, resolver):
|
||||
"""Test with an absolute Wine path where a path swap is possible."""
|
||||
# In this and upcoming tests, patch is_file so we always assume there is
|
||||
# a file at the given unix path. We want to test the conversion logic only.
|
||||
with patch("pathlib.Path.is_file", return_value=True):
|
||||
assert resolver.resolve_cvdump("Z:\\usr\\isle\\test.h") == "/usr/isle/test.h"
|
||||
winepath_mock.assert_not_called()
|
||||
|
||||
# Without the patch, this should call the winepath_mock, but we have
|
||||
# memoized the value from the previous run.
|
||||
assert resolver.resolve_cvdump("Z:\\usr\\isle\\test.h") == "/usr/isle/test.h"
|
||||
winepath_mock.assert_not_called()
|
||||
|
||||
|
||||
@patch("isledecomp.dir.winepath_win_to_unix")
|
||||
def test_file_does_not_exist(winepath_mock, resolver):
|
||||
"""These test files (probably) don't exist, so we always assume
|
||||
the path swap failed and defer to winepath."""
|
||||
resolver.resolve_cvdump("Z:\\usr\\isle\\test.h")
|
||||
winepath_mock.assert_called_once_with("Z:\\usr\\isle\\test.h")
|
||||
|
||||
|
||||
@patch("isledecomp.dir.winepath_win_to_unix")
|
||||
def test_outside_basedir(winepath_mock, resolver):
|
||||
"""Test an absolute path where we cannot do a path swap."""
|
||||
with patch("pathlib.Path.is_file", return_value=True):
|
||||
resolver.resolve_cvdump("Z:\\lego\\test.h")
|
||||
winepath_mock.assert_called_once_with("Z:\\lego\\test.h")
|
||||
|
||||
|
||||
@patch("isledecomp.dir.winepath_win_to_unix")
|
||||
def test_relative(winepath_mock, resolver):
|
||||
"""Test relative paths inside and outside of the base dir."""
|
||||
with patch("pathlib.Path.is_file", return_value=True):
|
||||
assert resolver.resolve_cvdump("./test.h") == "/usr/isle/test.h"
|
||||
|
||||
# This works because we will resolve "/usr/isle/test/../test.h"
|
||||
assert resolver.resolve_cvdump("../test.h") == "/usr/test.h"
|
||||
winepath_mock.assert_not_called()
|
||||
|
||||
|
||||
@patch("isledecomp.dir.winepath_win_to_unix")
|
||||
def test_intermediate_relative(winepath_mock, resolver):
|
||||
"""We can resolve intermediate backdirs if they are relative to the basedir."""
|
||||
with patch("pathlib.Path.is_file", return_value=True):
|
||||
assert (
|
||||
resolver.resolve_cvdump("Z:\\usr\\isle\\test\\..\\test.h")
|
||||
== "/usr/isle/test.h"
|
||||
)
|
||||
assert resolver.resolve_cvdump(".\\subdir\\..\\test.h") == "/usr/isle/test.h"
|
||||
winepath_mock.assert_not_called()
|
||||
Reference in New Issue
Block a user