test.py revision 6423cf5ef0ddf82722a6ed77ad3908fc8802d8cf
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
202c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdilfrom file_format.checker.struct      import CheckerFile, TestCase, TestAssertion, RegexExpression
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      """
1082c27f2ccf316aebf96cf365d33d2834a8206444dDavid 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):
1346423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("// CHECK: foo bar", "foo bar")
1356423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("// CHECK: foo bar", "abc def")
1362c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1372c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_Pattern(self):
1386423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("// CHECK: abc {{de.}}", "abc de#")
1396423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("// CHECK: abc {{de.}}", "abc d#f")
1402c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1412c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_Variables(self):
1426423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
1432c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
144c2c48ffdd623b4e58b34115d1521b0988a42b217David Brazdil      // CHECK: foo<<X:.>>bar
145c2c48ffdd623b4e58b34115d1521b0988a42b217David Brazdil      // CHECK: abc<<X>>def
1462c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1472c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1484e9aac12cf5f88d565d0856a6f842f6c9280056dDavid Brazdil      foo0bar
1494e9aac12cf5f88d565d0856a6f842f6c9280056dDavid Brazdil      abc0def
1506423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1516423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
1522c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
153c2c48ffdd623b4e58b34115d1521b0988a42b217David Brazdil      // CHECK: foo<<X:([0-9]+)>>bar
154c2c48ffdd623b4e58b34115d1521b0988a42b217David Brazdil      // CHECK: abc<<X>>def
155c2c48ffdd623b4e58b34115d1521b0988a42b217David Brazdil      // CHECK: ### <<X>> ###
1562c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1572c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1582c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo1234bar
1592c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc1234def
1602c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      ### 1234 ###
1616423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1626423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
1632c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
164c2c48ffdd623b4e58b34115d1521b0988a42b217David Brazdil      // CHECK: foo<<X:([0-9]+)>>bar
165c2c48ffdd623b4e58b34115d1521b0988a42b217David 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):
1736423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches("// CHECK: b{{.}}r", "abc bar def")
1746423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("// CHECK: b{{.}}r", "abc Xbar def")
1756423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("// CHECK: b{{.}}r", "abc barX def")
1766423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch("// CHECK: b{{.}}r", "abc b r def")
1774e9aac12cf5f88d565d0856a6f842f6c9280056dDavid Brazdil
1782c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_InOrderAssertions(self):
1796423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
1802c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1812c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK: foo
1822c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK: bar
1832c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1842c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1852c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
1862c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
1876423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1886423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
1892c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1902c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK: foo
1912c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK: bar
1922c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
1932c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
1942c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
1952c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
1966423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
1972c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
1982c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_DagAssertions(self):
1996423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2002c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2012c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: foo
2022c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: bar
2032c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2042c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2052c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2062c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2076423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2086423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2092c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2102c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: foo
2112c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: bar
2122c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2132c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2142c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2152c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2166423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2172c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
2182c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_DagAssertionsScope(self):
2196423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2202c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2212c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     foo
2222c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: abc
2232c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: def
2242c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     bar
2252c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2262c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2272c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2282c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
2292c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
2302c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2316423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2326423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
2332c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2342c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     foo
2352c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: abc
2362c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: def
2372c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     bar
2382c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2392c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2402c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2412c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
2422c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2432c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
2446423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2456423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
2462c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2472c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     foo
2482c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: abc
2492c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: def
2502c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     bar
2512c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2522c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2532c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
2542c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
2552c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
2562c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
2576423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2582c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
2592c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_NotAssertions(self):
2606423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2612c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2622c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-NOT: foo
2632c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2642c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2652c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
2662c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
2676423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2686423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
2692c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2702c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-NOT: foo
2712c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2722c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2732c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc foo
2742c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
2756423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2766423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
2772c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2782c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-NOT: foo
2792c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-NOT: bar
2802c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2812c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2822c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
2832c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def bar
2846423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2852c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
2862c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_NotAssertionsScope(self):
2876423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2882c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2892c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     abc
2902c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-NOT: foo
2912c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     def
2922c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
2932c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2942c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
2952c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
2966423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
2976423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
2982c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
2992c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     abc
3002c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-NOT: foo
3012c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     def
3022c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3032c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3042c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3052c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
3062c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3076423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3086423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
3092c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3102c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     abc
3112c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-NOT: foo
3122c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK:     def
3132c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3142c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3152c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3162c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3172c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      def
3186423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3192c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil
3202c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil  def test_LineOnlyMatchesOnce(self):
3216423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertMatches(
3222c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3232c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: foo
3242c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: foo
3252c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3262c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3272c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3282c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3292c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3306423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
3316423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    self.assertDoesNotMatch(
3322c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3332c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: foo
3342c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      // CHECK-DAG: foo
3352c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """,
3362c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil    """
3372c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      foo
3382c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      abc
3392c27f2ccf316aebf96cf365d33d2834a8206444dDavid Brazdil      bar
3406423cf5ef0ddf82722a6ed77ad3908fc8802d8cfDavid Brazdil    """)
341