diff options
author | Jeffrey Overbey | 2009-01-07 21:39:42 +0000 |
---|---|---|
committer | Jeffrey Overbey | 2009-01-07 21:39:42 +0000 |
commit | da03d2609507dc2e83dc9ea09beb511d5a1a5a1c (patch) | |
tree | 5a57996aa4990da1cd208841d8dfbbbd6f707271 | |
parent | 99831bdc1ecf834252f423835c4842cf6101fcac (diff) | |
download | org.eclipse.photran-da03d2609507dc2e83dc9ea09beb511d5a1a5a1c.tar.gz org.eclipse.photran-da03d2609507dc2e83dc9ea09beb511d5a1a5a1c.tar.xz org.eclipse.photran-da03d2609507dc2e83dc9ea09beb511d5a1a5a1c.zip |
Added unit tests for subprogram-interface linkage
6 files changed, 146 insertions, 1 deletions
diff --git a/org.eclipse.photran.core.vpg.tests/interface-test-code/definition1.f90 b/org.eclipse.photran.core.vpg.tests/interface-test-code/definition1.f90 new file mode 100644 index 00000000..26fbfbfa --- /dev/null +++ b/org.eclipse.photran.core.vpg.tests/interface-test-code/definition1.f90 @@ -0,0 +1,3 @@ +integer function f() ! 1,18 + f = 1 +end function diff --git a/org.eclipse.photran.core.vpg.tests/interface-test-code/definition2.f90 b/org.eclipse.photran.core.vpg.tests/interface-test-code/definition2.f90 new file mode 100644 index 00000000..4fd6bcd1 --- /dev/null +++ b/org.eclipse.photran.core.vpg.tests/interface-test-code/definition2.f90 @@ -0,0 +1,3 @@ +integer function f() ! 1,18 + f = 2 +end function diff --git a/org.eclipse.photran.core.vpg.tests/interface-test-code/interface1.f90 b/org.eclipse.photran.core.vpg.tests/interface-test-code/interface1.f90 new file mode 100644 index 00000000..4eb5aeb0 --- /dev/null +++ b/org.eclipse.photran.core.vpg.tests/interface-test-code/interface1.f90 @@ -0,0 +1,26 @@ +interface + integer function f() ! 2,20 + end function +end interface + +contains + + subroutine s1(f) + interface + integer function f() ! 10,14 Subroutine parameter -- should not bind + end function + end interface + end subroutine + + subroutine s2 + interface + integer function f() ! 17,24 + end function + end interface + end subroutine + +end program + +integer function f() ! 24,18 + f = 0 +end function diff --git a/org.eclipse.photran.core.vpg.tests/interface-test-code/interface2.f90 b/org.eclipse.photran.core.vpg.tests/interface-test-code/interface2.f90 new file mode 100644 index 00000000..039ce2e4 --- /dev/null +++ b/org.eclipse.photran.core.vpg.tests/interface-test-code/interface2.f90 @@ -0,0 +1,6 @@ +interface + integer function f() ! 2,20 + end function +end interface + +end program diff --git a/org.eclipse.photran.core.vpg.tests/src/org/eclipse/photran/internal/core/tests/h_interface_links/InterfaceLinkTestCase.java b/org.eclipse.photran.core.vpg.tests/src/org/eclipse/photran/internal/core/tests/h_interface_links/InterfaceLinkTestCase.java new file mode 100644 index 00000000..730afca2 --- /dev/null +++ b/org.eclipse.photran.core.vpg.tests/src/org/eclipse/photran/internal/core/tests/h_interface_links/InterfaceLinkTestCase.java @@ -0,0 +1,106 @@ +package org.eclipse.photran.internal.core.tests.h_interface_links; + +import java.util.Collection; +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.photran.core.IFortranAST; +import org.eclipse.photran.core.vpg.PhotranVPG; +import org.eclipse.photran.internal.core.analysis.binding.Definition; +import org.eclipse.photran.internal.core.lexer.Token; +import org.eclipse.photran.refactoring.tests.RefactoringTestCase; + +public class InterfaceLinkTestCase extends RefactoringTestCase +{ + private static final String DIR = "interface-test-code"; + + private IFile interface1; + private IFile definition1; + private IFile definition2; + private IFile interface2; + + private Definition if1; + private Definition if2; + private Definition if3; + private Definition if4; + private Definition def1; + private Definition def2; + private Definition def3; + + @Override public void setUp() throws Exception + { + super.setUp(); + + /* The four files are imported in this order so that + * the INTERFACE block in the first file is seen /before/ + * all of the corresponding subprogram declarations, + * while the INTERFACE block in the last file is seen + * /after/ all of the corresponding subprograms. + */ + + interface1 = importFile(DIR, "interface1.f90"); + definition1 = importFile(DIR, "definition1.f90"); + definition2 = importFile(DIR, "definition2.f90"); + interface2 = importFile(DIR, "interface2.f90"); + // File Line Column + if1 = findDefinition(interface1, 2, 20); // Ordinary INTERFACE block + if2 = findDefinition(interface1, 10, 24); // INTERFACE block for a subprogram parameter + if3 = findDefinition(interface1, 17, 24); // Ordinary INTERFACE block + if4 = findDefinition(interface2, 2, 20); // Ordinary INTERFACE block + def1 = findDefinition(interface1, 24, 18); + def2 = findDefinition(definition1, 1, 18); + def3 = findDefinition(definition2, 1, 18); + } + + public void testResolveInterfaceBinding() throws Exception + { + checkContainsAllDefinitions(if1.resolveInterfaceBinding()); + assertTrue(if2.resolveInterfaceBinding().isEmpty()); // Interface for subprogram parameter + checkContainsAllDefinitions(if3.resolveInterfaceBinding()); + checkContainsAllDefinitions(if4.resolveInterfaceBinding()); + } + + public void testFindMatchingDeclarationsInInterfaces() throws Exception + { + checkContainsAllInterfaces(def1.findMatchingDeclarationsInInterfaces()); + checkContainsAllInterfaces(def2.findMatchingDeclarationsInInterfaces()); + checkContainsAllInterfaces(def3.findMatchingDeclarationsInInterfaces()); + } + + private void checkContainsAllDefinitions(Collection<Definition> defs) + { + assertEquals(3, defs.size()); + assertTrue(defs.contains(def1)); + assertTrue(defs.contains(def2)); + assertTrue(defs.contains(def3)); + } + + private void checkContainsAllInterfaces(Collection<Definition> defs) + { + assertEquals(3, defs.size()); + assertTrue(defs.contains(if1)); + assertFalse(defs.contains(if2)); // Interface for subprogram parameter + assertTrue(defs.contains(if3)); + assertTrue(defs.contains(if4)); + } + + private Definition findDefinition(IFile file, int line, int col) + { + IFortranAST ast = PhotranVPG.getInstance().acquireTransientAST(file); assertNotNull(ast); + Token token = findTokenByLineCol(ast, line, col); assertNotNull(token); + List<Definition> defs = token.resolveBinding(); assertEquals(1, defs.size()); + Definition def = defs.get(0); + assertEquals(file, def.getTokenRef().getFile()); + assertEquals(token.getFileOffset(), def.getTokenRef().getOffset()); + return def; + } + + private Token findTokenByLineCol(IFortranAST ast, int line, int col) + { + for (Token token : ast) + if (token.getLine() == line && token.getCol() == col) + return token; + + return null; + } +} diff --git a/org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java b/org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java index 4037954a..d892fc56 100644 --- a/org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java +++ b/org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java @@ -458,7 +458,8 @@ public class Definition implements Serializable, Comparable<Definition> { Definition def = PhotranVPG.getInstance().getDefinitionFor(d); if (def != null) - result.add(def); + if ((def.isSubprogram() && !def.isInInterfaceBlock()) || def.isSubprogramArgument()) + result.add(def); } return result; } |