blob: 12605645fb5ac2ca4be1556e754a774e520f7330 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2016 1C-Soft LLC 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:
* Vladimir Piskarev (1C) - initial API and implementation
*******************************************************************************/
package org.eclipse.handly.internal.examples.basic.ui.model;
import static org.eclipse.handly.model.IElementDeltaConstants.F_CONTENT;
import static org.eclipse.handly.model.IElementDeltaConstants.F_DESCRIPTION;
import static org.eclipse.handly.model.IElementDeltaConstants.F_OPEN;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.Path;
import org.eclipse.handly.examples.basic.ui.model.FooModelCore;
import org.eclipse.handly.examples.basic.ui.model.IFooFile;
import org.eclipse.handly.examples.basic.ui.model.IFooModel;
import org.eclipse.handly.examples.basic.ui.model.IFooProject;
import org.eclipse.handly.junit.WorkspaceTestCase;
import org.eclipse.handly.model.IElementChangeEvent;
import org.eclipse.handly.model.IElementChangeListener;
import org.eclipse.handly.model.impl.ElementDelta;
/**
* Foo element change notification tests.
*/
public class FooModelNotificationTest
extends WorkspaceTestCase
{
private IFooModel fooModel = FooModelCore.getFooModel();
private FooModelListener listener = new FooModelListener();
@Override
protected void setUp() throws Exception
{
super.setUp();
setUpProject("Test001");
fooModel.addElementChangeListener(listener);
}
@Override
protected void tearDown() throws Exception
{
fooModel.removeElementChangeListener(listener);
super.tearDown();
}
public void testFooModelNotification() throws Exception
{
IFooProject fooProject1 = fooModel.getFooProject("Test001");
IFooProject fooProject2 = fooModel.getFooProject("Test002");
setUpProject("Test002");
assertDelta(newDeltaBuilder().added(fooProject2).getDelta(),
listener.delta);
IFooFile fooFile1 = fooProject1.getFooFile("test.foo");
fooFile1.getFile().touch(null);
assertDelta(newDeltaBuilder().changed(fooFile1, F_CONTENT).getDelta(),
listener.delta);
fooFile1.getFile().copy(new Path("/Test002/test1.foo"), true, null);
assertDelta(newDeltaBuilder().added(fooProject2.getFooFile(
"test1.foo")).getDelta(), listener.delta);
fooFile1.getFile().delete(true, null);
assertDelta(newDeltaBuilder().removed(fooFile1).getDelta(),
listener.delta);
IFooFile fooFile2 = fooProject2.getFooFile("test.foo");
IFooFile movedFooFile2 = fooProject1.getFooFile("test1.foo");
fooFile2.getFile().move(new Path("/Test001/test1.foo"), true, null);
assertDelta(newDeltaBuilder().movedTo(movedFooFile2,
fooFile2).movedFrom(fooFile2, movedFooFile2).getDelta(),
listener.delta);
IFolder aFolder = fooProject1.getProject().getFolder("a");
aFolder.delete(true, null);
assertDelta(newDeltaBuilder().changed(fooProject1,
F_CONTENT).getDelta(), listener.delta);
assertNull(listener.delta.hResourceDeltas());
ElementDelta projectDelta = listener.delta.hDeltaFor(fooProject1);
assertEquals(1, projectDelta.hResourceDeltas().length);
IResourceDelta resourceDelta = projectDelta.hResourceDeltas()[0];
assertEquals(IResourceDelta.REMOVED, resourceDelta.getKind());
assertEquals(aFolder, resourceDelta.getResource());
IFile bFile = fooProject1.getProject().getFile("b");
bFile.touch(null);
assertDelta(newDeltaBuilder().changed(fooProject1,
F_CONTENT).getDelta(), listener.delta);
assertNull(listener.delta.hResourceDeltas());
projectDelta = listener.delta.hDeltaFor(fooProject1);
assertEquals(1, projectDelta.hResourceDeltas().length);
resourceDelta = projectDelta.hResourceDeltas()[0];
assertEquals(IResourceDelta.CHANGED, resourceDelta.getKind());
assertEquals(bFile, resourceDelta.getResource());
IProject simpleProject = setUpProject("SimpleProject");
assertDelta(newDeltaBuilder().changed(fooModel, F_CONTENT).getDelta(),
listener.delta);
assertEquals(1, listener.delta.hResourceDeltas().length);
resourceDelta = listener.delta.hResourceDeltas()[0];
assertEquals(IResourceDelta.ADDED, resourceDelta.getKind());
assertEquals(simpleProject, resourceDelta.getResource());
fooProject2.getProject().close(null);
assertDelta(newDeltaBuilder().removed(fooProject2, F_OPEN).getDelta(),
listener.delta);
fooProject2.getProject().open(null);
assertDelta(newDeltaBuilder().added(fooProject2, F_OPEN).getDelta(),
listener.delta);
fooProject2.getProject().delete(true, null);
assertDelta(newDeltaBuilder().removed(fooProject2).getDelta(),
listener.delta);
IProjectDescription description =
fooProject1.getProject().getDescription();
String[] oldNatures = description.getNatureIds();
description.setNatureIds(new String[0]);
fooProject1.getProject().setDescription(description, null);
assertDelta(newDeltaBuilder().removed(fooProject1,
F_DESCRIPTION).getDelta(), listener.delta);
description.setNatureIds(oldNatures);
fooProject1.getProject().setDescription(description, null);
assertDelta(newDeltaBuilder().added(fooProject1,
F_DESCRIPTION).getDelta(), listener.delta);
IFooProject movedFooProject1 = fooModel.getFooProject("Test");
fooProject1.getProject().move(new Path("Test"), true, null);
assertDelta(newDeltaBuilder().movedTo(movedFooProject1,
fooProject1).movedFrom(fooProject1, movedFooProject1).getDelta(),
listener.delta);
}
private ElementDelta.Builder newDeltaBuilder()
{
return new ElementDelta.Builder(new ElementDelta(fooModel));
}
private static void assertDelta(ElementDelta expected, ElementDelta actual)
{
if (expected == null)
{
assertNull(actual);
return;
}
assertNotNull(actual);
assertEquals(expected.hElement(), actual.hElement());
assertEquals(expected.hKind(), actual.hKind());
assertEquals(expected.hFlags(), actual.hFlags());
assertEquals(expected.hMovedToElement(), actual.hMovedToElement());
assertEquals(expected.hMovedFromElement(), actual.hMovedFromElement());
ElementDelta[] expectedChildren = expected.hAffectedChildren();
ElementDelta[] actualChildren = actual.hAffectedChildren();
assertEquals(expectedChildren.length, actualChildren.length);
for (int i = 0; i < expectedChildren.length; i++)
assertDelta(expectedChildren[i], actualChildren[i]);
}
private static class FooModelListener
implements IElementChangeListener
{
public ElementDelta delta;
@Override
public void elementChanged(IElementChangeEvent event)
{
delta = (ElementDelta)event.getDelta();
}
}
}