blob: 4df3a9bd92f54ba08c0f2397f01b106a56a930e2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 SprinSource 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:
* Andrew Eisenberg - initial version
*******************************************************************************/
package org.eclipse.ajdt.core.tests.model;
import java.util.List;
import org.aspectj.asm.IHierarchy;
import org.aspectj.asm.IProgramElement;
import org.eclipse.ajdt.core.model.AJProjectModelFacade;
import org.eclipse.ajdt.core.model.AJProjectModelFactory;
import org.eclipse.ajdt.core.model.AJRelationshipManager;
import org.eclipse.ajdt.core.tests.AJDTCoreTestCase;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IParent;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
/**
* Tests for mapping between IProgramElement and IJavaElements
*
* This class tests that aj references across projects are working
*/
public class MultipleProjectModelTests extends AJDTCoreTestCase {
private IJavaProject commons;
private IJavaProject dependent;
private AJProjectModelFacade model;
@Override
protected void setUp() throws Exception {
super.setUp();
commons = JavaCore.create(createPredefinedProject("DefaultEmptyProject"));
dependent = JavaCore.create(createPredefinedProject("DefaultEmptyProjectDependent"));
model = AJProjectModelFactory.getInstance().getModelForJavaElement(dependent);
}
public void testITDFieldInOtherProject() throws Exception {
ICompilationUnit other = createCompilationUnitAndPackage("common", "Aspect.aj",
"package common;\n" +
"public aspect Aspect {\n" +
" public int ITD.x;\n" +
" public void ITD.x2() { };\n" +
" declare parents : dependent.* implements ITD;\n" +
" declare @type : dependent.* : @Foo;\n" +
" interface ITD { }\n" +
" public @interface Foo{ }" +
"}", commons);
ICompilationUnit unit = createCompilationUnitAndPackage("dependent", "Java.java",
"package dependent;\n" +
"public class Java {\n" +
"}", dependent);
assertNoProblems(commons.getProject());
assertNoProblems(dependent.getProject());
IType type = unit.getType("Java");
IType otherType = other.getType("Aspect");
List<IJavaElement> elts = model.getRelationshipsForElement(type, AJRelationshipManager.ASPECT_DECLARATIONS);
// the ITDs + the declare statement
assertEquals("Wrong number of aspect declarations found "+ type, 3, elts.size());
for (IJavaElement orig : elts) {
roundTripCheck(otherType, orig);
}
// AspectJ bug 327057 Not working yet
// elts = model.getRelationshipsForElement(type, AJRelationshipManager.ANNOTATED_BY);
//
// // one declare annotation
// assertEquals("Wrong number of aspect declarations found "+ type, 1, elts.size());
// for (IJavaElement orig : elts) {
// roundTripCheck(otherType, orig);
// }
}
private void roundTripCheck(IType otherType, IJavaElement orig) throws JavaModelException {
assertTrue("Should exist: " + orig.getHandleIdentifier(), orig.exists());
assertEquals(otherType, orig.getParent());
assertTrue("" + orig + " should be a child of " + otherType, isAChildOf(otherType, orig));
IProgramElement ipe = model.javaElementToProgramElement(orig);
assertNotSame(IHierarchy.NO_STRUCTURE, ipe);
orig = model.programElementToJavaElement(ipe);
assertTrue("Should exist: " + orig.getHandleIdentifier(), orig.exists());
assertEquals(otherType, orig.getParent());
assertTrue("" + orig + " should be a child of " + otherType, isAChildOf(otherType, orig));
}
private boolean isAChildOf(IParent parent, IJavaElement maybeChild) throws JavaModelException {
IJavaElement[] children = parent.getChildren();
for (IJavaElement child : children) {
if (child.equals(maybeChild)) {
return true;
}
}
return false;
}
}