1123c5e983d26b6fb57d2ebe817e5c20fb6046803David Brazdil#!/usr/bin/env python2
2ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil#
3ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# Copyright (C) 2014 The Android Open Source Project
4ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil#
5ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# Licensed under the Apache License, Version 2.0 (the "License");
6ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# you may not use this file except in compliance with the License.
7ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# You may obtain a copy of the License at
8ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil#
9ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil#   http://www.apache.org/licenses/LICENSE-2.0
10ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil#
11ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# Unless required by applicable law or agreed to in writing, software
12ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# distributed under the License is distributed on an "AS IS" BASIS,
13ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# See the License for the specific language governing permissions and
15ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# limitations under the License.
16ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
17ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# This is a test file which exercises all feautres supported by the domain-
18ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil# specific markup language implemented by Checker.
19ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
20ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilimport checker
21ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilimport io
22ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilimport unittest
23ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
242e15cd2cf19753e5d72ddad607efea6ae7617e80David Brazdil# The parent type of exception expected to be thrown by Checker during tests.
252e15cd2cf19753e5d72ddad607efea6ae7617e80David Brazdil# It must be specific enough to not cover exceptions thrown due to actual flaws
2648942de205db678a1a74d953ae3288937b26834dDavid Brazdil# in Checker.
272e15cd2cf19753e5d72ddad607efea6ae7617e80David BrazdilCheckerException = SystemExit
282e15cd2cf19753e5d72ddad607efea6ae7617e80David Brazdil
29ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
30ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilclass TestCheckFile_PrefixExtraction(unittest.TestCase):
31ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __tryParse(self, string):
32ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    checkFile = checker.CheckFile(None, [])
33ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    return checkFile._extractLine("CHECK", string)
34ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
35ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_InvalidFormat(self):
36ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("CHECK"))
37ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse(":CHECK"))
38ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("CHECK:"))
39ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("//CHECK"))
40ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("#CHECK"))
41ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
42ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNotNone(self.__tryParse("//CHECK:foo"))
43ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNotNone(self.__tryParse("#CHECK:bar"))
44ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
45ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_InvalidLabel(self):
46ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("//ACHECK:foo"))
47ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("#ACHECK:foo"))
48ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
49ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_NotFirstOnTheLine(self):
50ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("A// CHECK: foo"))
51ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("A # CHECK: foo"))
52ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("// // CHECK: foo"))
53ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(self.__tryParse("# # CHECK: foo"))
54ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
55ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_WhitespaceAgnostic(self):
56ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNotNone(self.__tryParse("  //CHECK: foo"))
57ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNotNone(self.__tryParse("//  CHECK: foo"))
58ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNotNone(self.__tryParse("    //CHECK: foo"))
59ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNotNone(self.__tryParse("//    CHECK: foo"))
60ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
61ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
62ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilclass TestCheckLine_Parse(unittest.TestCase):
63b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil  def __getPartPattern(self, linePart):
64b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil    if linePart.variant == checker.CheckElement.Variant.Separator:
65b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil      return "\s+"
66b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil    else:
67b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil      return linePart.pattern
68b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil
69ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __getRegex(self, checkLine):
70b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil    return "".join(map(lambda x: "(" + self.__getPartPattern(x) + ")", checkLine.lineParts))
71ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
72ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __tryParse(self, string):
73ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    return checker.CheckLine(string)
74ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
75ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __parsesTo(self, string, expected):
76ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(expected, self.__getRegex(self.__tryParse(string)))
77ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
789a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  def __tryParseNot(self, string):
792e15cd2cf19753e5d72ddad607efea6ae7617e80David Brazdil    return checker.CheckLine(string, checker.CheckLine.Variant.Not)
809a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil
81ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __parsesPattern(self, string, pattern):
82ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    line = self.__tryParse(string)
83ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(1, len(line.lineParts))
84ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(checker.CheckElement.Variant.Pattern, line.lineParts[0].variant)
85ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(pattern, line.lineParts[0].pattern)
86ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
87ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __parsesVarRef(self, string, name):
88ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    line = self.__tryParse(string)
89ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(1, len(line.lineParts))
90ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(checker.CheckElement.Variant.VarRef, line.lineParts[0].variant)
91ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(name, line.lineParts[0].name)
92ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
93ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __parsesVarDef(self, string, name, body):
94ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    line = self.__tryParse(string)
95ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(1, len(line.lineParts))
96ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(checker.CheckElement.Variant.VarDef, line.lineParts[0].variant)
97ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(name, line.lineParts[0].name)
98ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(body, line.lineParts[0].pattern)
99ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
100ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __doesNotParse(self, string, partType):
101ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    line = self.__tryParse(string)
102ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(1, len(line.lineParts))
103ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertNotEqual(partType, line.lineParts[0].variant)
104ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
105ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  # Test that individual parts of the line are recognized
106ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
107ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_TextOnly(self):
108ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo", "(foo)")
109ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("  foo  ", "(foo)")
110ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("f$o^o", "(f\$o\^o)")
111ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
112ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_TextWithWhitespace(self):
113ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo bar", "(foo)(\s+)(bar)")
114ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo   bar", "(foo)(\s+)(bar)")
115ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
116ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_RegexOnly(self):
117ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesPattern("{{a?b.c}}", "a?b.c")
118ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
119ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_VarRefOnly(self):
120ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesVarRef("[[ABC]]", "ABC")
121ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
122ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_VarDefOnly(self):
123ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesVarDef("[[ABC:a?b.c]]", "ABC", "a?b.c")
124ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
125ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_TextWithRegex(self):
126ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo{{abc}}bar", "(foo)(abc)(bar)")
127ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
128ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_TextWithVar(self):
129ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo[[ABC:abc]]bar", "(foo)(abc)(bar)")
130ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
131ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_PlainWithRegexAndWhitespaces(self):
132ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo {{abc}}bar", "(foo)(\s+)(abc)(bar)")
133ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo{{abc}} bar", "(foo)(abc)(\s+)(bar)")
134ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo {{abc}} bar", "(foo)(\s+)(abc)(\s+)(bar)")
135ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
136ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_PlainWithVarAndWhitespaces(self):
137ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo [[ABC:abc]]bar", "(foo)(\s+)(abc)(bar)")
138ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo[[ABC:abc]] bar", "(foo)(abc)(\s+)(bar)")
139ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo [[ABC:abc]] bar", "(foo)(\s+)(abc)(\s+)(bar)")
140ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
141ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_AllKinds(self):
142ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo [[ABC:abc]]{{def}}bar", "(foo)(\s+)(abc)(def)(bar)")
143ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo[[ABC:abc]] {{def}}bar", "(foo)(abc)(\s+)(def)(bar)")
144ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("foo [[ABC:abc]] {{def}} bar", "(foo)(\s+)(abc)(\s+)(def)(\s+)(bar)")
145ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
146ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  # Test that variables and patterns are parsed correctly
147ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
148ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_ValidPattern(self):
149ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesPattern("{{abc}}", "abc")
150ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesPattern("{{a[b]c}}", "a[b]c")
151ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesPattern("{{(a{bc})}}", "(a{bc})")
152ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
153ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_ValidRef(self):
154ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesVarRef("[[ABC]]", "ABC")
155ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesVarRef("[[A1BC2]]", "A1BC2")
156ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
157ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_ValidDef(self):
158ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesVarDef("[[ABC:abc]]", "ABC", "abc")
159ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesVarDef("[[ABC:ab:c]]", "ABC", "ab:c")
160ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesVarDef("[[ABC:a[b]c]]", "ABC", "a[b]c")
161ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesVarDef("[[ABC:(a[bc])]]", "ABC", "(a[bc])")
162ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
163ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_Empty(self):
164ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("{{}}", checker.CheckElement.Variant.Pattern)
165ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("[[]]", checker.CheckElement.Variant.VarRef)
166ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("[[:]]", checker.CheckElement.Variant.VarDef)
167ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
168ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_InvalidVarName(self):
169ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("[[0ABC]]", checker.CheckElement.Variant.VarRef)
170ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("[[AB=C]]", checker.CheckElement.Variant.VarRef)
171ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("[[ABC=]]", checker.CheckElement.Variant.VarRef)
172ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("[[0ABC:abc]]", checker.CheckElement.Variant.VarDef)
173ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("[[AB=C:abc]]", checker.CheckElement.Variant.VarDef)
174ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__doesNotParse("[[ABC=:abc]]", checker.CheckElement.Variant.VarDef)
175ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
176ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_BodyMatchNotGreedy(self):
177ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("{{abc}}{{def}}", "(abc)(def)")
178ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("[[ABC:abc]][[DEF:def]]", "(abc)(def)")
179ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
1809a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  def test_NoVarDefsInNotChecks(self):
1812e15cd2cf19753e5d72ddad607efea6ae7617e80David Brazdil    with self.assertRaises(CheckerException):
1829a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil      self.__tryParseNot("[[ABC:abc]]")
183ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
184ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilclass TestCheckLine_Match(unittest.TestCase):
185ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __matchSingle(self, checkString, outputString, varState={}):
186ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    checkLine = checker.CheckLine(checkString)
187ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    newVarState = checkLine.match(outputString, varState)
188ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNotNone(newVarState)
189ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    return newVarState
190ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
191ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __notMatchSingle(self, checkString, outputString, varState={}):
192ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    checkLine = checker.CheckLine(checkString)
193ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertIsNone(checkLine.match(outputString, varState))
194ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
195ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_TextAndWhitespace(self):
196ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo", "foo")
197b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil    self.__matchSingle("foo", "  foo  ")
198ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo", "foo bar")
199b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil    self.__notMatchSingle("foo", "XfooX")
200ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchSingle("foo", "zoo")
201ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
202ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo bar", "foo   bar")
203ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo bar", "abc foo bar def")
204ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo bar", "foo foo bar bar")
205b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil
206b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil    self.__matchSingle("foo bar", "foo X bar")
207b86e77937e824940d087b7c5999c79e5c38b00c8David Brazdil    self.__notMatchSingle("foo bar", "foo Xbar")
208ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
209ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_Pattern(self):
210ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo{{A|B}}bar", "fooAbar")
211ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo{{A|B}}bar", "fooBbar")
212ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchSingle("foo{{A|B}}bar", "fooCbar")
213ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
214ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_VariableReference(self):
215ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo[[X]]bar", "foobar", {"X": ""})
216ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo[[X]]bar", "fooAbar", {"X": "A"})
217ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo[[X]]bar", "fooBbar", {"X": "B"})
218ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchSingle("foo[[X]]bar", "foobar", {"X": "A"})
219ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchSingle("foo[[X]]bar", "foo bar", {"X": "A"})
2202e15cd2cf19753e5d72ddad607efea6ae7617e80David Brazdil    with self.assertRaises(CheckerException):
221ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil      self.__matchSingle("foo[[X]]bar", "foobar", {})
222ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
223ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_VariableDefinition(self):
224ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo[[X:A|B]]bar", "fooAbar")
225ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo[[X:A|B]]bar", "fooBbar")
226ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchSingle("foo[[X:A|B]]bar", "fooCbar")
227ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
228ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    env = self.__matchSingle("foo[[X:A.*B]]bar", "fooABbar", {})
229ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(env, {"X": "AB"})
230ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    env = self.__matchSingle("foo[[X:A.*B]]bar", "fooAxxBbar", {})
231ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertEqual(env, {"X": "AxxB"})
232ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
233ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo[[X:A|B]]bar[[X]]baz", "fooAbarAbaz")
234ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("foo[[X:A|B]]bar[[X]]baz", "fooBbarBbaz")
235ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchSingle("foo[[X:A|B]]bar[[X]]baz", "fooAbarBbaz")
236ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
237ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_NoVariableRedefinition(self):
2382e15cd2cf19753e5d72ddad607efea6ae7617e80David Brazdil    with self.assertRaises(CheckerException):
239ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil      self.__matchSingle("[[X:...]][[X]][[X:...]][[X]]", "foofoobarbar")
240ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
241ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_EnvNotChangedOnPartialMatch(self):
242ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    env = {"Y": "foo"}
243ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchSingle("[[X:A]]bar", "Abaz", env)
244ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.assertFalse("X" in env.keys())
245ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
246ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_VariableContentEscaped(self):
247ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchSingle("[[X:..]]foo[[X]]", ".*foo.*")
248ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchSingle("[[X:..]]foo[[X]]", ".*fooAAAA")
249ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
250ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
2519a6f20e0ca565f2256c59f72a2437994e15ca597David BrazdilCheckVariant = checker.CheckLine.Variant
2529a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil
2539a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdildef prepareSingleCheck(line):
2549a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  if isinstance(line, str):
2559a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    return checker.CheckLine(line)
2569a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  else:
2579a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    return checker.CheckLine(line[0], line[1])
2589a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil
2599a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdildef prepareChecks(lines):
2609a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  if isinstance(lines, str):
2619a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    lines = lines.splitlines()
2629a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  return list(map(lambda line: prepareSingleCheck(line), lines))
2639a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil
2649a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil
265ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilclass TestCheckGroup_Match(unittest.TestCase):
2669a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  def __matchMulti(self, checkLines, outputString):
2679a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    checkGroup = checker.CheckGroup("MyGroup", prepareChecks(checkLines))
268ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    outputGroup = checker.OutputGroup("MyGroup", outputString.splitlines())
269ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    return checkGroup.match(outputGroup)
270ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
271ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __notMatchMulti(self, checkString, outputString):
2722e15cd2cf19753e5d72ddad607efea6ae7617e80David Brazdil    with self.assertRaises(CheckerException):
273ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil      self.__matchMulti(checkString, outputString)
274ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
275ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_TextAndPattern(self):
276ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchMulti("""foo bar
277ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc {{def}}""",
278ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                      """foo bar
279ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc def""");
280ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchMulti("""foo bar
281ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc {{de.}}""",
282ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                      """=======
283ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         foo bar
284ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         =======
285ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc de#
286ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         =======""");
287ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__notMatchMulti("""//XYZ: foo bar
288ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                            //XYZ: abc {{def}}""",
289ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         """=======
290ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                            foo bar
291ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                            =======
292ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                            abc de#
293ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                            =======""");
294ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
295ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_Variables(self):
296ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchMulti("""foo[[X:.]]bar
297ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc[[X]]def""",
298ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                      """foo bar
299ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc def""");
300ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__matchMulti("""foo[[X:([0-9]+)]]bar
301ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc[[X]]def
302ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         ### [[X]] ###""",
303ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                      """foo1234bar
304ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc1234def
305ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         ### 1234 ###""");
306ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
307ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_Ordering(self):
3089a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__matchMulti([("foo", CheckVariant.InOrder),
3099a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       ("bar", CheckVariant.InOrder)],
310ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                      """foo
311ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         bar""")
3129a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__notMatchMulti([("foo", CheckVariant.InOrder),
3139a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          ("bar", CheckVariant.InOrder)],
314ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         """bar
315ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                            foo""")
3169a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__matchMulti([("abc", CheckVariant.DAG),
3179a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       ("def", CheckVariant.DAG)],
3189a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                      """abc
3199a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         def""")
3209a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__matchMulti([("abc", CheckVariant.DAG),
3219a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       ("def", CheckVariant.DAG)],
3229a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                      """def
3239a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         abc""")
3249a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__matchMulti([("foo", CheckVariant.InOrder),
3259a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       ("abc", CheckVariant.DAG),
3269a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       ("def", CheckVariant.DAG),
3279a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       ("bar", CheckVariant.InOrder)],
3289a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                      """foo
3299a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         def
3309a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         abc
3319a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         bar""")
3329a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__notMatchMulti([("foo", CheckVariant.InOrder),
3339a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          ("abc", CheckVariant.DAG),
3349a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          ("def", CheckVariant.DAG),
3359a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          ("bar", CheckVariant.InOrder)],
3369a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         """foo
3379a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                            abc
3389a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                            bar""")
3399a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__notMatchMulti([("foo", CheckVariant.InOrder),
3409a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          ("abc", CheckVariant.DAG),
3419a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          ("def", CheckVariant.DAG),
3429a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          ("bar", CheckVariant.InOrder)],
3439a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         """foo
3449a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                            def
3459a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                            bar""")
3469a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil
3479a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  def test_NotAssertions(self):
3489a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__matchMulti([("foo", CheckVariant.Not)],
3499a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                      """abc
3509a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         def""")
3519a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__notMatchMulti([("foo", CheckVariant.Not)],
3529a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                         """abc foo
3539a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                            def""")
35421df8898e239a46ebfb189b14668d216d5801a61David Brazdil    self.__notMatchMulti([("foo", CheckVariant.Not),
35521df8898e239a46ebfb189b14668d216d5801a61David Brazdil                          ("bar", CheckVariant.Not)],
35621df8898e239a46ebfb189b14668d216d5801a61David Brazdil                         """abc
35721df8898e239a46ebfb189b14668d216d5801a61David Brazdil                            def bar""")
3589a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil
3599a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  def test_LineOnlyMatchesOnce(self):
3609a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__matchMulti([("foo", CheckVariant.DAG),
3619a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       ("foo", CheckVariant.DAG)],
3629a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       """foo
3639a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          foo""")
3649a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__notMatchMulti([("foo", CheckVariant.DAG),
3659a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          ("foo", CheckVariant.DAG)],
3669a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                          """foo
3679a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                             bar""")
368ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
369ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilclass TestOutputFile_Parse(unittest.TestCase):
370ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __parsesTo(self, string, expected):
371123c5e983d26b6fb57d2ebe817e5c20fb6046803David Brazdil    if isinstance(string, str):
372123c5e983d26b6fb57d2ebe817e5c20fb6046803David Brazdil      string = unicode(string)
373ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    outputStream = io.StringIO(string)
374ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    return self.assertEqual(checker.OutputFile(outputStream).groups, expected)
375ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
376ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_NoInput(self):
377ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo(None, [])
378ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("", [])
379ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
380ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_SingleGroup(self):
381ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("""begin_compilation
382ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         method "MyMethod"
383ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_compilation
384ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       begin_cfg
385ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         name "pass1"
386ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         foo
387ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         bar
388ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_cfg""",
389ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                    [ checker.OutputGroup("MyMethod pass1", [ "foo", "bar" ]) ])
390ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
391ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_MultipleGroups(self):
392ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("""begin_compilation
393ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         name "xyz1"
394ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         method "MyMethod1"
395ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         date 1234
396ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_compilation
397ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       begin_cfg
398ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         name "pass1"
399ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         foo
400ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         bar
401ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_cfg
402ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       begin_cfg
403ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         name "pass2"
404ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc
405ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         def
406ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_cfg""",
407ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                    [ checker.OutputGroup("MyMethod1 pass1", [ "foo", "bar" ]),
408ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                      checker.OutputGroup("MyMethod1 pass2", [ "abc", "def" ]) ])
409ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
410ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("""begin_compilation
411ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         name "xyz1"
412ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         method "MyMethod1"
413ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         date 1234
414ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_compilation
415ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       begin_cfg
416ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         name "pass1"
417ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         foo
418ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         bar
419ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_cfg
420ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       begin_compilation
421ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         name "xyz2"
422ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         method "MyMethod2"
423ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         date 5678
424ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_compilation
425ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       begin_cfg
426ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         name "pass2"
427ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         abc
428ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                         def
429ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       end_cfg""",
430ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                    [ checker.OutputGroup("MyMethod1 pass1", [ "foo", "bar" ]),
431ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                      checker.OutputGroup("MyMethod2 pass2", [ "abc", "def" ]) ])
432ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
433ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilclass TestCheckFile_Parse(unittest.TestCase):
434ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def __parsesTo(self, string, expected):
435123c5e983d26b6fb57d2ebe817e5c20fb6046803David Brazdil    if isinstance(string, str):
436123c5e983d26b6fb57d2ebe817e5c20fb6046803David Brazdil      string = unicode(string)
437ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    checkStream = io.StringIO(string)
438ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    return self.assertEqual(checker.CheckFile("CHECK", checkStream).groups, expected)
439ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
440ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_NoInput(self):
441ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo(None, [])
442ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("", [])
443ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
444ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_SingleGroup(self):
445ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("""// CHECK-START: Example Group
446ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       // CHECK:  foo
447ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       // CHECK:    bar""",
4489a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                    [ checker.CheckGroup("Example Group", prepareChecks([ "foo", "bar" ])) ])
449ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
450ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  def test_MultipleGroups(self):
451ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil    self.__parsesTo("""// CHECK-START: Example Group1
452ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       // CHECK: foo
453ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       // CHECK: bar
454ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       // CHECK-START: Example Group2
455ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       // CHECK: abc
456ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil                       // CHECK: def""",
4579a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                    [ checker.CheckGroup("Example Group1", prepareChecks([ "foo", "bar" ])),
4589a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                      checker.CheckGroup("Example Group2", prepareChecks([ "abc", "def" ])) ])
4599a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil
4609a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil  def test_CheckVariants(self):
4619a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil    self.__parsesTo("""// CHECK-START: Example Group
4629a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       // CHECK:     foo
4639a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       // CHECK-NOT: bar
4649a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       // CHECK-DAG: abc
4659a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                       // CHECK-DAG: def""",
4669a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                    [ checker.CheckGroup("Example Group",
4679a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                                         prepareChecks([ ("foo", CheckVariant.InOrder),
4689a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                                                         ("bar", CheckVariant.Not),
4699a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                                                         ("abc", CheckVariant.DAG),
4709a6f20e0ca565f2256c59f72a2437994e15ca597David Brazdil                                                         ("def", CheckVariant.DAG) ])) ])
471ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil
472ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdilif __name__ == '__main__':
4737cca5df2e8565f0a09d695719879edcd7d6bb827David Brazdil  checker.Logger.Verbosity = checker.Logger.Level.NoOutput
474ee690a3dd364c025ebc1767d9f84097bb7473eecDavid Brazdil  unittest.main()
475