19f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com/* 29f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * [The "BSD licence"] 39f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * Copyright (c) 2010 Ben Gruver 49f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * All rights reserved. 59f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * 69f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without 79f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions 89f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * are met: 99f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright 109f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer. 119f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright 129f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer in the 139f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * documentation and/or other materials provided with the distribution. 149f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products 159f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * derived from this software without specific prior written permission. 169f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * 179f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 189f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 199f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 209f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 219f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 229f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 269f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com */ 289f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 299f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.comimport org.antlr.runtime.ANTLRInputStream; 309f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.comimport org.antlr.runtime.CommonToken; 319f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.comimport org.antlr.runtime.CommonTokenStream; 329f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.comimport org.antlr.runtime.RecognitionException; 330dceb148f3c09311513e07665c65e581edc46a0dBen Gruverimport org.jf.smali.expectedTokensTestGrammarLexer; 340dceb148f3c09311513e07665c65e581edc46a0dBen Gruverimport org.jf.smali.expectedTokensTestGrammarParser; 350dceb148f3c09311513e07665c65e581edc46a0dBen Gruverimport org.jf.smali.smaliFlexLexer; 360dceb148f3c09311513e07665c65e581edc46a0dBen Gruverimport org.jf.smali.smaliParser; 379f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.comimport org.junit.Assert; 389f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.comimport org.junit.Test; 399f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 400dceb148f3c09311513e07665c65e581edc46a0dBen Gruverimport java.io.File; 410dceb148f3c09311513e07665c65e581edc46a0dBen Gruverimport java.io.IOException; 420dceb148f3c09311513e07665c65e581edc46a0dBen Gruverimport java.io.InputStream; 439f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.comimport java.util.HashMap; 449f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.comimport java.util.List; 459f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 460dceb148f3c09311513e07665c65e581edc46a0dBen Gruverimport static org.jf.smali.expectedTokensTestGrammarParser.ExpectedToken; 470dceb148f3c09311513e07665c65e581edc46a0dBen Gruver 489f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.compublic class LexerTest { 499f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com private static final HashMap<String, Integer> tokenTypesByName; 509f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 519f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com static { 529f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com tokenTypesByName = new HashMap<String, Integer>(); 539f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 549f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com for (int i=0; i<smaliParser.tokenNames.length; i++) { 559f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com tokenTypesByName.put(smaliParser.tokenNames[i], i); 569f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 579f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 589f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 599f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com @Test 609f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com public void DirectiveTest() { 619f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com runTest("DirectiveTest"); 629f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 639f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 649f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com @Test 659f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com public void ByteLiteralTest() { 669f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com runTest("ByteLiteralTest"); 679f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 689f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 699f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com @Test 709f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com public void ShortLiteralTest() { 719f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com runTest("ShortLiteralTest"); 729f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 739f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 749f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com @Test 759f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com public void IntegerLiteralTest() { 769f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com runTest("IntegerLiteralTest"); 779f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 789f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 799f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com @Test 809f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com public void LongLiteralTest() { 819f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com runTest("LongLiteralTest"); 829f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 839f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 849f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com @Test 859f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com public void FloatLiteralTest() { 869f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com runTest("FloatLiteralTest"); 879f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 889f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 892c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com @Test 902c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com public void CharLiteralTest() { 912c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com runTest("CharLiteralTest"); 922c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com } 932c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com 942c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com @Test 952c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com public void StringLiteralTest() { 962c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com runTest("StringLiteralTest"); 972c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com } 982c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com 992c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com @Test 1002c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com public void MiscTest() { 1012c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com runTest("MiscTest"); 1022c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com } 1032c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com 1042c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com @Test 1052c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com public void CommentTest() { 1062c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com runTest("CommentTest", false); 1072c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com } 1082c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com 1092c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com @Test 1102c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com public void InstructionTest() { 1112c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com runTest("InstructionTest", true); 1122c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com } 1132c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com 1142c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com @Test 1152c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com public void TypeAndIdentifierTest() { 1162c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com runTest("TypeAndIdentifierTest"); 1172c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com } 1182c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com 1192c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com @Test 1202c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com public void SymbolTest() { 1212c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com runTest("SymbolTest", false); 1222c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com } 1232c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com 124f65966da4fc7ef06b29f7617b667ba37c4c67e0eJesusFreke@JesusFreke.com @Test 125f65966da4fc7ef06b29f7617b667ba37c4c67e0eJesusFreke@JesusFreke.com public void RealSmaliFileTest() { 126f65966da4fc7ef06b29f7617b667ba37c4c67e0eJesusFreke@JesusFreke.com runTest("RealSmaliFileTest", true); 127f65966da4fc7ef06b29f7617b667ba37c4c67e0eJesusFreke@JesusFreke.com } 128f65966da4fc7ef06b29f7617b667ba37c4c67e0eJesusFreke@JesusFreke.com 1299f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com public void runTest(String test) { 1302c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com runTest(test, true); 1312c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com } 1322c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com 1332c69ece4a5e8372744b6610ea6ab9517ddb54c39JesusFreke@JesusFreke.com public void runTest(String test, boolean discardHiddenTokens) { 1349f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com String smaliFile = String.format("LexerTest%s%s.smali", File.separatorChar, test); 1359f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com String tokensFile = String.format("LexerTest%s%s.tokens", File.separatorChar, test); 1369f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1379f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com expectedTokensTestGrammarLexer expectedTokensLexer = null; 1389f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com try { 1399f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com expectedTokensLexer = new expectedTokensTestGrammarLexer(new ANTLRInputStream( 1409f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com LexerTest.class.getClassLoader().getResourceAsStream(tokensFile))); 1419f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } catch (IOException ex) { 1429f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com throw new RuntimeException(ex); 1439f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 1449f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1459f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com CommonTokenStream expectedTokensStream = new CommonTokenStream(expectedTokensLexer); 1469f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1479f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com expectedTokensTestGrammarParser expectedTokensParser = 1489f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com new expectedTokensTestGrammarParser(expectedTokensStream); 1499f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com try { 1509f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com expectedTokensParser.top(); 1519f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } catch (RecognitionException ex) { 1529f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com throw new RuntimeException(ex); 1539f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 1549f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1559f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com List<ExpectedToken> expectedTokens = expectedTokensParser.getExpectedTokens(); 1569f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1579f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com InputStream smaliStream = LexerTest.class.getClassLoader().getResourceAsStream(smaliFile); 1589f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com if (smaliStream == null) { 1599f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com Assert.fail("Could not load " + smaliFile); 1609f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 1619f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com smaliFlexLexer lexer = new smaliFlexLexer(smaliStream); 16273d1b5d3cbc845e7123f41acd80c8cca4c1a369dJesusFreke@JesusFreke.com lexer.setSourceFile(new File(test + ".smali")); 16373d1b5d3cbc845e7123f41acd80c8cca4c1a369dJesusFreke@JesusFreke.com lexer.setSuppressErrors(true); 1649f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1659f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com CommonTokenStream tokenStream = new CommonTokenStream(lexer); 1660dceb148f3c09311513e07665c65e581edc46a0dBen Gruver tokenStream.fill(); 1679f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com List tokens = tokenStream.getTokens(); 1689f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1699f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com int expectedTokenIndex = 0; 1709f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com CommonToken token; 1710dceb148f3c09311513e07665c65e581edc46a0dBen Gruver for (int i=0; i<tokens.size()-1; i++) { 1729f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com token = (CommonToken)tokens.get(i); 1739f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 17448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver if (discardHiddenTokens && token.getChannel() == smaliParser.HIDDEN) { 1759f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com continue; 1769f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 1779f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1789f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com if (expectedTokenIndex >= expectedTokens.size()) { 1799f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com Assert.fail("Too many tokens"); 1809f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 1819f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1829f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com if (token.getType() == smaliParser.INVALID_TOKEN) { 1839f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com Assert.assertTrue("Encountered an INVALID_TOKEN not on the error channel", 18448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver token.getChannel() == smaliParser.ERROR_CHANNEL); 1859f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 1869f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1879f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com ExpectedToken expectedToken = expectedTokens.get(expectedTokenIndex++); 1889f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com if (!tokenTypesByName.containsKey(expectedToken.tokenName)) { 1899f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com Assert.fail("Unknown token: " + expectedToken.tokenName); 1909f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 1919f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com int expectedTokenType = tokenTypesByName.get(expectedToken.tokenName); 1929f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1939f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com if (token.getType() != expectedTokenType) { 1942829262f9de8a5e8f0388c22eb9b23f3a844f9efBen Gruver Assert.fail(String.format("Invalid token at index %d. Expecting %s, got %s(%s)", 1952829262f9de8a5e8f0388c22eb9b23f3a844f9efBen Gruver expectedTokenIndex-1, expectedToken.tokenName, getTokenName(token.getType()), token.getText())); 1969f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 1979f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 1989f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com if (expectedToken.tokenText != null) { 199671e5c7ea5040c0705f3c4aa637d4c255f3ed6b5Ben Gruver if (!expectedToken.tokenText.equals(token.getText())) { 200671e5c7ea5040c0705f3c4aa637d4c255f3ed6b5Ben Gruver Assert.fail( 201671e5c7ea5040c0705f3c4aa637d4c255f3ed6b5Ben Gruver String.format("Invalid token text at index %d. Expecting text \"%s\", got \"%s\"", 2029f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com expectedTokenIndex - 1, expectedToken.tokenText, token.getText())); 2039f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 2049f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 2059f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 2069f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 2079f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com if (expectedTokenIndex < expectedTokens.size()) { 2089f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com Assert.fail(String.format("Not enough tokens. Expecting %d tokens, but got %d", expectedTokens.size(), 2099f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com expectedTokenIndex)); 2109f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 2119f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 2129f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 2139f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 2149f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com 2159f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com private static String getTokenName(int tokenType) { 2169f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com return smaliParser.tokenNames[tokenType]; 2179f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com } 2189f2671f5ffb0f0776401e0750d1767d6b69da9e3JesusFreke@JesusFreke.com} 219