/******************************************************************************
 * Copyright (c) 2021 CEA LIST, Artal Technologies
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *  Rengin Battal (ARTAL) - rengin.battal@artal.fr - Initial API and implementation
 *****************************************************************************/
package org.eclipse.papyrus.uml.siriusdiag.clazz.tests.drop.subNodes;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.junit.framework.classification.tests.AbstractPapyrusTest;
import org.eclipse.papyrus.junit.utils.rules.ActiveDiagram;
import org.eclipse.papyrus.junit.utils.rules.PluginResource;
import org.eclipse.papyrus.sirusdiag.junit.utils.rules.SiriusDiagramEditorFixture;
import org.eclipse.papyrus.uml.sirius.clazz.diagram.internal.constants.SemanticDropToolsIds;
import org.eclipse.sirius.diagram.DDiagram;
import org.eclipse.sirius.diagram.model.business.internal.spec.DNodeContainerSpec;
import org.eclipse.sirius.diagram.model.business.internal.spec.DNodeListElementSpec;
import org.eclipse.sirius.diagram.model.business.internal.spec.DNodeListSpec;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.NamedElement;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;

/**
 * adapted from org.eclipse.papyrus.uml.diagram.clazz.test.canonical.TestClassDiagramTopNode
 */
@PluginResource("resources/drop/subNode/propertyOperationToClass/SubNode_PropertyOperationToClass_DropTest.di")
@SuppressWarnings({ "nls", "restriction" })
public class SubNode_OperationToClass_DropTest extends AbstractPapyrusTest {

	private static final String DIAGRAM_NAME = "SubNode_PropertyOperationToClass_ClassDiagram";

	/**
	 * this fixture is used to access to Papyrus environment (editor/diagram/commandstack/editingdomain/...)
	 */
	@Rule
	public final SiriusDiagramEditorFixture fixture = new SiriusDiagramEditorFixture(/* Collections.singletonList("aird") */);

	@Test
	@ActiveDiagram(DIAGRAM_NAME) // open the diagram
	public void createOperationSubNodeTest() {

		Assert.assertTrue(fixture.getModel() instanceof Model);
		DiagramEditPart diagramEditpart = fixture.getActiveDiagram();
		Diagram diagram = diagramEditpart.getDiagramView();

		Object classElement = diagram.getChildren().get(0);
		DNodeContainerSpec classRepresentation = (DNodeContainerSpec) ((View) classElement).getElement();
		DNodeListSpec operationContainer = (DNodeListSpec) classRepresentation.getOwnedDiagramElements().get(0);
		NamedElement elementToBeDropped = ((Class) classRepresentation.getTarget()).getOwnedOperations().get(0);
		DDiagram diagramRepresentation = (DDiagram) diagram.getElement();
		fixture.applyContainerDropDescriptionTool(diagramRepresentation, SemanticDropToolsIds.DROP__OPERATION__TOOL, operationContainer, elementToBeDropped);
		fixture.flushDisplayEvents();

		classElement = diagram.getChildren().get(0);
		classRepresentation = (DNodeContainerSpec) ((View) classElement).getElement();
		DNodeListSpec element = (DNodeListSpec) classRepresentation.getOwnedDiagramElements().get(0);
		Object siriusNewRepresentation = element.getOwnedElements().get(0);
		Assert.assertTrue("The created sirus node must be a DNode", siriusNewRepresentation instanceof DNodeListElementSpec);
		EObject semanticElement = ((DNodeListElementSpec) siriusNewRepresentation).getSemanticElements().iterator().next();
		Assert.assertTrue("The created element must be a UML Operation", semanticElement instanceof org.eclipse.uml2.uml.Operation);
		Class classElem = (Class) classRepresentation.getTarget();
		Assert.assertEquals("The Class must contains one additional Operation after the creation", 1, classElem.getOwnedOperations().size());

		// undo
		fixture.getEditingDomain().getCommandStack().undo();
		fixture.flushDisplayEvents();
		Assert.assertEquals("The class must have no attribut after undoing the Drop action", 0, element.getOwnedElements().size());

		// redo
		fixture.getEditingDomain().getCommandStack().redo();
		fixture.flushDisplayEvents();
		Assert.assertEquals("The diagram children size does not change on dropping a sub node", 1, classElem.getOwnedOperations().size());
		siriusNewRepresentation = element.getOwnedElements().get(0);
		Assert.assertTrue("The created sirus node must be a DNode", siriusNewRepresentation instanceof DNodeListElementSpec);
		semanticElement = ((DNodeListElementSpec) siriusNewRepresentation).getSemanticElements().iterator().next();
		Assert.assertTrue("The created element must be a UML Operation", semanticElement instanceof org.eclipse.uml2.uml.Operation);
		classElem = (Class) classRepresentation.getTarget();
		Assert.assertEquals("The Class must contains one additional Attribut after the Drop action", 1, classElem.getOwnedOperations().size());

	}
}
