diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2023-02-14 10:12:38 -0500 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2023-03-01 20:13:34 -0500 |
commit | f0dc61a76403d3ad26cbfa8e3922fa84343ba7d4 (patch) | |
tree | 7479c1af389b43a785c90a3a43e1574ff75d1205 /mesonbuild/interpreter | |
parent | a952b01a0885da9cc89b637d78ee649aea437a95 (diff) | |
download | meson-f0dc61a76403d3ad26cbfa8e3922fa84343ba7d4.zip meson-f0dc61a76403d3ad26cbfa8e3922fa84343ba7d4.tar.gz meson-f0dc61a76403d3ad26cbfa8e3922fa84343ba7d4.tar.bz2 |
interpreter: Add testcase..endtestcase clause support
This is currently only enabled when running unit tests to facilitate
writing failing unit tests.
Fixes: #11394
Diffstat (limited to 'mesonbuild/interpreter')
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 2bf97da..9e20446 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -33,7 +33,7 @@ from ..interpreterbase import noPosargs, noKwargs, permittedKwargs, noArgsFlatte from ..interpreterbase import InterpreterException, InvalidArguments, InvalidCode, SubdirDoneRequest from ..interpreterbase import Disabler, disablerIfNotFound from ..interpreterbase import FeatureNew, FeatureDeprecated, FeatureNewKwargs, FeatureDeprecatedKwargs -from ..interpreterbase import ObjectHolder +from ..interpreterbase import ObjectHolder, ContextManagerObject from ..modules import ExtensionModule, ModuleObject, MutableModuleObject, NewExtensionModule, NotFoundExtensionModule from ..cmake import CMakeInterpreter from ..backend.backends import ExecutableSerialisation @@ -416,6 +416,8 @@ class Interpreter(InterpreterBase, HoldableObject): }) if 'MESON_UNIT_TEST' in os.environ: self.funcs.update({'exception': self.func_exception}) + if 'MESON_RUNNING_IN_PROJECT_TESTS' in os.environ: + self.funcs.update({'expect_error': self.func_expect_error}) def build_holder_map(self) -> None: ''' @@ -1395,6 +1397,24 @@ class Interpreter(InterpreterBase, HoldableObject): def func_exception(self, node, args, kwargs): raise RuntimeError('unit test traceback :)') + @noKwargs + @typed_pos_args('expect_error', str) + def func_expect_error(self, node: mparser.BaseNode, args: T.Tuple[str], kwargs: TYPE_kwargs) -> ContextManagerObject: + class ExpectErrorObject(ContextManagerObject): + def __init__(self, msg: str, subproject: str) -> None: + super().__init__(subproject) + self.msg = msg + + def __exit__(self, exc_type, exc_val, exc_tb): + if exc_val is None: + raise InterpreterException('Expecting an error but code block succeeded') + if isinstance(exc_val, mesonlib.MesonException): + msg = str(exc_val) + if msg != self.msg: + raise InterpreterException(f'Expecting error {self.msg!r} but got {msg!r}') + return True + return ExpectErrorObject(args[0], self.subproject) + def add_languages(self, args: T.List[str], required: bool, for_machine: MachineChoice) -> bool: success = self.add_languages_for(args, required, for_machine) if not self.coredata.is_cross_build(): |