[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