[antlr-interest] A useful unit test for dependent grammars

Sam Harwell sharwell at pixelminegames.com
Thu Nov 13 11:26:36 PST 2008


This is taken from the testing portion for the ANTLR Tool as an example
of a token matching unit test in the actual executable. It uses
reflection to make sure the constant token values in a source class
match those in a target class (where target grammar imports source's
tokens).

 

[TestInitialize]

public void setUp()

{

    ErrorManager.resetErrorState();

 

    // verify token constants in StringTemplate

    VerifyImportedTokens( typeof( Antlr3.ST.Language.ActionParser ),
typeof( Antlr3.ST.Language.ActionLexer ) );

    VerifyImportedTokens( typeof( Antlr3.ST.Language.ActionParser ),
typeof( Antlr3.ST.Language.ActionEvaluator ) );

    VerifyImportedTokens( typeof( Antlr3.ST.Language.TemplateParser ),
typeof( Antlr3.ST.Language.TemplateLexer ) );

    VerifyImportedTokens( typeof( Antlr3.ST.Language.TemplateParser ),
typeof( Antlr3.ST.Language.AngleBracketTemplateLexer ) );

 

    // verify token constants in the ANTLR Tool

    VerifyImportedTokens( typeof( Antlr3.Grammars.ANTLRParser ), typeof(
Antlr3.Grammars.ANTLRLexer ) );

    VerifyImportedTokens( typeof( Antlr3.Grammars.ANTLRParser ), typeof(
Antlr3.Grammars.ANTLRTreePrinter ) );

    VerifyImportedTokens( typeof( Antlr3.Grammars.ANTLRParser ), typeof(
Antlr3.Grammars.AssignTokenTypesWalker ) );

    VerifyImportedTokens( typeof( Antlr3.Grammars.ANTLRParser ), typeof(
Antlr3.Grammars.CodeGenTreeWalker ) );

    VerifyImportedTokens( typeof( Antlr3.Grammars.ANTLRParser ), typeof(
Antlr3.Grammars.DefineGrammarItemsWalker ) );

    VerifyImportedTokens( typeof( Antlr3.Grammars.ANTLRParser ), typeof(
Antlr3.Grammars.TreeToNFAConverter ) );

}

 

private void VerifyImportedTokens( Type source, Type target )

{

    System.Reflection.FieldInfo namesField = source.GetField(
"tokenNames" );

    System.Reflection.FieldInfo targetNamesField = target.GetField(
"tokenNames" );

    Assert.IsNotNull( namesField, string.Format( "No tokenNames field
was found in grammar {0}.", source.Name ) );

 

    string[] sourceNames = namesField.GetValue( null ) as string[];

    string[] targetNames = ( targetNamesField != null ) ?
targetNamesField.GetValue( null ) as string[] : null;

    Assert.IsNotNull( sourceNames, string.Format( "The tokenNames field
in grammar {0} was null.", source.Name ) );

 

    for ( int i = 0; i < sourceNames.Length; i++ )

    {

        string tokenName = sourceNames[i];

        if ( string.IsNullOrEmpty( tokenName ) || tokenName[0] == '<' )

            continue;

 

        if ( tokenName[0] == '\'' )

        {

            if ( targetNames != null && targetNames.Length > i )

            {

                // make sure implicit tokens like 'new' that show up in
code as T__45 refer to the same token

                Assert.AreEqual(

                    sourceNames[i],

                    targetNames[i],

                    string.Format( "Implicit token {0} in grammar {1}
doesn't match {2} in grammar {3}.", sourceNames[i], source.Name,
targetNames[i], target.Name )

                    );

 

                continue;

            }

            else

            {

                tokenName = "T__" + i.ToString();

            }

        }

 

        System.Reflection.FieldInfo sourceToken = source.GetField(
tokenName );

        System.Reflection.FieldInfo targetToken = target.GetField(
tokenName );

        if ( source != null && target != null )

        {

            int sourceValue = (int)sourceToken.GetValue( null );

            int targetValue = (int)targetToken.GetValue( null );

            Assert.AreEqual(

                sourceValue,

                targetValue,

                string.Format( "Token {0} with value {1} grammar {2}
doesn't match value {3} in grammar {4}.", tokenName, sourceValue,
source.Name, targetValue, target.Name )

                );

        }

    }

}

 

 

Sam

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20081113/7fe4c3b1/attachment.html 


More information about the antlr-interest mailing list