| /******************************************************************************* |
| * Copyright (c) 2009 University of Illinois at Urbana-Champaign and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * UIUC - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.photran.internal.tests.refactoring.infrastructure; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.OperationCanceledException; |
| import org.eclipse.ltk.core.refactoring.RefactoringStatus; |
| import org.eclipse.photran.core.IFortranAST; |
| import org.eclipse.photran.internal.core.parser.ASTMainProgramNode; |
| import org.eclipse.photran.internal.core.parser.ASTModuleNode; |
| import org.eclipse.photran.internal.core.parser.ASTSubroutineSubprogramNode; |
| import org.eclipse.photran.internal.core.refactoring.infrastructure.FortranEditorRefactoring; |
| import org.eclipse.photran.internal.core.vpg.PhotranVPG; |
| import org.eclipse.photran.internal.tests.Activator; |
| import org.eclipse.photran.internal.tests.PhotranWorkspaceTestCase; |
| |
| /** |
| * Unit tests for {@link PhotranVPG#listAllModules()} |
| * |
| * @author Jeff Overbey |
| */ |
| public class CheckCanAddDeclTests extends PhotranWorkspaceTestCase |
| { |
| private static final String DIR = "refactoring-test-code/infrastructure/check-can-add-decl"; |
| |
| private ASTMainProgramNode mainProgram; |
| private ASTSubroutineSubprogramNode internalSubroutine; |
| private ASTModuleNode module; |
| |
| @Override public void setUp() throws Exception |
| { |
| super.setUp(); |
| |
| IFile main_f90 = importFile(Activator.getDefault(), DIR, "main.f90"); |
| IFile module_f90 = importFile(Activator.getDefault(), DIR, "module.f90"); |
| importFile(Activator.getDefault(), DIR, "external.f90"); |
| PhotranVPG.getInstance().ensureVPGIsUpToDate(new NullProgressMonitor()); |
| |
| project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); |
| compileAndRunFortranProgram("module.f90", "main.f90", "external.f90"); |
| |
| PhotranVPG vpg = PhotranVPG.getInstance(); |
| IFortranAST mainFileAST = vpg.acquireTransientAST(main_f90); |
| IFortranAST moduleFileAST = vpg.acquireTransientAST(module_f90); |
| assertNotNull(mainFileAST); |
| assertNotNull(moduleFileAST); |
| |
| mainProgram = mainFileAST.findFirstTokenOnLine(1).findNearestAncestor(ASTMainProgramNode.class); |
| internalSubroutine = mainFileAST.findFirstTokenOnLine(23).findNearestAncestor(ASTSubroutineSubprogramNode.class); |
| module = moduleFileAST.findFirstTokenOnLine(1).findNearestAncestor(ASTModuleNode.class); |
| assertNotNull(mainProgram); |
| assertNotNull(internalSubroutine); |
| assertNotNull(module); |
| } |
| |
| public void testAddDeclsToMainProgram() throws Exception |
| { |
| new FauxFortranRefactoring() |
| { |
| protected void runTest() |
| { |
| assertTrue(canAdd("something_new")); |
| assertFalse(canAdd("assigned_local_variable")); |
| assertFalse(canAdd("AsSiGnEd_LoCaL_vArIaBlE")); |
| assertFalse(canAdd("unused_local_variable")); |
| assertFalse(canAdd("local_variable_accessed_from_internal_subroutine")); |
| assertFalse(canAdd("defined_external_subroutine")); |
| assertFalse(canAdd("declared_external_subroutine")); |
| assertFalse(canAdd("undeclared_external_subroutine")); |
| assertFalse(canAdd("internal_subroutine")); |
| assertFalse(canAdd("used_module_subroutine")); |
| assertFalse(canAdd("unused_module_subroutine")); |
| assertTrue(canAdd("private_module_subroutine")); |
| } |
| |
| private boolean canAdd(String name) |
| { |
| return checkIfDeclarationCanBeAddedToScope(name, mainProgram, new NullProgressMonitor()); |
| } |
| }.runTest(); |
| } |
| |
| public void testAddDeclsToModule() throws Exception |
| { |
| new FauxFortranRefactoring() |
| { |
| protected void runTest() |
| { |
| assertFalse(canAdd("private_module_subroutine")); |
| |
| // These are the same as above, since declaring these in the module |
| // will cause them to be imported into the main program, preventing |
| // the main program from redeclaring them |
| |
| assertTrue(canAdd("something_new")); |
| assertFalse(canAdd("assigned_local_variable")); |
| assertFalse(canAdd("AsSiGnEd_LoCaL_vArIaBlE")); |
| assertFalse(canAdd("unused_local_variable")); |
| assertFalse(canAdd("local_variable_accessed_from_internal_subroutine")); |
| // FIXME assertFalse(canAdd("defined_external_subroutine")); |
| assertFalse(canAdd("declared_external_subroutine")); |
| assertFalse(canAdd("undeclared_external_subroutine")); |
| assertFalse(canAdd("internal_subroutine")); |
| assertFalse(canAdd("used_module_subroutine")); |
| assertFalse(canAdd("unused_module_subroutine")); |
| } |
| |
| private boolean canAdd(String name) |
| { |
| return checkIfDeclarationCanBeAddedToScope(name, module, new NullProgressMonitor()); |
| } |
| }.runTest(); |
| } |
| |
| public void testAddDeclsToInternalSubprogram() throws Exception |
| { |
| new FauxFortranRefactoring() |
| { |
| protected void runTest() |
| { |
| assertTrue(canAdd("something_new")); |
| assertFalse(canAdd("internal_subroutine")); |
| assertFalse(canAdd("local_variable_accessed_from_internal_subroutine")); |
| assertTrue(canAdd("private_module_subroutine")); |
| |
| // These will shadow declarations in an outer scope, but since they're not |
| // referenced, that is OK |
| assertTrue(canAdd("assigned_local_variable")); |
| assertTrue(canAdd("AsSiGnEd_LoCaL_vArIaBlE")); |
| assertTrue(canAdd("unused_local_variable")); |
| assertTrue(canAdd("defined_external_subroutine")); |
| assertTrue(canAdd("declared_external_subroutine")); |
| assertTrue(canAdd("undeclared_external_subroutine")); |
| assertTrue(canAdd("used_module_subroutine")); |
| assertTrue(canAdd("unused_module_subroutine")); |
| } |
| |
| private boolean canAdd(String name) |
| { |
| return checkIfDeclarationCanBeAddedToScope(name, internalSubroutine, new NullProgressMonitor()); |
| } |
| }.runTest(); |
| } |
| |
| /** |
| * This is intended to be subclassed in order to gain access to the protected methods of |
| * {@link FortranEditorRefactoring} to test those methods. |
| * |
| * @author Jeff Overbey |
| */ |
| private class FauxFortranRefactoring extends FortranEditorRefactoring |
| { |
| public FauxFortranRefactoring() |
| { |
| this.vpg = PhotranVPG.getInstance(); |
| } |
| |
| @Override |
| protected void doCheckInitialConditions(RefactoringStatus status, IProgressMonitor pm) |
| throws PreconditionFailure |
| { |
| } |
| |
| @Override |
| protected void doCheckFinalConditions(RefactoringStatus status, IProgressMonitor pm) |
| throws PreconditionFailure |
| { |
| } |
| |
| @Override |
| protected void doCreateChange(IProgressMonitor pm) throws CoreException, OperationCanceledException |
| { |
| } |
| |
| @Override |
| public String getName() |
| { |
| return null; |
| } |
| } |
| } |