/*
 * 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.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.Dependency;
import org.eclipse.uml2.uml.DeploymentSpecification;
import org.eclipse.uml2.uml.Device;
import org.eclipse.uml2.uml.Duration;
import org.eclipse.uml2.uml.DurationInterval;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Enumeration;
import org.eclipse.uml2.uml.ExecutionEnvironment;
import org.eclipse.uml2.uml.Expression;
import org.eclipse.uml2.uml.Extension;
import org.eclipse.uml2.uml.FunctionBehavior;
import org.eclipse.uml2.uml.InformationItem;
import org.eclipse.uml2.uml.InstanceValue;
import org.eclipse.uml2.uml.Interaction;
import org.eclipse.uml2.uml.Interface;
import org.eclipse.uml2.uml.Interval;
import org.eclipse.uml2.uml.LiteralBoolean;
import org.eclipse.uml2.uml.LiteralInteger;
import org.eclipse.uml2.uml.LiteralNull;
import org.eclipse.uml2.uml.LiteralReal;
import org.eclipse.uml2.uml.LiteralString;
import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
import org.eclipse.uml2.uml.Node;
import org.eclipse.uml2.uml.OpaqueBehavior;
import org.eclipse.uml2.uml.OpaqueExpression;
import org.eclipse.uml2.uml.PrimitiveType;
import org.eclipse.uml2.uml.ProtocolStateMachine;
import org.eclipse.uml2.uml.Signal;
import org.eclipse.uml2.uml.StateMachine;
import org.eclipse.uml2.uml.Stereotype;
import org.eclipse.uml2.uml.StringExpression;
import org.eclipse.uml2.uml.TemplateParameter;
import org.eclipse.uml2.uml.TimeExpression;
import org.eclipse.uml2.uml.TimeInterval;
import org.eclipse.uml2.uml.UseCase;

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

	public void testEAnnotations() {
		Expression expression = UML.createExpression();
		assertValid(expression);

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

	public void testOwnedComment() {
		Expression expression = UML.createExpression();
		assertValid(expression);

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

	public void testOwnedElement() {
		Expression expression = UML.createExpression();
		assertValid(expression);
		EList<Element> elements = expression.getOwnedElements();
		EList<Element> elements2 = expression.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		Expression expression = UML.createExpression();
		assertValid(expression);
		EList<Dependency> dependencys = expression.getClientDependencies();
		EList<Dependency> dependencys2 = expression.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		Expression expression = UML.createExpression();
		assertValid(expression);

		StringExpression stringExpression = UML.createStringExpression();
		assertValid(stringExpression);
		expression.setNameExpression(stringExpression);
		assertSuperset(
			expression.getOwnedElements().contains(stringExpression));
	}

	public void testOwningTemplateParameter() {
		Expression expression = UML.createExpression();
		assertValid(expression);

		TemplateParameter templateParameter = UML.createTemplateParameter();
		assertValid(templateParameter);
		expression.setOwningTemplateParameter(templateParameter);
		assertSuperset(expression.getOwner() == templateParameter);
		assertSuperset(expression.getTemplateParameter() == templateParameter);
	}

	public void testTemplateParameter() {
		Expression expression = UML.createExpression();
		assertValid(expression);

		TemplateParameter templateParameter = UML.createTemplateParameter();
		assertValid(templateParameter);
		expression.setTemplateParameter(templateParameter);
	}

	public void testType() {
		Expression expression = UML.createExpression();
		assertValid(expression);

		FunctionBehavior functionBehavior = UML.createFunctionBehavior();
		assertValid(functionBehavior);
		expression.setType(functionBehavior);

		Activity activity = UML.createActivity();
		assertValid(activity);
		expression.setType(activity);

		Expression expression2 = UML.createExpression();
		assertValid(expression2);

		Interface interface_ = UML.createInterface();
		assertValid(interface_);
		expression2.setType(interface_);

		InformationItem informationItem = UML.createInformationItem();
		assertValid(informationItem);
		expression2.setType(informationItem);

		Expression expression3 = UML.createExpression();
		assertValid(expression3);

		CommunicationPath communicationPath = UML.createCommunicationPath();
		assertValid(communicationPath);
		expression3.setType(communicationPath);

		ExecutionEnvironment executionEnvironment = UML
			.createExecutionEnvironment();
		assertValid(executionEnvironment);
		expression3.setType(executionEnvironment);

		Expression expression4 = UML.createExpression();
		assertValid(expression4);

		Component component = UML.createComponent();
		assertValid(component);
		expression4.setType(component);

		Interaction interaction = UML.createInteraction();
		assertValid(interaction);
		expression4.setType(interaction);

		Expression expression5 = UML.createExpression();
		assertValid(expression5);

		DeploymentSpecification deploymentSpecification = UML
			.createDeploymentSpecification();
		assertValid(deploymentSpecification);
		expression5.setType(deploymentSpecification);

		OpaqueBehavior opaqueBehavior = UML.createOpaqueBehavior();
		assertValid(opaqueBehavior);
		expression5.setType(opaqueBehavior);

		Expression expression6 = UML.createExpression();
		assertValid(expression6);

		Association association = UML.createAssociation();
		assertValid(association);
		expression6.setType(association);

		DataType dataType = UML.createDataType();
		assertValid(dataType);
		expression6.setType(dataType);

		Expression expression7 = UML.createExpression();
		assertValid(expression7);

		Device device = UML.createDevice();
		assertValid(device);
		expression7.setType(device);

		Extension extension = UML.createExtension();
		assertValid(extension);
		expression7.setType(extension);

		Expression expression8 = UML.createExpression();
		assertValid(expression8);

		AssociationClass associationClass = UML.createAssociationClass();
		assertValid(associationClass);
		expression8.setType(associationClass);

		org.eclipse.uml2.uml.Class class_ = UML.createClass();
		assertValid(class_);
		expression8.setType(class_);

		Expression expression9 = UML.createExpression();
		assertValid(expression9);

		Enumeration enumeration = UML.createEnumeration();
		assertValid(enumeration);
		expression9.setType(enumeration);

		PrimitiveType primitiveType = UML.createPrimitiveType();
		assertValid(primitiveType);
		expression9.setType(primitiveType);

		Expression expression10 = UML.createExpression();
		assertValid(expression10);

		Actor actor = UML.createActor();
		assertValid(actor);
		expression10.setType(actor);

		ProtocolStateMachine protocolStateMachine = UML
			.createProtocolStateMachine();
		assertValid(protocolStateMachine);
		expression10.setType(protocolStateMachine);

		Expression expression11 = UML.createExpression();
		assertValid(expression11);

		UseCase useCase = UML.createUseCase();
		assertValid(useCase);
		expression11.setType(useCase);

		Signal signal = UML.createSignal();
		assertValid(signal);
		expression11.setType(signal);

		Expression expression12 = UML.createExpression();
		assertValid(expression12);

		Node node = UML.createNode();
		assertValid(node);
		expression12.setType(node);

		Stereotype stereotype = UML.createStereotype();
		assertValid(stereotype);
		expression12.setType(stereotype);

		Expression expression13 = UML.createExpression();
		assertValid(expression13);

		StateMachine stateMachine = UML.createStateMachine();
		assertValid(stateMachine);
		expression13.setType(stateMachine);

		Artifact artifact = UML.createArtifact();
		assertValid(artifact);
		expression13.setType(artifact);

		Expression expression14 = UML.createExpression();
		assertValid(expression14);

		Collaboration collaboration = UML.createCollaboration();
		assertValid(collaboration);
		expression14.setType(collaboration);
	}

	public void testOperand() {
		Expression expression = UML.createExpression();
		assertValid(expression);

		LiteralBoolean literalBoolean = UML.createLiteralBoolean();
		assertValid(literalBoolean);
		expression.getOperands().add(literalBoolean);
		assertSuperset(expression.getOwnedElements().contains(literalBoolean));

		Interval interval = UML.createInterval();
		assertValid(interval);
		expression.getOperands().add(interval);
		assertSuperset(expression.getOwnedElements().contains(interval));

		OpaqueExpression opaqueExpression = UML.createOpaqueExpression();
		assertValid(opaqueExpression);
		expression.getOperands().add(opaqueExpression);
		assertSuperset(
			expression.getOwnedElements().contains(opaqueExpression));

		Expression expression2 = UML.createExpression();
		assertValid(expression2);
		expression.getOperands().add(expression2);
		assertSuperset(expression.getOwnedElements().contains(expression2));

		LiteralReal literalReal = UML.createLiteralReal();
		assertValid(literalReal);
		expression.getOperands().add(literalReal);
		assertSuperset(expression.getOwnedElements().contains(literalReal));

		LiteralString literalString = UML.createLiteralString();
		assertValid(literalString);
		expression.getOperands().add(literalString);
		assertSuperset(expression.getOwnedElements().contains(literalString));

		LiteralNull literalNull = UML.createLiteralNull();
		assertValid(literalNull);
		expression.getOperands().add(literalNull);
		assertSuperset(expression.getOwnedElements().contains(literalNull));

		Duration duration = UML.createDuration();
		assertValid(duration);
		expression.getOperands().add(duration);
		assertSuperset(expression.getOwnedElements().contains(duration));

		LiteralInteger literalInteger = UML.createLiteralInteger();
		assertValid(literalInteger);
		expression.getOperands().add(literalInteger);
		assertSuperset(expression.getOwnedElements().contains(literalInteger));

		DurationInterval durationInterval = UML.createDurationInterval();
		assertValid(durationInterval);
		expression.getOperands().add(durationInterval);
		assertSuperset(
			expression.getOwnedElements().contains(durationInterval));

		StringExpression stringExpression = UML.createStringExpression();
		assertValid(stringExpression);
		expression.getOperands().add(stringExpression);
		assertSuperset(
			expression.getOwnedElements().contains(stringExpression));

		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);
		expression.getOperands().add(literalUnlimitedNatural);
		assertSuperset(
			expression.getOwnedElements().contains(literalUnlimitedNatural));

		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);
		expression.getOperands().add(timeInterval);
		assertSuperset(expression.getOwnedElements().contains(timeInterval));

		TimeExpression timeExpression = UML.createTimeExpression();
		assertValid(timeExpression);
		expression.getOperands().add(timeExpression);
		assertSuperset(expression.getOwnedElements().contains(timeExpression));

		InstanceValue instanceValue = UML.createInstanceValue();
		assertValid(instanceValue);
		expression.getOperands().add(instanceValue);
		assertSuperset(expression.getOwnedElements().contains(instanceValue));
	}

}
