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/interpreterbase/interpreterbase.py | |
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/interpreterbase/interpreterbase.py')
-rw-r--r-- | mesonbuild/interpreterbase/interpreterbase.py | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py index da64f68..c8ef303 100644 --- a/mesonbuild/interpreterbase/interpreterbase.py +++ b/mesonbuild/interpreterbase/interpreterbase.py @@ -26,6 +26,7 @@ from .baseobjects import ( InterpreterObjectTypeVar, ObjectHolder, IterableObject, + ContextManagerObject, HoldableTypes, ) @@ -231,6 +232,8 @@ class InterpreterBase: raise ContinueRequest() elif isinstance(cur, mparser.BreakNode): raise BreakRequest() + elif isinstance(cur, mparser.TestCaseClauseNode): + return self.evaluate_testcase(cur) else: raise InvalidCode("Unknown statement.") return None @@ -294,6 +297,16 @@ class InterpreterBase: self.evaluate_codeblock(node.elseblock) return None + def evaluate_testcase(self, node: mparser.TestCaseClauseNode) -> T.Optional[Disabler]: + result = self.evaluate_statement(node.condition) + if isinstance(result, Disabler): + return result + if not isinstance(result, ContextManagerObject): + raise InvalidCode(f'testcase clause {result!r} does not evaluate to a context manager.') + with result: + self.evaluate_codeblock(node.block) + return None + def evaluate_comparison(self, node: mparser.ComparisonNode) -> InterpreterObject: val1 = self.evaluate_statement(node.left) if val1 is None: |