12c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# Copyright (C) 2014 The Android Open Source Project
22c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil#
32c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# Licensed under the Apache License, Version 2.0 (the "License");
42c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# you may not use this file except in compliance with the License.
52c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# You may obtain a copy of the License at
62c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil#
72c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil#   http://www.apache.org/licenses/LICENSE-2.0
82c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil#
92c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# Unless required by applicable law or agreed to in writing, software
102c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# distributed under the License is distributed on an "AS IS" BASIS,
112c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# See the License for the specific language governing permissions and
132c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil# limitations under the License.
142c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
15c4de9436bbfe3a9c9adf48085b9344ad9a37c14bDavid Brazdilfrom common.immutables               import ImmutableDict
162c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilfrom common.testing                  import ToUnicode
172c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilfrom file_format.c1visualizer.parser import ParseC1visualizerStream
182c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilfrom file_format.c1visualizer.struct import C1visualizerFile, C1visualizerPass
192c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilfrom file_format.checker.parser      import ParseCheckerStream, ParseCheckerAssertion
20b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdilfrom file_format.checker.struct      import CheckerFile, TestCase, TestAssertion
216423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdilfrom match.file                      import MatchTestCase, MatchFailedException
222c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilfrom match.line                      import MatchLines
232c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
242c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilimport io
252c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilimport unittest
262c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
272c27f2ccf316aebf96cf365d33d2834a8206444dDavid BrazdilCheckerException = SystemExit
282c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
292c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilclass MatchLines_Test(unittest.TestCase):
302c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
312c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def createTestAssertion(self, checkerString):
322c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    checkerFile = CheckerFile("<checker-file>")
332c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    testCase = TestCase(checkerFile, "TestMethod TestPass", 0)
342c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    return ParseCheckerAssertion(testCase, checkerString, TestAssertion.Variant.InOrder, 0)
352c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
362c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def tryMatch(self, checkerString, c1String, varState={}):
37c4de9436bbfe3a9c9adf48085b9344ad9a37c14bDavid Brazdil    return MatchLines(self.createTestAssertion(checkerString),
38c4de9436bbfe3a9c9adf48085b9344ad9a37c14bDavid Brazdil                      ToUnicode(c1String),
39c4de9436bbfe3a9c9adf48085b9344ad9a37c14bDavid Brazdil                      ImmutableDict(varState))
402c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
416423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil  def assertMatches(self, checkerString, c1String, varState={}):
426423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertIsNotNone(self.tryMatch(checkerString, c1String, varState))
436423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil
446423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil  def assertDoesNotMatch(self, checkerString, c1String, varState={}):
456423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertIsNone(self.tryMatch(checkerString, c1String, varState))
462c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
472c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_TextAndWhitespace(self):
486423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo", "foo")
496423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo", "  foo  ")
506423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo", "foo bar")
516423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("foo", "XfooX")
526423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("foo", "zoo")
532c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
546423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo bar", "foo   bar")
556423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo bar", "abc foo bar def")
566423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo bar", "foo foo bar bar")
572c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
586423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo bar", "foo X bar")
596423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("foo bar", "foo Xbar")
602c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
612c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_Pattern(self):
626423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo{{A|B}}bar", "fooAbar")
636423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo{{A|B}}bar", "fooBbar")
646423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("foo{{A|B}}bar", "fooCbar")
652c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
662c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_VariableReference(self):
676423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo<<X>>bar", "foobar", {"X": ""})
686423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo<<X>>bar", "fooAbar", {"X": "A"})
696423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo<<X>>bar", "fooBbar", {"X": "B"})
706423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("foo<<X>>bar", "foobar", {"X": "A"})
716423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("foo<<X>>bar", "foo bar", {"X": "A"})
722c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    with self.assertRaises(CheckerException):
736423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil      self.tryMatch("foo<<X>>bar", "foobar", {})
742c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
752c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_VariableDefinition(self):
766423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo<<X:A|B>>bar", "fooAbar")
776423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo<<X:A|B>>bar", "fooBbar")
786423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("foo<<X:A|B>>bar", "fooCbar")
792c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
80c2c48ffdd623b4e58b34115d1521b0988a42b217David Brazdil    env = self.tryMatch("foo<<X:A.*B>>bar", "fooABbar", {})
812c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    self.assertEqual(env, {"X": "AB"})
82c2c48ffdd623b4e58b34115d1521b0988a42b217David Brazdil    env = self.tryMatch("foo<<X:A.*B>>bar", "fooAxxBbar", {})
832c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    self.assertEqual(env, {"X": "AxxB"})
842c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
856423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo<<X:A|B>>bar<<X>>baz", "fooAbarAbaz")
866423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("foo<<X:A|B>>bar<<X>>baz", "fooBbarBbaz")
876423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("foo<<X:A|B>>bar<<X>>baz", "fooAbarBbaz")
882c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
892c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_NoVariableRedefinition(self):
902c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    with self.assertRaises(CheckerException):
916423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil      self.tryMatch("<<X:...>><<X>><<X:...>><<X>>", "foofoobarbar")
922c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
932c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_EnvNotChangedOnPartialMatch(self):
942c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    env = {"Y": "foo"}
956423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("<<X:A>>bar", "Abaz", env)
962c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    self.assertFalse("X" in env.keys())
972c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
982c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_VariableContentEscaped(self):
996423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("<<X:..>>foo<<X>>", ".*foo.*")
1006423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("<<X:..>>foo<<X>>", ".*fooAAAA")
1012c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1022c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1032c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilclass MatchFiles_Test(unittest.TestCase):
1042c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1056423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil  def assertMatches(self, checkerString, c1String):
1062c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    checkerString = \
1072c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      """
108a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil        /// CHECK-START: MyMethod MyPass
1092c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      """ + checkerString
1102c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    c1String = \
1112c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      """
1122c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil        begin_compilation
1132c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil          name "MyMethod"
1142c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil          method "MyMethod"
1152c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil          date 1234
1162c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil        end_compilation
1172c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil        begin_cfg
1182c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil          name "MyPass"
1192c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      """ + c1String + \
1202c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      """
1212c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil        end_cfg
1222c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      """
1232c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    checkerFile = ParseCheckerStream("<test-file>", "CHECK", io.StringIO(ToUnicode(checkerString)))
1242c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    c1File = ParseC1visualizerStream("<c1-file>", io.StringIO(ToUnicode(c1String)))
1256423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    assert len(checkerFile.testCases) == 1
1266423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    assert len(c1File.passes) == 1
1276423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    MatchTestCase(checkerFile.testCases[0], c1File.passes[0])
1286423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil
1296423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil  def assertDoesNotMatch(self, checkerString, c1String):
1306423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    with self.assertRaises(MatchFailedException):
1316423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil      self.assertMatches(checkerString, c1String)
1322c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1332c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_Text(self):
134a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil    self.assertMatches("/// CHECK: foo bar", "foo bar")
135a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil    self.assertDoesNotMatch("/// CHECK: foo bar", "abc def")
1362c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1372c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_Pattern(self):
138a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil    self.assertMatches("/// CHECK: abc {{de.}}", "abc de#")
139a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil    self.assertDoesNotMatch("/// CHECK: abc {{de.}}", "abc d#f")
1402c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1412c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_Variables(self):
1426423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
1432c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
144a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: foo<<X:.>>bar
145a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: abc<<X>>def
1462c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1472c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1484e9aac12cf5f88d565d0856a6f842f6c9280056dDavid Brazdil      foo0bar
1494e9aac12cf5f88d565d0856a6f842f6c9280056dDavid Brazdil      abc0def
1506423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1516423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
1522c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
153a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: foo<<X:([0-9]+)>>bar
154a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: abc<<X>>def
155a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: ### <<X>> ###
1562c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1572c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1582c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo1234bar
1592c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc1234def
1602c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      ### 1234 ###
1616423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1626423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
1632c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
164a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: foo<<X:([0-9]+)>>bar
165a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: abc<<X>>def
1662c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1672c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1682c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo1234bar
1692c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc1235def
1706423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1712c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1724e9aac12cf5f88d565d0856a6f842f6c9280056dDavid Brazdil  def test_WholeWordMustMatch(self):
173a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil    self.assertMatches("/// CHECK: b{{.}}r", "abc bar def")
174a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil    self.assertDoesNotMatch("/// CHECK: b{{.}}r", "abc Xbar def")
175a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil    self.assertDoesNotMatch("/// CHECK: b{{.}}r", "abc barX def")
176a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil    self.assertDoesNotMatch("/// CHECK: b{{.}}r", "abc b r def")
1774e9aac12cf5f88d565d0856a6f842f6c9280056dDavid Brazdil
1782c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_InOrderAssertions(self):
1796423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
1802c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
181a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: foo
182a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: bar
1832c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1842c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1852c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
1862c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
1876423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1886423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
1892c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
190a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: foo
191a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK: bar
1922c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1932c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1942c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
1952c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
1966423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1972c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
198711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil  def test_NextLineAssertions(self):
199711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    self.assertMatches(
200711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """
201a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:      foo
202a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NEXT: bar
203a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NEXT: abc
204a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:      def
205711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """,
206711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """
207711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      foo
208711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      bar
209711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      abc
210711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      def
211711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """)
212711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    self.assertMatches(
213711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """
214a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:      foo
215a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NEXT: bar
216a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:      def
217711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """,
218711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """
219711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      foo
220711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      bar
221711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      abc
222711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      def
223711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """)
224711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    self.assertDoesNotMatch(
225711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """
226a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:      foo
227a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NEXT: bar
228711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """,
229711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """
230711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      foo
231711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      abc
232711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      bar
233711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """)
234711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil
235711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    self.assertDoesNotMatch(
236711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """
237a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:      foo
238a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NEXT: bar
239711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """,
240711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """
241711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      bar
242711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      foo
243711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil      abc
244711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil    """)
245711411957a433555eda4bcf8d1f05aabf04425e8David Brazdil
2462c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_DagAssertions(self):
2476423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2482c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
249a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: foo
250a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: bar
2512c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2522c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2532c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2542c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2556423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2566423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2572c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
258a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: foo
259a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: bar
2602c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2612c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2622c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2632c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2646423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2652c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
2662c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_DagAssertionsScope(self):
2676423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2682c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
269a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     foo
270a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: abc
271a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: def
272a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     bar
2732c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2742c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2752c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2762c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
2772c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
2782c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2796423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2806423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
2812c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
282a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     foo
283a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: abc
284a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: def
285a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     bar
2862c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2872c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2882c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2892c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
2902c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2912c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
2926423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2936423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
2942c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
295a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     foo
296a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: abc
297a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: def
298a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     bar
2992c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3002c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3012c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3022c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
3032c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
3042c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3056423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3062c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
3072c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_NotAssertions(self):
3086423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
3092c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
310a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NOT: foo
3112c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3122c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3132c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3142c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
3156423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3166423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
3172c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
318a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NOT: foo
3192c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3202c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3212c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc foo
3222c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
3236423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3246423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
3252c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
326a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NOT: foo
327a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NOT: bar
3282c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3292c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3302c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3312c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def bar
3326423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3332c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
3342c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_NotAssertionsScope(self):
3356423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
3362c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
337a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     abc
338a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NOT: foo
339a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     def
3402c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3412c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3422c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3432c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
3446423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3456423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
3462c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
347a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     abc
348a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NOT: foo
349a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     def
3502c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3512c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3522c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3532c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
3542c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3556423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3566423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
3572c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
358a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     abc
359a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-NOT: foo
360a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK:     def
3612c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3622c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3632c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3642c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3652c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
3666423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3672c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
3682c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_LineOnlyMatchesOnce(self):
3696423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
3702c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
371a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: foo
372a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: foo
3732c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3742c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3752c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3762c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3772c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3786423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3796423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
3802c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
381a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: foo
382a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil      /// CHECK-DAG: foo
3832c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3842c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3852c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3862c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3872c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
3886423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
389b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil
390b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil  def test_EvalAssertions(self):
391b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil    self.assertMatches("/// CHECK-EVAL: True", "foo")
392b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil    self.assertDoesNotMatch("/// CHECK-EVAL: False", "foo")
393b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil
394b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil    self.assertMatches("/// CHECK-EVAL: 1 + 2 == 3", "foo")
395b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil    self.assertDoesNotMatch("/// CHECK-EVAL: 1 + 2 == 4", "foo")
396b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil
397b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil    twoVarTestCase = """
398b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil                       /// CHECK-DAG: <<X:\d+>> <<Y:\d+>>
399b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil                       /// CHECK-EVAL: <<X>> > <<Y>>
400b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil                     """
401b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil    self.assertMatches(twoVarTestCase, "42 41");
402b34c35ee8fe1516118d1d172a5e05b263ccbd93dDavid Brazdil    self.assertDoesNotMatch(twoVarTestCase, "42 43")
403