Bug 324859 - Need Undo/Redo support for Non-EMF based domain objects
diff --git a/tests/org.eclipse.graphiti.ui.tests/src/org/eclipse/graphiti/ui/tests/AllTests.java b/tests/org.eclipse.graphiti.ui.tests/src/org/eclipse/graphiti/ui/tests/AllTests.java
index 0cdf0f9..7bb738c 100644
--- a/tests/org.eclipse.graphiti.ui.tests/src/org/eclipse/graphiti/ui/tests/AllTests.java
+++ b/tests/org.eclipse.graphiti.ui.tests/src/org/eclipse/graphiti/ui/tests/AllTests.java
@@ -1,7 +1,7 @@
 /*******************************************************************************
  * <copyright>
  *
- * Copyright (c) 2005, 2010 SAP AG.
+ * Copyright (c) 2005, 2011 SAP AG.
  * 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
@@ -9,6 +9,7 @@
  *
  * Contributors:
  *    SAP AG - initial API, implementation and documentation
+ *    mwenz - Bug 324859 - Need Undo/Redo support for Non-EMF based domain objects
  *
  * </copyright>
  *
@@ -19,7 +20,7 @@
 import org.junit.runners.Suite;
 
 @RunWith(Suite.class)
-@Suite.SuiteClasses({ PackageTest.class, CommandStackTest.class, MigrationServiceTest.class })
+@Suite.SuiteClasses({ PackageTest.class, CommandStackTest.class, MigrationServiceTest.class, CustomUndoableFeatureTest.class })
 public class AllTests {
 
 }
diff --git a/tests/org.eclipse.graphiti.ui.tests/src/org/eclipse/graphiti/ui/tests/CustomUndoableFeatureTest.java b/tests/org.eclipse.graphiti.ui.tests/src/org/eclipse/graphiti/ui/tests/CustomUndoableFeatureTest.java
new file mode 100644
index 0000000..61c540f
--- /dev/null
+++ b/tests/org.eclipse.graphiti.ui.tests/src/org/eclipse/graphiti/ui/tests/CustomUndoableFeatureTest.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * <copyright>
+ *
+ * Copyright (c) 2005, 2010 SAP AG.
+ * 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:
+ *    mwenz - Bug 324859 - initial API, implementation and documentation
+ *
+ * </copyright>
+ *
+ *******************************************************************************/
+package org.eclipse.graphiti.ui.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.easymock.EasyMock;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.graphiti.dt.IDiagramTypeProvider;
+import org.eclipse.graphiti.features.ICustomUndoableFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IContext;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
+import org.eclipse.graphiti.internal.command.CommandContainer;
+import org.eclipse.graphiti.internal.command.GenericFeatureCommandWithContext;
+import org.eclipse.graphiti.tb.IToolBehaviorProvider;
+import org.eclipse.graphiti.tests.reuse.GFAbstractTestCase;
+import org.eclipse.graphiti.ui.editor.DiagramEditorFactory;
+import org.eclipse.graphiti.ui.internal.command.GefCommandWrapper;
+import org.eclipse.graphiti.ui.internal.config.IConfigurationProvider;
+import org.eclipse.graphiti.ui.internal.editor.GFCommandStack;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ *
+ */
+@SuppressWarnings("restriction")
+public class CustomUndoableFeatureTest extends GFAbstractTestCase {
+
+	@BeforeClass
+	public static void prepareClass() {
+	}
+
+	@Before
+	public void initializeTest() {
+	}
+
+	@Test
+	public void testPositive() {
+		TransactionalEditingDomain editingDomain = DiagramEditorFactory.createResourceSetAndEditingDomain();
+		IToolBehaviorProvider toolBehaviorProvider = EasyMock.createNiceMock(IToolBehaviorProvider.class);
+		EasyMock.replay(toolBehaviorProvider);
+
+		IDiagramTypeProvider diagramTypeProvider = EasyMock.createNiceMock(IDiagramTypeProvider.class);
+		IFeatureProvider featureProvider = EasyMock.createNiceMock(IFeatureProvider.class);
+		EasyMock.replay(featureProvider);
+
+		EasyMock.expect(diagramTypeProvider.getCurrentToolBehaviorProvider()).andReturn(toolBehaviorProvider).anyTimes();
+		EasyMock.replay(diagramTypeProvider);
+
+		IConfigurationProvider configurationProvider = EasyMock.createNiceMock(IConfigurationProvider.class);
+		EasyMock.expect(configurationProvider.getDiagramTypeProvider()).andReturn(diagramTypeProvider).anyTimes();
+		EasyMock.replay(configurationProvider);
+		GFCommandStack commandStack = new GFCommandStack(configurationProvider, editingDomain);
+
+		ICustomContext context = EasyMock.createNiceMock(ICustomContext.class);
+		EasyMock.replay(context);
+
+		TestCustomFeature feature = new TestCustomFeature(featureProvider);
+		GenericFeatureCommandWithContext featureCommand = new GenericFeatureCommandWithContext(feature, context);
+
+		CommandContainer commandContainer = new CommandContainer(featureProvider);
+		commandContainer.add(featureCommand);
+
+		GefCommandWrapper commandWrapper = new GefCommandWrapper(commandContainer, editingDomain);
+		commandStack.execute(commandWrapper);
+
+		// Check that feature can be undone
+		assertTrue("Executed command must be undoable", commandStack.canUndo());
+
+		// Check that undo is called
+		commandStack.undo();
+		assertTrue("Undo() must have been called", feature.undoCalled);
+
+		// Check that feature can be redone
+		assertTrue("Executed command must be redoable", commandStack.canRedo());
+
+		// Check that redo is called
+		commandStack.redo();
+		assertTrue("Redo() must have been called", feature.redoCalled);
+	}
+
+	private class TestCustomFeature extends AbstractCustomFeature implements ICustomUndoableFeature {
+
+		public boolean undoCalled = false;
+		public boolean redoCalled = false;
+		private ICustomContext context = null;
+
+		public TestCustomFeature(IFeatureProvider fp) {
+			super(fp);
+		}
+
+		@Override
+		public boolean canExecute(ICustomContext context) {
+			return true;
+		}
+
+		@Override
+		public void execute(ICustomContext context) {
+			// Do nothing
+			this.context = context;
+		}
+
+		@Override
+		public boolean canUndo(IContext context) {
+			return true;
+		}
+
+		@Override
+		public void undo(IContext context) {
+			undoCalled = true;
+			assertEquals("Context object must be the same as in execute", this.context, context);
+		}
+
+		@Override
+		public boolean canRedo(IContext context) {
+			return true;
+		}
+
+		@Override
+		public void redo(IContext context) {
+			redoCalled = true;
+			assertEquals("Context object must be the same as in execute", this.context, context);
+		}
+	}
+}