/*
 * 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.ActionInputPin;
import org.eclipse.uml2.uml.Comment;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.ExtensionEnd;
import org.eclipse.uml2.uml.InputPin;
import org.eclipse.uml2.uml.LinkEndDestructionData;
import org.eclipse.uml2.uml.Port;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.QualifierValue;
import org.eclipse.uml2.uml.ValuePin;

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

	public void testEAnnotations() {
		LinkEndDestructionData linkEndDestructionData = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData);

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

	public void testOwnedComment() {
		LinkEndDestructionData linkEndDestructionData = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData);

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

	public void testOwnedElement() {
		LinkEndDestructionData linkEndDestructionData = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData);
		EList<Element> elements = linkEndDestructionData.getOwnedElements();
		EList<Element> elements2 = linkEndDestructionData.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testEnd() {
		LinkEndDestructionData linkEndDestructionData = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData);

		Port port = UML.createPort();
		assertValid(port);
		linkEndDestructionData.setEnd(port);

		ExtensionEnd extensionEnd = UML.createExtensionEnd();
		assertValid(extensionEnd);
		linkEndDestructionData.setEnd(extensionEnd);

		LinkEndDestructionData linkEndDestructionData2 = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData2);

		Property property = UML.createProperty();
		assertValid(property);
		linkEndDestructionData2.setEnd(property);
	}

	public void testQualifier() {
		LinkEndDestructionData linkEndDestructionData = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData);

		QualifierValue qualifierValue = UML.createQualifierValue();
		assertValid(qualifierValue);
		linkEndDestructionData.getQualifiers().add(qualifierValue);
		assertSuperset(
			linkEndDestructionData.getOwnedElements().contains(qualifierValue));
	}

	public void testValue() {
		LinkEndDestructionData linkEndDestructionData = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData);

		InputPin inputPin = UML.createInputPin();
		assertValid(inputPin);
		linkEndDestructionData.setValue(inputPin);

		ValuePin valuePin = UML.createValuePin();
		assertValid(valuePin);
		linkEndDestructionData.setValue(valuePin);

		LinkEndDestructionData linkEndDestructionData2 = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData2);

		ActionInputPin actionInputPin = UML.createActionInputPin();
		assertValid(actionInputPin);
		linkEndDestructionData2.setValue(actionInputPin);
	}

	public void testDestroyAt() {
		LinkEndDestructionData linkEndDestructionData = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData);

		InputPin inputPin = UML.createInputPin();
		assertValid(inputPin);
		linkEndDestructionData.setDestroyAt(inputPin);

		ValuePin valuePin = UML.createValuePin();
		assertValid(valuePin);
		linkEndDestructionData.setDestroyAt(valuePin);

		LinkEndDestructionData linkEndDestructionData2 = UML
			.createLinkEndDestructionData();
		assertValid(linkEndDestructionData2);

		ActionInputPin actionInputPin = UML.createActionInputPin();
		assertValid(actionInputPin);
		linkEndDestructionData2.setDestroyAt(actionInputPin);
	}

}
