/*
 * 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.Comment;
import org.eclipse.uml2.uml.Dependency;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.GeneralOrdering;
import org.eclipse.uml2.uml.Interaction;
import org.eclipse.uml2.uml.InteractionOperand;
import org.eclipse.uml2.uml.Lifeline;
import org.eclipse.uml2.uml.OccurrenceSpecification;
import org.eclipse.uml2.uml.StringExpression;

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

	public void testEAnnotations() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

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

	public void testOwnedComment() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

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

	public void testOwnedElement() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);
		EList<Element> elements = occurrenceSpecification.getOwnedElements();
		EList<Element> elements2 = occurrenceSpecification.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);
		EList<Dependency> dependencys = occurrenceSpecification
			.getClientDependencies();
		EList<Dependency> dependencys2 = occurrenceSpecification
			.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

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

	public void testCovered() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

		Lifeline lifeline = UML.createLifeline();
		assertValid(lifeline);
		occurrenceSpecification.getCovereds().add(lifeline);
	}

	public void testEnclosingOperand() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

		InteractionOperand interactionOperand = UML.createInteractionOperand();
		assertValid(interactionOperand);
		occurrenceSpecification.setEnclosingOperand(interactionOperand);
		assertSuperset(
			occurrenceSpecification.getNamespace() == interactionOperand);
	}

	public void testEnclosingInteraction() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

		Interaction interaction = UML.createInteraction();
		assertValid(interaction);
		occurrenceSpecification.setEnclosingInteraction(interaction);
		assertSuperset(occurrenceSpecification.getNamespace() == interaction);
	}

	public void testGeneralOrdering() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

		GeneralOrdering generalOrdering = UML.createGeneralOrdering();
		assertValid(generalOrdering);
		occurrenceSpecification.getGeneralOrderings().add(generalOrdering);
		assertSuperset(occurrenceSpecification.getOwnedElements()
			.contains(generalOrdering));
	}

	public void testToAfter() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

		GeneralOrdering generalOrdering = UML.createGeneralOrdering();
		assertValid(generalOrdering);
		occurrenceSpecification.getToAfters().add(generalOrdering);
	}

	public void testToBefore() {
		OccurrenceSpecification occurrenceSpecification = UML
			.createOccurrenceSpecification();
		assertValid(occurrenceSpecification);

		GeneralOrdering generalOrdering = UML.createGeneralOrdering();
		assertValid(generalOrdering);
		occurrenceSpecification.getToBefores().add(generalOrdering);
	}

}
