1*16467b97STreehugger Robot 2*16467b97STreehugger Robotfrom io import StringIO 3*16467b97STreehugger Robotimport os 4*16467b97STreehugger Robotimport unittest 5*16467b97STreehugger Robot 6*16467b97STreehugger Robotfrom antlr3.tree import CommonTreeAdaptor, CommonTree, INVALID_TOKEN_TYPE 7*16467b97STreehugger Robotfrom antlr3.treewizard import TreeWizard, computeTokenTypes, \ 8*16467b97STreehugger Robot TreePatternLexer, EOF, ID, BEGIN, END, PERCENT, COLON, DOT, ARG, \ 9*16467b97STreehugger Robot TreePatternParser, \ 10*16467b97STreehugger Robot TreePattern, WildcardTreePattern, TreePatternTreeAdaptor 11*16467b97STreehugger Robot 12*16467b97STreehugger Robot 13*16467b97STreehugger Robotclass TestComputeTokenTypes(unittest.TestCase): 14*16467b97STreehugger Robot """Test case for the computeTokenTypes function.""" 15*16467b97STreehugger Robot 16*16467b97STreehugger Robot def testNone(self): 17*16467b97STreehugger Robot """computeTokenTypes(None) -> {}""" 18*16467b97STreehugger Robot 19*16467b97STreehugger Robot typeMap = computeTokenTypes(None) 20*16467b97STreehugger Robot self.assertIsInstance(typeMap, dict) 21*16467b97STreehugger Robot self.assertEqual(typeMap, {}) 22*16467b97STreehugger Robot 23*16467b97STreehugger Robot 24*16467b97STreehugger Robot def testList(self): 25*16467b97STreehugger Robot """computeTokenTypes(['a', 'b']) -> { 'a': 0, 'b': 1 }""" 26*16467b97STreehugger Robot 27*16467b97STreehugger Robot typeMap = computeTokenTypes(['a', 'b']) 28*16467b97STreehugger Robot self.assertIsInstance(typeMap, dict) 29*16467b97STreehugger Robot self.assertEqual(typeMap, { 'a': 0, 'b': 1 }) 30*16467b97STreehugger Robot 31*16467b97STreehugger Robot 32*16467b97STreehugger Robotclass TestTreePatternLexer(unittest.TestCase): 33*16467b97STreehugger Robot """Test case for the TreePatternLexer class.""" 34*16467b97STreehugger Robot 35*16467b97STreehugger Robot def testBegin(self): 36*16467b97STreehugger Robot """TreePatternLexer(): '('""" 37*16467b97STreehugger Robot 38*16467b97STreehugger Robot lexer = TreePatternLexer('(') 39*16467b97STreehugger Robot type = lexer.nextToken() 40*16467b97STreehugger Robot self.assertEqual(type, BEGIN) 41*16467b97STreehugger Robot self.assertEqual(lexer.sval, '') 42*16467b97STreehugger Robot self.assertFalse(lexer.error) 43*16467b97STreehugger Robot 44*16467b97STreehugger Robot 45*16467b97STreehugger Robot def testEnd(self): 46*16467b97STreehugger Robot """TreePatternLexer(): ')'""" 47*16467b97STreehugger Robot 48*16467b97STreehugger Robot lexer = TreePatternLexer(')') 49*16467b97STreehugger Robot type = lexer.nextToken() 50*16467b97STreehugger Robot self.assertEqual(type, END) 51*16467b97STreehugger Robot self.assertEqual(lexer.sval, '') 52*16467b97STreehugger Robot self.assertFalse(lexer.error) 53*16467b97STreehugger Robot 54*16467b97STreehugger Robot 55*16467b97STreehugger Robot def testPercent(self): 56*16467b97STreehugger Robot """TreePatternLexer(): '%'""" 57*16467b97STreehugger Robot 58*16467b97STreehugger Robot lexer = TreePatternLexer('%') 59*16467b97STreehugger Robot type = lexer.nextToken() 60*16467b97STreehugger Robot self.assertEqual(type, PERCENT) 61*16467b97STreehugger Robot self.assertEqual(lexer.sval, '') 62*16467b97STreehugger Robot self.assertFalse(lexer.error) 63*16467b97STreehugger Robot 64*16467b97STreehugger Robot 65*16467b97STreehugger Robot def testDot(self): 66*16467b97STreehugger Robot """TreePatternLexer(): '.'""" 67*16467b97STreehugger Robot 68*16467b97STreehugger Robot lexer = TreePatternLexer('.') 69*16467b97STreehugger Robot type = lexer.nextToken() 70*16467b97STreehugger Robot self.assertEqual(type, DOT) 71*16467b97STreehugger Robot self.assertEqual(lexer.sval, '') 72*16467b97STreehugger Robot self.assertFalse(lexer.error) 73*16467b97STreehugger Robot 74*16467b97STreehugger Robot 75*16467b97STreehugger Robot def testColon(self): 76*16467b97STreehugger Robot """TreePatternLexer(): ':'""" 77*16467b97STreehugger Robot 78*16467b97STreehugger Robot lexer = TreePatternLexer(':') 79*16467b97STreehugger Robot type = lexer.nextToken() 80*16467b97STreehugger Robot self.assertEqual(type, COLON) 81*16467b97STreehugger Robot self.assertEqual(lexer.sval, '') 82*16467b97STreehugger Robot self.assertFalse(lexer.error) 83*16467b97STreehugger Robot 84*16467b97STreehugger Robot 85*16467b97STreehugger Robot def testEOF(self): 86*16467b97STreehugger Robot """TreePatternLexer(): EOF""" 87*16467b97STreehugger Robot 88*16467b97STreehugger Robot lexer = TreePatternLexer(' \n \r \t ') 89*16467b97STreehugger Robot type = lexer.nextToken() 90*16467b97STreehugger Robot self.assertEqual(type, EOF) 91*16467b97STreehugger Robot self.assertEqual(lexer.sval, '') 92*16467b97STreehugger Robot self.assertFalse(lexer.error) 93*16467b97STreehugger Robot 94*16467b97STreehugger Robot 95*16467b97STreehugger Robot def testID(self): 96*16467b97STreehugger Robot """TreePatternLexer(): ID""" 97*16467b97STreehugger Robot 98*16467b97STreehugger Robot lexer = TreePatternLexer('_foo12_bar') 99*16467b97STreehugger Robot type = lexer.nextToken() 100*16467b97STreehugger Robot self.assertEqual(type, ID) 101*16467b97STreehugger Robot self.assertEqual(lexer.sval, '_foo12_bar') 102*16467b97STreehugger Robot self.assertFalse(lexer.error) 103*16467b97STreehugger Robot 104*16467b97STreehugger Robot 105*16467b97STreehugger Robot def testARG(self): 106*16467b97STreehugger Robot """TreePatternLexer(): ARG""" 107*16467b97STreehugger Robot 108*16467b97STreehugger Robot lexer = TreePatternLexer(r'[ \]bla\n]') 109*16467b97STreehugger Robot type = lexer.nextToken() 110*16467b97STreehugger Robot self.assertEqual(type, ARG) 111*16467b97STreehugger Robot self.assertEqual(lexer.sval, r' ]bla\n') 112*16467b97STreehugger Robot self.assertFalse(lexer.error) 113*16467b97STreehugger Robot 114*16467b97STreehugger Robot 115*16467b97STreehugger Robot def testError(self): 116*16467b97STreehugger Robot """TreePatternLexer(): error""" 117*16467b97STreehugger Robot 118*16467b97STreehugger Robot lexer = TreePatternLexer('1') 119*16467b97STreehugger Robot type = lexer.nextToken() 120*16467b97STreehugger Robot self.assertEqual(type, EOF) 121*16467b97STreehugger Robot self.assertEqual(lexer.sval, '') 122*16467b97STreehugger Robot self.assertTrue(lexer.error) 123*16467b97STreehugger Robot 124*16467b97STreehugger Robot 125*16467b97STreehugger Robotclass TestTreePatternParser(unittest.TestCase): 126*16467b97STreehugger Robot """Test case for the TreePatternParser class.""" 127*16467b97STreehugger Robot 128*16467b97STreehugger Robot def setUp(self): 129*16467b97STreehugger Robot """Setup text fixure 130*16467b97STreehugger Robot 131*16467b97STreehugger Robot We need a tree adaptor, use CommonTreeAdaptor. 132*16467b97STreehugger Robot And a constant list of token names. 133*16467b97STreehugger Robot 134*16467b97STreehugger Robot """ 135*16467b97STreehugger Robot 136*16467b97STreehugger Robot self.adaptor = CommonTreeAdaptor() 137*16467b97STreehugger Robot self.tokens = [ 138*16467b97STreehugger Robot "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR" 139*16467b97STreehugger Robot ] 140*16467b97STreehugger Robot self.wizard = TreeWizard(self.adaptor, tokenNames=self.tokens) 141*16467b97STreehugger Robot 142*16467b97STreehugger Robot 143*16467b97STreehugger Robot def testSingleNode(self): 144*16467b97STreehugger Robot """TreePatternParser: 'ID'""" 145*16467b97STreehugger Robot lexer = TreePatternLexer('ID') 146*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, self.adaptor) 147*16467b97STreehugger Robot tree = parser.pattern() 148*16467b97STreehugger Robot self.assertIsInstance(tree, CommonTree) 149*16467b97STreehugger Robot self.assertEqual(tree.getType(), 10) 150*16467b97STreehugger Robot self.assertEqual(tree.getText(), 'ID') 151*16467b97STreehugger Robot 152*16467b97STreehugger Robot 153*16467b97STreehugger Robot def testSingleNodeWithArg(self): 154*16467b97STreehugger Robot """TreePatternParser: 'ID[foo]'""" 155*16467b97STreehugger Robot lexer = TreePatternLexer('ID[foo]') 156*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, self.adaptor) 157*16467b97STreehugger Robot tree = parser.pattern() 158*16467b97STreehugger Robot self.assertIsInstance(tree, CommonTree) 159*16467b97STreehugger Robot self.assertEqual(tree.getType(), 10) 160*16467b97STreehugger Robot self.assertEqual(tree.getText(), 'foo') 161*16467b97STreehugger Robot 162*16467b97STreehugger Robot 163*16467b97STreehugger Robot def testSingleLevelTree(self): 164*16467b97STreehugger Robot """TreePatternParser: '(A B)'""" 165*16467b97STreehugger Robot lexer = TreePatternLexer('(A B)') 166*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, self.adaptor) 167*16467b97STreehugger Robot tree = parser.pattern() 168*16467b97STreehugger Robot self.assertIsInstance(tree, CommonTree) 169*16467b97STreehugger Robot self.assertEqual(tree.getType(), 5) 170*16467b97STreehugger Robot self.assertEqual(tree.getText(), 'A') 171*16467b97STreehugger Robot self.assertEqual(tree.getChildCount(), 1) 172*16467b97STreehugger Robot self.assertEqual(tree.getChild(0).getType(), 6) 173*16467b97STreehugger Robot self.assertEqual(tree.getChild(0).getText(), 'B') 174*16467b97STreehugger Robot 175*16467b97STreehugger Robot 176*16467b97STreehugger Robot def testNil(self): 177*16467b97STreehugger Robot """TreePatternParser: 'nil'""" 178*16467b97STreehugger Robot lexer = TreePatternLexer('nil') 179*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, self.adaptor) 180*16467b97STreehugger Robot tree = parser.pattern() 181*16467b97STreehugger Robot self.assertIsInstance(tree, CommonTree) 182*16467b97STreehugger Robot self.assertEqual(tree.getType(), 0) 183*16467b97STreehugger Robot self.assertIsNone(tree.getText()) 184*16467b97STreehugger Robot 185*16467b97STreehugger Robot 186*16467b97STreehugger Robot def testWildcard(self): 187*16467b97STreehugger Robot """TreePatternParser: '(.)'""" 188*16467b97STreehugger Robot lexer = TreePatternLexer('(.)') 189*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, self.adaptor) 190*16467b97STreehugger Robot tree = parser.pattern() 191*16467b97STreehugger Robot self.assertIsInstance(tree, WildcardTreePattern) 192*16467b97STreehugger Robot 193*16467b97STreehugger Robot 194*16467b97STreehugger Robot def testLabel(self): 195*16467b97STreehugger Robot """TreePatternParser: '(%a:A)'""" 196*16467b97STreehugger Robot lexer = TreePatternLexer('(%a:A)') 197*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, TreePatternTreeAdaptor()) 198*16467b97STreehugger Robot tree = parser.pattern() 199*16467b97STreehugger Robot self.assertIsInstance(tree, TreePattern) 200*16467b97STreehugger Robot self.assertEqual(tree.label, 'a') 201*16467b97STreehugger Robot 202*16467b97STreehugger Robot 203*16467b97STreehugger Robot def testError1(self): 204*16467b97STreehugger Robot """TreePatternParser: ')'""" 205*16467b97STreehugger Robot lexer = TreePatternLexer(')') 206*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, self.adaptor) 207*16467b97STreehugger Robot tree = parser.pattern() 208*16467b97STreehugger Robot self.assertIsNone(tree) 209*16467b97STreehugger Robot 210*16467b97STreehugger Robot 211*16467b97STreehugger Robot def testError2(self): 212*16467b97STreehugger Robot """TreePatternParser: '()'""" 213*16467b97STreehugger Robot lexer = TreePatternLexer('()') 214*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, self.adaptor) 215*16467b97STreehugger Robot tree = parser.pattern() 216*16467b97STreehugger Robot self.assertIsNone(tree) 217*16467b97STreehugger Robot 218*16467b97STreehugger Robot 219*16467b97STreehugger Robot def testError3(self): 220*16467b97STreehugger Robot """TreePatternParser: '(A ])'""" 221*16467b97STreehugger Robot lexer = TreePatternLexer('(A ])') 222*16467b97STreehugger Robot parser = TreePatternParser(lexer, self.wizard, self.adaptor) 223*16467b97STreehugger Robot tree = parser.pattern() 224*16467b97STreehugger Robot self.assertIsNone(tree) 225*16467b97STreehugger Robot 226*16467b97STreehugger Robot 227*16467b97STreehugger Robotclass TestTreeWizard(unittest.TestCase): 228*16467b97STreehugger Robot """Test case for the TreeWizard class.""" 229*16467b97STreehugger Robot 230*16467b97STreehugger Robot def setUp(self): 231*16467b97STreehugger Robot """Setup text fixure 232*16467b97STreehugger Robot 233*16467b97STreehugger Robot We need a tree adaptor, use CommonTreeAdaptor. 234*16467b97STreehugger Robot And a constant list of token names. 235*16467b97STreehugger Robot 236*16467b97STreehugger Robot """ 237*16467b97STreehugger Robot 238*16467b97STreehugger Robot self.adaptor = CommonTreeAdaptor() 239*16467b97STreehugger Robot self.tokens = [ 240*16467b97STreehugger Robot "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR" 241*16467b97STreehugger Robot ] 242*16467b97STreehugger Robot 243*16467b97STreehugger Robot 244*16467b97STreehugger Robot def testInit(self): 245*16467b97STreehugger Robot """TreeWizard.__init__()""" 246*16467b97STreehugger Robot 247*16467b97STreehugger Robot wiz = TreeWizard( 248*16467b97STreehugger Robot self.adaptor, 249*16467b97STreehugger Robot tokenNames=['a', 'b'] 250*16467b97STreehugger Robot ) 251*16467b97STreehugger Robot 252*16467b97STreehugger Robot self.assertIs(wiz.adaptor, self.adaptor) 253*16467b97STreehugger Robot self.assertEqual( 254*16467b97STreehugger Robot wiz.tokenNameToTypeMap, 255*16467b97STreehugger Robot { 'a': 0, 'b': 1 } 256*16467b97STreehugger Robot ) 257*16467b97STreehugger Robot 258*16467b97STreehugger Robot 259*16467b97STreehugger Robot def testGetTokenType(self): 260*16467b97STreehugger Robot """TreeWizard.getTokenType()""" 261*16467b97STreehugger Robot 262*16467b97STreehugger Robot wiz = TreeWizard( 263*16467b97STreehugger Robot self.adaptor, 264*16467b97STreehugger Robot tokenNames=self.tokens 265*16467b97STreehugger Robot ) 266*16467b97STreehugger Robot 267*16467b97STreehugger Robot self.assertEqual( 268*16467b97STreehugger Robot wiz.getTokenType('A'), 269*16467b97STreehugger Robot 5 270*16467b97STreehugger Robot ) 271*16467b97STreehugger Robot 272*16467b97STreehugger Robot self.assertEqual( 273*16467b97STreehugger Robot wiz.getTokenType('VAR'), 274*16467b97STreehugger Robot 11 275*16467b97STreehugger Robot ) 276*16467b97STreehugger Robot 277*16467b97STreehugger Robot self.assertEqual( 278*16467b97STreehugger Robot wiz.getTokenType('invalid'), 279*16467b97STreehugger Robot INVALID_TOKEN_TYPE 280*16467b97STreehugger Robot ) 281*16467b97STreehugger Robot 282*16467b97STreehugger Robot def testSingleNode(self): 283*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 284*16467b97STreehugger Robot t = wiz.create("ID") 285*16467b97STreehugger Robot found = t.toStringTree() 286*16467b97STreehugger Robot expecting = "ID" 287*16467b97STreehugger Robot self.assertEqual(expecting, found) 288*16467b97STreehugger Robot 289*16467b97STreehugger Robot 290*16467b97STreehugger Robot def testSingleNodeWithArg(self): 291*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 292*16467b97STreehugger Robot t = wiz.create("ID[foo]") 293*16467b97STreehugger Robot found = t.toStringTree() 294*16467b97STreehugger Robot expecting = "foo" 295*16467b97STreehugger Robot self.assertEqual(expecting, found) 296*16467b97STreehugger Robot 297*16467b97STreehugger Robot 298*16467b97STreehugger Robot def testSingleNodeTree(self): 299*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 300*16467b97STreehugger Robot t = wiz.create("(A)") 301*16467b97STreehugger Robot found = t.toStringTree() 302*16467b97STreehugger Robot expecting = "A" 303*16467b97STreehugger Robot self.assertEqual(expecting, found) 304*16467b97STreehugger Robot 305*16467b97STreehugger Robot 306*16467b97STreehugger Robot def testSingleLevelTree(self): 307*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 308*16467b97STreehugger Robot t = wiz.create("(A B C D)") 309*16467b97STreehugger Robot found = t.toStringTree() 310*16467b97STreehugger Robot expecting = "(A B C D)" 311*16467b97STreehugger Robot self.assertEqual(expecting, found) 312*16467b97STreehugger Robot 313*16467b97STreehugger Robot 314*16467b97STreehugger Robot def testListTree(self): 315*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 316*16467b97STreehugger Robot t = wiz.create("(nil A B C)") 317*16467b97STreehugger Robot found = t.toStringTree() 318*16467b97STreehugger Robot expecting = "A B C" 319*16467b97STreehugger Robot self.assertEqual(expecting, found) 320*16467b97STreehugger Robot 321*16467b97STreehugger Robot 322*16467b97STreehugger Robot def testInvalidListTree(self): 323*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 324*16467b97STreehugger Robot t = wiz.create("A B C") 325*16467b97STreehugger Robot self.assertIsNone(t) 326*16467b97STreehugger Robot 327*16467b97STreehugger Robot 328*16467b97STreehugger Robot def testDoubleLevelTree(self): 329*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 330*16467b97STreehugger Robot t = wiz.create("(A (B C) (B D) E)") 331*16467b97STreehugger Robot found = t.toStringTree() 332*16467b97STreehugger Robot expecting = "(A (B C) (B D) E)" 333*16467b97STreehugger Robot self.assertEqual(expecting, found) 334*16467b97STreehugger Robot 335*16467b97STreehugger Robot 336*16467b97STreehugger Robot def __simplifyIndexMap(self, indexMap): 337*16467b97STreehugger Robot return dict( # stringify nodes for easy comparing 338*16467b97STreehugger Robot (ttype, [str(node) for node in nodes]) 339*16467b97STreehugger Robot for ttype, nodes in indexMap.items() 340*16467b97STreehugger Robot ) 341*16467b97STreehugger Robot 342*16467b97STreehugger Robot def testSingleNodeIndex(self): 343*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 344*16467b97STreehugger Robot tree = wiz.create("ID") 345*16467b97STreehugger Robot indexMap = wiz.index(tree) 346*16467b97STreehugger Robot found = self.__simplifyIndexMap(indexMap) 347*16467b97STreehugger Robot expecting = { 10: ["ID"] } 348*16467b97STreehugger Robot self.assertEqual(expecting, found) 349*16467b97STreehugger Robot 350*16467b97STreehugger Robot 351*16467b97STreehugger Robot def testNoRepeatsIndex(self): 352*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 353*16467b97STreehugger Robot tree = wiz.create("(A B C D)") 354*16467b97STreehugger Robot indexMap = wiz.index(tree) 355*16467b97STreehugger Robot found = self.__simplifyIndexMap(indexMap) 356*16467b97STreehugger Robot expecting = { 8:['D'], 6:['B'], 7:['C'], 5:['A'] } 357*16467b97STreehugger Robot self.assertEqual(expecting, found) 358*16467b97STreehugger Robot 359*16467b97STreehugger Robot 360*16467b97STreehugger Robot def testRepeatsIndex(self): 361*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 362*16467b97STreehugger Robot tree = wiz.create("(A B (A C B) B D D)") 363*16467b97STreehugger Robot indexMap = wiz.index(tree) 364*16467b97STreehugger Robot found = self.__simplifyIndexMap(indexMap) 365*16467b97STreehugger Robot expecting = { 8: ['D', 'D'], 6: ['B', 'B', 'B'], 7: ['C'], 5: ['A', 'A'] } 366*16467b97STreehugger Robot self.assertEqual(expecting, found) 367*16467b97STreehugger Robot 368*16467b97STreehugger Robot 369*16467b97STreehugger Robot def testNoRepeatsVisit(self): 370*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 371*16467b97STreehugger Robot tree = wiz.create("(A B C D)") 372*16467b97STreehugger Robot 373*16467b97STreehugger Robot elements = [] 374*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 375*16467b97STreehugger Robot elements.append(str(node)) 376*16467b97STreehugger Robot 377*16467b97STreehugger Robot wiz.visit(tree, wiz.getTokenType("B"), visitor) 378*16467b97STreehugger Robot 379*16467b97STreehugger Robot expecting = ['B'] 380*16467b97STreehugger Robot self.assertEqual(expecting, elements) 381*16467b97STreehugger Robot 382*16467b97STreehugger Robot 383*16467b97STreehugger Robot def testNoRepeatsVisit2(self): 384*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 385*16467b97STreehugger Robot tree = wiz.create("(A B (A C B) B D D)") 386*16467b97STreehugger Robot 387*16467b97STreehugger Robot elements = [] 388*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 389*16467b97STreehugger Robot elements.append(str(node)) 390*16467b97STreehugger Robot 391*16467b97STreehugger Robot wiz.visit(tree, wiz.getTokenType("C"), visitor) 392*16467b97STreehugger Robot 393*16467b97STreehugger Robot expecting = ['C'] 394*16467b97STreehugger Robot self.assertEqual(expecting, elements) 395*16467b97STreehugger Robot 396*16467b97STreehugger Robot 397*16467b97STreehugger Robot def testRepeatsVisit(self): 398*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 399*16467b97STreehugger Robot tree = wiz.create("(A B (A C B) B D D)") 400*16467b97STreehugger Robot 401*16467b97STreehugger Robot elements = [] 402*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 403*16467b97STreehugger Robot elements.append(str(node)) 404*16467b97STreehugger Robot 405*16467b97STreehugger Robot wiz.visit(tree, wiz.getTokenType("B"), visitor) 406*16467b97STreehugger Robot 407*16467b97STreehugger Robot expecting = ['B', 'B', 'B'] 408*16467b97STreehugger Robot self.assertEqual(expecting, elements) 409*16467b97STreehugger Robot 410*16467b97STreehugger Robot 411*16467b97STreehugger Robot def testRepeatsVisit2(self): 412*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 413*16467b97STreehugger Robot tree = wiz.create("(A B (A C B) B D D)") 414*16467b97STreehugger Robot 415*16467b97STreehugger Robot elements = [] 416*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 417*16467b97STreehugger Robot elements.append(str(node)) 418*16467b97STreehugger Robot 419*16467b97STreehugger Robot wiz.visit(tree, wiz.getTokenType("A"), visitor) 420*16467b97STreehugger Robot 421*16467b97STreehugger Robot expecting = ['A', 'A'] 422*16467b97STreehugger Robot self.assertEqual(expecting, elements) 423*16467b97STreehugger Robot 424*16467b97STreehugger Robot 425*16467b97STreehugger Robot def testRepeatsVisitWithContext(self): 426*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 427*16467b97STreehugger Robot tree = wiz.create("(A B (A C B) B D D)") 428*16467b97STreehugger Robot 429*16467b97STreehugger Robot elements = [] 430*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 431*16467b97STreehugger Robot elements.append('{}@{}[{}]'.format(node, parent, childIndex)) 432*16467b97STreehugger Robot 433*16467b97STreehugger Robot wiz.visit(tree, wiz.getTokenType("B"), visitor) 434*16467b97STreehugger Robot 435*16467b97STreehugger Robot expecting = ['B@A[0]', 'B@A[1]', 'B@A[2]'] 436*16467b97STreehugger Robot self.assertEqual(expecting, elements) 437*16467b97STreehugger Robot 438*16467b97STreehugger Robot 439*16467b97STreehugger Robot def testRepeatsVisitWithNullParentAndContext(self): 440*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 441*16467b97STreehugger Robot tree = wiz.create("(A B (A C B) B D D)") 442*16467b97STreehugger Robot 443*16467b97STreehugger Robot elements = [] 444*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 445*16467b97STreehugger Robot elements.append( 446*16467b97STreehugger Robot '{}@{}[{}]'.format( 447*16467b97STreehugger Robot node, parent or 'nil', childIndex) 448*16467b97STreehugger Robot ) 449*16467b97STreehugger Robot 450*16467b97STreehugger Robot wiz.visit(tree, wiz.getTokenType("A"), visitor) 451*16467b97STreehugger Robot 452*16467b97STreehugger Robot expecting = ['A@nil[0]', 'A@A[1]'] 453*16467b97STreehugger Robot self.assertEqual(expecting, elements) 454*16467b97STreehugger Robot 455*16467b97STreehugger Robot 456*16467b97STreehugger Robot def testVisitPattern(self): 457*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 458*16467b97STreehugger Robot tree = wiz.create("(A B C (A B) D)") 459*16467b97STreehugger Robot 460*16467b97STreehugger Robot elements = [] 461*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 462*16467b97STreehugger Robot elements.append( 463*16467b97STreehugger Robot str(node) 464*16467b97STreehugger Robot ) 465*16467b97STreehugger Robot 466*16467b97STreehugger Robot wiz.visit(tree, '(A B)', visitor) 467*16467b97STreehugger Robot 468*16467b97STreehugger Robot expecting = ['A'] # shouldn't match overall root, just (A B) 469*16467b97STreehugger Robot self.assertEqual(expecting, elements) 470*16467b97STreehugger Robot 471*16467b97STreehugger Robot 472*16467b97STreehugger Robot def testVisitPatternMultiple(self): 473*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 474*16467b97STreehugger Robot tree = wiz.create("(A B C (A B) (D (A B)))") 475*16467b97STreehugger Robot 476*16467b97STreehugger Robot elements = [] 477*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 478*16467b97STreehugger Robot elements.append( 479*16467b97STreehugger Robot '{}@{}[{}]'.format(node, parent or 'nil', childIndex) 480*16467b97STreehugger Robot ) 481*16467b97STreehugger Robot 482*16467b97STreehugger Robot wiz.visit(tree, '(A B)', visitor) 483*16467b97STreehugger Robot 484*16467b97STreehugger Robot expecting = ['A@A[2]', 'A@D[0]'] 485*16467b97STreehugger Robot self.assertEqual(expecting, elements) 486*16467b97STreehugger Robot 487*16467b97STreehugger Robot 488*16467b97STreehugger Robot def testVisitPatternMultipleWithLabels(self): 489*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 490*16467b97STreehugger Robot tree = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))") 491*16467b97STreehugger Robot 492*16467b97STreehugger Robot elements = [] 493*16467b97STreehugger Robot def visitor(node, parent, childIndex, labels): 494*16467b97STreehugger Robot elements.append( 495*16467b97STreehugger Robot '{}@{}[{}]{}&{}'.format( 496*16467b97STreehugger Robot node, 497*16467b97STreehugger Robot parent or 'nil', 498*16467b97STreehugger Robot childIndex, 499*16467b97STreehugger Robot labels['a'], 500*16467b97STreehugger Robot labels['b'], 501*16467b97STreehugger Robot ) 502*16467b97STreehugger Robot ) 503*16467b97STreehugger Robot 504*16467b97STreehugger Robot wiz.visit(tree, '(%a:A %b:B)', visitor) 505*16467b97STreehugger Robot 506*16467b97STreehugger Robot expecting = ['foo@A[2]foo&bar', 'big@D[0]big&dog'] 507*16467b97STreehugger Robot self.assertEqual(expecting, elements) 508*16467b97STreehugger Robot 509*16467b97STreehugger Robot 510*16467b97STreehugger Robot def testParse(self): 511*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 512*16467b97STreehugger Robot t = wiz.create("(A B C)") 513*16467b97STreehugger Robot valid = wiz.parse(t, "(A B C)") 514*16467b97STreehugger Robot self.assertTrue(valid) 515*16467b97STreehugger Robot 516*16467b97STreehugger Robot 517*16467b97STreehugger Robot def testParseSingleNode(self): 518*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 519*16467b97STreehugger Robot t = wiz.create("A") 520*16467b97STreehugger Robot valid = wiz.parse(t, "A") 521*16467b97STreehugger Robot self.assertTrue(valid) 522*16467b97STreehugger Robot 523*16467b97STreehugger Robot 524*16467b97STreehugger Robot def testParseSingleNodeFails(self): 525*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 526*16467b97STreehugger Robot t = wiz.create("A") 527*16467b97STreehugger Robot valid = wiz.parse(t, "B") 528*16467b97STreehugger Robot self.assertFalse(valid) 529*16467b97STreehugger Robot 530*16467b97STreehugger Robot 531*16467b97STreehugger Robot def testParseFlatTree(self): 532*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 533*16467b97STreehugger Robot t = wiz.create("(nil A B C)") 534*16467b97STreehugger Robot valid = wiz.parse(t, "(nil A B C)") 535*16467b97STreehugger Robot self.assertTrue(valid) 536*16467b97STreehugger Robot 537*16467b97STreehugger Robot 538*16467b97STreehugger Robot def testParseFlatTreeFails(self): 539*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 540*16467b97STreehugger Robot t = wiz.create("(nil A B C)") 541*16467b97STreehugger Robot valid = wiz.parse(t, "(nil A B)") 542*16467b97STreehugger Robot self.assertFalse(valid) 543*16467b97STreehugger Robot 544*16467b97STreehugger Robot 545*16467b97STreehugger Robot def testParseFlatTreeFails2(self): 546*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 547*16467b97STreehugger Robot t = wiz.create("(nil A B C)") 548*16467b97STreehugger Robot valid = wiz.parse(t, "(nil A B A)") 549*16467b97STreehugger Robot self.assertFalse(valid) 550*16467b97STreehugger Robot 551*16467b97STreehugger Robot 552*16467b97STreehugger Robot def testWildcard(self): 553*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 554*16467b97STreehugger Robot t = wiz.create("(A B C)") 555*16467b97STreehugger Robot valid = wiz.parse(t, "(A . .)") 556*16467b97STreehugger Robot self.assertTrue(valid) 557*16467b97STreehugger Robot 558*16467b97STreehugger Robot 559*16467b97STreehugger Robot def testParseWithText(self): 560*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 561*16467b97STreehugger Robot t = wiz.create("(A B[foo] C[bar])") 562*16467b97STreehugger Robot # C pattern has no text arg so despite [bar] in t, no need 563*16467b97STreehugger Robot # to match text--check structure only. 564*16467b97STreehugger Robot valid = wiz.parse(t, "(A B[foo] C)") 565*16467b97STreehugger Robot self.assertTrue(valid) 566*16467b97STreehugger Robot 567*16467b97STreehugger Robot 568*16467b97STreehugger Robot def testParseWithText2(self): 569*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 570*16467b97STreehugger Robot t = wiz.create("(A B[T__32] (C (D E[a])))") 571*16467b97STreehugger Robot # C pattern has no text arg so despite [bar] in t, no need 572*16467b97STreehugger Robot # to match text--check structure only. 573*16467b97STreehugger Robot valid = wiz.parse(t, "(A B[foo] C)") 574*16467b97STreehugger Robot self.assertEqual("(A T__32 (C (D a)))", t.toStringTree()) 575*16467b97STreehugger Robot 576*16467b97STreehugger Robot 577*16467b97STreehugger Robot def testParseWithTextFails(self): 578*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 579*16467b97STreehugger Robot t = wiz.create("(A B C)") 580*16467b97STreehugger Robot valid = wiz.parse(t, "(A[foo] B C)") 581*16467b97STreehugger Robot self.assertFalse(valid) # fails 582*16467b97STreehugger Robot 583*16467b97STreehugger Robot 584*16467b97STreehugger Robot def testParseLabels(self): 585*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 586*16467b97STreehugger Robot t = wiz.create("(A B C)") 587*16467b97STreehugger Robot labels = {} 588*16467b97STreehugger Robot valid = wiz.parse(t, "(%a:A %b:B %c:C)", labels) 589*16467b97STreehugger Robot self.assertTrue(valid) 590*16467b97STreehugger Robot self.assertEqual("A", str(labels["a"])) 591*16467b97STreehugger Robot self.assertEqual("B", str(labels["b"])) 592*16467b97STreehugger Robot self.assertEqual("C", str(labels["c"])) 593*16467b97STreehugger Robot 594*16467b97STreehugger Robot 595*16467b97STreehugger Robot def testParseWithWildcardLabels(self): 596*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 597*16467b97STreehugger Robot t = wiz.create("(A B C)") 598*16467b97STreehugger Robot labels = {} 599*16467b97STreehugger Robot valid = wiz.parse(t, "(A %b:. %c:.)", labels) 600*16467b97STreehugger Robot self.assertTrue(valid) 601*16467b97STreehugger Robot self.assertEqual("B", str(labels["b"])) 602*16467b97STreehugger Robot self.assertEqual("C", str(labels["c"])) 603*16467b97STreehugger Robot 604*16467b97STreehugger Robot 605*16467b97STreehugger Robot def testParseLabelsAndTestText(self): 606*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 607*16467b97STreehugger Robot t = wiz.create("(A B[foo] C)") 608*16467b97STreehugger Robot labels = {} 609*16467b97STreehugger Robot valid = wiz.parse(t, "(%a:A %b:B[foo] %c:C)", labels) 610*16467b97STreehugger Robot self.assertTrue(valid) 611*16467b97STreehugger Robot self.assertEqual("A", str(labels["a"])) 612*16467b97STreehugger Robot self.assertEqual("foo", str(labels["b"])) 613*16467b97STreehugger Robot self.assertEqual("C", str(labels["c"])) 614*16467b97STreehugger Robot 615*16467b97STreehugger Robot 616*16467b97STreehugger Robot def testParseLabelsInNestedTree(self): 617*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 618*16467b97STreehugger Robot t = wiz.create("(A (B C) (D E))") 619*16467b97STreehugger Robot labels = {} 620*16467b97STreehugger Robot valid = wiz.parse(t, "(%a:A (%b:B %c:C) (%d:D %e:E) )", labels) 621*16467b97STreehugger Robot self.assertTrue(valid) 622*16467b97STreehugger Robot self.assertEqual("A", str(labels["a"])) 623*16467b97STreehugger Robot self.assertEqual("B", str(labels["b"])) 624*16467b97STreehugger Robot self.assertEqual("C", str(labels["c"])) 625*16467b97STreehugger Robot self.assertEqual("D", str(labels["d"])) 626*16467b97STreehugger Robot self.assertEqual("E", str(labels["e"])) 627*16467b97STreehugger Robot 628*16467b97STreehugger Robot 629*16467b97STreehugger Robot def testEquals(self): 630*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 631*16467b97STreehugger Robot t1 = wiz.create("(A B C)") 632*16467b97STreehugger Robot t2 = wiz.create("(A B C)") 633*16467b97STreehugger Robot same = wiz.equals(t1, t2) 634*16467b97STreehugger Robot self.assertTrue(same) 635*16467b97STreehugger Robot 636*16467b97STreehugger Robot 637*16467b97STreehugger Robot def testEqualsWithText(self): 638*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 639*16467b97STreehugger Robot t1 = wiz.create("(A B[foo] C)") 640*16467b97STreehugger Robot t2 = wiz.create("(A B[foo] C)") 641*16467b97STreehugger Robot same = wiz.equals(t1, t2) 642*16467b97STreehugger Robot self.assertTrue(same) 643*16467b97STreehugger Robot 644*16467b97STreehugger Robot 645*16467b97STreehugger Robot def testEqualsWithMismatchedText(self): 646*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 647*16467b97STreehugger Robot t1 = wiz.create("(A B[foo] C)") 648*16467b97STreehugger Robot t2 = wiz.create("(A B C)") 649*16467b97STreehugger Robot same = wiz.equals(t1, t2) 650*16467b97STreehugger Robot self.assertFalse(same) 651*16467b97STreehugger Robot 652*16467b97STreehugger Robot 653*16467b97STreehugger Robot def testEqualsWithMismatchedList(self): 654*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 655*16467b97STreehugger Robot t1 = wiz.create("(A B C)") 656*16467b97STreehugger Robot t2 = wiz.create("(A B A)") 657*16467b97STreehugger Robot same = wiz.equals(t1, t2) 658*16467b97STreehugger Robot self.assertFalse(same) 659*16467b97STreehugger Robot 660*16467b97STreehugger Robot 661*16467b97STreehugger Robot def testEqualsWithMismatchedListLength(self): 662*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 663*16467b97STreehugger Robot t1 = wiz.create("(A B C)") 664*16467b97STreehugger Robot t2 = wiz.create("(A B)") 665*16467b97STreehugger Robot same = wiz.equals(t1, t2) 666*16467b97STreehugger Robot self.assertFalse(same) 667*16467b97STreehugger Robot 668*16467b97STreehugger Robot 669*16467b97STreehugger Robot def testFindPattern(self): 670*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 671*16467b97STreehugger Robot t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))") 672*16467b97STreehugger Robot subtrees = wiz.find(t, "(A B)") 673*16467b97STreehugger Robot found = [str(node) for node in subtrees] 674*16467b97STreehugger Robot expecting = ['foo', 'big'] 675*16467b97STreehugger Robot self.assertEqual(expecting, found) 676*16467b97STreehugger Robot 677*16467b97STreehugger Robot 678*16467b97STreehugger Robot def testFindTokenType(self): 679*16467b97STreehugger Robot wiz = TreeWizard(self.adaptor, self.tokens) 680*16467b97STreehugger Robot t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))") 681*16467b97STreehugger Robot subtrees = wiz.find(t, wiz.getTokenType('A')) 682*16467b97STreehugger Robot found = [str(node) for node in subtrees] 683*16467b97STreehugger Robot expecting = ['A', 'foo', 'big'] 684*16467b97STreehugger Robot self.assertEqual(expecting, found) 685*16467b97STreehugger Robot 686*16467b97STreehugger Robot 687*16467b97STreehugger Robot 688*16467b97STreehugger Robotif __name__ == "__main__": 689*16467b97STreehugger Robot unittest.main(testRunner=unittest.TextTestRunner(verbosity=2)) 690