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