/*
 * Copyright (c) 2018 CEA, 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:
 *   Eike Stepper - initial API and implementation
 */
package org.eclipse.uml2.uml.cdo.tests.compliance;

import org.eclipse.emf.common.util.EList;

import org.eclipse.emf.ecore.EAnnotation;

import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.Actor;
import org.eclipse.uml2.uml.Artifact;
import org.eclipse.uml2.uml.Association;
import org.eclipse.uml2.uml.AssociationClass;
import org.eclipse.uml2.uml.ClassifierTemplateParameter;
import org.eclipse.uml2.uml.Collaboration;
import org.eclipse.uml2.uml.Comment;
import org.eclipse.uml2.uml.CommunicationPath;
import org.eclipse.uml2.uml.Component;
import org.eclipse.uml2.uml.DataType;
import org.eclipse.uml2.uml.DeploymentSpecification;
import org.eclipse.uml2.uml.Device;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Enumeration;
import org.eclipse.uml2.uml.ExecutionEnvironment;
import org.eclipse.uml2.uml.Extension;
import org.eclipse.uml2.uml.FunctionBehavior;
import org.eclipse.uml2.uml.InformationItem;
import org.eclipse.uml2.uml.Interaction;
import org.eclipse.uml2.uml.Interface;
import org.eclipse.uml2.uml.Node;
import org.eclipse.uml2.uml.OpaqueBehavior;
import org.eclipse.uml2.uml.PrimitiveType;
import org.eclipse.uml2.uml.ProtocolStateMachine;
import org.eclipse.uml2.uml.RedefinableTemplateSignature;
import org.eclipse.uml2.uml.Signal;
import org.eclipse.uml2.uml.StateMachine;
import org.eclipse.uml2.uml.Stereotype;
import org.eclipse.uml2.uml.TemplateSignature;
import org.eclipse.uml2.uml.UseCase;

/**
 * @author Eike Stepper
 */
public class ClassifierTemplateParameterTest
		extends _Abstract_Compliance_Test_ {

	public void testEAnnotations() {
		ClassifierTemplateParameter classifierTemplateParameter = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter);

		EAnnotation eAnnotation = ECORE.createEAnnotation();
		assertValid(eAnnotation);
		classifierTemplateParameter.getEAnnotations().add(eAnnotation);
	}

	public void testOwnedComment() {
		ClassifierTemplateParameter classifierTemplateParameter = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter);

		Comment comment = UML.createComment();
		assertValid(comment);
		classifierTemplateParameter.getOwnedComments().add(comment);
		assertSuperset(
			classifierTemplateParameter.getOwnedElements().contains(comment));
	}

	public void testOwnedElement() {
		ClassifierTemplateParameter classifierTemplateParameter = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter);
		EList<Element> elements = classifierTemplateParameter
			.getOwnedElements();
		EList<Element> elements2 = classifierTemplateParameter
			.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testParameteredElement() {
		ClassifierTemplateParameter classifierTemplateParameter = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter);

		FunctionBehavior functionBehavior = UML.createFunctionBehavior();
		assertValid(functionBehavior);
		classifierTemplateParameter.setParameteredElement(functionBehavior);

		Activity activity = UML.createActivity();
		assertValid(activity);
		classifierTemplateParameter.setParameteredElement(activity);

		ClassifierTemplateParameter classifierTemplateParameter2 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter2);

		Interface interface_ = UML.createInterface();
		assertValid(interface_);
		classifierTemplateParameter2.setParameteredElement(interface_);

		InformationItem informationItem = UML.createInformationItem();
		assertValid(informationItem);
		classifierTemplateParameter2.setParameteredElement(informationItem);

		ClassifierTemplateParameter classifierTemplateParameter3 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter3);

		CommunicationPath communicationPath = UML.createCommunicationPath();
		assertValid(communicationPath);
		classifierTemplateParameter3.setParameteredElement(communicationPath);

		ExecutionEnvironment executionEnvironment = UML
			.createExecutionEnvironment();
		assertValid(executionEnvironment);
		classifierTemplateParameter3
			.setParameteredElement(executionEnvironment);

		ClassifierTemplateParameter classifierTemplateParameter4 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter4);

		Component component = UML.createComponent();
		assertValid(component);
		classifierTemplateParameter4.setParameteredElement(component);

		Interaction interaction = UML.createInteraction();
		assertValid(interaction);
		classifierTemplateParameter4.setParameteredElement(interaction);

		ClassifierTemplateParameter classifierTemplateParameter5 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter5);

		DeploymentSpecification deploymentSpecification = UML
			.createDeploymentSpecification();
		assertValid(deploymentSpecification);
		classifierTemplateParameter5
			.setParameteredElement(deploymentSpecification);

		OpaqueBehavior opaqueBehavior = UML.createOpaqueBehavior();
		assertValid(opaqueBehavior);
		classifierTemplateParameter5.setParameteredElement(opaqueBehavior);

		ClassifierTemplateParameter classifierTemplateParameter6 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter6);

		Association association = UML.createAssociation();
		assertValid(association);
		classifierTemplateParameter6.setParameteredElement(association);

		DataType dataType = UML.createDataType();
		assertValid(dataType);
		classifierTemplateParameter6.setParameteredElement(dataType);

		ClassifierTemplateParameter classifierTemplateParameter7 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter7);

		Device device = UML.createDevice();
		assertValid(device);
		classifierTemplateParameter7.setParameteredElement(device);

		Extension extension = UML.createExtension();
		assertValid(extension);
		classifierTemplateParameter7.setParameteredElement(extension);

		ClassifierTemplateParameter classifierTemplateParameter8 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter8);

		AssociationClass associationClass = UML.createAssociationClass();
		assertValid(associationClass);
		classifierTemplateParameter8.setParameteredElement(associationClass);

		org.eclipse.uml2.uml.Class class_ = UML.createClass();
		assertValid(class_);
		classifierTemplateParameter8.setParameteredElement(class_);

		ClassifierTemplateParameter classifierTemplateParameter9 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter9);

		Enumeration enumeration = UML.createEnumeration();
		assertValid(enumeration);
		classifierTemplateParameter9.setParameteredElement(enumeration);

		PrimitiveType primitiveType = UML.createPrimitiveType();
		assertValid(primitiveType);
		classifierTemplateParameter9.setParameteredElement(primitiveType);

		ClassifierTemplateParameter classifierTemplateParameter10 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter10);

		Actor actor = UML.createActor();
		assertValid(actor);
		classifierTemplateParameter10.setParameteredElement(actor);

		ProtocolStateMachine protocolStateMachine = UML
			.createProtocolStateMachine();
		assertValid(protocolStateMachine);
		classifierTemplateParameter10
			.setParameteredElement(protocolStateMachine);

		ClassifierTemplateParameter classifierTemplateParameter11 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter11);

		UseCase useCase = UML.createUseCase();
		assertValid(useCase);
		classifierTemplateParameter11.setParameteredElement(useCase);

		Signal signal = UML.createSignal();
		assertValid(signal);
		classifierTemplateParameter11.setParameteredElement(signal);

		ClassifierTemplateParameter classifierTemplateParameter12 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter12);

		Node node = UML.createNode();
		assertValid(node);
		classifierTemplateParameter12.setParameteredElement(node);

		Stereotype stereotype = UML.createStereotype();
		assertValid(stereotype);
		classifierTemplateParameter12.setParameteredElement(stereotype);

		ClassifierTemplateParameter classifierTemplateParameter13 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter13);

		StateMachine stateMachine = UML.createStateMachine();
		assertValid(stateMachine);
		classifierTemplateParameter13.setParameteredElement(stateMachine);

		Artifact artifact = UML.createArtifact();
		assertValid(artifact);
		classifierTemplateParameter13.setParameteredElement(artifact);

		ClassifierTemplateParameter classifierTemplateParameter14 = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter14);

		Collaboration collaboration = UML.createCollaboration();
		assertValid(collaboration);
		classifierTemplateParameter14.setParameteredElement(collaboration);
	}

	public void testSignature() {
		ClassifierTemplateParameter classifierTemplateParameter = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter);

		TemplateSignature templateSignature = UML.createTemplateSignature();
		assertValid(templateSignature);
		classifierTemplateParameter.setSignature(templateSignature);
		assertSuperset(
			classifierTemplateParameter.getOwner() == templateSignature);

		RedefinableTemplateSignature redefinableTemplateSignature = UML
			.createRedefinableTemplateSignature();
		assertValid(redefinableTemplateSignature);
		classifierTemplateParameter.setSignature(redefinableTemplateSignature);
		assertSuperset(classifierTemplateParameter
			.getOwner() == redefinableTemplateSignature);
	}

	public void testConstrainingClassifier() {
		ClassifierTemplateParameter classifierTemplateParameter = UML
			.createClassifierTemplateParameter();
		assertValid(classifierTemplateParameter);

		FunctionBehavior functionBehavior = UML.createFunctionBehavior();
		assertValid(functionBehavior);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(functionBehavior);

		Activity activity = UML.createActivity();
		assertValid(activity);
		classifierTemplateParameter.getConstrainingClassifiers().add(activity);

		Interface interface_ = UML.createInterface();
		assertValid(interface_);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(interface_);

		InformationItem informationItem = UML.createInformationItem();
		assertValid(informationItem);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(informationItem);

		CommunicationPath communicationPath = UML.createCommunicationPath();
		assertValid(communicationPath);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(communicationPath);

		ExecutionEnvironment executionEnvironment = UML
			.createExecutionEnvironment();
		assertValid(executionEnvironment);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(executionEnvironment);

		Component component = UML.createComponent();
		assertValid(component);
		classifierTemplateParameter.getConstrainingClassifiers().add(component);

		Interaction interaction = UML.createInteraction();
		assertValid(interaction);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(interaction);

		DeploymentSpecification deploymentSpecification = UML
			.createDeploymentSpecification();
		assertValid(deploymentSpecification);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(deploymentSpecification);

		OpaqueBehavior opaqueBehavior = UML.createOpaqueBehavior();
		assertValid(opaqueBehavior);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(opaqueBehavior);

		Association association = UML.createAssociation();
		assertValid(association);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(association);

		DataType dataType = UML.createDataType();
		assertValid(dataType);
		classifierTemplateParameter.getConstrainingClassifiers().add(dataType);

		Device device = UML.createDevice();
		assertValid(device);
		classifierTemplateParameter.getConstrainingClassifiers().add(device);

		Extension extension = UML.createExtension();
		assertValid(extension);
		classifierTemplateParameter.getConstrainingClassifiers().add(extension);

		AssociationClass associationClass = UML.createAssociationClass();
		assertValid(associationClass);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(associationClass);

		org.eclipse.uml2.uml.Class class_ = UML.createClass();
		assertValid(class_);
		classifierTemplateParameter.getConstrainingClassifiers().add(class_);

		Enumeration enumeration = UML.createEnumeration();
		assertValid(enumeration);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(enumeration);

		PrimitiveType primitiveType = UML.createPrimitiveType();
		assertValid(primitiveType);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(primitiveType);

		Actor actor = UML.createActor();
		assertValid(actor);
		classifierTemplateParameter.getConstrainingClassifiers().add(actor);

		ProtocolStateMachine protocolStateMachine = UML
			.createProtocolStateMachine();
		assertValid(protocolStateMachine);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(protocolStateMachine);

		UseCase useCase = UML.createUseCase();
		assertValid(useCase);
		classifierTemplateParameter.getConstrainingClassifiers().add(useCase);

		Signal signal = UML.createSignal();
		assertValid(signal);
		classifierTemplateParameter.getConstrainingClassifiers().add(signal);

		Node node = UML.createNode();
		assertValid(node);
		classifierTemplateParameter.getConstrainingClassifiers().add(node);

		Stereotype stereotype = UML.createStereotype();
		assertValid(stereotype);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(stereotype);

		StateMachine stateMachine = UML.createStateMachine();
		assertValid(stateMachine);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(stateMachine);

		Artifact artifact = UML.createArtifact();
		assertValid(artifact);
		classifierTemplateParameter.getConstrainingClassifiers().add(artifact);

		Collaboration collaboration = UML.createCollaboration();
		assertValid(collaboration);
		classifierTemplateParameter.getConstrainingClassifiers()
			.add(collaboration);
	}

}
