/*
 * 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.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.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 TimeIntervalTest
		extends _Abstract_Compliance_Test_ {

	public void testEAnnotations() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);

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

	public void testOwnedComment() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);

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

	public void testOwnedElement() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);
		EList<Element> elements = timeInterval.getOwnedElements();
		EList<Element> elements2 = timeInterval.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);
		EList<Dependency> dependencys = timeInterval.getClientDependencies();
		EList<Dependency> dependencys2 = timeInterval.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);

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

	public void testOwningTemplateParameter() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);

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

	public void testTemplateParameter() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);

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

	public void testType() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);

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

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

		TimeInterval timeInterval2 = UML.createTimeInterval();
		assertValid(timeInterval2);

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

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

		TimeInterval timeInterval3 = UML.createTimeInterval();
		assertValid(timeInterval3);

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

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

		TimeInterval timeInterval4 = UML.createTimeInterval();
		assertValid(timeInterval4);

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

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

		TimeInterval timeInterval5 = UML.createTimeInterval();
		assertValid(timeInterval5);

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

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

		TimeInterval timeInterval6 = UML.createTimeInterval();
		assertValid(timeInterval6);

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

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

		TimeInterval timeInterval7 = UML.createTimeInterval();
		assertValid(timeInterval7);

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

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

		TimeInterval timeInterval8 = UML.createTimeInterval();
		assertValid(timeInterval8);

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

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

		TimeInterval timeInterval9 = UML.createTimeInterval();
		assertValid(timeInterval9);

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

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

		TimeInterval timeInterval10 = UML.createTimeInterval();
		assertValid(timeInterval10);

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

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

		TimeInterval timeInterval11 = UML.createTimeInterval();
		assertValid(timeInterval11);

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

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

		TimeInterval timeInterval12 = UML.createTimeInterval();
		assertValid(timeInterval12);

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

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

		TimeInterval timeInterval13 = UML.createTimeInterval();
		assertValid(timeInterval13);

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

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

		TimeInterval timeInterval14 = UML.createTimeInterval();
		assertValid(timeInterval14);

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

	public void testMax() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);

		TimeExpression timeExpression = UML.createTimeExpression();
		assertValid(timeExpression);
		timeInterval.setMax(timeExpression);
	}

	public void testMin() {
		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);

		TimeExpression timeExpression = UML.createTimeExpression();
		assertValid(timeExpression);
		timeInterval.setMin(timeExpression);
	}

}
