blob: 0d3373d07719eafa0a4a933482ba27bf6a1fe39b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Steve Young - initial version
*******************************************************************************/
package org.eclipse.ajdt.ui.tests.visualiser;
import java.util.Iterator;
import java.util.List;
import org.eclipse.ajdt.core.AspectJPlugin;
import org.eclipse.ajdt.core.javaelements.AJCompilationUnitManager;
import org.eclipse.ajdt.internal.ui.visualiser.AJDTContentProvider;
import org.eclipse.ajdt.ui.tests.UITestCase;
import org.eclipse.contribution.visualiser.core.ProviderManager;
import org.eclipse.contribution.visualiser.jdtImpl.JDTMember;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
/**
* Test the content provider used by the AJDT the Visualiser.
*
* While this test class drives most of the important methods of <code>AJDTContentProvider</code>,
* it also depends on the workbench infrastructure to inialise classes correctly. So, rather
* than creating an instance of <code>AJDTContentProvider</code> directly, it was necessary to
* activate the Visualiser perspective via the workbench, then retrieve the active instance
* of <code>AJDTContentProvider</code> from the <code>ProviderManager</code> class.
*
* The following methods have been excluded from testing, as no meaningful test could be
* performed:
*
* {@link org.eclipse.ajdt.internal.ui.visualiser.AJDTContentProvider#reset()}
* Sets internal variables to null, thus cleaning state, but accessor methods cannot
* check this, as they would trigger said internal variables to be re-initialised to
* non-null values.
*
* {@link org.eclipse.ajdt.internal.ui.visualiser.AJDTContentProvider#processMouseClick()}
* No discernable chanage of state to measure.
*/
public class AJDTContentProviderTest extends UITestCase {
private static final String VISUALISER_PERSPECTIVE_ID = "org.eclipse.ajdt.ui.visualiser.AspectVisualizationPerspective"; //$NON-NLS-1$
private IWorkbench workbench = null;
private IWorkbenchPage visualiserPerspective = null;
private AJDTContentProvider ajdtContentProvider = null;
private String testProjectName = "Simple AJ Project"; //$NON-NLS-1$
private IProject testProject = null;
private IJavaProject javaTestProject = null;
// NB This count includes the default package (so 3 == p1, p2 and default)
private static final int PROJECT_PACKAGE_COUNT = 3;
private static final int PROJECT_MEMBER_COUNT = 4;
private IPackageFragment defaultPackage = null;
private static final String DEFAULT_PACKAGE_NAME = ""; // default package //$NON-NLS-1$
private static final int DEFAULT_PACKAGE_MEMBER_COUNT = 2;
private IPackageFragment packageOne = null;
private static final String PACKAGE_ONE_NAME = "p1"; //$NON-NLS-1$
private static final String PACKAGE_ONE_MEMBER_NAME = "Main"; //$NON-NLS-1$
private static final int PACKAGE_ONE_MEMBER_COUNT = 1;
private IPackageFragment packageTwo = null;
private static final String PACKAGE_TWO_NAME = "p2"; //$NON-NLS-1$
private static final String PACKAGE_TWO_MEMBER_NAME = "Aspect"; //$NON-NLS-1$
private static final int PACKAGE_TWO_MEMBER_COUNT = 1;
// Any valid Java element (used to drive methods expecting one as an arg)
private IJavaElement someJavaElement = null;
public AJDTContentProviderTest(String string) {
super(string);
}
/*
* Setup the visualiser perspective, test project, packages and members therein
* which other tests depend on.
*
* @see org.eclipse.ajdt.ui.tests.UITestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
/*
* Show the perspective first, so is gets initialised properly and
* we don't get that java.lang.ClassCircularityError:
*/
workbench = PlatformUI.getWorkbench();
try {
// Check what perspectives are open to start with
workbench.getActiveWorkbenchWindow();
// Keep a reference to the opened perspective page so we can close
// it afterwards
visualiserPerspective = workbench.showPerspective(
VISUALISER_PERSPECTIVE_ID, workbench
.getActiveWorkbenchWindow());
} catch (WorkbenchException wbe) {
wbe.printStackTrace();
fail("WorkbenchException opening perspective"); //$NON-NLS-1$
}
// Obtain the instance with which to work
ajdtContentProvider = (AJDTContentProvider) ProviderManager.getCurrent().getContentProvider();
/*
* Create a project, a package and some members for the various tests to
* use. NB This must exist as a valid eclipse project under:
*
* org.eclipse.ajdt.ui.tests\workspace
*
* Re-use an existing test project.
*/
testProject = createPredefinedProject(testProjectName);
javaTestProject = JavaCore.create(testProject);
/*
* This is required in order to gurantee that AJDT "knows about all the .aj files"
* as some tests depend on this.
*/
AJCompilationUnitManager.INSTANCE.initCompilationUnits(AspectJPlugin.getWorkspace());
// It seems to be protocol to call this method at this point...
waitForJobsToComplete();
/*
* "A package fragment is a portion of the workspace corresponding to an entire package,
* or to a portion thereof."
*/
IPackageFragmentRoot[] packageFragmentRoots = javaTestProject.getPackageFragmentRoots();
defaultPackage = packageFragmentRoots[0].getPackageFragment(DEFAULT_PACKAGE_NAME);
packageOne = packageFragmentRoots[0].getPackageFragment(PACKAGE_ONE_NAME);
packageTwo = packageFragmentRoots[0].getPackageFragment(PACKAGE_TWO_NAME);
someJavaElement = packageOne.getChildren()[0];
}
protected void tearDown() throws Exception {
super.tearDown();
/*
* Calling:
*
* visualiserPerspective.close()
*
* results in no perspective being open, thus skuppering subsequent tests (!)
*
* Use:
*
* closePerspective(visualiserPerspective.getPerspective(), false, false);
*
* the last arg indicating that the "page" should not be closed.
*
* -spyoung
*/
visualiserPerspective.closePerspective(visualiserPerspective.getPerspective(), false, false);
}
/**
* Detailed test method for
* {@link org.eclipse.ajdt.internal.ui.visualiser.AJDTContentProvider#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)}.
*/
public void testSelectionChanged() {
ajdtContentProvider.selectionChanged(null, new AJDTContentProviderTest.MockStructuredSelection(someJavaElement));
assertNotNull("currentProject has not been set", ajdtContentProvider.getCurrentProject()); //$NON-NLS-1$
assertEquals("getCurrentProject() did not return the expect project instance", javaTestProject, //$NON-NLS-1$
ajdtContentProvider.getCurrentProject());
}
/*
* Simple mock class used to drive the selectionChanged method.
*/
private class MockStructuredSelection implements IStructuredSelection {
private Object elementToSelect = null;
private MockStructuredSelection(Object elementToSelect){
this.elementToSelect = elementToSelect;
}
// Return a valid Java element from a test project
public Object getFirstElement() {
return elementToSelect;
}
public Iterator iterator() {
return null;
}
public int size() {
return 0;
}
public Object[] toArray() {
return null;
}
public List toList() {
return null;
}
public boolean isEmpty() {
return false;
}
}
/**
* More detailed test method for (also drives {@link org.eclipse.ajdt.internal.ui.
* visualiser.AJDTContentProvider#selectionChanged(org.eclipse.ui.IWorkbenchPart,
* org.eclipse.jface.viewers.ISelection)} for non-trivial test cases.
* {@link org.eclipse.ajdt.internal.ui.visualiser.AJDTContentProvider#getAllMembers()}.
*/
public void testGetAllMembers() {
List members = ajdtContentProvider.getAllMembers();
assertNotNull("Members list should not be null", members); //$NON-NLS-1$
// Select the project - should cause getAllMembers to return all elements in all packages
ajdtContentProvider.selectionChanged(null, new MockStructuredSelection(javaTestProject));
List projectMembers = ajdtContentProvider.getAllMembers();
assertEquals("Wrong number of project members", PROJECT_MEMBER_COUNT, projectMembers.size()); //$NON-NLS-1$
System.out.println("Commented out part of AJDTContentProviderTest.testGetAllMembers() because of sporadic failures on build server.");
// Select the first package - should cause getAllMembers to return all elements in that packages
ajdtContentProvider.selectionChanged(null, new MockStructuredSelection(defaultPackage));
List packageMembers = ajdtContentProvider.getAllMembers();
assertEquals("Wrong number of package members", DEFAULT_PACKAGE_MEMBER_COUNT, packageMembers.size()); //$NON-NLS-1$
}
/**
* More detailed test method for (also drives {@link org.eclipse.ajdt.internal.ui.
* visualiser.AJDTContentProvider#selectionChanged(org.eclipse.ui.IWorkbenchPart,
* org.eclipse.jface.viewers.ISelection)} for non-trivial test cases.
* {@link org.eclipse.ajdt.internal.ui.visualiser.AJDTContentProvider#getAllGroups()}.
*
* NB This method does not appear to be invoked by the workbench over the course of
* typical usage. Tests are provided for completeness/coverage.
*/
public void testGetAllGroups() {
List allGroups = ajdtContentProvider.getAllGroups();
assertNotNull("Groups list should not be null", allGroups); //$NON-NLS-1$
// Select the project - should cause getAllGroups to return all packages
ajdtContentProvider.selectionChanged(null, new MockStructuredSelection(javaTestProject));
List projectGroups = ajdtContentProvider.getAllGroups();
assertEquals("Wrong number of projects for package", PROJECT_PACKAGE_COUNT, projectGroups.size()); //$NON-NLS-1$
}
/**
* More detailed test method for
* {@link org.eclipse.ajdt.internal.ui.visualiser.AJDTContentProvider#getMembersForPackage(org.eclipse.jdt.core.IPackageFragment)}.
*/
public void testGetMembersForPackage() {
List membersForPackageOne = ajdtContentProvider.getMembersForPackage(packageOne);
assertNotNull("MembersForPackage 1 list should not be null", membersForPackageOne); //$NON-NLS-1$
JDTMember packageOneMember = (JDTMember) membersForPackageOne.get(0);
assertEquals("Wrong package member for " + packageOne.getElementName(), PACKAGE_ONE_MEMBER_NAME, packageOneMember.getName()); //$NON-NLS-1$
assertEquals("Wrong number of members for " + packageOne.getElementName(), PACKAGE_ONE_MEMBER_COUNT, membersForPackageOne.size()); //$NON-NLS-1$
// Try with another package
List membersForPackageTwo = ajdtContentProvider.getMembersForPackage(packageTwo);
assertNotNull("MembersForPackage list should not be null", membersForPackageTwo); //$NON-NLS-1$
JDTMember packageTwoMember = (JDTMember) membersForPackageTwo.get(0);
assertEquals("Wrong package member for " + packageTwo.getElementName(), PACKAGE_TWO_MEMBER_NAME, packageTwoMember.getName()); //$NON-NLS-1$
assertEquals("Wrong number of members for " + packageTwo.getElementName(), PACKAGE_TWO_MEMBER_COUNT, membersForPackageTwo.size()); //$NON-NLS-1$
}
}