org.eclipse.mylyn.java.tests.InteractionContextManagerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.java.tests.InteractionContextManagerTest.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2010 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.java.tests;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;

import org.eclipse.core.internal.resources.Workspace;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.JavaModel;
import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.mylyn.context.core.AbstractContextListener;
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
import org.eclipse.mylyn.context.core.ContextChangeEvent;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.core.IInteractionContext;
import org.eclipse.mylyn.context.core.IInteractionElement;
import org.eclipse.mylyn.context.sdk.java.AbstractJavaContextTest;
import org.eclipse.mylyn.internal.context.core.CompositeContextElement;
import org.eclipse.mylyn.internal.context.core.CompositeInteractionContext;
import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
import org.eclipse.mylyn.internal.context.core.InteractionContext;
import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
import org.eclipse.mylyn.internal.context.core.LocalContextStore;
import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
import org.eclipse.mylyn.internal.resources.ui.ResourceStructureBridge;
import org.eclipse.mylyn.monitor.core.InteractionEvent;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;

/**
 * @author Mik Kersten
 */
public class InteractionContextManagerTest extends AbstractJavaContextTest {

    private PackageExplorerPart explorer;

    private LocalContextStore contextStore;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        explorer = PackageExplorerPart.openInActivePerspective();
        contextStore = ContextCorePlugin.getContextStore();
        assertNotNull(explorer);
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    };

    class LandmarksModelListener extends AbstractContextListener {

        public int numAdditions = 0;

        public int numDeletions = 0;

        @Override
        public void contextChanged(ContextChangeEvent event) {
            switch (event.getEventKind()) {
            case LANDMARKS_ADDED:
                numAdditions += event.getElements().size();
                break;
            case LANDMARKS_REMOVED:
                numDeletions += event.getElements().size();
                break;
            }
        }
    }

    public void testHandleToPathConversion() throws IOException {
        String handle = "https://bugs.eclipse.org/bugs-123";
        File file = contextStore.getFileForContext(handle);
        assertFalse(file.exists());
        file.createNewFile();
        assertTrue(file.exists());
    }

    public void testPauseAndResume() throws JavaModelException {
        ContextCore.getContextManager().setContextCapturePaused(true);
        ContextCore.getContextManager().processInteractionEvent(mockInterestContribution("paused", 3));
        IInteractionElement paused = ContextCore.getContextManager().getElement("paused");
        assertFalse(paused.getInterest().isInteresting());

        ContextCore.getContextManager().setContextCapturePaused(false);
        ContextCore.getContextManager().processInteractionEvent(mockInterestContribution("paused", 3));
        IInteractionElement resumed = ContextCore.getContextManager().getElement("paused");
        assertTrue(resumed.getInterest().isInteresting());
    }

    // XXX 3.5 re-enable test
    // NOTE: This is to test that the shell activation event is first in the activation history.
    //       Currently this test fails but passes when run with CoreUtil.TEST_MODE = true
    //   public void testShellLifecycleActivityStart() {
    //      List<InteractionEvent> events = manager.getActivityMetaContext().getInteractionHistory();
    //      assertEquals("Activity monitoring possibly activated before context ui startup",
    //            InteractionContextManager.ACTIVITY_DELTA_STARTED, events.get(0).getDelta());
    //      assertEquals(InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, events.get(1).getDelta());
    //   }

    public void testActivityHistory() {
        manager.resetActivityMetaContext();
        InteractionContext history = manager.getActivityMetaContext();
        assertNotNull(history);
        assertEquals(0, manager.getActivityMetaContext().getInteractionHistory().size());

        manager.internalActivateContext(contextStore.loadContext("1"));
        assertEquals(1, manager.getActivityMetaContext().getInteractionHistory().size());

        manager.deactivateContext("2");
        assertEquals(2, manager.getActivityMetaContext().getInteractionHistory().size());
    }

    public void testChangeHandle() {
        ContextCore.getContextManager().processInteractionEvent(mockInterestContribution("old", 3));
        IInteractionElement old = ContextCore.getContextManager().getElement("old");
        assertTrue(old.getInterest().isInteresting());

        ContextCore.getContextManager().getActiveContext().updateElementHandle(old, "new");
        IInteractionElement changed = ContextCore.getContextManager().getElement("new");
        assertTrue(changed.getInterest().isInteresting());
    }

    public void testCopyContext() {
        File sourceFile = contextStore.getFileForContext(context.getHandleIdentifier());
        context.parseEvent(mockSelection("1"));
        assertFalse(context.getInteractionHistory().isEmpty());
        contextStore.saveContext(context);
        assertTrue(sourceFile.exists());

        File toFile = contextStore.getFileForContext("toContext");
        assertFalse(toFile.exists());

        contextStore.cloneContext(context.getHandleIdentifier(), "toContext");
        assertTrue(toFile.exists());

        manager.activateContext("toContext");
        IInteractionContext toContext = manager.getActiveContext();
        assertFalse(toContext.getInteractionHistory().isEmpty());
        //      assertEquals(((CompositeInteractionContext) manager.getActiveContext()).get("toContext").getHandleIdentifier(),
        //            toContext.getHandleIdentifier());

        toFile.delete();
        assertFalse(toFile.delete());
        manager.deactivateAllContexts();
    }

    public void testHasContext() {
        manager.deleteContext("1");
        assertFalse(contextStore.getFileForContext("1").exists());
        assertFalse(manager.hasContext("1"));
        manager.internalActivateContext(contextStore.loadContext("1"));
        assertTrue(manager.isContextActive());

        manager.deactivateContext("1");
        assertFalse(manager.hasContext("1"));

        manager.internalActivateContext(contextStore.loadContext("1"));
        manager.processInteractionEvent(mockSelection());
        manager.deactivateContext("1");
        assertTrue(manager.hasContext("1"));
        contextStore.getFileForContext("1").delete();
    }

    public void testDelete() {
        manager.deleteContext("1");
        assertFalse(contextStore.getFileForContext("1").exists());
        assertFalse(manager.hasContext("1"));
        manager.internalActivateContext(contextStore.loadContext("1"));
        assertTrue(manager.isContextActive());

        InteractionContext activeContext = ((CompositeInteractionContext) manager.getActiveContext())
                .getContextMap().values().iterator().next();
        activeContext.parseEvent(mockSelection());
        assertTrue(containsHandle(activeContext, MOCK_HANDLE));
        activeContext.delete(activeContext.get(MOCK_HANDLE));
        assertFalse(containsHandle(activeContext, MOCK_HANDLE));

        manager.deactivateContext("1");
        assertFalse(manager.hasContext("1"));

        manager.activateContext("1");
        activeContext = ((CompositeInteractionContext) manager.getActiveContext()).getContextMap().values()
                .iterator().next();
        assertFalse(containsHandle(activeContext, MOCK_HANDLE));

        manager.internalActivateContext(contextStore.loadContext("1"));
        manager.processInteractionEvent(mockSelection());
        manager.deactivateContext("1");
        assertTrue(manager.hasContext("1"));
        contextStore.getFileForContext("1").delete();
    }

    private boolean containsHandle(InteractionContext context, String mockHandle) {
        for (IInteractionElement element : context.getAllElements()) {
            if (element.getHandleIdentifier().equals(mockHandle)) {
                return true;
            }
        }

        for (InteractionEvent element : context.getInteractionHistory()) {
            if (element.getStructureHandle().equals(mockHandle)) {
                return true;
            }
        }
        return false;
    }

    public void testPredictedInterest() {
        IInteractionElement node = ContextCore.getContextManager().getElement("doesn't exist");
        assertFalse(node.getInterest().isInteresting());
        assertFalse(node.getInterest().isPropagated());
    }

    public void testParentInterestAfterDecay() throws JavaModelException {
        IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
        IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
        StructuredSelection sm1 = new StructuredSelection(m1);
        monitor.selectionChanged(part, sm1);

        IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
        assertTrue(node.getInterest().isInteresting());
        AbstractContextStructureBridge bridge = ContextCorePlugin.getDefault()
                .getStructureBridge(node.getContentType());
        IInteractionElement parent = ContextCore.getContextManager()
                .getElement(bridge.getParentHandle(node.getHandleIdentifier()));
        assertTrue(parent.getInterest().isInteresting());
        assertTrue(parent.getInterest().isPropagated());

        for (int i = 0; i < 1 / (scaling.getDecay()) * 3; i++) {
            ContextCore.getContextManager().processInteractionEvent(mockSelection());
        }

        assertFalse(
                ContextCore.getContextManager().getElement(m1.getHandleIdentifier()).getInterest().isInteresting());
        ContextCore.getContextManager().processInteractionEvent(mockSelection(m1.getHandleIdentifier()));
        assertTrue(
                ContextCore.getContextManager().getElement(m1.getHandleIdentifier()).getInterest().isInteresting());
    }

    public void testPropagation() throws JavaModelException, Exception {
        IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
        IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
        assertFalse(node.getInterest().isInteresting());

        InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
                new JavaStructureBridge().getContentType(), m1.getHandleIdentifier(), "source");
        ContextCorePlugin.getContextManager().processInteractionEvent(event, true);

        node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
        assertTrue(node.getInterest().isInteresting());

        project.build();
        IJavaElement parent = m1.getParent();
        IInteractionElement parentNode = ContextCore.getContextManager().getElement(parent.getHandleIdentifier());
        assertFalse(parentNode.getInterest().isInteresting());

        InteractionEvent selectionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION,
                new JavaStructureBridge().getContentType(), m1.getHandleIdentifier(), "source");
        ContextCorePlugin.getContextManager().processInteractionEvent(selectionEvent, true);
        parentNode = ContextCore.getContextManager().getElement(parent.getHandleIdentifier());
        assertTrue(parentNode.getInterest().isInteresting());
    }

    public void testPropagationBetweenResourcesAndJava() throws JavaModelException, Exception {
        Workspace workspace = ((Workspace) ResourcesPlugin.getWorkspace());
        IPath fullPath = p1.getResource().getFullPath();

        IFolder newResource = (IFolder) workspace.newResource(fullPath.append("meta-inf"), IResource.FOLDER);
        newResource.create(true, true, new NullProgressMonitor());
        fullPath = newResource.getFullPath();

        IFile file = (IFile) workspace.newResource(fullPath.append("test.xml"), IResource.FILE);
        file.create(null, true, new NullProgressMonitor());

        ResourceStructureBridge resourceStructureBridge = new ResourceStructureBridge();
        String fileHandle = resourceStructureBridge.getHandleIdentifier(file);
        IInteractionElement node = ContextCore.getContextManager().getElement(fileHandle);
        assertFalse(node.getInterest().isInteresting());

        InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
                resourceStructureBridge.getContentType(), fileHandle, "source");
        ContextCorePlugin.getContextManager().processInteractionEvent(event, true);

        node = ContextCore.getContextManager().getElement(fileHandle);
        assertTrue(node.getInterest().isInteresting());

        project.build();
        IProject project = file.getProject();

        String projectHandle = resourceStructureBridge.getHandleIdentifier(project);
        IInteractionElement parentNode = ContextCore.getContextManager().getElement(projectHandle);
        assertFalse(parentNode.getInterest().isInteresting());

        InteractionEvent selectionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION,
                resourceStructureBridge.getContentType(), fileHandle, "source");
        ContextCorePlugin.getContextManager().processInteractionEvent(selectionEvent, true);

        parentNode = ContextCore.getContextManager().getElement(p1.getHandleIdentifier());
        assertTrue("Package is not in the context", parentNode.getInterest().isInteresting());

        parentNode = ContextCore.getContextManager().getElement(projectHandle);
        assertTrue("Project is not in the context", parentNode.getInterest().isInteresting());
    }

    public void testIncremenOfParentDoi() throws JavaModelException, Exception {
        IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
        IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
        IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
        assertFalse(node.getInterest().isInteresting());

        StructuredSelection sm1 = new StructuredSelection(m1);
        monitor.selectionChanged(part, sm1);
        node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
        assertTrue(node.getInterest().isInteresting());

        project.build();
        IJavaElement parent = m1.getParent();
        @SuppressWarnings("unused")
        int level = 1;
        do {
            level++;
            IInteractionElement parentNode = ContextCore.getContextManager()
                    .getElement(parent.getHandleIdentifier());
            if (!(parent instanceof JavaModel)) {
                assertEquals("failed on: " + parent.getClass(), node.getInterest().getValue(),
                        parentNode.getInterest().getValue());
            }
            parent = parent.getParent();
        } while (parent != null);
    }

    public void testIncremenOfParentDoiAfterForcedDecay() throws JavaModelException, Exception {
        IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
        IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
        IMethod m2 = type1.createMethod("void m2() { }", null, true, null);
        IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
        assertFalse(node.getInterest().isInteresting());

        monitor.selectionChanged(part, new StructuredSelection(m1));
        node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
        assertTrue(node.getInterest().isInteresting());

        // make all the parents interest propated to have negative interest
        IJavaElement parent = m1.getParent();
        @SuppressWarnings("unused")
        int level = 1;
        do {
            level++;
            IInteractionElement parentNode = ContextCore.getContextManager()
                    .getElement(parent.getHandleIdentifier());
            if (!(parent instanceof JavaModel)) {
                assertTrue(parentNode.getInterest().isInteresting());
                ContextCore.getContextManager().processInteractionEvent(mockInterestContribution(
                        parentNode.getHandleIdentifier(), -2 * parentNode.getInterest().getValue()));
                IInteractionElement updatedParent = ContextCore.getContextManager()
                        .getElement(parent.getHandleIdentifier());
                assertFalse(updatedParent.getInterest().isInteresting());
            }
            parent = parent.getParent();
        } while (parent != null);

        //      assertFalse(node.getInterest().isInteresting());

        // select the element, should propagate up
        monitor.selectionChanged(part, new StructuredSelection(m2));
        monitor.selectionChanged(part, new StructuredSelection(m1));
        node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
        assertTrue(node.getInterest().isInteresting());

        project.build();
        parent = m1.getParent();
        level = 1;
        do {
            level++;
            IInteractionElement parentNode = ContextCore.getContextManager()
                    .getElement(parent.getHandleIdentifier());
            if (!(parent instanceof JavaModel)) {
                assertTrue(parentNode.getInterest().isInteresting());
                //            assertEquals("failed on: " + parent.getClass(), node.getInterest().getValue(), parentNode.getInterest()
                //                  .getValue());
            }
            parent = parent.getParent();
        } while (parent != null);
    }

    public void testLandmarks() throws CoreException, IOException {
        LandmarksModelListener listener = new LandmarksModelListener();
        try {
            manager.addListener(listener);

            IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                    .getActivePart();
            IMethod m1 = type1.createMethod("void m1() { }", null, true, null);

            StructuredSelection sm1 = new StructuredSelection(m1);
            monitor.selectionChanged(part, sm1);
            manager.processInteractionEvent(
                    mockInterestContribution(m1.getHandleIdentifier(), scaling.getLandmark()));
            // packages can't be landmarks
            manager.processInteractionEvent(mockInterestContribution(
                    m1.getCompilationUnit().getParent().getHandleIdentifier(), scaling.getLandmark()));
            // source folders can't be landmarks
            manager.processInteractionEvent(mockInterestContribution(
                    m1.getCompilationUnit().getParent().getParent().getHandleIdentifier(), scaling.getLandmark()));
            // projects can't be landmarks
            manager.processInteractionEvent(mockInterestContribution(
                    m1.getCompilationUnit().getParent().getParent().getParent().getHandleIdentifier(),
                    scaling.getLandmark()));

            assertEquals(1, ContextCore.getContextManager().getActiveLandmarks().size());
            assertEquals(1, listener.numAdditions);

            manager.processInteractionEvent(
                    mockInterestContribution(m1.getHandleIdentifier(), -scaling.getLandmark()));
            assertEquals(1, listener.numDeletions);
        } finally {
            manager.removeListener(listener);
        }
    }

    public void testEventProcessWithObject() throws JavaModelException {
        InteractionContext context = new InteractionContext("global-id", new InteractionContextScaling());
        context.setContentLimitedTo(JavaStructureBridge.CONTENT_TYPE);
        ContextCorePlugin.getContextManager().addGlobalContext(context);

        assertEquals(0, ContextCore.getContextManager().getActiveContext().getAllElements().size());
        assertEquals(0, context.getAllElements().size());
        ContextCorePlugin.getContextManager().processInteractionEvent(type1, InteractionEvent.Kind.SELECTION,
                MOCK_ORIGIN, context);
        assertEquals(9, context.getAllElements().size());
        assertEquals(0, ContextCore.getContextManager().getActiveContext().getAllElements().size());
        ContextCorePlugin.getContextManager().removeGlobalContext(context);
    }

    public void testEventProcessWithNonExistentObject() throws JavaModelException {
        InteractionContext context = new InteractionContext("global-id", new InteractionContextScaling());
        context.setContentLimitedTo(JavaStructureBridge.CONTENT_TYPE);
        ContextCorePlugin.getContextManager().addGlobalContext(context);

        assertEquals(0, ContextCore.getContextManager().getActiveContext().getAllElements().size());
        assertEquals(0, context.getAllElements().size());
        ContextCorePlugin.getContextManager().processInteractionEvent(new String("non existent"),
                InteractionEvent.Kind.SELECTION, MOCK_ORIGIN, context);
        assertEquals(0, context.getAllElements().size());
        assertEquals(0, ContextCore.getContextManager().getActiveContext().getAllElements().size());
        ContextCorePlugin.getContextManager().removeGlobalContext(context);
    }

    public void testExplicitContextManipulationListener() throws JavaModelException {

        StubContextElementedDeletedListener listener = new StubContextElementedDeletedListener();
        try {
            manager.addListener(listener);

            IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
            IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
            assertFalse(node.getInterest().isInteresting());

            InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
                    new JavaStructureBridge().getContentType(), m1.getHandleIdentifier(), "source");
            IInteractionElement element = ContextCorePlugin.getContextManager().processInteractionEvent(event,
                    true);

            // test implicit manipulation
            manager.manipulateInterestForElement(element, true, false, true, "test", false);
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(0, listener.implicitDeletionEventCount);

            manager.manipulateInterestForElement(element, false, false, true, "test", false);
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(1, listener.implicitDeletionEventCount);
            listener.reset();

            // test emplicit manipulation
            manager.manipulateInterestForElement(element, true, false, true, "test", false);
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(0, listener.implicitDeletionEventCount);

            manager.manipulateInterestForElement(element, false, false, true, "test", true);
            assertEquals(1, listener.explicitDeletionEventCount);
            assertEquals(0, listener.implicitDeletionEventCount);
            listener.reset();

            // test implicit deletion
            ContextCorePlugin.getContextManager().processInteractionEvent(event, true);
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(0, listener.implicitDeletionEventCount);

            manager.deleteElements(Collections.singleton(element), false);
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(1, listener.implicitDeletionEventCount);
            listener.reset();

            // test explicit deletion
            ContextCorePlugin.getContextManager().processInteractionEvent(event, true);
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(0, listener.implicitDeletionEventCount);

            manager.deleteElements(Collections.singleton(element), true);
            assertEquals(1, listener.explicitDeletionEventCount);
            assertEquals(0, listener.implicitDeletionEventCount);
            listener.reset();

            // test old deletion
            ContextCorePlugin.getContextManager().processInteractionEvent(event, true);
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(0, listener.implicitDeletionEventCount);

            manager.deleteElements(Collections.singleton(element));
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(1, listener.implicitDeletionEventCount);
        } finally {
            // clean up
            manager.removeListener(listener);
        }
    }

    public void testRemoveProjectFromContextRemovesOnlyInteresting() throws JavaModelException {

        StubContextElementedDeletedListener listener = new StubContextElementedDeletedListener();
        try {
            manager.addListener(listener);
            type1.createMethod("void m1() { }", null, true, null);
            type1.createMethod("void m2() { }", null, true, null);
            type1.createMethod("void m4() { }", null, true, null);
            type1.createMethod("void m5() { }", null, true, null);
            IJavaProject project = type1.getJavaProject();
            IInteractionElement node = ContextCore.getContextManager().getElement(project.getHandleIdentifier());
            assertFalse(node.getInterest().isInteresting());

            InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
                    new JavaStructureBridge().getContentType(), project.getHandleIdentifier(), "source");
            IInteractionElement element = ContextCorePlugin.getContextManager().processInteractionEvent(event,
                    true);

            // test implicit deletion
            ContextCorePlugin.getContextManager().processInteractionEvent(event, true);
            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(0, listener.elementCount);

            // test explicit deletion
            manager.manipulateInterestForElements(Collections.singletonList(element), false, false, false, "test",
                    ContextCorePlugin.getContextManager().getActiveContext(), true);
            assertEquals(1, listener.explicitDeletionEventCount);

            // should have 2 element changes.  1 for resources and 1 for java
            assertEquals(2, listener.elementCount);

        } finally {
            // clean up
            manager.removeListener(listener);
        }
    }

    public void testDeleteElementsFromContext() {
        StubContextElementedDeletedListener listener = new StubContextElementedDeletedListener();
        try {
            manager.addListener(listener);
            IJavaProject project = type1.getJavaProject();
            InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
                    new JavaStructureBridge().getContentType(), project.getHandleIdentifier(), "source");
            IInteractionElement element = ContextCorePlugin.getContextManager().processInteractionEvent(event,
                    true);

            assertEquals(0, listener.explicitDeletionEventCount);
            assertEquals(0, listener.elementCount);
            IInteractionElement originalElement = ContextCorePlugin.getContextManager()
                    .getElement(element.getHandleIdentifier());
            assertEquals(element, originalElement);
            assertTrue(originalElement instanceof CompositeContextElement);
            assertEquals(1, ((CompositeContextElement) originalElement).getNodes().size());

            ContextCorePlugin.getContextManager()
                    .deleteElements(Arrays.asList(new IInteractionElement[] { element }));
            IInteractionElement deletedElement = ContextCorePlugin.getContextManager()
                    .getElement(element.getHandleIdentifier());
            assertTrue(deletedElement instanceof CompositeContextElement);
            assertEquals(0, ((CompositeContextElement) deletedElement).getNodes().size());
        } finally {
            manager.removeListener(listener);
        }
    }

    private class StubContextElementedDeletedListener extends AbstractContextListener {

        private int explicitDeletionEventCount;

        private int implicitDeletionEventCount;

        private int elementCount;

        void reset() {
            implicitDeletionEventCount = 0;
            explicitDeletionEventCount = 0;
            elementCount = 0;
        }

        @Override
        public void contextChanged(ContextChangeEvent event) {
            switch (event.getEventKind()) {

            case LANDMARKS_REMOVED:
            case ELEMENTS_DELETED:
                if (event.isExplicitManipulation()) {
                    explicitDeletionEventCount++;
                } else {
                    implicitDeletionEventCount++;
                }
                elementCount += event.getElements().size();
                break;
            }
        }
    }

}