diff options
| author | Dylan Baker <dylan@pnwbakers.com> | 2024-01-22 15:49:44 -0800 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2024-01-25 10:01:50 -0800 |
| commit | adc8d6bae4010c06fc3b779b8d84c1c5b4a910ad (patch) | |
| tree | 7b7e810833ffd3d6c346bec7ebcf578413fc9206 | |
| parent | 37883e7d5fe25f9abcc93f100655b61a0e23f8e5 (diff) | |
| download | meson-adc8d6bae4010c06fc3b779b8d84c1c5b4a910ad.tar.gz | |
interpreter: replace mock keyword argument with unittest.mock
Python provides some nifty tools for mocking, without relying on
altering running code. We should use these to simplify the actual run
paths and move the complicated logic into tests.
| -rw-r--r-- | mesonbuild/interpreter/interpreter.py | 11 | ||||
| -rw-r--r-- | unittests/datatests.py | 15 | ||||
| -rw-r--r-- | unittests/internaltests.py | 5 |
3 files changed, 19 insertions, 12 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index b736aea41..bee64aa94 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -266,7 +266,6 @@ class Interpreter(InterpreterBase, HoldableObject): subdir: str = '', subproject_dir: str = 'subprojects', default_project_options: T.Optional[T.Dict[OptionKey, str]] = None, - mock: bool = False, ast: T.Optional[mparser.CodeBlockNode] = None, is_translated: bool = False, relaxations: T.Optional[T.Set[InterpreterRuleRelaxation]] = None, @@ -285,12 +284,11 @@ class Interpreter(InterpreterBase, HoldableObject): self.subproject_directory_name = subdir.split(os.path.sep)[-1] self.subproject_dir = subproject_dir self.relaxations = relaxations or set() - if not mock and ast is None: + if ast is None: self.load_root_meson_file() - self.sanity_check_ast() - elif ast is not None: + else: self.ast = ast - self.sanity_check_ast() + self.sanity_check_ast() self.builtin.update({'meson': MesonMain(self.build, self)}) self.generators: T.List[build.Generator] = [] self.processed_buildfiles: T.Set[str] = set() @@ -319,8 +317,7 @@ class Interpreter(InterpreterBase, HoldableObject): build_filename = os.path.join(self.subdir, environment.build_filename) if not is_translated: self.build_def_files.add(build_filename) - if not mock: - self.parse_project() + self.parse_project() self._redetect_machines() def __getnewargs_ex__(self) -> T.Tuple[T.Tuple[object], T.Dict[str, object]]: diff --git a/unittests/datatests.py b/unittests/datatests.py index ae32a9491..4f9d52032 100644 --- a/unittests/datatests.py +++ b/unittests/datatests.py @@ -5,6 +5,7 @@ import re import unittest from itertools import chain from pathlib import Path +from unittest import mock import mesonbuild.mlog import mesonbuild.depfile @@ -208,7 +209,10 @@ class DataTests(unittest.TestCase): name = name.replace('_', '-') self.assertIn(name, html) - @unittest.mock.patch.dict(os.environ) + @mock.patch.dict(os.environ) + @mock.patch.object(Interpreter, 'load_root_meson_file', mock.Mock(return_value=None)) + @mock.patch.object(Interpreter, 'sanity_check_ast', mock.Mock(return_value=None)) + @mock.patch.object(Interpreter, 'parse_project', mock.Mock(return_value=None)) def test_vim_syntax_highlighting(self): ''' Ensure that vim syntax highlighting files were updated for new @@ -217,13 +221,16 @@ class DataTests(unittest.TestCase): # Disable unit test specific syntax del os.environ['MESON_RUNNING_IN_PROJECT_TESTS'] env = get_fake_env() - interp = Interpreter(FakeBuild(env), mock=True) + interp = Interpreter(FakeBuild(env)) with open('data/syntax-highlighting/vim/syntax/meson.vim', encoding='utf-8') as f: res = re.search(r'syn keyword mesonBuiltin(\s+\\\s\w+)+', f.read(), re.MULTILINE) defined = set([a.strip() for a in res.group().split('\\')][1:]) self.assertEqual(defined, set(chain(interp.funcs.keys(), interp.builtin.keys()))) - @unittest.mock.patch.dict(os.environ) + @mock.patch.dict(os.environ) + @mock.patch.object(Interpreter, 'load_root_meson_file', mock.Mock(return_value=None)) + @mock.patch.object(Interpreter, 'sanity_check_ast', mock.Mock(return_value=None)) + @mock.patch.object(Interpreter, 'parse_project', mock.Mock(return_value=None)) def test_all_functions_defined_in_ast_interpreter(self): ''' Ensure that the all functions defined in the Interpreter are also defined @@ -232,6 +239,6 @@ class DataTests(unittest.TestCase): # Disable unit test specific syntax del os.environ['MESON_RUNNING_IN_PROJECT_TESTS'] env = get_fake_env() - interp = Interpreter(FakeBuild(env), mock=True) + interp = Interpreter(FakeBuild(env)) astint = AstInterpreter('.', '', '') self.assertEqual(set(interp.funcs.keys()), set(astint.funcs.keys())) diff --git a/unittests/internaltests.py b/unittests/internaltests.py index 945faa18b..fd843c88c 100644 --- a/unittests/internaltests.py +++ b/unittests/internaltests.py @@ -1662,13 +1662,16 @@ class InternalTests(unittest.TestCase): actual = mesonbuild.environment.detect_cpu({}) self.assertEqual(actual, expected) + @mock.patch('mesonbuild.interpreter.Interpreter.load_root_meson_file', mock.Mock(return_value=None)) + @mock.patch('mesonbuild.interpreter.Interpreter.sanity_check_ast', mock.Mock(return_value=None)) + @mock.patch('mesonbuild.interpreter.Interpreter.parse_project', mock.Mock(return_value=None)) def test_interpreter_unpicklable(self) -> None: build = mock.Mock() build.environment = mock.Mock() build.environment.get_source_dir = mock.Mock(return_value='') with mock.patch('mesonbuild.interpreter.Interpreter._redetect_machines', mock.Mock()), \ self.assertRaises(mesonbuild.mesonlib.MesonBugException): - i = mesonbuild.interpreter.Interpreter(build, mock=True) + i = mesonbuild.interpreter.Interpreter(build) pickle.dumps(i) def test_major_versions_differ(self) -> None: |
