/** * <copyright> Copyright (c) 2008-2009 Jonas Helming, Maximilian Koegel. 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 </copyright> */ package org.eclipse.emf.emfstore.client.test.changeTracking.operations; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; import org.eclipse.emf.emfstore.client.model.CompositeOperationHandle; import org.eclipse.emf.emfstore.client.model.exceptions.InvalidHandleException; import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand; import org.eclipse.emf.emfstore.client.test.WorkspaceTest; import org.eclipse.emf.emfstore.client.test.model.document.DocumentFactory; import org.eclipse.emf.emfstore.client.test.model.document.LeafSection; import org.eclipse.emf.emfstore.client.test.model.requirement.RequirementFactory; import org.eclipse.emf.emfstore.client.test.model.requirement.UseCase; import org.eclipse.emf.emfstore.client.test.model.task.ActionItem; import org.eclipse.emf.emfstore.client.test.model.task.TaskFactory; import org.eclipse.emf.emfstore.client.test.model.task.WorkPackage; import org.eclipse.emf.emfstore.common.model.ModelElementId; import org.eclipse.emf.emfstore.common.model.Project; import org.eclipse.emf.emfstore.common.model.util.ModelUtil; import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation; import org.eclipse.emf.emfstore.server.model.versioning.operations.CompositeOperation; import org.junit.Test; /** * Tests the comnposite operation recording. * * @author koegel */ public class CompositeOperationTest extends WorkspaceTest { /** * Test the creation and completion of a composite operation. */ @Test public void createSmallComposite() { final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); new EMFStoreCommand() { @Override protected void doRun() { getProject().addModelElement(section); section.setName("Name"); section.setDescription("Description"); assertEquals(true, getProject().containsInstance(section)); assertEquals("Name", section.getName()); assertEquals("Description", section.getDescription()); assertEquals(0, section.getModelElements().size()); clearOperations(); } }.run(false); final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase(); new EMFStoreCommand() { @Override protected void doRun() { CompositeOperationHandle handle = getProjectSpace().beginCompositeOperation(); section.setName("newName"); section.setDescription("newDescription"); section.getModelElements().add(useCase); assertEquals(true, getProject().containsInstance(useCase)); assertEquals(getProject(), ModelUtil.getProject(useCase)); assertEquals(useCase, section.getModelElements().iterator().next()); assertEquals("newName", section.getName()); assertEquals("newDescription", section.getDescription()); ModelElementId sectionId = ModelUtil.getProject(section).getModelElementId(section); try { handle.end("sectionCreation", "description", sectionId); } catch (InvalidHandleException e) { fail(); } } }.run(false); assertEquals(true, getProject().containsInstance(useCase)); assertEquals(getProject(), ModelUtil.getProject(useCase)); assertEquals(useCase, section.getModelElements().iterator().next()); assertEquals("newName", section.getName()); assertEquals("newDescription", section.getDescription()); assertEquals(1, getProjectSpace().getOperations().size()); AbstractOperation operation = getProjectSpace().getOperations().iterator().next(); assertEquals(true, operation instanceof CompositeOperation); CompositeOperation compositeOperation = (CompositeOperation) operation; assertEquals(4, compositeOperation.getSubOperations().size()); } /** * Test the creation and abort of a composite operation. * * @throws InvalidHandleException if the test fails * @throws IOException */ @Test public void abortSmallComposite() throws InvalidHandleException, IOException { final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); new EMFStoreCommand() { @Override protected void doRun() { getProject().addModelElement(section); section.setName("Name"); section.setDescription("Description"); assertEquals(true, getProject().containsInstance(section)); assertEquals("Name", section.getName()); assertEquals("Description", section.getDescription()); assertEquals(0, section.getModelElements().size()); clearOperations(); } }.run(false); final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase(); new EMFStoreCommand() { @Override protected void doRun() { CompositeOperationHandle handle = getProjectSpace().beginCompositeOperation(); section.setName("newName"); section.setDescription("newDescription"); section.getModelElements().add(useCase); assertEquals(true, getProject().containsInstance(useCase)); assertEquals(getProject(), ModelUtil.getProject(useCase)); assertEquals(useCase, section.getModelElements().iterator().next()); assertEquals("newName", section.getName()); assertEquals("newDescription", section.getDescription()); try { handle.abort(); } catch (InvalidHandleException e) { fail(); } } }.run(false); assertEquals(true, getProject().containsInstance(section)); assertEquals("Name", section.getName()); assertEquals("Description", section.getDescription()); assertEquals(0, section.getModelElements().size()); assertEquals(false, getProject().containsInstance(useCase)); assertEquals(0, getProjectSpace().getOperations().size()); Project loadedProject = ModelUtil.loadEObjectFromResource( org.eclipse.emf.emfstore.common.model.ModelFactory.eINSTANCE.getModelPackage().getProject(), getProject() .eResource().getURI(), false); assertTrue(ModelUtil.areEqual(loadedProject, getProject())); assertEquals(false, getProject().containsInstance(useCase)); assertEquals(true, getProject().containsInstance(section)); } /** * Test the creation and abort of a composite operation after some elements have been added. Check if the abort * reverses the last operation. */ @Test public void beginAndAbortEmptyCompositeAfterSimpleOperation() { new EMFStoreCommand() { @Override protected void doRun() { clearOperations(); cleanProjectSpace(); final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); final WorkPackage workPackage = TaskFactory.eINSTANCE.createWorkPackage(); final ActionItem actionItem = TaskFactory.eINSTANCE.createActionItem(); getProject().addModelElement(section); getProject().addModelElement(workPackage); getProject().addModelElement(actionItem); actionItem.setContainingWorkpackage(workPackage); CompositeOperationHandle compositeOperationHandle = getProjectSpace().beginCompositeOperation(); try { compositeOperationHandle.abort(); } catch (InvalidHandleException e) { throw new IllegalStateException(e); } assertEquals(workPackage, actionItem.getContainingWorkpackage()); } }.run(false); } /** * Test the creation and abort of a composite operation. */ @Test public void beginAndAbortEmptyComposite() { new EMFStoreCommand() { @Override protected void doRun() { clearOperations(); cleanProjectSpace(); CompositeOperationHandle compositeOperationHandle = getProjectSpace().beginCompositeOperation(); try { compositeOperationHandle.abort(); compositeOperationHandle = getProjectSpace().beginCompositeOperation(); compositeOperationHandle.abort(); compositeOperationHandle = getProjectSpace().beginCompositeOperation(); compositeOperationHandle.abort(); } catch (InvalidHandleException e) { fail(); } } }.run(false); } }