"""The retired numerical backend must not become a hidden runtime dependency.""" import os from pathlib import Path import subprocess import sys import unittest from unittest.mock import patch from app.simulation.backends import numeric_engine_name class NativeOnlyBackendTests(unittest.TestCase): def test_python_backend_is_rejected_explicitly(self): with patch.dict(os.environ, {'SIMULATION_NUMERIC_ENGINE': 'python'}): with self.assertRaisesRegex(ValueError, 'removed'): numeric_engine_name() self.assertEqual(numeric_engine_name('native-c'), 'native') def test_api_and_compiler_import_without_numpy_or_scipy(self): code = ''' import importlib.abc import sys from pathlib import Path class NoNumericalPython(importlib.abc.MetaPathFinder): def find_spec(self, fullname, path=None, target=None): if fullname.split('.')[0] in ('numpy', 'scipy'): raise AssertionError('Retired numerical dependency imported: '+fullname) sys.meta_path.insert(0, NoNumericalPython()) from app.main import compile_system_xml_network from app.simulation.native_codegen.compiler import compile_native_program from app.system_xml import validate_system_xml_document doc = validate_system_xml_document(Path('tests/data/native-skill-test.xml').read_bytes()).document program = compile_native_program(compile_system_xml_network(doc)) assert len(program.state_keys) == 12 assert len(program.variables) == 175 assert not any(name.startswith('app.simulation.solvers.') for name in sys.modules) ''' subprocess.run([sys.executable, '-c', code], cwd=Path(__file__).resolve().parents[1], capture_output=True, text=True, check=True, timeout=30)