/*
 * 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.AcceptCallAction;
import org.eclipse.uml2.uml.AcceptEventAction;
import org.eclipse.uml2.uml.AddStructuralFeatureValueAction;
import org.eclipse.uml2.uml.AddVariableValueAction;
import org.eclipse.uml2.uml.BroadcastSignalAction;
import org.eclipse.uml2.uml.CallBehaviorAction;
import org.eclipse.uml2.uml.CallOperationAction;
import org.eclipse.uml2.uml.Clause;
import org.eclipse.uml2.uml.ClearAssociationAction;
import org.eclipse.uml2.uml.ClearStructuralFeatureAction;
import org.eclipse.uml2.uml.ClearVariableAction;
import org.eclipse.uml2.uml.Comment;
import org.eclipse.uml2.uml.ConditionalNode;
import org.eclipse.uml2.uml.CreateLinkAction;
import org.eclipse.uml2.uml.CreateLinkObjectAction;
import org.eclipse.uml2.uml.CreateObjectAction;
import org.eclipse.uml2.uml.DestroyLinkAction;
import org.eclipse.uml2.uml.DestroyObjectAction;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.ExpansionRegion;
import org.eclipse.uml2.uml.LoopNode;
import org.eclipse.uml2.uml.OpaqueAction;
import org.eclipse.uml2.uml.OutputPin;
import org.eclipse.uml2.uml.RaiseExceptionAction;
import org.eclipse.uml2.uml.ReadExtentAction;
import org.eclipse.uml2.uml.ReadIsClassifiedObjectAction;
import org.eclipse.uml2.uml.ReadLinkAction;
import org.eclipse.uml2.uml.ReadLinkObjectEndAction;
import org.eclipse.uml2.uml.ReadLinkObjectEndQualifierAction;
import org.eclipse.uml2.uml.ReadSelfAction;
import org.eclipse.uml2.uml.ReadStructuralFeatureAction;
import org.eclipse.uml2.uml.ReadVariableAction;
import org.eclipse.uml2.uml.ReclassifyObjectAction;
import org.eclipse.uml2.uml.ReduceAction;
import org.eclipse.uml2.uml.RemoveStructuralFeatureValueAction;
import org.eclipse.uml2.uml.RemoveVariableValueAction;
import org.eclipse.uml2.uml.ReplyAction;
import org.eclipse.uml2.uml.SendObjectAction;
import org.eclipse.uml2.uml.SendSignalAction;
import org.eclipse.uml2.uml.SequenceNode;
import org.eclipse.uml2.uml.StartClassifierBehaviorAction;
import org.eclipse.uml2.uml.StartObjectBehaviorAction;
import org.eclipse.uml2.uml.StructuredActivityNode;
import org.eclipse.uml2.uml.TestIdentityAction;
import org.eclipse.uml2.uml.UnmarshallAction;
import org.eclipse.uml2.uml.ValueSpecificationAction;

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

	public void testEAnnotations() {
		Clause clause = UML.createClause();
		assertValid(clause);

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

	public void testOwnedComment() {
		Clause clause = UML.createClause();
		assertValid(clause);

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

	public void testOwnedElement() {
		Clause clause = UML.createClause();
		assertValid(clause);
		EList<Element> elements = clause.getOwnedElements();
		EList<Element> elements2 = clause.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testBody() {
		Clause clause = UML.createClause();
		assertValid(clause);

		ReadIsClassifiedObjectAction readIsClassifiedObjectAction = UML
			.createReadIsClassifiedObjectAction();
		assertValid(readIsClassifiedObjectAction);
		clause.getBodies().add(readIsClassifiedObjectAction);

		StartClassifierBehaviorAction startClassifierBehaviorAction = UML
			.createStartClassifierBehaviorAction();
		assertValid(startClassifierBehaviorAction);
		clause.getBodies().add(startClassifierBehaviorAction);

		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		clause.getBodies().add(removeVariableValueAction);

		AddStructuralFeatureValueAction addStructuralFeatureValueAction = UML
			.createAddStructuralFeatureValueAction();
		assertValid(addStructuralFeatureValueAction);
		clause.getBodies().add(addStructuralFeatureValueAction);

		ReadVariableAction readVariableAction = UML.createReadVariableAction();
		assertValid(readVariableAction);
		clause.getBodies().add(readVariableAction);

		ClearVariableAction clearVariableAction = UML
			.createClearVariableAction();
		assertValid(clearVariableAction);
		clause.getBodies().add(clearVariableAction);

		RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction = UML
			.createRemoveStructuralFeatureValueAction();
		assertValid(removeStructuralFeatureValueAction);
		clause.getBodies().add(removeStructuralFeatureValueAction);

		CreateLinkAction createLinkAction = UML.createCreateLinkAction();
		assertValid(createLinkAction);
		clause.getBodies().add(createLinkAction);

		ReadSelfAction readSelfAction = UML.createReadSelfAction();
		assertValid(readSelfAction);
		clause.getBodies().add(readSelfAction);

		ReclassifyObjectAction reclassifyObjectAction = UML
			.createReclassifyObjectAction();
		assertValid(reclassifyObjectAction);
		clause.getBodies().add(reclassifyObjectAction);

		ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction = UML
			.createReadLinkObjectEndQualifierAction();
		assertValid(readLinkObjectEndQualifierAction);
		clause.getBodies().add(readLinkObjectEndQualifierAction);

		SendObjectAction sendObjectAction = UML.createSendObjectAction();
		assertValid(sendObjectAction);
		clause.getBodies().add(sendObjectAction);

		ReduceAction reduceAction = UML.createReduceAction();
		assertValid(reduceAction);
		clause.getBodies().add(reduceAction);

		CreateLinkObjectAction createLinkObjectAction = UML
			.createCreateLinkObjectAction();
		assertValid(createLinkObjectAction);
		clause.getBodies().add(createLinkObjectAction);

		AcceptEventAction acceptEventAction = UML.createAcceptEventAction();
		assertValid(acceptEventAction);
		clause.getBodies().add(acceptEventAction);

		DestroyLinkAction destroyLinkAction = UML.createDestroyLinkAction();
		assertValid(destroyLinkAction);
		clause.getBodies().add(destroyLinkAction);

		SendSignalAction sendSignalAction = UML.createSendSignalAction();
		assertValid(sendSignalAction);
		clause.getBodies().add(sendSignalAction);

		ReadLinkAction readLinkAction = UML.createReadLinkAction();
		assertValid(readLinkAction);
		clause.getBodies().add(readLinkAction);

		ReplyAction replyAction = UML.createReplyAction();
		assertValid(replyAction);
		clause.getBodies().add(replyAction);

		TestIdentityAction testIdentityAction = UML.createTestIdentityAction();
		assertValid(testIdentityAction);
		clause.getBodies().add(testIdentityAction);

		ClearAssociationAction clearAssociationAction = UML
			.createClearAssociationAction();
		assertValid(clearAssociationAction);
		clause.getBodies().add(clearAssociationAction);

		BroadcastSignalAction broadcastSignalAction = UML
			.createBroadcastSignalAction();
		assertValid(broadcastSignalAction);
		clause.getBodies().add(broadcastSignalAction);

		ClearStructuralFeatureAction clearStructuralFeatureAction = UML
			.createClearStructuralFeatureAction();
		assertValid(clearStructuralFeatureAction);
		clause.getBodies().add(clearStructuralFeatureAction);

		ExpansionRegion expansionRegion = UML.createExpansionRegion();
		assertValid(expansionRegion);
		clause.getBodies().add(expansionRegion);

		StructuredActivityNode structuredActivityNode = UML
			.createStructuredActivityNode();
		assertValid(structuredActivityNode);
		clause.getBodies().add(structuredActivityNode);

		RaiseExceptionAction raiseExceptionAction = UML
			.createRaiseExceptionAction();
		assertValid(raiseExceptionAction);
		clause.getBodies().add(raiseExceptionAction);

		StartObjectBehaviorAction startObjectBehaviorAction = UML
			.createStartObjectBehaviorAction();
		assertValid(startObjectBehaviorAction);
		clause.getBodies().add(startObjectBehaviorAction);

		CallOperationAction callOperationAction = UML
			.createCallOperationAction();
		assertValid(callOperationAction);
		clause.getBodies().add(callOperationAction);

		LoopNode loopNode = UML.createLoopNode();
		assertValid(loopNode);
		clause.getBodies().add(loopNode);

		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		clause.getBodies().add(valueSpecificationAction);

		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		clause.getBodies().add(acceptCallAction);

		AddVariableValueAction addVariableValueAction = UML
			.createAddVariableValueAction();
		assertValid(addVariableValueAction);
		clause.getBodies().add(addVariableValueAction);

		ReadLinkObjectEndAction readLinkObjectEndAction = UML
			.createReadLinkObjectEndAction();
		assertValid(readLinkObjectEndAction);
		clause.getBodies().add(readLinkObjectEndAction);

		UnmarshallAction unmarshallAction = UML.createUnmarshallAction();
		assertValid(unmarshallAction);
		clause.getBodies().add(unmarshallAction);

		OpaqueAction opaqueAction = UML.createOpaqueAction();
		assertValid(opaqueAction);
		clause.getBodies().add(opaqueAction);

		SequenceNode sequenceNode = UML.createSequenceNode();
		assertValid(sequenceNode);
		clause.getBodies().add(sequenceNode);

		CreateObjectAction createObjectAction = UML.createCreateObjectAction();
		assertValid(createObjectAction);
		clause.getBodies().add(createObjectAction);

		DestroyObjectAction destroyObjectAction = UML
			.createDestroyObjectAction();
		assertValid(destroyObjectAction);
		clause.getBodies().add(destroyObjectAction);

		CallBehaviorAction callBehaviorAction = UML.createCallBehaviorAction();
		assertValid(callBehaviorAction);
		clause.getBodies().add(callBehaviorAction);

		ConditionalNode conditionalNode = UML.createConditionalNode();
		assertValid(conditionalNode);
		clause.getBodies().add(conditionalNode);

		ReadExtentAction readExtentAction = UML.createReadExtentAction();
		assertValid(readExtentAction);
		clause.getBodies().add(readExtentAction);

		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		clause.getBodies().add(readStructuralFeatureAction);
	}

	public void testBodyOutput() {
		Clause clause = UML.createClause();
		assertValid(clause);

		OutputPin outputPin = UML.createOutputPin();
		assertValid(outputPin);
		clause.getBodyOutputs().add(outputPin);
	}

	public void testDecider() {
		Clause clause = UML.createClause();
		assertValid(clause);

		OutputPin outputPin = UML.createOutputPin();
		assertValid(outputPin);
		clause.setDecider(outputPin);
	}

	public void testPredecessorClause() {
		Clause clause = UML.createClause();
		assertValid(clause);

		Clause clause2 = UML.createClause();
		assertValid(clause2);
		clause.getPredecessorClauses().add(clause2);
	}

	public void testSuccessorClause() {
		Clause clause = UML.createClause();
		assertValid(clause);

		Clause clause2 = UML.createClause();
		assertValid(clause2);
		clause.getSuccessorClauses().add(clause2);
	}

	public void testTest() {
		Clause clause = UML.createClause();
		assertValid(clause);

		ReadIsClassifiedObjectAction readIsClassifiedObjectAction = UML
			.createReadIsClassifiedObjectAction();
		assertValid(readIsClassifiedObjectAction);
		clause.getTests().add(readIsClassifiedObjectAction);

		StartClassifierBehaviorAction startClassifierBehaviorAction = UML
			.createStartClassifierBehaviorAction();
		assertValid(startClassifierBehaviorAction);
		clause.getTests().add(startClassifierBehaviorAction);

		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		clause.getTests().add(removeVariableValueAction);

		AddStructuralFeatureValueAction addStructuralFeatureValueAction = UML
			.createAddStructuralFeatureValueAction();
		assertValid(addStructuralFeatureValueAction);
		clause.getTests().add(addStructuralFeatureValueAction);

		ReadVariableAction readVariableAction = UML.createReadVariableAction();
		assertValid(readVariableAction);
		clause.getTests().add(readVariableAction);

		ClearVariableAction clearVariableAction = UML
			.createClearVariableAction();
		assertValid(clearVariableAction);
		clause.getTests().add(clearVariableAction);

		RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction = UML
			.createRemoveStructuralFeatureValueAction();
		assertValid(removeStructuralFeatureValueAction);
		clause.getTests().add(removeStructuralFeatureValueAction);

		CreateLinkAction createLinkAction = UML.createCreateLinkAction();
		assertValid(createLinkAction);
		clause.getTests().add(createLinkAction);

		ReadSelfAction readSelfAction = UML.createReadSelfAction();
		assertValid(readSelfAction);
		clause.getTests().add(readSelfAction);

		ReclassifyObjectAction reclassifyObjectAction = UML
			.createReclassifyObjectAction();
		assertValid(reclassifyObjectAction);
		clause.getTests().add(reclassifyObjectAction);

		ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction = UML
			.createReadLinkObjectEndQualifierAction();
		assertValid(readLinkObjectEndQualifierAction);
		clause.getTests().add(readLinkObjectEndQualifierAction);

		SendObjectAction sendObjectAction = UML.createSendObjectAction();
		assertValid(sendObjectAction);
		clause.getTests().add(sendObjectAction);

		ReduceAction reduceAction = UML.createReduceAction();
		assertValid(reduceAction);
		clause.getTests().add(reduceAction);

		CreateLinkObjectAction createLinkObjectAction = UML
			.createCreateLinkObjectAction();
		assertValid(createLinkObjectAction);
		clause.getTests().add(createLinkObjectAction);

		AcceptEventAction acceptEventAction = UML.createAcceptEventAction();
		assertValid(acceptEventAction);
		clause.getTests().add(acceptEventAction);

		DestroyLinkAction destroyLinkAction = UML.createDestroyLinkAction();
		assertValid(destroyLinkAction);
		clause.getTests().add(destroyLinkAction);

		SendSignalAction sendSignalAction = UML.createSendSignalAction();
		assertValid(sendSignalAction);
		clause.getTests().add(sendSignalAction);

		ReadLinkAction readLinkAction = UML.createReadLinkAction();
		assertValid(readLinkAction);
		clause.getTests().add(readLinkAction);

		ReplyAction replyAction = UML.createReplyAction();
		assertValid(replyAction);
		clause.getTests().add(replyAction);

		TestIdentityAction testIdentityAction = UML.createTestIdentityAction();
		assertValid(testIdentityAction);
		clause.getTests().add(testIdentityAction);

		ClearAssociationAction clearAssociationAction = UML
			.createClearAssociationAction();
		assertValid(clearAssociationAction);
		clause.getTests().add(clearAssociationAction);

		BroadcastSignalAction broadcastSignalAction = UML
			.createBroadcastSignalAction();
		assertValid(broadcastSignalAction);
		clause.getTests().add(broadcastSignalAction);

		ClearStructuralFeatureAction clearStructuralFeatureAction = UML
			.createClearStructuralFeatureAction();
		assertValid(clearStructuralFeatureAction);
		clause.getTests().add(clearStructuralFeatureAction);

		ExpansionRegion expansionRegion = UML.createExpansionRegion();
		assertValid(expansionRegion);
		clause.getTests().add(expansionRegion);

		StructuredActivityNode structuredActivityNode = UML
			.createStructuredActivityNode();
		assertValid(structuredActivityNode);
		clause.getTests().add(structuredActivityNode);

		RaiseExceptionAction raiseExceptionAction = UML
			.createRaiseExceptionAction();
		assertValid(raiseExceptionAction);
		clause.getTests().add(raiseExceptionAction);

		StartObjectBehaviorAction startObjectBehaviorAction = UML
			.createStartObjectBehaviorAction();
		assertValid(startObjectBehaviorAction);
		clause.getTests().add(startObjectBehaviorAction);

		CallOperationAction callOperationAction = UML
			.createCallOperationAction();
		assertValid(callOperationAction);
		clause.getTests().add(callOperationAction);

		LoopNode loopNode = UML.createLoopNode();
		assertValid(loopNode);
		clause.getTests().add(loopNode);

		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		clause.getTests().add(valueSpecificationAction);

		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		clause.getTests().add(acceptCallAction);

		AddVariableValueAction addVariableValueAction = UML
			.createAddVariableValueAction();
		assertValid(addVariableValueAction);
		clause.getTests().add(addVariableValueAction);

		ReadLinkObjectEndAction readLinkObjectEndAction = UML
			.createReadLinkObjectEndAction();
		assertValid(readLinkObjectEndAction);
		clause.getTests().add(readLinkObjectEndAction);

		UnmarshallAction unmarshallAction = UML.createUnmarshallAction();
		assertValid(unmarshallAction);
		clause.getTests().add(unmarshallAction);

		OpaqueAction opaqueAction = UML.createOpaqueAction();
		assertValid(opaqueAction);
		clause.getTests().add(opaqueAction);

		SequenceNode sequenceNode = UML.createSequenceNode();
		assertValid(sequenceNode);
		clause.getTests().add(sequenceNode);

		CreateObjectAction createObjectAction = UML.createCreateObjectAction();
		assertValid(createObjectAction);
		clause.getTests().add(createObjectAction);

		DestroyObjectAction destroyObjectAction = UML
			.createDestroyObjectAction();
		assertValid(destroyObjectAction);
		clause.getTests().add(destroyObjectAction);

		CallBehaviorAction callBehaviorAction = UML.createCallBehaviorAction();
		assertValid(callBehaviorAction);
		clause.getTests().add(callBehaviorAction);

		ConditionalNode conditionalNode = UML.createConditionalNode();
		assertValid(conditionalNode);
		clause.getTests().add(conditionalNode);

		ReadExtentAction readExtentAction = UML.createReadExtentAction();
		assertValid(readExtentAction);
		clause.getTests().add(readExtentAction);

		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		clause.getTests().add(readStructuralFeatureAction);
	}

}
