def test_imp_none_in_module(): ''' test that implicit none can be added to a module in the correct location''' module = ModuleGen(name="testmodule", implicitnone=False) module.add(ImplicitNoneGen(module)) in_idx = line_number(module.root, "IMPLICIT NONE") cont_idx = line_number(module.root, "CONTAINS") assert in_idx > -1, "IMPLICIT NONE not found" assert cont_idx > -1, "CONTAINS not found" assert cont_idx - in_idx == 1, "CONTAINS is not on the line after" +\ " IMPLICIT NONE"
def test_if_add_use(): ''' Check that IfThenGen.add() correctly handles the case when it is passed a UseGen object ''' module = ModuleGen(name="testmodule") clause = "a < b" if_statement = IfThenGen(module, clause) if_statement.add(CommentGen(if_statement, "GOODBYE")) if_statement.add(UseGen(if_statement, name="dibna")) module.add(if_statement) print str(module.root) use_line = line_number(module.root, "USE dibna") if_line = line_number(module.root, "IF (" + clause + ") THEN") # The use statement must come before the if..then block assert use_line < if_line
def test_subroutine_var_with_implicit_none(): ''' test that a variable is added after an implicit none statement in a subroutine''' module = ModuleGen(name="testmodule") subroutine = SubroutineGen(module, name="testsubroutine", implicitnone=True) module.add(subroutine) subroutine.add(DeclGen(subroutine, datatype="integer", entity_decls=["var1"])) idx_var = line_number(subroutine.root, "INTEGER var1") idx_imp_none = line_number(subroutine.root, "IMPLICIT NONE") print str(module.root) assert idx_var - idx_imp_none == 1, \ "variable declation must be after implicit none"
def test_do_loop_add_after(): ''' Test that we correctly generate code for a do loop when adding a child to it with position *after* ''' module = ModuleGen(name="testmodule") sub = SubroutineGen(module, name="testsub") module.add(sub) dogen = DoGen(sub, "it", "1", "10", step="2") sub.add(dogen) assign1 = AssignGen(dogen, lhs="happy", rhs=".TRUE.") dogen.add(assign1) assign2 = AssignGen(dogen, lhs="sad", rhs=".FALSE.") dogen.add(assign2, position=["before", assign1.root]) a1_line = line_number(sub.root, "happy = ") a2_line = line_number(sub.root, "sad = ") assert a1_line > a2_line
def test_subroutine_var_intent_in_with_directive(): ''' test that a variable declared as intent in is added before a directive in a subroutine''' module = ModuleGen(name="testmodule") subroutine = SubroutineGen(module, name="testsubroutine", implicitnone=False) module.add(subroutine) subroutine.add(DirectiveGen(subroutine, "omp", "begin", "parallel", "")) subroutine.add(DeclGen(subroutine, datatype="integer", intent="in", entity_decls=["var1"])) idx_par = line_number(subroutine.root, "!$omp parallel") idx_var = line_number(subroutine.root, "INTEGER, intent(in) :: var1") print str(module.root) assert idx_par - idx_var == 1, \ "variable declaration must be before directive"
def test_basegen_first(): '''Check that we can insert an object as the first child''' module = ModuleGen(name="testmodule") sub = SubroutineGen(module, name="testsubroutine") module.add(sub) sub.add(DeclGen(sub, datatype="integer", entity_decls=["var1"])) sub.add(CommentGen(sub, " hello"), position=["first"]) cindex = line_number(sub.root, "hello") assert cindex == 1
def test_basegen_append(): '''Check that we can append an object to the tree''' module = ModuleGen(name="testmodule") sub = SubroutineGen(module, name="testsubroutine") module.add(sub) sub.add(DeclGen(sub, datatype="integer", entity_decls=["var1"])) sub.add(CommentGen(sub, " hello"), position=["append"]) cindex = line_number(sub.root, "hello") assert cindex == 3
def test_imp_none_in_module_with_decs(): ''' test that implicit none is added before any declaration statements in a module when auto (the default) is used for insertion ''' module = ModuleGen(name="testmodule", implicitnone=False) module.add(DeclGen(module, datatype="integer", entity_decls=["var1"])) module.add(TypeDeclGen(module, datatype="my_type", entity_decls=["type1"])) module.add(ImplicitNoneGen(module)) in_idx = line_number(module.root, "IMPLICIT NONE") assert in_idx == 1
def test_basegen_append_default(): ''' Check if no position argument is supplied to BaseGen.add() then it defaults to appending ''' from psyclone.f2pygen import BaseGen module = ModuleGen(name="testmodule") sub = SubroutineGen(module, name="testsubroutine") module.add(sub) BaseGen.add(sub, DeclGen(sub, datatype="integer", entity_decls=["var1"])) BaseGen.add(sub, CommentGen(sub, " hello")) cindex = line_number(sub.root, "hello") assert cindex == 3
def test_basegen_after_index(): '''Check that we can insert an object using "after_index"''' module = ModuleGen(name="testmodule") sub = SubroutineGen(module, name="testsubroutine") module.add(sub) sub.add(DeclGen(sub, datatype="integer", entity_decls=["var1"])) sub.add(DeclGen(sub, datatype="integer", entity_decls=["var2"])) sub.add(CommentGen(sub, " hello"), position=["after_index", 1]) # The code checked by line_number() *includes* the SUBROUTINE # statement (which is obviously not a child of the SubroutineGen # object) and therefore the index it returns is 1 greater than we # might expect. assert line_number(sub.root, "hello") == 3
def test_imp_none_in_subroutine_with_use_and_decs(): ''' test that implicit none is added after any use statements and before any declarations in a subroutine when auto (the default) is used for insertion''' module = ModuleGen(name="testmodule") sub = SubroutineGen(module, name="testsubroutine") module.add(sub) sub.add(DeclGen(sub, datatype="integer", entity_decls=["var1"])) sub.add(TypeDeclGen(sub, datatype="my_type", entity_decls=["type1"])) sub.add(UseGen(sub, "fred")) sub.add(ImplicitNoneGen(sub)) in_idx = line_number(sub.root, "IMPLICIT NONE") assert in_idx == 2
def test_imp_none_in_module_with_use_and_decs_and_comments(): ''' test that implicit none is added after any use statements and before any declarations in a module in the presence of comments when auto (the default) is used for insertion''' module = ModuleGen(name="testmodule", implicitnone=False) module.add(DeclGen(module, datatype="integer", entity_decls=["var1"])) module.add(TypeDeclGen(module, datatype="my_type", entity_decls=["type1"])) module.add(UseGen(module, "fred")) for idx in [0, 1, 2, 3]: module.add(CommentGen(module, " hello " + str(idx)), position=["before_index", 2 * idx]) module.add(ImplicitNoneGen(module)) in_idx = line_number(module.root, "IMPLICIT NONE") assert in_idx == 3