/*******************************************************************************
 * Copyright (c) 2010 protos software gmbh (http://www.protos.de).
 * 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:
 * 		Thomas Schuetz and Henrik Rentz-Reichert (initial contribution)
 * 
 *******************************************************************************/

package org.eclipse.etrice.ui.structure.commands;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.net.URL;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.ActorRef;
import org.eclipse.etrice.core.room.Binding;
import org.eclipse.etrice.core.room.Port;
import org.eclipse.etrice.tests.base.TestBase;
import org.eclipse.etrice.ui.structure.DiagramAccess;
import org.eclipse.etrice.ui.structure.StructureTestActivator;
import org.eclipse.etrice.ui.structure.support.ActorContainerRefSupport;
import org.eclipse.etrice.ui.structure.support.BindingSupport;
import org.eclipse.etrice.ui.structure.support.DiagramUtil;
import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
import org.eclipse.graphiti.mm.algorithms.Rectangle;
import org.eclipse.graphiti.mm.algorithms.Text;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.mm.pictograms.Shape;
import org.eclipse.graphiti.services.Graphiti;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Unit test for the structure of an actor class with inheritance
 *
 * @author Henrik Rentz-Reichert initial contribution and API
 */
public class TestActorClassWithInheritance extends TestBase {

	private ActorClass ac = null;

	@Before
	public void setUp() {
		loadModelFile();

		assertEquals("models read", 1, getModels().size());
		assertEquals("actor classes in our model", 3, getModels().get(0).getActorClasses().size());

		for (ActorClass a : getModels().get(0).getActorClasses()) {
			if (a.getName().equals("MyActorClass")) {
				ac = a;
				break;
			}
		}
		assertNotNull("ActorClass expected", ac);
	}
	
	@After
	public void tearDown() {
		removeDiagramsDirectory();
	}
	
	@Override
	protected String getModelFileName() {
		return "ActorClassWithInheritance.room";
	}
	
	@Test
	public void checkReferences() {
		Diagram diagram = new DiagramAccess().getDiagram(ac);
		ContainerShape shape = (ContainerShape) diagram.getChildren().get(0);
		EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(shape);
		assertTrue("bo is ActorClass", bo instanceof ActorClass);
		
		// re-assign this because the old Java object is another instance since it comes from another resource
		ac = (ActorClass) bo;
		
		assertEquals("actor class child shapes", 8, shape.getChildren().size());

		int nRefs = 0;
		for (Shape childShape : shape.getChildren()) {
			EObject[] bos = Graphiti.getLinkService()
					.getAllBusinessObjectsForLinkedPictogramElement(childShape);
			assertEquals("business objects", 1, bos.length);
			if (!(bos[0] instanceof Port)) {
				assertTrue("bo is actor ref", bos[0] instanceof ActorRef);
				nRefs++;
				
				ActorRef ar = (ActorRef) bos[0];
				boolean inherited = (ar.eContainer()!=ac);
					
				assertNotNull("ga is there (invisible rectangle)", childShape.getGraphicsAlgorithm());
				assertTrue("ga is rectangle", childShape.getGraphicsAlgorithm() instanceof Rectangle);
				assertFalse("ga is invisible", childShape.getGraphicsAlgorithm().getFilled());
				assertFalse("ga is invisible", childShape.getGraphicsAlgorithm().getLineVisible());
				GraphicsAlgorithm borderRect = (GraphicsAlgorithm) DiagramUtil.findProp(childShape.getGraphicsAlgorithm().getGraphicsAlgorithmChildren(),
						ActorContainerRefSupport.GRAPHIC_ITEM_KEY, ActorContainerRefSupport.MAIN_BORDER);
				assertNotNull("borderRect", borderRect);
				if (inherited)
					assertTrue("border rect foreground", isEqual(borderRect.getForeground(), ActorContainerRefSupport.INHERITED_COLOR));
				else
					assertTrue("border rect background", isEqual(borderRect.getForeground(), ActorContainerRefSupport.LINE_COLOR));
				
				// ports of actor refs
				assertEquals("grand child shapes", 4, ((ContainerShape)childShape).getChildren().size());
				for (Shape grandChildShape : ((ContainerShape)childShape).getChildren()) {
					// skip the actor ref label
					if (grandChildShape.getGraphicsAlgorithm() instanceof Text)
						continue;
					
					bos = Graphiti.getLinkService()
						.getAllBusinessObjectsForLinkedPictogramElement(grandChildShape);
					assertEquals("business objects", 1, bos.length);
					assertTrue("bo is port", bos[0] instanceof Port);
				}
			}
		}
		assertEquals("number of actor references", 3, nRefs);
	}

	@Test
	public void checkBindings() {
		Diagram diagram = new DiagramAccess().getDiagram(ac);
		ContainerShape shape = (ContainerShape) diagram.getChildren().get(0);
		EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(shape);
		assertTrue("bo is ActorClass", bo instanceof ActorClass);
		
		// re-assign this because the old Java object is another instance since it comes from another resource
		ac = (ActorClass) bo;

		assertEquals("bindings", 4, diagram.getConnections().size());
		
		for (Connection conn : diagram.getConnections()) {
			EObject[] bos = Graphiti.getLinkService().getAllBusinessObjectsForLinkedPictogramElement(conn);
			assertEquals("business objects", 1, bos.length);
			assertTrue("binding", bos[0] instanceof Binding);
			
			Binding b = (Binding) bos[0];
			boolean inherited = (b.eContainer()!=ac);
			
			if (inherited)
				assertTrue("border rect background", isEqual(conn.getGraphicsAlgorithm().getForeground(), BindingSupport.INHERITED_COLOR));
			else
				assertTrue("border rect background", isEqual(conn.getGraphicsAlgorithm().getForeground(), BindingSupport.LINE_COLOR));
			
			// the first port is part of the only MyActor instance
			List<PictogramElement> pes = Graphiti.getLinkService().getPictogramElements(diagram, b.getEndpoint1().getPort());
			assertEquals("instances of first port", 1, pes.size());
			
			// the second port is part of SubActor which has three instances
			pes = Graphiti.getLinkService().getPictogramElements(diagram, b.getEndpoint2().getPort());
			assertEquals("instances of second port", 3, pes.size());
			assertNull("first ref", b.getEndpoint1().getActorRef());

			// the second ref is represented once in the diagram
			assertNotNull("second ref", b.getEndpoint2().getActorRef());
			pes = Graphiti.getLinkService().getPictogramElements(diagram, ((ActorRef)b.getEndpoint2().getActorRef()));
			assertEquals("instances of second ref", 1, pes.size());
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.etrice.tests.base.TestBase#getModelsDirectoy()
	 */
	@Override
	protected URL getModelsDirectoy() {
		return StructureTestActivator.getInstance().getBundle().getEntry("models");
	}

}
