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