/*
 * 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.LiteralUnlimitedNatural;
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.UseCase;

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

	public void testEAnnotations() {
		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);

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

	public void testOwnedComment() {
		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);

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

	public void testOwnedElement() {
		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);
		EList<Element> elements = literalUnlimitedNatural.getOwnedElements();
		EList<Element> elements2 = literalUnlimitedNatural.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);
		EList<Dependency> dependencys = literalUnlimitedNatural
			.getClientDependencies();
		EList<Dependency> dependencys2 = literalUnlimitedNatural
			.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);

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

	public void testOwningTemplateParameter() {
		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);

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

	public void testTemplateParameter() {
		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);

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

	public void testType() {
		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural2 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural2);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural3 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural3);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural4 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural4);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural5 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural5);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural6 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural6);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural7 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural7);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural8 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural8);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural9 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural9);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural10 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural10);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural11 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural11);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural12 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural12);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural13 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural13);

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

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

		LiteralUnlimitedNatural literalUnlimitedNatural14 = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural14);

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

}
