initial commit
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
import importlib.util
|
||||
import os
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
|
||||
def load_fortran_toolchain():
|
||||
module_path = Path(__file__).resolve().parent / "fortran_toolchain.py"
|
||||
spec = importlib.util.spec_from_file_location("fortran_toolchain", module_path)
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(module)
|
||||
return module
|
||||
|
||||
|
||||
class FortranToolchainTests(unittest.TestCase):
|
||||
def test_auto_prefers_ifx_over_ifort_when_both_are_on_path(self):
|
||||
fortran_toolchain = load_fortran_toolchain()
|
||||
|
||||
def fake_which(name):
|
||||
return f"C:\\oneapi\\{name}.exe" if name in {"ifx", "ifort"} else None
|
||||
|
||||
with patch.object(fortran_toolchain.shutil, "which", side_effect=fake_which):
|
||||
with patch.dict(os.environ, {}, clear=True):
|
||||
toolchain = fortran_toolchain.resolve_toolchain()
|
||||
|
||||
self.assertEqual(toolchain.name, "ifx")
|
||||
self.assertEqual(toolchain.executable, "C:\\oneapi\\ifx.exe")
|
||||
self.assertIsNone(toolchain.env_script)
|
||||
|
||||
def test_auto_uses_oneapi_env_script_when_compiler_is_not_on_path(self):
|
||||
fortran_toolchain = load_fortran_toolchain()
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
vars_bat = Path(tmp) / "setvars.bat"
|
||||
vars_bat.write_text("@echo off\n", encoding="utf-8")
|
||||
|
||||
with patch.object(fortran_toolchain.shutil, "which", return_value=None):
|
||||
with patch.object(fortran_toolchain, "ONEAPI_VARS_CANDIDATES", [vars_bat]):
|
||||
with patch.dict(os.environ, {}, clear=True):
|
||||
toolchain = fortran_toolchain.resolve_toolchain()
|
||||
|
||||
self.assertEqual(toolchain.name, "ifx")
|
||||
self.assertEqual(toolchain.executable, "ifx")
|
||||
self.assertEqual(toolchain.env_script, vars_bat)
|
||||
|
||||
def test_explicit_compiler_preference_is_honored(self):
|
||||
fortran_toolchain = load_fortran_toolchain()
|
||||
|
||||
def fake_which(name):
|
||||
return f"C:\\oneapi\\{name}.exe"
|
||||
|
||||
with patch.object(fortran_toolchain.shutil, "which", side_effect=fake_which):
|
||||
with patch.dict(os.environ, {"HARNESS_FORTRAN_COMPILER": "ifort"}, clear=True):
|
||||
toolchain = fortran_toolchain.resolve_toolchain()
|
||||
|
||||
self.assertEqual(toolchain.name, "ifort")
|
||||
self.assertEqual(toolchain.executable, "C:\\oneapi\\ifort.exe")
|
||||
|
||||
def test_wrap_command_calls_oneapi_env_before_compiler(self):
|
||||
fortran_toolchain = load_fortran_toolchain()
|
||||
toolchain = fortran_toolchain.FortranToolchain(
|
||||
name="ifx",
|
||||
executable="ifx",
|
||||
env_script=Path(r"C:\Program Files (x86)\Intel\oneAPI\setvars.bat"),
|
||||
)
|
||||
|
||||
command = fortran_toolchain.wrap_command(toolchain, ["ifx", "/nologo", "test.f90"])
|
||||
|
||||
self.assertIn("cmd /d /s /c", command)
|
||||
self.assertIn('call "C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat" intel64', command)
|
||||
self.assertIn("ifx /nologo test.f90", command)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user