aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2023-02-14 10:12:38 -0500
committerXavier Claessens <xclaesse@gmail.com>2023-03-01 20:13:34 -0500
commitf0dc61a76403d3ad26cbfa8e3922fa84343ba7d4 (patch)
tree7479c1af389b43a785c90a3a43e1574ff75d1205 /mesonbuild/interpreter
parenta952b01a0885da9cc89b637d78ee649aea437a95 (diff)
downloadmeson-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.py22
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():