/*
 * 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.Port;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.QualifierValue;
import org.eclipse.uml2.uml.ValuePin;

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

	public void testEAnnotations() {
		QualifierValue qualifierValue = UML.createQualifierValue();
		assertValid(qualifierValue);

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

	public void testOwnedComment() {
		QualifierValue qualifierValue = UML.createQualifierValue();
		assertValid(qualifierValue);

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

	public void testOwnedElement() {
		QualifierValue qualifierValue = UML.createQualifierValue();
		assertValid(qualifierValue);
		EList<Element> elements = qualifierValue.getOwnedElements();
		EList<Element> elements2 = qualifierValue.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testQualifier() {
		QualifierValue qualifierValue = UML.createQualifierValue();
		assertValid(qualifierValue);

		Port port = UML.createPort();
		assertValid(port);
		qualifierValue.setQualifier(port);

		ExtensionEnd extensionEnd = UML.createExtensionEnd();
		assertValid(extensionEnd);
		qualifierValue.setQualifier(extensionEnd);

		QualifierValue qualifierValue2 = UML.createQualifierValue();
		assertValid(qualifierValue2);

		Property property = UML.createProperty();
		assertValid(property);
		qualifierValue2.setQualifier(property);
	}

	public void testValue() {
		QualifierValue qualifierValue = UML.createQualifierValue();
		assertValid(qualifierValue);

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

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

		QualifierValue qualifierValue2 = UML.createQualifierValue();
		assertValid(qualifierValue2);

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

}
