blob: eaf3fbfc9e3184cec124d4cd50621fc44f3fde85 [file] [log] [blame]
###############################################################################
# Copyright (c) 2005, 2007 IBM Corporation and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# SPDX-License-Identifier: EPL-2.0
#
###############################################################################
import compiler
import compiler.ast
import os
class MakeScriptTestCase( object ):
# Initialize from file_name and index. Index used to output junit test.
def __init__( self, file_name, index, pluginPath ):
self.file_name = file_name
self.makeNFN()
self.test_index= index
self.inst_index = 0
self.parentName = "module"
self.pluginPath = pluginPath
self.after_fields = []
self.inClass = 0
self.inMethod = 0
self.added_fields = {} # already declated fiels in selected class
try:
self.ast = compiler.parseFile( file_name )
self.content = ""
except:
self.content = "\tpublic void testModelGen%s( ) throws Exception\n\t{" %( self.test_index )
self.content += "\t\tthrow new RuntimeException(\"Failed to parse file:%s\");\n\t}" %( file_name.replace( os.sep, "/" ) )
return
if self.ast is not None:
self.makeContent()
# Make self.content to appropriate test.
def makeContent( self ):
self.content = "\tpublic void testModelGen%s( ) throws Exception {" %( self.test_index )
self.content += """
String prj = "%(pluginPath)s";
IScriptProject project = getScriptProject( prj );
ISourceModule module = this.getSourceModule( prj, "src", new Path("%(fName)s"));
assertNotNull("Module %(fName)s not found", module);
assertEquals("%(fName)s", module.getElementName());
""" %{ "index": self.test_index, "fName": self.file_name, "pluginPath": self.pluginPath }
self.content += "\n"
self.addChildTests( self.ast, 0, "" )
self.content += "\n\t}"
def addChildTests( self, node, parentNode, elderParentName, depth = 2 ):
childs = node.getChildNodes( )
#self.content += "\t"*depth + "//Nodes count %s" %( len( childs ) ) + "\n"
#self.content += "\t"*depth + str( node.__class__ ) + "\n"
oldParentName = self.parentName
oldInClass = self.inClass
oldInMethod = self.inMethod
hasSub = 0
if node.__class__ == compiler.ast.Function:
self.inMethod = 1
hasSub = 1
self.content += "\t"*depth + "//Function test:%s" %( node.name ) + "\n"
instName = "method" + node.name + "%d" %( self.inst_index )
self.parentName = instName
self.content += "\t"*depth + "{\n"
self.content += "\t"*depth + "IMethod %s;" %( instName ) + "\n"
self.inst_index += 1
args = node.argnames
self.content += "\t"*(depth+1) + "IModelElement[] %sChilds = %s.getChildren();" %( oldParentName, oldParentName ) + "\n"
self.content += "\t"*(depth+1) + instName + " = ModelTestUtils.getAssertMethod( %sChilds, \"%s\", %d );" %( oldParentName, node.name, len( args ) ) + "\n"
if( len( args ) > 0 ):
argss = ""
first = 1
for arg in args:
if arg is not None:
if first: first = 0
else: argss += ", "
argss += "\"" + str( arg ) + "\""
ar = (instName, argss )
self.content += "\t"*(depth+1) + "ModelTestUtils.assertParameterNames( %s, new String[] {%s} );" % ar + "\n"
if node.__class__ == compiler.ast.Class:
self.inClass = 1
hasSub = 1
self.content += "\t"*depth + "//Class test" + "\n"
instName = "class" + node.name + "%d" %( self.inst_index )
self.parentName = instName
self.content += "\t"*depth + "{\n"
self.content += "\t"*depth + "IType %s;" %( instName ) + "\n"
self.inst_index += 1
self.content += "\t"*(depth+1) + "IModelElement[] %sChilds = %s.getChildren();" %( oldParentName, oldParentName ) + "\n"
self.content += "\t"*(depth+1) + instName + " = ModelTestUtils.getAssertClass( %sChilds, \"%s\" );" %( oldParentName, node.name ) + "\n"
if node.__class__ == compiler.ast.Assign:
if node.expr.__class__ == compiler.ast.Lambda : pass
elif ( self.inClass and not self.inMethod ) or self.parentName == "module":
try:# can raise exceptions if not simple assert here.
child_name = ( node.getChildren()[0].name )
self.content += "\t"*(depth) + "{\n"
self.content += "\t"*(depth+1) + "IModelElement[] %sChilds = %s.getChildren();" %( oldParentName, oldParentName ) + "\n"
self.content += "\t"*(depth+1) + """IField fieldValue = ModelTestUtils.getAssertField( %(className)s, "%(childName)s");\n""" % { "childName": child_name, "className": self.parentName + "Childs" }
self.content += "\t"*(depth) + "}\n"
except:
pass
elif self.inClass and self.inMethod:
try:# can raise exceptions if not simple assert here.
child_base = ( node.getChildren()[0].getChildren()[0].name )
child_name = ( node.getChildren()[0].getChildren()[1] )
if child_base == "self":
self.after_fields.append( child_name )
except:
pass
for child in childs:
if node.__class__ in [ compiler.ast.Class, compiler.ast.Function, compiler.ast.Assign ]:
self.addChildTests( child, node, oldParentName, depth + 1 )
else:
self.addChildTests( child, node, oldParentName, depth )
if self.parentName != oldParentName:
self.parentName = oldParentName
self.content += "\t"*depth + "}\n"
if hasSub:
if node.__class__ == compiler.ast.Function and parentNode.__class__ == compiler.ast.Class:
if len( self.after_fields ) > 0:
for field in self.after_fields:
if str( parentNode ) in self.added_fields.keys():
fields = self.added_fields[ str( parentNode ) ]
if not field in fields:
fields.append( field )
self.content += "\t"*(depth) + "{\n"
self.content += "\t"*(depth+1) + "IModelElement[] %sChilds = %s.getChildren();" %( elderParentName, elderParentName ) + "\n"
self.content += "\t"*(depth+1) + """IField fieldValue = ModelTestUtils.getAssertField( %(className)s, "%(childName)s");\n""" % { "childName": field, "className": elderParentName + "Childs" }
self.content += "\t"*(depth) + "}\n"
else:
fields = [ field ]
self.added_fields[ str( parentNode ) ] = fields
self.content += "\t"*(depth) + "{\n"
self.content += "\t"*(depth+1) + "IModelElement[] %sChilds = %s.getChildren();" %( elderParentName, elderParentName ) + "\n"
self.content += "\t"*(depth+1) + """IField fieldValue = ModelTestUtils.getAssertField( %(className)s, "%(childName)s");\n""" % { "childName": field, "className": elderParentName + "Childs" }
self.content += "\t"*(depth) + "}\n"
self.inst_index += 1
self.after_fields = []
self.inMethod = oldInMethod
self.inClass = oldInClass
def makeNFN( self ):
import os
if self.file_name.find( os.sep ) != -1:
pos = self.file_name.rfind( os.sep )
self.file_name = self.file_name[ pos + 1: ]
# Final Content
Content = property( lambda self: self.content )
if __name__ == "__main__":
mt = MakeScriptTestCase( "module0.py", 0 )
print mt.Content