xref: /aosp_15_r20/art/tools/checker/match/test.py (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2014 The Android Open Source Project
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*795d594fSAndroid Build Coastguard Worker#
7*795d594fSAndroid Build Coastguard Worker#   http://www.apache.org/licenses/LICENSE-2.0
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*795d594fSAndroid Build Coastguard Worker# limitations under the License.
14*795d594fSAndroid Build Coastguard Worker
15*795d594fSAndroid Build Coastguard Workerfrom common.immutables import ImmutableDict
16*795d594fSAndroid Build Coastguard Workerfrom file_format.c1visualizer.parser import parse_c1_visualizer_stream
17*795d594fSAndroid Build Coastguard Workerfrom file_format.checker.parser import parse_checker_stream, parse_checker_statement
18*795d594fSAndroid Build Coastguard Workerfrom file_format.checker.struct import CheckerFile, TestCase, TestStatement
19*795d594fSAndroid Build Coastguard Workerfrom match.file import match_test_case, MatchFailedException, BadStructureException
20*795d594fSAndroid Build Coastguard Workerfrom match.line import match_lines
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard Workerimport io
23*795d594fSAndroid Build Coastguard Workerimport unittest
24*795d594fSAndroid Build Coastguard Worker
25*795d594fSAndroid Build Coastguard WorkerCheckerException = SystemExit
26*795d594fSAndroid Build Coastguard Worker
27*795d594fSAndroid Build Coastguard Worker
28*795d594fSAndroid Build Coastguard Workerclass MatchLines_Test(unittest.TestCase):
29*795d594fSAndroid Build Coastguard Worker
30*795d594fSAndroid Build Coastguard Worker  def create_test_statement(self, checker_string):
31*795d594fSAndroid Build Coastguard Worker    checker_file = CheckerFile("<checker-file>")
32*795d594fSAndroid Build Coastguard Worker    test_case = TestCase(checker_file, "TestMethod TestPass", 0)
33*795d594fSAndroid Build Coastguard Worker    return parse_checker_statement(test_case, checker_string, TestStatement.Variant.IN_ORDER, 0)
34*795d594fSAndroid Build Coastguard Worker
35*795d594fSAndroid Build Coastguard Worker  def try_match(self, checker_string, c1_string, var_state={}):
36*795d594fSAndroid Build Coastguard Worker    return match_lines(self.create_test_statement(checker_string),
37*795d594fSAndroid Build Coastguard Worker                       c1_string,
38*795d594fSAndroid Build Coastguard Worker                       ImmutableDict(var_state))
39*795d594fSAndroid Build Coastguard Worker
40*795d594fSAndroid Build Coastguard Worker  def assertMatches(self, checker_string, c1_string, var_state={}):
41*795d594fSAndroid Build Coastguard Worker    self.assertIsNotNone(self.try_match(checker_string, c1_string, var_state))
42*795d594fSAndroid Build Coastguard Worker
43*795d594fSAndroid Build Coastguard Worker  def assertDoesNotMatch(self, checker_string, c1_string, var_state={}):
44*795d594fSAndroid Build Coastguard Worker    self.assertIsNone(self.try_match(checker_string, c1_string, var_state))
45*795d594fSAndroid Build Coastguard Worker
46*795d594fSAndroid Build Coastguard Worker  def test_TextAndWhitespace(self):
47*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo", "foo")
48*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo", "  foo  ")
49*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo", "foo bar")
50*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("foo", "XfooX")
51*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("foo", "zoo")
52*795d594fSAndroid Build Coastguard Worker
53*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo bar", "foo   bar")
54*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo bar", "abc foo bar def")
55*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo bar", "foo foo bar bar")
56*795d594fSAndroid Build Coastguard Worker
57*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo bar", "foo X bar")
58*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("foo bar", "foo Xbar")
59*795d594fSAndroid Build Coastguard Worker
60*795d594fSAndroid Build Coastguard Worker  def test_Pattern(self):
61*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo{{A|B}}bar", "fooAbar")
62*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo{{A|B}}bar", "fooBbar")
63*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("foo{{A|B}}bar", "fooCbar")
64*795d594fSAndroid Build Coastguard Worker
65*795d594fSAndroid Build Coastguard Worker  def test_VariableReference(self):
66*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo<<X>>bar", "foobar", {"X": ""})
67*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo<<X>>bar", "fooAbar", {"X": "A"})
68*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo<<X>>bar", "fooBbar", {"X": "B"})
69*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("foo<<X>>bar", "foobar", {"X": "A"})
70*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("foo<<X>>bar", "foo bar", {"X": "A"})
71*795d594fSAndroid Build Coastguard Worker    with self.assertRaises(CheckerException):
72*795d594fSAndroid Build Coastguard Worker      self.try_match("foo<<X>>bar", "foobar", {})
73*795d594fSAndroid Build Coastguard Worker
74*795d594fSAndroid Build Coastguard Worker  def test_VariableDefinition(self):
75*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo<<X:A|B>>bar", "fooAbar")
76*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo<<X:A|B>>bar", "fooBbar")
77*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("foo<<X:A|B>>bar", "fooCbar")
78*795d594fSAndroid Build Coastguard Worker
79*795d594fSAndroid Build Coastguard Worker    env = self.try_match("foo<<X:A.*B>>bar", "fooABbar", {})
80*795d594fSAndroid Build Coastguard Worker    self.assertEqual(env, {"X": "AB"})
81*795d594fSAndroid Build Coastguard Worker    env = self.try_match("foo<<X:A.*B>>bar", "fooAxxBbar", {})
82*795d594fSAndroid Build Coastguard Worker    self.assertEqual(env, {"X": "AxxB"})
83*795d594fSAndroid Build Coastguard Worker
84*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo<<X:A|B>>bar<<X>>baz", "fooAbarAbaz")
85*795d594fSAndroid Build Coastguard Worker    self.assertMatches("foo<<X:A|B>>bar<<X>>baz", "fooBbarBbaz")
86*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("foo<<X:A|B>>bar<<X>>baz", "fooAbarBbaz")
87*795d594fSAndroid Build Coastguard Worker
88*795d594fSAndroid Build Coastguard Worker  def test_NoVariableRedefinition(self):
89*795d594fSAndroid Build Coastguard Worker    with self.assertRaises(CheckerException):
90*795d594fSAndroid Build Coastguard Worker      self.try_match("<<X:...>><<X>><<X:...>><<X>>", "foofoobarbar")
91*795d594fSAndroid Build Coastguard Worker
92*795d594fSAndroid Build Coastguard Worker  def test_EnvNotChangedOnPartialMatch(self):
93*795d594fSAndroid Build Coastguard Worker    env = {"Y": "foo"}
94*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("<<X:A>>bar", "Abaz", env)
95*795d594fSAndroid Build Coastguard Worker    self.assertFalse("X" in env.keys())
96*795d594fSAndroid Build Coastguard Worker
97*795d594fSAndroid Build Coastguard Worker  def test_VariableContentEscaped(self):
98*795d594fSAndroid Build Coastguard Worker    self.assertMatches("<<X:..>>foo<<X>>", ".*foo.*")
99*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("<<X:..>>foo<<X>>", ".*fooAAAA")
100*795d594fSAndroid Build Coastguard Worker
101*795d594fSAndroid Build Coastguard Worker
102*795d594fSAndroid Build Coastguard Workerclass MatchFiles_Test(unittest.TestCase):
103*795d594fSAndroid Build Coastguard Worker
104*795d594fSAndroid Build Coastguard Worker  def assertMatches(self, checker_string, c1_string,
105*795d594fSAndroid Build Coastguard Worker                    isa=None,
106*795d594fSAndroid Build Coastguard Worker                    instruction_set_features=None,
107*795d594fSAndroid Build Coastguard Worker                    read_barrier_type="none"):
108*795d594fSAndroid Build Coastguard Worker    checker_string = \
109*795d594fSAndroid Build Coastguard Worker      """
110*795d594fSAndroid Build Coastguard Worker        /// CHECK-START: MyMethod MyPass
111*795d594fSAndroid Build Coastguard Worker      """ + checker_string
112*795d594fSAndroid Build Coastguard Worker    meta_data = ""
113*795d594fSAndroid Build Coastguard Worker    if isa:
114*795d594fSAndroid Build Coastguard Worker      meta_data += "isa:" + isa
115*795d594fSAndroid Build Coastguard Worker
116*795d594fSAndroid Build Coastguard Worker    if instruction_set_features:
117*795d594fSAndroid Build Coastguard Worker      if meta_data:
118*795d594fSAndroid Build Coastguard Worker        meta_data += " "
119*795d594fSAndroid Build Coastguard Worker
120*795d594fSAndroid Build Coastguard Worker      joined_features = ",".join(
121*795d594fSAndroid Build Coastguard Worker        name if present else "-" + name for name, present in instruction_set_features.items())
122*795d594fSAndroid Build Coastguard Worker      meta_data += "isa_features:" + joined_features
123*795d594fSAndroid Build Coastguard Worker
124*795d594fSAndroid Build Coastguard Worker    if meta_data:
125*795d594fSAndroid Build Coastguard Worker      meta_data += " "
126*795d594fSAndroid Build Coastguard Worker    meta_data += f"read_barrier_type:{read_barrier_type}"
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard Worker    meta_data_string = ""
129*795d594fSAndroid Build Coastguard Worker    if meta_data:
130*795d594fSAndroid Build Coastguard Worker      meta_data_string = \
131*795d594fSAndroid Build Coastguard Worker        """
132*795d594fSAndroid Build Coastguard Worker          begin_compilation
133*795d594fSAndroid Build Coastguard Worker            name "%s"
134*795d594fSAndroid Build Coastguard Worker            method "%s"
135*795d594fSAndroid Build Coastguard Worker            date 1234
136*795d594fSAndroid Build Coastguard Worker          end_compilation
137*795d594fSAndroid Build Coastguard Worker        """ % (meta_data, meta_data)
138*795d594fSAndroid Build Coastguard Worker    c1_string = meta_data_string + \
139*795d594fSAndroid Build Coastguard Worker               """
140*795d594fSAndroid Build Coastguard Worker                 begin_compilation
141*795d594fSAndroid Build Coastguard Worker                   name "MyMethod"
142*795d594fSAndroid Build Coastguard Worker                   method "MyMethod"
143*795d594fSAndroid Build Coastguard Worker                   date 1234
144*795d594fSAndroid Build Coastguard Worker                 end_compilation
145*795d594fSAndroid Build Coastguard Worker                 begin_cfg
146*795d594fSAndroid Build Coastguard Worker                   name "MyPass"
147*795d594fSAndroid Build Coastguard Worker               """ + c1_string + \
148*795d594fSAndroid Build Coastguard Worker               """
149*795d594fSAndroid Build Coastguard Worker                 end_cfg
150*795d594fSAndroid Build Coastguard Worker               """
151*795d594fSAndroid Build Coastguard Worker    checker_file = parse_checker_stream("<test-file>", "CHECK", io.StringIO(checker_string))
152*795d594fSAndroid Build Coastguard Worker    c1_file = parse_c1_visualizer_stream("<c1-file>", io.StringIO(c1_string))
153*795d594fSAndroid Build Coastguard Worker    assert len(checker_file.test_cases) == 1
154*795d594fSAndroid Build Coastguard Worker    assert len(c1_file.passes) == 1
155*795d594fSAndroid Build Coastguard Worker    match_test_case(checker_file.test_cases[0],
156*795d594fSAndroid Build Coastguard Worker                    c1_file.passes[0],
157*795d594fSAndroid Build Coastguard Worker                    c1_file.instruction_set_features,
158*795d594fSAndroid Build Coastguard Worker                    c1_file.read_barrier_type)
159*795d594fSAndroid Build Coastguard Worker
160*795d594fSAndroid Build Coastguard Worker  def assertDoesNotMatch(self, checker_string, c1_string,
161*795d594fSAndroid Build Coastguard Worker                         isa=None,
162*795d594fSAndroid Build Coastguard Worker                         instruction_set_features=None,
163*795d594fSAndroid Build Coastguard Worker                         read_barrier_type="none"):
164*795d594fSAndroid Build Coastguard Worker    with self.assertRaises(MatchFailedException):
165*795d594fSAndroid Build Coastguard Worker      self.assertMatches(checker_string, c1_string, isa, instruction_set_features, read_barrier_type)
166*795d594fSAndroid Build Coastguard Worker
167*795d594fSAndroid Build Coastguard Worker  def assertBadStructure(self, checker_string, c1_string):
168*795d594fSAndroid Build Coastguard Worker    with self.assertRaises(BadStructureException):
169*795d594fSAndroid Build Coastguard Worker      self.assertMatches(checker_string, c1_string)
170*795d594fSAndroid Build Coastguard Worker
171*795d594fSAndroid Build Coastguard Worker  def test_Text(self):
172*795d594fSAndroid Build Coastguard Worker    self.assertMatches("/// CHECK: foo bar", "foo bar")
173*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("/// CHECK: foo bar", "abc def")
174*795d594fSAndroid Build Coastguard Worker
175*795d594fSAndroid Build Coastguard Worker  def test_Pattern(self):
176*795d594fSAndroid Build Coastguard Worker    self.assertMatches("/// CHECK: abc {{de.}}", "abc de#")
177*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("/// CHECK: abc {{de.}}", "abc d#f")
178*795d594fSAndroid Build Coastguard Worker
179*795d594fSAndroid Build Coastguard Worker  def test_Variables(self):
180*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
181*795d594fSAndroid Build Coastguard Worker      """
182*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo<<X:.>>bar
183*795d594fSAndroid Build Coastguard Worker        /// CHECK: abc<<X>>def
184*795d594fSAndroid Build Coastguard Worker      """,
185*795d594fSAndroid Build Coastguard Worker      """
186*795d594fSAndroid Build Coastguard Worker        foo0bar
187*795d594fSAndroid Build Coastguard Worker        abc0def
188*795d594fSAndroid Build Coastguard Worker      """)
189*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
190*795d594fSAndroid Build Coastguard Worker      """
191*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo<<X:([0-9]+)>>bar
192*795d594fSAndroid Build Coastguard Worker        /// CHECK: abc<<X>>def
193*795d594fSAndroid Build Coastguard Worker        /// CHECK: ### <<X>> ###
194*795d594fSAndroid Build Coastguard Worker      """,
195*795d594fSAndroid Build Coastguard Worker      """
196*795d594fSAndroid Build Coastguard Worker        foo1234bar
197*795d594fSAndroid Build Coastguard Worker        abc1234def
198*795d594fSAndroid Build Coastguard Worker        ### 1234 ###
199*795d594fSAndroid Build Coastguard Worker      """)
200*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
201*795d594fSAndroid Build Coastguard Worker      """
202*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo<<X:([0-9]+)>>bar
203*795d594fSAndroid Build Coastguard Worker        /// CHECK: abc<<X>>def
204*795d594fSAndroid Build Coastguard Worker      """,
205*795d594fSAndroid Build Coastguard Worker      """
206*795d594fSAndroid Build Coastguard Worker        foo1234bar
207*795d594fSAndroid Build Coastguard Worker        abc1235def
208*795d594fSAndroid Build Coastguard Worker      """)
209*795d594fSAndroid Build Coastguard Worker
210*795d594fSAndroid Build Coastguard Worker  def test_WholeWordMustMatch(self):
211*795d594fSAndroid Build Coastguard Worker    self.assertMatches("/// CHECK: b{{.}}r", "abc bar def")
212*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("/// CHECK: b{{.}}r", "abc Xbar def")
213*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("/// CHECK: b{{.}}r", "abc barX def")
214*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("/// CHECK: b{{.}}r", "abc b r def")
215*795d594fSAndroid Build Coastguard Worker
216*795d594fSAndroid Build Coastguard Worker  def test_InOrderStatements(self):
217*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
218*795d594fSAndroid Build Coastguard Worker      """
219*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo
220*795d594fSAndroid Build Coastguard Worker        /// CHECK: bar
221*795d594fSAndroid Build Coastguard Worker      """,
222*795d594fSAndroid Build Coastguard Worker      """
223*795d594fSAndroid Build Coastguard Worker        foo
224*795d594fSAndroid Build Coastguard Worker        bar
225*795d594fSAndroid Build Coastguard Worker      """)
226*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
227*795d594fSAndroid Build Coastguard Worker      """
228*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo
229*795d594fSAndroid Build Coastguard Worker        /// CHECK: bar
230*795d594fSAndroid Build Coastguard Worker      """,
231*795d594fSAndroid Build Coastguard Worker      """
232*795d594fSAndroid Build Coastguard Worker        bar
233*795d594fSAndroid Build Coastguard Worker        foo
234*795d594fSAndroid Build Coastguard Worker      """)
235*795d594fSAndroid Build Coastguard Worker
236*795d594fSAndroid Build Coastguard Worker  def test_NextLineStatements(self):
237*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
238*795d594fSAndroid Build Coastguard Worker      """
239*795d594fSAndroid Build Coastguard Worker        /// CHECK:      foo
240*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
241*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: abc
242*795d594fSAndroid Build Coastguard Worker        /// CHECK:      def
243*795d594fSAndroid Build Coastguard Worker      """,
244*795d594fSAndroid Build Coastguard Worker      """
245*795d594fSAndroid Build Coastguard Worker        foo
246*795d594fSAndroid Build Coastguard Worker        bar
247*795d594fSAndroid Build Coastguard Worker        abc
248*795d594fSAndroid Build Coastguard Worker        def
249*795d594fSAndroid Build Coastguard Worker      """)
250*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
251*795d594fSAndroid Build Coastguard Worker      """
252*795d594fSAndroid Build Coastguard Worker        /// CHECK:      foo
253*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
254*795d594fSAndroid Build Coastguard Worker        /// CHECK:      def
255*795d594fSAndroid Build Coastguard Worker      """,
256*795d594fSAndroid Build Coastguard Worker      """
257*795d594fSAndroid Build Coastguard Worker        foo
258*795d594fSAndroid Build Coastguard Worker        bar
259*795d594fSAndroid Build Coastguard Worker        abc
260*795d594fSAndroid Build Coastguard Worker        def
261*795d594fSAndroid Build Coastguard Worker      """)
262*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
263*795d594fSAndroid Build Coastguard Worker      """
264*795d594fSAndroid Build Coastguard Worker        /// CHECK:      foo
265*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
266*795d594fSAndroid Build Coastguard Worker      """,
267*795d594fSAndroid Build Coastguard Worker      """
268*795d594fSAndroid Build Coastguard Worker        foo
269*795d594fSAndroid Build Coastguard Worker        abc
270*795d594fSAndroid Build Coastguard Worker        bar
271*795d594fSAndroid Build Coastguard Worker      """)
272*795d594fSAndroid Build Coastguard Worker
273*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
274*795d594fSAndroid Build Coastguard Worker      """
275*795d594fSAndroid Build Coastguard Worker        /// CHECK:      foo
276*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
277*795d594fSAndroid Build Coastguard Worker      """,
278*795d594fSAndroid Build Coastguard Worker      """
279*795d594fSAndroid Build Coastguard Worker        bar
280*795d594fSAndroid Build Coastguard Worker        foo
281*795d594fSAndroid Build Coastguard Worker        abc
282*795d594fSAndroid Build Coastguard Worker      """)
283*795d594fSAndroid Build Coastguard Worker
284*795d594fSAndroid Build Coastguard Worker  def test_DagStatements(self):
285*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
286*795d594fSAndroid Build Coastguard Worker      """
287*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: foo
288*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: bar
289*795d594fSAndroid Build Coastguard Worker      """,
290*795d594fSAndroid Build Coastguard Worker      """
291*795d594fSAndroid Build Coastguard Worker        foo
292*795d594fSAndroid Build Coastguard Worker        bar
293*795d594fSAndroid Build Coastguard Worker      """)
294*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
295*795d594fSAndroid Build Coastguard Worker      """
296*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: foo
297*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: bar
298*795d594fSAndroid Build Coastguard Worker      """,
299*795d594fSAndroid Build Coastguard Worker      """
300*795d594fSAndroid Build Coastguard Worker        bar
301*795d594fSAndroid Build Coastguard Worker        foo
302*795d594fSAndroid Build Coastguard Worker      """)
303*795d594fSAndroid Build Coastguard Worker
304*795d594fSAndroid Build Coastguard Worker  def test_DagStatementsScope(self):
305*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
306*795d594fSAndroid Build Coastguard Worker      """
307*795d594fSAndroid Build Coastguard Worker        /// CHECK:     foo
308*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: abc
309*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: def
310*795d594fSAndroid Build Coastguard Worker        /// CHECK:     bar
311*795d594fSAndroid Build Coastguard Worker      """,
312*795d594fSAndroid Build Coastguard Worker      """
313*795d594fSAndroid Build Coastguard Worker        foo
314*795d594fSAndroid Build Coastguard Worker        def
315*795d594fSAndroid Build Coastguard Worker        abc
316*795d594fSAndroid Build Coastguard Worker        bar
317*795d594fSAndroid Build Coastguard Worker      """)
318*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
319*795d594fSAndroid Build Coastguard Worker      """
320*795d594fSAndroid Build Coastguard Worker        /// CHECK:     foo
321*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: abc
322*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: def
323*795d594fSAndroid Build Coastguard Worker        /// CHECK:     bar
324*795d594fSAndroid Build Coastguard Worker      """,
325*795d594fSAndroid Build Coastguard Worker      """
326*795d594fSAndroid Build Coastguard Worker        foo
327*795d594fSAndroid Build Coastguard Worker        abc
328*795d594fSAndroid Build Coastguard Worker        bar
329*795d594fSAndroid Build Coastguard Worker        def
330*795d594fSAndroid Build Coastguard Worker      """)
331*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
332*795d594fSAndroid Build Coastguard Worker      """
333*795d594fSAndroid Build Coastguard Worker        /// CHECK:     foo
334*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: abc
335*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: def
336*795d594fSAndroid Build Coastguard Worker        /// CHECK:     bar
337*795d594fSAndroid Build Coastguard Worker      """,
338*795d594fSAndroid Build Coastguard Worker      """
339*795d594fSAndroid Build Coastguard Worker        foo
340*795d594fSAndroid Build Coastguard Worker        def
341*795d594fSAndroid Build Coastguard Worker        bar
342*795d594fSAndroid Build Coastguard Worker        abc
343*795d594fSAndroid Build Coastguard Worker      """)
344*795d594fSAndroid Build Coastguard Worker
345*795d594fSAndroid Build Coastguard Worker  def test_NotStatements(self):
346*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
347*795d594fSAndroid Build Coastguard Worker      """
348*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT: foo
349*795d594fSAndroid Build Coastguard Worker      """,
350*795d594fSAndroid Build Coastguard Worker      """
351*795d594fSAndroid Build Coastguard Worker        abc
352*795d594fSAndroid Build Coastguard Worker        def
353*795d594fSAndroid Build Coastguard Worker      """)
354*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
355*795d594fSAndroid Build Coastguard Worker      """
356*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT: foo
357*795d594fSAndroid Build Coastguard Worker      """,
358*795d594fSAndroid Build Coastguard Worker      """
359*795d594fSAndroid Build Coastguard Worker        abc foo
360*795d594fSAndroid Build Coastguard Worker        def
361*795d594fSAndroid Build Coastguard Worker      """)
362*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
363*795d594fSAndroid Build Coastguard Worker      """
364*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT: foo
365*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT: bar
366*795d594fSAndroid Build Coastguard Worker      """,
367*795d594fSAndroid Build Coastguard Worker      """
368*795d594fSAndroid Build Coastguard Worker        abc
369*795d594fSAndroid Build Coastguard Worker        def bar
370*795d594fSAndroid Build Coastguard Worker      """)
371*795d594fSAndroid Build Coastguard Worker
372*795d594fSAndroid Build Coastguard Worker  def test_NotStatementsScope(self):
373*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
374*795d594fSAndroid Build Coastguard Worker      """
375*795d594fSAndroid Build Coastguard Worker        /// CHECK:     abc
376*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT: foo
377*795d594fSAndroid Build Coastguard Worker        /// CHECK:     def
378*795d594fSAndroid Build Coastguard Worker      """,
379*795d594fSAndroid Build Coastguard Worker      """
380*795d594fSAndroid Build Coastguard Worker        abc
381*795d594fSAndroid Build Coastguard Worker        def
382*795d594fSAndroid Build Coastguard Worker      """)
383*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
384*795d594fSAndroid Build Coastguard Worker      """
385*795d594fSAndroid Build Coastguard Worker        /// CHECK:     abc
386*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT: foo
387*795d594fSAndroid Build Coastguard Worker        /// CHECK:     def
388*795d594fSAndroid Build Coastguard Worker      """,
389*795d594fSAndroid Build Coastguard Worker      """
390*795d594fSAndroid Build Coastguard Worker        abc
391*795d594fSAndroid Build Coastguard Worker        def
392*795d594fSAndroid Build Coastguard Worker        foo
393*795d594fSAndroid Build Coastguard Worker      """)
394*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
395*795d594fSAndroid Build Coastguard Worker      """
396*795d594fSAndroid Build Coastguard Worker        /// CHECK:     abc
397*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT: foo
398*795d594fSAndroid Build Coastguard Worker        /// CHECK:     def
399*795d594fSAndroid Build Coastguard Worker      """,
400*795d594fSAndroid Build Coastguard Worker      """
401*795d594fSAndroid Build Coastguard Worker        abc
402*795d594fSAndroid Build Coastguard Worker        foo
403*795d594fSAndroid Build Coastguard Worker        def
404*795d594fSAndroid Build Coastguard Worker      """)
405*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
406*795d594fSAndroid Build Coastguard Worker      """
407*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT:  foo
408*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: 1 + 1 == 2
409*795d594fSAndroid Build Coastguard Worker        /// CHECK:      bar
410*795d594fSAndroid Build Coastguard Worker      """,
411*795d594fSAndroid Build Coastguard Worker      """
412*795d594fSAndroid Build Coastguard Worker        foo
413*795d594fSAndroid Build Coastguard Worker        abc
414*795d594fSAndroid Build Coastguard Worker        bar
415*795d594fSAndroid Build Coastguard Worker      """)
416*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
417*795d594fSAndroid Build Coastguard Worker      """
418*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG:  bar
419*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG:  abc
420*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT:  foo
421*795d594fSAndroid Build Coastguard Worker      """,
422*795d594fSAndroid Build Coastguard Worker      """
423*795d594fSAndroid Build Coastguard Worker        foo
424*795d594fSAndroid Build Coastguard Worker        abc
425*795d594fSAndroid Build Coastguard Worker        bar
426*795d594fSAndroid Build Coastguard Worker      """)
427*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
428*795d594fSAndroid Build Coastguard Worker      """
429*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG:  abc
430*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG:  foo
431*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT:  bar
432*795d594fSAndroid Build Coastguard Worker      """,
433*795d594fSAndroid Build Coastguard Worker      """
434*795d594fSAndroid Build Coastguard Worker        foo
435*795d594fSAndroid Build Coastguard Worker        abc
436*795d594fSAndroid Build Coastguard Worker        bar
437*795d594fSAndroid Build Coastguard Worker      """)
438*795d594fSAndroid Build Coastguard Worker
439*795d594fSAndroid Build Coastguard Worker  def test_LineOnlyMatchesOnce(self):
440*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
441*795d594fSAndroid Build Coastguard Worker      """
442*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: foo
443*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: foo
444*795d594fSAndroid Build Coastguard Worker      """,
445*795d594fSAndroid Build Coastguard Worker      """
446*795d594fSAndroid Build Coastguard Worker        foo
447*795d594fSAndroid Build Coastguard Worker        abc
448*795d594fSAndroid Build Coastguard Worker        foo
449*795d594fSAndroid Build Coastguard Worker      """)
450*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
451*795d594fSAndroid Build Coastguard Worker      """
452*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: foo
453*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG: foo
454*795d594fSAndroid Build Coastguard Worker      """,
455*795d594fSAndroid Build Coastguard Worker      """
456*795d594fSAndroid Build Coastguard Worker        foo
457*795d594fSAndroid Build Coastguard Worker        abc
458*795d594fSAndroid Build Coastguard Worker        bar
459*795d594fSAndroid Build Coastguard Worker      """)
460*795d594fSAndroid Build Coastguard Worker
461*795d594fSAndroid Build Coastguard Worker  def test_EvalStatements(self):
462*795d594fSAndroid Build Coastguard Worker    self.assertMatches("/// CHECK-EVAL: True", "foo")
463*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("/// CHECK-EVAL: False", "foo")
464*795d594fSAndroid Build Coastguard Worker
465*795d594fSAndroid Build Coastguard Worker    self.assertMatches("/// CHECK-EVAL: 1 + 2 == 3", "foo")
466*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch("/// CHECK-EVAL: 1 + 2 == 4", "foo")
467*795d594fSAndroid Build Coastguard Worker
468*795d594fSAndroid Build Coastguard Worker    twoVarTestCase = """
469*795d594fSAndroid Build Coastguard Worker                       /// CHECK-DAG: <<X:\d+>> <<Y:\d+>>
470*795d594fSAndroid Build Coastguard Worker                       /// CHECK-EVAL: <<X>> > <<Y>>
471*795d594fSAndroid Build Coastguard Worker                     """
472*795d594fSAndroid Build Coastguard Worker    self.assertMatches(twoVarTestCase, "42 41")
473*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(twoVarTestCase, "42 43")
474*795d594fSAndroid Build Coastguard Worker
475*795d594fSAndroid Build Coastguard Worker  def test_MisplacedNext(self):
476*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
477*795d594fSAndroid Build Coastguard Worker      """
478*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG:  foo
479*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
480*795d594fSAndroid Build Coastguard Worker      """,
481*795d594fSAndroid Build Coastguard Worker      """
482*795d594fSAndroid Build Coastguard Worker      foo
483*795d594fSAndroid Build Coastguard Worker      bar
484*795d594fSAndroid Build Coastguard Worker      """)
485*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
486*795d594fSAndroid Build Coastguard Worker      """
487*795d594fSAndroid Build Coastguard Worker        /// CHECK-NOT:  foo
488*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
489*795d594fSAndroid Build Coastguard Worker      """,
490*795d594fSAndroid Build Coastguard Worker      """
491*795d594fSAndroid Build Coastguard Worker      foo
492*795d594fSAndroid Build Coastguard Worker      bar
493*795d594fSAndroid Build Coastguard Worker      """)
494*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
495*795d594fSAndroid Build Coastguard Worker      """
496*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: True
497*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
498*795d594fSAndroid Build Coastguard Worker      """,
499*795d594fSAndroid Build Coastguard Worker      """
500*795d594fSAndroid Build Coastguard Worker      foo
501*795d594fSAndroid Build Coastguard Worker      bar
502*795d594fSAndroid Build Coastguard Worker      """)
503*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
504*795d594fSAndroid Build Coastguard Worker      """
505*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
506*795d594fSAndroid Build Coastguard Worker      """,
507*795d594fSAndroid Build Coastguard Worker      """
508*795d594fSAndroid Build Coastguard Worker      foo
509*795d594fSAndroid Build Coastguard Worker      bar
510*795d594fSAndroid Build Coastguard Worker      """)
511*795d594fSAndroid Build Coastguard Worker
512*795d594fSAndroid Build Coastguard Worker  def test_EnvVariableEval(self):
513*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
514*795d594fSAndroid Build Coastguard Worker      """
515*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: os.environ.get('MARTY_MCFLY') != '89mph!'
516*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
517*795d594fSAndroid Build Coastguard Worker      """,
518*795d594fSAndroid Build Coastguard Worker      """
519*795d594fSAndroid Build Coastguard Worker      foo
520*795d594fSAndroid Build Coastguard Worker      """
521*795d594fSAndroid Build Coastguard Worker    )
522*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
523*795d594fSAndroid Build Coastguard Worker      """
524*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: os.environ.get('MARTY_MCFLY') != '89mph!'
525*795d594fSAndroid Build Coastguard Worker      """,
526*795d594fSAndroid Build Coastguard Worker      """
527*795d594fSAndroid Build Coastguard Worker      foo
528*795d594fSAndroid Build Coastguard Worker      """
529*795d594fSAndroid Build Coastguard Worker    )
530*795d594fSAndroid Build Coastguard Worker
531*795d594fSAndroid Build Coastguard Worker  def test_IfStatements(self):
532*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
533*795d594fSAndroid Build Coastguard Worker      """
534*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
535*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
536*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT: foo2
537*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
538*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: foo3
539*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: bar
540*795d594fSAndroid Build Coastguard Worker      """,
541*795d594fSAndroid Build Coastguard Worker      """
542*795d594fSAndroid Build Coastguard Worker      foo1
543*795d594fSAndroid Build Coastguard Worker      foo2
544*795d594fSAndroid Build Coastguard Worker      foo3
545*795d594fSAndroid Build Coastguard Worker      bar
546*795d594fSAndroid Build Coastguard Worker      """)
547*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
548*795d594fSAndroid Build Coastguard Worker      """
549*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
550*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
551*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
552*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
553*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
554*795d594fSAndroid Build Coastguard Worker      """,
555*795d594fSAndroid Build Coastguard Worker      """
556*795d594fSAndroid Build Coastguard Worker      foo1
557*795d594fSAndroid Build Coastguard Worker      bar
558*795d594fSAndroid Build Coastguard Worker      """)
559*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
560*795d594fSAndroid Build Coastguard Worker      """
561*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
562*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
563*795d594fSAndroid Build Coastguard Worker        ///   CHECK-DAG:    foo2
564*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
565*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG:    bar
566*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo3
567*795d594fSAndroid Build Coastguard Worker      """,
568*795d594fSAndroid Build Coastguard Worker      """
569*795d594fSAndroid Build Coastguard Worker      foo1
570*795d594fSAndroid Build Coastguard Worker      bar
571*795d594fSAndroid Build Coastguard Worker      foo2
572*795d594fSAndroid Build Coastguard Worker      foo3
573*795d594fSAndroid Build Coastguard Worker      """)
574*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
575*795d594fSAndroid Build Coastguard Worker      """
576*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
577*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
578*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT: foo2
579*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
580*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: foo3
581*795d594fSAndroid Build Coastguard Worker      """,
582*795d594fSAndroid Build Coastguard Worker      """
583*795d594fSAndroid Build Coastguard Worker      foo1
584*795d594fSAndroid Build Coastguard Worker      foo2
585*795d594fSAndroid Build Coastguard Worker      foo3
586*795d594fSAndroid Build Coastguard Worker      """)
587*795d594fSAndroid Build Coastguard Worker
588*795d594fSAndroid Build Coastguard Worker  def test_IfElseStatements(self):
589*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
590*795d594fSAndroid Build Coastguard Worker      """
591*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
592*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
593*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
594*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
595*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo3
596*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
597*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
598*795d594fSAndroid Build Coastguard Worker      """,
599*795d594fSAndroid Build Coastguard Worker      """
600*795d594fSAndroid Build Coastguard Worker      foo1
601*795d594fSAndroid Build Coastguard Worker      foo2
602*795d594fSAndroid Build Coastguard Worker      bar
603*795d594fSAndroid Build Coastguard Worker      """)
604*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
605*795d594fSAndroid Build Coastguard Worker      """
606*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
607*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
608*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
609*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
610*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo3
611*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
612*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
613*795d594fSAndroid Build Coastguard Worker      """,
614*795d594fSAndroid Build Coastguard Worker      """
615*795d594fSAndroid Build Coastguard Worker      foo1
616*795d594fSAndroid Build Coastguard Worker      foo3
617*795d594fSAndroid Build Coastguard Worker      bar
618*795d594fSAndroid Build Coastguard Worker      """)
619*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
620*795d594fSAndroid Build Coastguard Worker      """
621*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
622*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
623*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
624*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
625*795d594fSAndroid Build Coastguard Worker        ///   CHECK-DAG:    bar
626*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
627*795d594fSAndroid Build Coastguard Worker        /// CHECK-DAG:    foo3
628*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo4
629*795d594fSAndroid Build Coastguard Worker      """,
630*795d594fSAndroid Build Coastguard Worker      """
631*795d594fSAndroid Build Coastguard Worker      foo1
632*795d594fSAndroid Build Coastguard Worker      foo3
633*795d594fSAndroid Build Coastguard Worker      bar
634*795d594fSAndroid Build Coastguard Worker      foo4
635*795d594fSAndroid Build Coastguard Worker      """)
636*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
637*795d594fSAndroid Build Coastguard Worker      """
638*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
639*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
640*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
641*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
642*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo3
643*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
644*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
645*795d594fSAndroid Build Coastguard Worker      """,
646*795d594fSAndroid Build Coastguard Worker      """
647*795d594fSAndroid Build Coastguard Worker      foo1
648*795d594fSAndroid Build Coastguard Worker      foo2
649*795d594fSAndroid Build Coastguard Worker      bar
650*795d594fSAndroid Build Coastguard Worker      """)
651*795d594fSAndroid Build Coastguard Worker
652*795d594fSAndroid Build Coastguard Worker  def test_IfElifElseStatements(self):
653*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
654*795d594fSAndroid Build Coastguard Worker      """
655*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
656*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
657*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
658*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: True
659*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo3
660*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: True
661*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo4
662*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
663*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
664*795d594fSAndroid Build Coastguard Worker      """,
665*795d594fSAndroid Build Coastguard Worker      """
666*795d594fSAndroid Build Coastguard Worker      foo1
667*795d594fSAndroid Build Coastguard Worker      foo2
668*795d594fSAndroid Build Coastguard Worker      bar
669*795d594fSAndroid Build Coastguard Worker      """)
670*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
671*795d594fSAndroid Build Coastguard Worker      """
672*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
673*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
674*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
675*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: False
676*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo3
677*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: True
678*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo4
679*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
680*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
681*795d594fSAndroid Build Coastguard Worker      """,
682*795d594fSAndroid Build Coastguard Worker      """
683*795d594fSAndroid Build Coastguard Worker      foo1
684*795d594fSAndroid Build Coastguard Worker      foo4
685*795d594fSAndroid Build Coastguard Worker      bar
686*795d594fSAndroid Build Coastguard Worker      """)
687*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
688*795d594fSAndroid Build Coastguard Worker      """
689*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
690*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
691*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
692*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: True
693*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo3
694*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: True
695*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo4
696*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
697*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
698*795d594fSAndroid Build Coastguard Worker      """,
699*795d594fSAndroid Build Coastguard Worker      """
700*795d594fSAndroid Build Coastguard Worker      foo1
701*795d594fSAndroid Build Coastguard Worker      foo3
702*795d594fSAndroid Build Coastguard Worker      bar
703*795d594fSAndroid Build Coastguard Worker      """)
704*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
705*795d594fSAndroid Build Coastguard Worker      """
706*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
707*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
708*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
709*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: False
710*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo3
711*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: False
712*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo4
713*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
714*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
715*795d594fSAndroid Build Coastguard Worker      """,
716*795d594fSAndroid Build Coastguard Worker      """
717*795d594fSAndroid Build Coastguard Worker      foo1
718*795d594fSAndroid Build Coastguard Worker      bar
719*795d594fSAndroid Build Coastguard Worker      """)
720*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
721*795d594fSAndroid Build Coastguard Worker      """
722*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
723*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
724*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo2
725*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: True
726*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo3
727*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
728*795d594fSAndroid Build Coastguard Worker        ///   CHECK-NEXT:    foo4
729*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
730*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT:    bar
731*795d594fSAndroid Build Coastguard Worker      """,
732*795d594fSAndroid Build Coastguard Worker      """
733*795d594fSAndroid Build Coastguard Worker      foo1
734*795d594fSAndroid Build Coastguard Worker      foo2
735*795d594fSAndroid Build Coastguard Worker      bar
736*795d594fSAndroid Build Coastguard Worker      """)
737*795d594fSAndroid Build Coastguard Worker
738*795d594fSAndroid Build Coastguard Worker  def test_NestedBranching(self):
739*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
740*795d594fSAndroid Build Coastguard Worker      """
741*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
742*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
743*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: True
744*795d594fSAndroid Build Coastguard Worker        ///     CHECK-NEXT:    foo2
745*795d594fSAndroid Build Coastguard Worker        ///   CHECK-ELSE:
746*795d594fSAndroid Build Coastguard Worker        ///     CHECK-NEXT:    foo3
747*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
748*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
749*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: True
750*795d594fSAndroid Build Coastguard Worker        ///     CHECK-NEXT:    foo4
751*795d594fSAndroid Build Coastguard Worker        ///   CHECK-ELSE:
752*795d594fSAndroid Build Coastguard Worker        ///     CHECK-NEXT:    foo5
753*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
754*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
755*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: foo6
756*795d594fSAndroid Build Coastguard Worker      """,
757*795d594fSAndroid Build Coastguard Worker      """
758*795d594fSAndroid Build Coastguard Worker      foo1
759*795d594fSAndroid Build Coastguard Worker      foo2
760*795d594fSAndroid Build Coastguard Worker      foo6
761*795d594fSAndroid Build Coastguard Worker      """)
762*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
763*795d594fSAndroid Build Coastguard Worker      """
764*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
765*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: False
766*795d594fSAndroid Build Coastguard Worker        ///     CHECK:    foo1
767*795d594fSAndroid Build Coastguard Worker        ///   CHECK-ELSE:
768*795d594fSAndroid Build Coastguard Worker        ///     CHECK:    foo2
769*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
770*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
771*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: True
772*795d594fSAndroid Build Coastguard Worker        ///     CHECK:    foo3
773*795d594fSAndroid Build Coastguard Worker        ///   CHECK-ELSE:
774*795d594fSAndroid Build Coastguard Worker        ///     CHECK:    foo4
775*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
776*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
777*795d594fSAndroid Build Coastguard Worker      """,
778*795d594fSAndroid Build Coastguard Worker      """
779*795d594fSAndroid Build Coastguard Worker      foo2
780*795d594fSAndroid Build Coastguard Worker      """)
781*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
782*795d594fSAndroid Build Coastguard Worker      """
783*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
784*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: True
785*795d594fSAndroid Build Coastguard Worker        ///     CHECK:    foo1
786*795d594fSAndroid Build Coastguard Worker        ///   CHECK-ELSE:
787*795d594fSAndroid Build Coastguard Worker        ///     CHECK:    foo2
788*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
789*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
790*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: False
791*795d594fSAndroid Build Coastguard Worker        ///     CHECK:    foo3
792*795d594fSAndroid Build Coastguard Worker        ///   CHECK-ELSE:
793*795d594fSAndroid Build Coastguard Worker        ///     CHECK-IF: False
794*795d594fSAndroid Build Coastguard Worker        ///       CHECK:    foo4
795*795d594fSAndroid Build Coastguard Worker        ///     CHECK-ELSE:
796*795d594fSAndroid Build Coastguard Worker        ///       CHECK: foo5
797*795d594fSAndroid Build Coastguard Worker        ///     CHECK-FI:
798*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
799*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
800*795d594fSAndroid Build Coastguard Worker      """,
801*795d594fSAndroid Build Coastguard Worker      """
802*795d594fSAndroid Build Coastguard Worker      foo5
803*795d594fSAndroid Build Coastguard Worker      """)
804*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
805*795d594fSAndroid Build Coastguard Worker      """
806*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo1
807*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
808*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: False
809*795d594fSAndroid Build Coastguard Worker        ///     CHECK-NEXT:    foo2
810*795d594fSAndroid Build Coastguard Worker        ///   CHECK-ELSE:
811*795d594fSAndroid Build Coastguard Worker        ///     CHECK-NEXT:    foo3
812*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
813*795d594fSAndroid Build Coastguard Worker        /// CHECK-NEXT: foo6
814*795d594fSAndroid Build Coastguard Worker      """,
815*795d594fSAndroid Build Coastguard Worker      """
816*795d594fSAndroid Build Coastguard Worker      foo1
817*795d594fSAndroid Build Coastguard Worker      foo2
818*795d594fSAndroid Build Coastguard Worker      foo6
819*795d594fSAndroid Build Coastguard Worker      """)
820*795d594fSAndroid Build Coastguard Worker
821*795d594fSAndroid Build Coastguard Worker  def test_VariablesInBranches(self):
822*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
823*795d594fSAndroid Build Coastguard Worker      """
824*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
825*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo<<VarA:\d+>>
826*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
827*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: <<VarA>> == 12
828*795d594fSAndroid Build Coastguard Worker      """,
829*795d594fSAndroid Build Coastguard Worker      """
830*795d594fSAndroid Build Coastguard Worker      foo12
831*795d594fSAndroid Build Coastguard Worker      """)
832*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
833*795d594fSAndroid Build Coastguard Worker      """
834*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
835*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo<<VarA:\d+>>
836*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
837*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: <<VarA>> == 99
838*795d594fSAndroid Build Coastguard Worker      """,
839*795d594fSAndroid Build Coastguard Worker      """
840*795d594fSAndroid Build Coastguard Worker      foo12
841*795d594fSAndroid Build Coastguard Worker      """)
842*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
843*795d594fSAndroid Build Coastguard Worker      """
844*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
845*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo<<VarA:\d+>>
846*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: <<VarA>> == 12
847*795d594fSAndroid Build Coastguard Worker        ///     CHECK: bar<<VarB:M|N>>
848*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
849*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
850*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: "<<VarB>>" == "M"
851*795d594fSAndroid Build Coastguard Worker      """,
852*795d594fSAndroid Build Coastguard Worker      """
853*795d594fSAndroid Build Coastguard Worker      foo12
854*795d594fSAndroid Build Coastguard Worker      barM
855*795d594fSAndroid Build Coastguard Worker      """)
856*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
857*795d594fSAndroid Build Coastguard Worker      """
858*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
859*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo<<VarA:\d+>>
860*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: True
861*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo<<VarA:M|N>>
862*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
863*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: "<<VarA>>" == "M"
864*795d594fSAndroid Build Coastguard Worker      """,
865*795d594fSAndroid Build Coastguard Worker      """
866*795d594fSAndroid Build Coastguard Worker      fooM
867*795d594fSAndroid Build Coastguard Worker      """)
868*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
869*795d594fSAndroid Build Coastguard Worker      """
870*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: False
871*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo<<VarA:A|B>>
872*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF: False
873*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo<<VarA:A|B>>
874*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
875*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: False
876*795d594fSAndroid Build Coastguard Worker        ///     CHECK: foo<<VarA:A|B>>
877*795d594fSAndroid Build Coastguard Worker        ///   CHECK-ELSE:
878*795d594fSAndroid Build Coastguard Worker        ///     CHECK: foo<<VarA:M|N>>
879*795d594fSAndroid Build Coastguard Worker        ///   CHECK-FI:
880*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
881*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: "<<VarA>>" == "N"
882*795d594fSAndroid Build Coastguard Worker      """,
883*795d594fSAndroid Build Coastguard Worker      """
884*795d594fSAndroid Build Coastguard Worker      fooN
885*795d594fSAndroid Build Coastguard Worker      """)
886*795d594fSAndroid Build Coastguard Worker
887*795d594fSAndroid Build Coastguard Worker  def test_MalformedBranching(self):
888*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
889*795d594fSAndroid Build Coastguard Worker      """
890*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
891*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo
892*795d594fSAndroid Build Coastguard Worker      """,
893*795d594fSAndroid Build Coastguard Worker      """
894*795d594fSAndroid Build Coastguard Worker      foo
895*795d594fSAndroid Build Coastguard Worker      """)
896*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
897*795d594fSAndroid Build Coastguard Worker      """
898*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
899*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo
900*795d594fSAndroid Build Coastguard Worker      """,
901*795d594fSAndroid Build Coastguard Worker      """
902*795d594fSAndroid Build Coastguard Worker      foo
903*795d594fSAndroid Build Coastguard Worker      """)
904*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
905*795d594fSAndroid Build Coastguard Worker      """
906*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
907*795d594fSAndroid Build Coastguard Worker        /// CHECK: foo
908*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
909*795d594fSAndroid Build Coastguard Worker      """,
910*795d594fSAndroid Build Coastguard Worker      """
911*795d594fSAndroid Build Coastguard Worker      foo
912*795d594fSAndroid Build Coastguard Worker      """)
913*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
914*795d594fSAndroid Build Coastguard Worker      """
915*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
916*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo
917*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF:
918*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo
919*795d594fSAndroid Build Coastguard Worker        ///   CHECK-IF: True
920*795d594fSAndroid Build Coastguard Worker        ///     CHECK: foo
921*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
922*795d594fSAndroid Build Coastguard Worker      """,
923*795d594fSAndroid Build Coastguard Worker      """
924*795d594fSAndroid Build Coastguard Worker      foo
925*795d594fSAndroid Build Coastguard Worker      """)
926*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
927*795d594fSAndroid Build Coastguard Worker      """
928*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
929*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo
930*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
931*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo
932*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELIF:
933*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo
934*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
935*795d594fSAndroid Build Coastguard Worker      """,
936*795d594fSAndroid Build Coastguard Worker      """
937*795d594fSAndroid Build Coastguard Worker      foo
938*795d594fSAndroid Build Coastguard Worker      """)
939*795d594fSAndroid Build Coastguard Worker    self.assertBadStructure(
940*795d594fSAndroid Build Coastguard Worker      """
941*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: True
942*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo
943*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
944*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo
945*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
946*795d594fSAndroid Build Coastguard Worker        ///   CHECK: foo
947*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
948*795d594fSAndroid Build Coastguard Worker      """,
949*795d594fSAndroid Build Coastguard Worker      """
950*795d594fSAndroid Build Coastguard Worker      foo
951*795d594fSAndroid Build Coastguard Worker      """)
952*795d594fSAndroid Build Coastguard Worker
953*795d594fSAndroid Build Coastguard Worker  def test_hasIsaFeature(self):
954*795d594fSAndroid Build Coastguard Worker    no_isa = None
955*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
956*795d594fSAndroid Build Coastguard Worker      """
957*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: hasIsaFeature('feature1') and not hasIsaFeature('feature2')
958*795d594fSAndroid Build Coastguard Worker      """,
959*795d594fSAndroid Build Coastguard Worker      """
960*795d594fSAndroid Build Coastguard Worker      foo
961*795d594fSAndroid Build Coastguard Worker      """,
962*795d594fSAndroid Build Coastguard Worker      no_isa,
963*795d594fSAndroid Build Coastguard Worker      ImmutableDict({"feature1": True})
964*795d594fSAndroid Build Coastguard Worker    )
965*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
966*795d594fSAndroid Build Coastguard Worker      """
967*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: not hasIsaFeature('feature1')
968*795d594fSAndroid Build Coastguard Worker      """,
969*795d594fSAndroid Build Coastguard Worker      """
970*795d594fSAndroid Build Coastguard Worker      foo
971*795d594fSAndroid Build Coastguard Worker      """,
972*795d594fSAndroid Build Coastguard Worker      no_isa,
973*795d594fSAndroid Build Coastguard Worker      ImmutableDict({"feature1": True})
974*795d594fSAndroid Build Coastguard Worker    )
975*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
976*795d594fSAndroid Build Coastguard Worker      """
977*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: hasIsaFeature('feature2')
978*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar1
979*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
980*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar2
981*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
982*795d594fSAndroid Build Coastguard Worker      """,
983*795d594fSAndroid Build Coastguard Worker      """
984*795d594fSAndroid Build Coastguard Worker      foo
985*795d594fSAndroid Build Coastguard Worker      bar1
986*795d594fSAndroid Build Coastguard Worker      """,
987*795d594fSAndroid Build Coastguard Worker      no_isa,
988*795d594fSAndroid Build Coastguard Worker      ImmutableDict({"feature1": False, "feature2": True})
989*795d594fSAndroid Build Coastguard Worker    )
990*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
991*795d594fSAndroid Build Coastguard Worker      """
992*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: hasIsaFeature('feature1') and not hasIsaFeature('feature2')
993*795d594fSAndroid Build Coastguard Worker      """,
994*795d594fSAndroid Build Coastguard Worker      """
995*795d594fSAndroid Build Coastguard Worker      foo
996*795d594fSAndroid Build Coastguard Worker      """,
997*795d594fSAndroid Build Coastguard Worker      "some_isa",
998*795d594fSAndroid Build Coastguard Worker      ImmutableDict({"feature1": True})
999*795d594fSAndroid Build Coastguard Worker    )
1000*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
1001*795d594fSAndroid Build Coastguard Worker      """
1002*795d594fSAndroid Build Coastguard Worker        /// CHECK-EVAL: not hasIsaFeature('feature1')
1003*795d594fSAndroid Build Coastguard Worker      """,
1004*795d594fSAndroid Build Coastguard Worker      """
1005*795d594fSAndroid Build Coastguard Worker      foo
1006*795d594fSAndroid Build Coastguard Worker      """,
1007*795d594fSAndroid Build Coastguard Worker      "some_isa",
1008*795d594fSAndroid Build Coastguard Worker      ImmutableDict({"feature1": True})
1009*795d594fSAndroid Build Coastguard Worker    )
1010*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1011*795d594fSAndroid Build Coastguard Worker      """
1012*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: hasIsaFeature('feature2')
1013*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar1
1014*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
1015*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar2
1016*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
1017*795d594fSAndroid Build Coastguard Worker      """,
1018*795d594fSAndroid Build Coastguard Worker      """
1019*795d594fSAndroid Build Coastguard Worker      foo
1020*795d594fSAndroid Build Coastguard Worker      bar1
1021*795d594fSAndroid Build Coastguard Worker      """,
1022*795d594fSAndroid Build Coastguard Worker      "some_isa",
1023*795d594fSAndroid Build Coastguard Worker      ImmutableDict({"feature1": False, "feature2": True})
1024*795d594fSAndroid Build Coastguard Worker    )
1025*795d594fSAndroid Build Coastguard Worker
1026*795d594fSAndroid Build Coastguard Worker  def test_readBarrierType(self):
1027*795d594fSAndroid Build Coastguard Worker    # CheckEval assertions with no read barrier
1028*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1029*795d594fSAndroid Build Coastguard Worker        """
1030*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('none')
1031*795d594fSAndroid Build Coastguard Worker        """,
1032*795d594fSAndroid Build Coastguard Worker        """
1033*795d594fSAndroid Build Coastguard Worker        foo
1034*795d594fSAndroid Build Coastguard Worker        """,
1035*795d594fSAndroid Build Coastguard Worker        None,
1036*795d594fSAndroid Build Coastguard Worker        read_barrier_type="none"
1037*795d594fSAndroid Build Coastguard Worker    )
1038*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
1039*795d594fSAndroid Build Coastguard Worker        """
1040*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('none')
1041*795d594fSAndroid Build Coastguard Worker        """,
1042*795d594fSAndroid Build Coastguard Worker        """
1043*795d594fSAndroid Build Coastguard Worker        foo
1044*795d594fSAndroid Build Coastguard Worker        """,
1045*795d594fSAndroid Build Coastguard Worker        None,
1046*795d594fSAndroid Build Coastguard Worker        read_barrier_type="baker"
1047*795d594fSAndroid Build Coastguard Worker    )
1048*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
1049*795d594fSAndroid Build Coastguard Worker        """
1050*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('none')
1051*795d594fSAndroid Build Coastguard Worker        """,
1052*795d594fSAndroid Build Coastguard Worker        """
1053*795d594fSAndroid Build Coastguard Worker        foo
1054*795d594fSAndroid Build Coastguard Worker        """,
1055*795d594fSAndroid Build Coastguard Worker        None,
1056*795d594fSAndroid Build Coastguard Worker        read_barrier_type="tablelookup"
1057*795d594fSAndroid Build Coastguard Worker    )
1058*795d594fSAndroid Build Coastguard Worker
1059*795d594fSAndroid Build Coastguard Worker    # CheckEval assertions with "baker" read barrier
1060*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1061*795d594fSAndroid Build Coastguard Worker        """
1062*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('baker')
1063*795d594fSAndroid Build Coastguard Worker        """,
1064*795d594fSAndroid Build Coastguard Worker        """
1065*795d594fSAndroid Build Coastguard Worker        foo
1066*795d594fSAndroid Build Coastguard Worker        """,
1067*795d594fSAndroid Build Coastguard Worker        None,
1068*795d594fSAndroid Build Coastguard Worker        read_barrier_type="baker"
1069*795d594fSAndroid Build Coastguard Worker    )
1070*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
1071*795d594fSAndroid Build Coastguard Worker        """
1072*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('baker')
1073*795d594fSAndroid Build Coastguard Worker        """,
1074*795d594fSAndroid Build Coastguard Worker        """
1075*795d594fSAndroid Build Coastguard Worker        foo
1076*795d594fSAndroid Build Coastguard Worker        """,
1077*795d594fSAndroid Build Coastguard Worker        None,
1078*795d594fSAndroid Build Coastguard Worker        read_barrier_type="none"
1079*795d594fSAndroid Build Coastguard Worker    )
1080*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
1081*795d594fSAndroid Build Coastguard Worker        """
1082*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('baker')
1083*795d594fSAndroid Build Coastguard Worker        """,
1084*795d594fSAndroid Build Coastguard Worker        """
1085*795d594fSAndroid Build Coastguard Worker        foo
1086*795d594fSAndroid Build Coastguard Worker        """,
1087*795d594fSAndroid Build Coastguard Worker        None,
1088*795d594fSAndroid Build Coastguard Worker        read_barrier_type="tablelookup"
1089*795d594fSAndroid Build Coastguard Worker    )
1090*795d594fSAndroid Build Coastguard Worker
1091*795d594fSAndroid Build Coastguard Worker    # CheckEval assertions with "tablelookup" read barrier
1092*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1093*795d594fSAndroid Build Coastguard Worker        """
1094*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('tablelookup')
1095*795d594fSAndroid Build Coastguard Worker        """,
1096*795d594fSAndroid Build Coastguard Worker        """
1097*795d594fSAndroid Build Coastguard Worker        foo
1098*795d594fSAndroid Build Coastguard Worker        """,
1099*795d594fSAndroid Build Coastguard Worker        None,
1100*795d594fSAndroid Build Coastguard Worker        read_barrier_type="tablelookup"
1101*795d594fSAndroid Build Coastguard Worker    )
1102*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
1103*795d594fSAndroid Build Coastguard Worker        """
1104*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('tablelookup')
1105*795d594fSAndroid Build Coastguard Worker        """,
1106*795d594fSAndroid Build Coastguard Worker        """
1107*795d594fSAndroid Build Coastguard Worker        foo
1108*795d594fSAndroid Build Coastguard Worker        """,
1109*795d594fSAndroid Build Coastguard Worker        None,
1110*795d594fSAndroid Build Coastguard Worker        read_barrier_type="none"
1111*795d594fSAndroid Build Coastguard Worker    )
1112*795d594fSAndroid Build Coastguard Worker    self.assertDoesNotMatch(
1113*795d594fSAndroid Build Coastguard Worker        """
1114*795d594fSAndroid Build Coastguard Worker          /// CHECK-EVAL: readBarrierType('tablelookup')
1115*795d594fSAndroid Build Coastguard Worker        """,
1116*795d594fSAndroid Build Coastguard Worker        """
1117*795d594fSAndroid Build Coastguard Worker        foo
1118*795d594fSAndroid Build Coastguard Worker        """,
1119*795d594fSAndroid Build Coastguard Worker        None,
1120*795d594fSAndroid Build Coastguard Worker        read_barrier_type="baker"
1121*795d594fSAndroid Build Coastguard Worker    )
1122*795d594fSAndroid Build Coastguard Worker
1123*795d594fSAndroid Build Coastguard Worker    # CheckIf assertions with no read barrier
1124*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1125*795d594fSAndroid Build Coastguard Worker      """
1126*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: readBarrierType('none')
1127*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar1
1128*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
1129*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar2
1130*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
1131*795d594fSAndroid Build Coastguard Worker      """,
1132*795d594fSAndroid Build Coastguard Worker      """
1133*795d594fSAndroid Build Coastguard Worker      foo
1134*795d594fSAndroid Build Coastguard Worker      bar1
1135*795d594fSAndroid Build Coastguard Worker      """,
1136*795d594fSAndroid Build Coastguard Worker      None,
1137*795d594fSAndroid Build Coastguard Worker      read_barrier_type="none"
1138*795d594fSAndroid Build Coastguard Worker    )
1139*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1140*795d594fSAndroid Build Coastguard Worker      """
1141*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: not readBarrierType('none')
1142*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar1
1143*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
1144*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar2
1145*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
1146*795d594fSAndroid Build Coastguard Worker      """,
1147*795d594fSAndroid Build Coastguard Worker      """
1148*795d594fSAndroid Build Coastguard Worker      foo
1149*795d594fSAndroid Build Coastguard Worker      bar2
1150*795d594fSAndroid Build Coastguard Worker      """,
1151*795d594fSAndroid Build Coastguard Worker      None,
1152*795d594fSAndroid Build Coastguard Worker      read_barrier_type="none"
1153*795d594fSAndroid Build Coastguard Worker    )
1154*795d594fSAndroid Build Coastguard Worker
1155*795d594fSAndroid Build Coastguard Worker    # CheckIf assertions with 'baker' read barrier
1156*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1157*795d594fSAndroid Build Coastguard Worker        """
1158*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: readBarrierType('baker')
1159*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar1
1160*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
1161*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar2
1162*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
1163*795d594fSAndroid Build Coastguard Worker        """,
1164*795d594fSAndroid Build Coastguard Worker        """
1165*795d594fSAndroid Build Coastguard Worker        foo
1166*795d594fSAndroid Build Coastguard Worker        bar1
1167*795d594fSAndroid Build Coastguard Worker        """,
1168*795d594fSAndroid Build Coastguard Worker        None,
1169*795d594fSAndroid Build Coastguard Worker        read_barrier_type="baker"
1170*795d594fSAndroid Build Coastguard Worker    )
1171*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1172*795d594fSAndroid Build Coastguard Worker        """
1173*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: not readBarrierType('baker')
1174*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar1
1175*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
1176*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar2
1177*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
1178*795d594fSAndroid Build Coastguard Worker        """,
1179*795d594fSAndroid Build Coastguard Worker        """
1180*795d594fSAndroid Build Coastguard Worker        foo
1181*795d594fSAndroid Build Coastguard Worker        bar2
1182*795d594fSAndroid Build Coastguard Worker        """,
1183*795d594fSAndroid Build Coastguard Worker        None,
1184*795d594fSAndroid Build Coastguard Worker        read_barrier_type="baker"
1185*795d594fSAndroid Build Coastguard Worker    )
1186*795d594fSAndroid Build Coastguard Worker
1187*795d594fSAndroid Build Coastguard Worker    # CheckIf assertions with 'tablelookup' read barrier
1188*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1189*795d594fSAndroid Build Coastguard Worker        """
1190*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: readBarrierType('tablelookup')
1191*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar1
1192*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
1193*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar2
1194*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
1195*795d594fSAndroid Build Coastguard Worker        """,
1196*795d594fSAndroid Build Coastguard Worker        """
1197*795d594fSAndroid Build Coastguard Worker        foo
1198*795d594fSAndroid Build Coastguard Worker        bar1
1199*795d594fSAndroid Build Coastguard Worker        """,
1200*795d594fSAndroid Build Coastguard Worker        None,
1201*795d594fSAndroid Build Coastguard Worker        read_barrier_type="tablelookup"
1202*795d594fSAndroid Build Coastguard Worker    )
1203*795d594fSAndroid Build Coastguard Worker    self.assertMatches(
1204*795d594fSAndroid Build Coastguard Worker        """
1205*795d594fSAndroid Build Coastguard Worker        /// CHECK-IF: not readBarrierType('tablelookup')
1206*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar1
1207*795d594fSAndroid Build Coastguard Worker        /// CHECK-ELSE:
1208*795d594fSAndroid Build Coastguard Worker        ///   CHECK: bar2
1209*795d594fSAndroid Build Coastguard Worker        /// CHECK-FI:
1210*795d594fSAndroid Build Coastguard Worker        """,
1211*795d594fSAndroid Build Coastguard Worker        """
1212*795d594fSAndroid Build Coastguard Worker        foo
1213*795d594fSAndroid Build Coastguard Worker        bar2
1214*795d594fSAndroid Build Coastguard Worker        """,
1215*795d594fSAndroid Build Coastguard Worker        None,
1216*795d594fSAndroid Build Coastguard Worker        read_barrier_type="tablelookup"
1217*795d594fSAndroid Build Coastguard Worker    )
1218