aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mparser.py
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/mparser.py
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/mparser.py')
-rw-r--r--mesonbuild/mparser.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py
index b0e817c..9840f9f 100644
--- a/mesonbuild/mparser.py
+++ b/mesonbuild/mparser.py
@@ -16,6 +16,7 @@ from __future__ import annotations
from dataclasses import dataclass
import re
import codecs
+import os
import typing as T
from .mesonlib import MesonException
from . import mlog
@@ -113,6 +114,9 @@ class Lexer:
'endif', 'and', 'or', 'not', 'foreach', 'endforeach',
'in', 'continue', 'break'}
self.future_keywords = {'return'}
+ self.in_unit_test = 'MESON_RUNNING_IN_PROJECT_TESTS' in os.environ
+ if self.in_unit_test:
+ self.keywords.update({'testcase', 'endtestcase'})
self.token_specification = [
# Need to be sorted longest to shortest.
('ignore', re.compile(r'[ \t]')),
@@ -466,6 +470,12 @@ class IfClauseNode(BaseNode):
self.ifs = [] # type: T.List[IfNode]
self.elseblock = None # type: T.Union[EmptyNode, CodeBlockNode]
+class TestCaseClauseNode(BaseNode):
+ def __init__(self, condition: BaseNode, block: CodeBlockNode):
+ super().__init__(condition.lineno, condition.colno, condition.filename)
+ self.condition = condition
+ self.block = block
+
class UMinusNode(BaseNode):
def __init__(self, current_location: Token, value: BaseNode):
super().__init__(current_location.lineno, current_location.colno, current_location.filename)
@@ -808,6 +818,12 @@ class Parser:
return self.codeblock()
return EmptyNode(self.current.lineno, self.current.colno, self.current.filename)
+ def testcaseblock(self) -> TestCaseClauseNode:
+ condition = self.statement()
+ self.expect('eol')
+ block = self.codeblock()
+ return TestCaseClauseNode(condition, block)
+
def line(self) -> BaseNode:
block_start = self.current
if self.current == 'eol':
@@ -824,6 +840,10 @@ class Parser:
return ContinueNode(self.current)
if self.accept('break'):
return BreakNode(self.current)
+ if self.lexer.in_unit_test and self.accept('testcase'):
+ block = self.testcaseblock()
+ self.block_expect('endtestcase', block_start)
+ return block
return self.statement()
def codeblock(self) -> CodeBlockNode: