/*
 * 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.ActionInputPin;
import org.eclipse.uml2.uml.ActivityFinalNode;
import org.eclipse.uml2.uml.ActivityGroup;
import org.eclipse.uml2.uml.ActivityParameterNode;
import org.eclipse.uml2.uml.ActivityPartition;
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.CentralBufferNode;
import org.eclipse.uml2.uml.Classifier;
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.Constraint;
import org.eclipse.uml2.uml.ControlFlow;
import org.eclipse.uml2.uml.CreateLinkAction;
import org.eclipse.uml2.uml.CreateLinkObjectAction;
import org.eclipse.uml2.uml.CreateObjectAction;
import org.eclipse.uml2.uml.DataStoreNode;
import org.eclipse.uml2.uml.DecisionNode;
import org.eclipse.uml2.uml.Dependency;
import org.eclipse.uml2.uml.DestroyLinkAction;
import org.eclipse.uml2.uml.DestroyObjectAction;
import org.eclipse.uml2.uml.DurationConstraint;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.ExceptionHandler;
import org.eclipse.uml2.uml.ExpansionNode;
import org.eclipse.uml2.uml.ExpansionRegion;
import org.eclipse.uml2.uml.FlowFinalNode;
import org.eclipse.uml2.uml.ForkNode;
import org.eclipse.uml2.uml.InitialNode;
import org.eclipse.uml2.uml.InputPin;
import org.eclipse.uml2.uml.InteractionConstraint;
import org.eclipse.uml2.uml.InterruptibleActivityRegion;
import org.eclipse.uml2.uml.IntervalConstraint;
import org.eclipse.uml2.uml.JoinNode;
import org.eclipse.uml2.uml.LoopNode;
import org.eclipse.uml2.uml.MergeNode;
import org.eclipse.uml2.uml.ObjectFlow;
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.RedefinableElement;
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.StringExpression;
import org.eclipse.uml2.uml.StructuredActivityNode;
import org.eclipse.uml2.uml.TestIdentityAction;
import org.eclipse.uml2.uml.TimeConstraint;
import org.eclipse.uml2.uml.Trigger;
import org.eclipse.uml2.uml.UnmarshallAction;
import org.eclipse.uml2.uml.ValuePin;
import org.eclipse.uml2.uml.ValueSpecificationAction;

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

	public void testEAnnotations() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

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

	public void testOwnedComment() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

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

	public void testOwnedElement() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		EList<Element> elements = acceptCallAction.getOwnedElements();
		EList<Element> elements2 = acceptCallAction.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		EList<Dependency> dependencys = acceptCallAction
			.getClientDependencies();
		EList<Dependency> dependencys2 = acceptCallAction
			.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

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

	public void testRedefinedElement() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		EList<RedefinableElement> redefinableElements = acceptCallAction
			.getRedefinedElements();
		EList<RedefinableElement> redefinableElements2 = acceptCallAction
			.getRedefinedElements();
		assertSame(redefinableElements, redefinableElements2);
	}

	public void testRedefinitionContext() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		EList<Classifier> classifiers = acceptCallAction
			.getRedefinitionContexts();
		EList<Classifier> classifiers2 = acceptCallAction
			.getRedefinitionContexts();
		assertSame(classifiers, classifiers2);
	}

	public void testInGroup() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		EList<ActivityGroup> activityGroups = acceptCallAction.getInGroups();
		EList<ActivityGroup> activityGroups2 = acceptCallAction.getInGroups();
		assertSame(activityGroups, activityGroups2);
	}

	public void testInInterruptibleRegion() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		InterruptibleActivityRegion interruptibleActivityRegion = UML
			.createInterruptibleActivityRegion();
		assertValid(interruptibleActivityRegion);
		acceptCallAction.getInInterruptibleRegions()
			.add(interruptibleActivityRegion);
		assertSuperset(acceptCallAction.getInGroups()
			.contains(interruptibleActivityRegion));
	}

	public void testInStructuredNode() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		LoopNode loopNode = UML.createLoopNode();
		assertValid(loopNode);
		acceptCallAction.setInStructuredNode(loopNode);
		assertSuperset(acceptCallAction.getInGroups().contains(loopNode));
		assertSuperset(acceptCallAction.getOwner() == loopNode);

		ExpansionRegion expansionRegion = UML.createExpansionRegion();
		assertValid(expansionRegion);
		acceptCallAction.setInStructuredNode(expansionRegion);
		assertSuperset(
			acceptCallAction.getInGroups().contains(expansionRegion));
		assertSuperset(acceptCallAction.getOwner() == expansionRegion);

		AcceptCallAction acceptCallAction2 = UML.createAcceptCallAction();
		assertValid(acceptCallAction2);

		SequenceNode sequenceNode = UML.createSequenceNode();
		assertValid(sequenceNode);
		acceptCallAction2.setInStructuredNode(sequenceNode);
		assertSuperset(acceptCallAction2.getInGroups().contains(sequenceNode));
		assertSuperset(acceptCallAction2.getOwner() == sequenceNode);

		StructuredActivityNode structuredActivityNode = UML
			.createStructuredActivityNode();
		assertValid(structuredActivityNode);
		acceptCallAction2.setInStructuredNode(structuredActivityNode);
		assertSuperset(
			acceptCallAction2.getInGroups().contains(structuredActivityNode));
		assertSuperset(acceptCallAction2.getOwner() == structuredActivityNode);

		AcceptCallAction acceptCallAction3 = UML.createAcceptCallAction();
		assertValid(acceptCallAction3);

		ConditionalNode conditionalNode = UML.createConditionalNode();
		assertValid(conditionalNode);
		acceptCallAction3.setInStructuredNode(conditionalNode);
		assertSuperset(
			acceptCallAction3.getInGroups().contains(conditionalNode));
		assertSuperset(acceptCallAction3.getOwner() == conditionalNode);
	}

	public void testIncoming() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		ControlFlow controlFlow = UML.createControlFlow();
		assertValid(controlFlow);
		acceptCallAction.getIncomings().add(controlFlow);

		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);
		acceptCallAction.getIncomings().add(objectFlow);
	}

	public void testOutgoing() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		ControlFlow controlFlow = UML.createControlFlow();
		assertValid(controlFlow);
		acceptCallAction.getOutgoings().add(controlFlow);

		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);
		acceptCallAction.getOutgoings().add(objectFlow);
	}

	public void testRedefinedNode() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		StartClassifierBehaviorAction startClassifierBehaviorAction = UML
			.createStartClassifierBehaviorAction();
		assertValid(startClassifierBehaviorAction);
		acceptCallAction.getRedefinedNodes().add(startClassifierBehaviorAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(startClassifierBehaviorAction));

		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		acceptCallAction.getRedefinedNodes().add(removeVariableValueAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(removeVariableValueAction));

		ReadSelfAction readSelfAction = UML.createReadSelfAction();
		assertValid(readSelfAction);
		acceptCallAction.getRedefinedNodes().add(readSelfAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(readSelfAction));

		InputPin inputPin = UML.createInputPin();
		assertValid(inputPin);
		acceptCallAction.getRedefinedNodes().add(inputPin);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(inputPin));

		ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction = UML
			.createReadLinkObjectEndQualifierAction();
		assertValid(readLinkObjectEndQualifierAction);
		acceptCallAction.getRedefinedNodes()
			.add(readLinkObjectEndQualifierAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(readLinkObjectEndQualifierAction));

		JoinNode joinNode = UML.createJoinNode();
		assertValid(joinNode);
		acceptCallAction.getRedefinedNodes().add(joinNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(joinNode));

		CreateLinkObjectAction createLinkObjectAction = UML
			.createCreateLinkObjectAction();
		assertValid(createLinkObjectAction);
		acceptCallAction.getRedefinedNodes().add(createLinkObjectAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(createLinkObjectAction));

		SendSignalAction sendSignalAction = UML.createSendSignalAction();
		assertValid(sendSignalAction);
		acceptCallAction.getRedefinedNodes().add(sendSignalAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(sendSignalAction));

		ReadLinkAction readLinkAction = UML.createReadLinkAction();
		assertValid(readLinkAction);
		acceptCallAction.getRedefinedNodes().add(readLinkAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(readLinkAction));

		ReplyAction replyAction = UML.createReplyAction();
		assertValid(replyAction);
		acceptCallAction.getRedefinedNodes().add(replyAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(replyAction));

		ClearAssociationAction clearAssociationAction = UML
			.createClearAssociationAction();
		assertValid(clearAssociationAction);
		acceptCallAction.getRedefinedNodes().add(clearAssociationAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(clearAssociationAction));

		FlowFinalNode flowFinalNode = UML.createFlowFinalNode();
		assertValid(flowFinalNode);
		acceptCallAction.getRedefinedNodes().add(flowFinalNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(flowFinalNode));

		ClearStructuralFeatureAction clearStructuralFeatureAction = UML
			.createClearStructuralFeatureAction();
		assertValid(clearStructuralFeatureAction);
		acceptCallAction.getRedefinedNodes().add(clearStructuralFeatureAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(clearStructuralFeatureAction));

		ExpansionRegion expansionRegion = UML.createExpansionRegion();
		assertValid(expansionRegion);
		acceptCallAction.getRedefinedNodes().add(expansionRegion);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(expansionRegion));

		StructuredActivityNode structuredActivityNode = UML
			.createStructuredActivityNode();
		assertValid(structuredActivityNode);
		acceptCallAction.getRedefinedNodes().add(structuredActivityNode);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(structuredActivityNode));

		ValuePin valuePin = UML.createValuePin();
		assertValid(valuePin);
		acceptCallAction.getRedefinedNodes().add(valuePin);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(valuePin));

		StartObjectBehaviorAction startObjectBehaviorAction = UML
			.createStartObjectBehaviorAction();
		assertValid(startObjectBehaviorAction);
		acceptCallAction.getRedefinedNodes().add(startObjectBehaviorAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(startObjectBehaviorAction));

		ForkNode forkNode = UML.createForkNode();
		assertValid(forkNode);
		acceptCallAction.getRedefinedNodes().add(forkNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(forkNode));

		DecisionNode decisionNode = UML.createDecisionNode();
		assertValid(decisionNode);
		acceptCallAction.getRedefinedNodes().add(decisionNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(decisionNode));

		CallBehaviorAction callBehaviorAction = UML.createCallBehaviorAction();
		assertValid(callBehaviorAction);
		acceptCallAction.getRedefinedNodes().add(callBehaviorAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(callBehaviorAction));

		ConditionalNode conditionalNode = UML.createConditionalNode();
		assertValid(conditionalNode);
		acceptCallAction.getRedefinedNodes().add(conditionalNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(conditionalNode));

		ReadExtentAction readExtentAction = UML.createReadExtentAction();
		assertValid(readExtentAction);
		acceptCallAction.getRedefinedNodes().add(readExtentAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(readExtentAction));

		ActionInputPin actionInputPin = UML.createActionInputPin();
		assertValid(actionInputPin);
		acceptCallAction.getRedefinedNodes().add(actionInputPin);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(actionInputPin));

		ReadIsClassifiedObjectAction readIsClassifiedObjectAction = UML
			.createReadIsClassifiedObjectAction();
		assertValid(readIsClassifiedObjectAction);
		acceptCallAction.getRedefinedNodes().add(readIsClassifiedObjectAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(readIsClassifiedObjectAction));

		ActivityParameterNode activityParameterNode = UML
			.createActivityParameterNode();
		assertValid(activityParameterNode);
		acceptCallAction.getRedefinedNodes().add(activityParameterNode);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(activityParameterNode));

		AddStructuralFeatureValueAction addStructuralFeatureValueAction = UML
			.createAddStructuralFeatureValueAction();
		assertValid(addStructuralFeatureValueAction);
		acceptCallAction.getRedefinedNodes()
			.add(addStructuralFeatureValueAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(addStructuralFeatureValueAction));

		ReadVariableAction readVariableAction = UML.createReadVariableAction();
		assertValid(readVariableAction);
		acceptCallAction.getRedefinedNodes().add(readVariableAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(readVariableAction));

		ClearVariableAction clearVariableAction = UML
			.createClearVariableAction();
		assertValid(clearVariableAction);
		acceptCallAction.getRedefinedNodes().add(clearVariableAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(clearVariableAction));

		RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction = UML
			.createRemoveStructuralFeatureValueAction();
		assertValid(removeStructuralFeatureValueAction);
		acceptCallAction.getRedefinedNodes()
			.add(removeStructuralFeatureValueAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(removeStructuralFeatureValueAction));

		CreateLinkAction createLinkAction = UML.createCreateLinkAction();
		assertValid(createLinkAction);
		acceptCallAction.getRedefinedNodes().add(createLinkAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(createLinkAction));

		ReclassifyObjectAction reclassifyObjectAction = UML
			.createReclassifyObjectAction();
		assertValid(reclassifyObjectAction);
		acceptCallAction.getRedefinedNodes().add(reclassifyObjectAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(reclassifyObjectAction));

		DataStoreNode dataStoreNode = UML.createDataStoreNode();
		assertValid(dataStoreNode);
		acceptCallAction.getRedefinedNodes().add(dataStoreNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(dataStoreNode));

		SendObjectAction sendObjectAction = UML.createSendObjectAction();
		assertValid(sendObjectAction);
		acceptCallAction.getRedefinedNodes().add(sendObjectAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(sendObjectAction));

		ReduceAction reduceAction = UML.createReduceAction();
		assertValid(reduceAction);
		acceptCallAction.getRedefinedNodes().add(reduceAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(reduceAction));

		AcceptEventAction acceptEventAction = UML.createAcceptEventAction();
		assertValid(acceptEventAction);
		acceptCallAction.getRedefinedNodes().add(acceptEventAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(acceptEventAction));

		DestroyLinkAction destroyLinkAction = UML.createDestroyLinkAction();
		assertValid(destroyLinkAction);
		acceptCallAction.getRedefinedNodes().add(destroyLinkAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(destroyLinkAction));

		ExpansionNode expansionNode = UML.createExpansionNode();
		assertValid(expansionNode);
		acceptCallAction.getRedefinedNodes().add(expansionNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(expansionNode));

		InitialNode initialNode = UML.createInitialNode();
		assertValid(initialNode);
		acceptCallAction.getRedefinedNodes().add(initialNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(initialNode));

		TestIdentityAction testIdentityAction = UML.createTestIdentityAction();
		assertValid(testIdentityAction);
		acceptCallAction.getRedefinedNodes().add(testIdentityAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(testIdentityAction));

		OutputPin outputPin = UML.createOutputPin();
		assertValid(outputPin);
		acceptCallAction.getRedefinedNodes().add(outputPin);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(outputPin));

		CentralBufferNode centralBufferNode = UML.createCentralBufferNode();
		assertValid(centralBufferNode);
		acceptCallAction.getRedefinedNodes().add(centralBufferNode);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(centralBufferNode));

		BroadcastSignalAction broadcastSignalAction = UML
			.createBroadcastSignalAction();
		assertValid(broadcastSignalAction);
		acceptCallAction.getRedefinedNodes().add(broadcastSignalAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(broadcastSignalAction));

		RaiseExceptionAction raiseExceptionAction = UML
			.createRaiseExceptionAction();
		assertValid(raiseExceptionAction);
		acceptCallAction.getRedefinedNodes().add(raiseExceptionAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(raiseExceptionAction));

		ActivityFinalNode activityFinalNode = UML.createActivityFinalNode();
		assertValid(activityFinalNode);
		acceptCallAction.getRedefinedNodes().add(activityFinalNode);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(activityFinalNode));

		CallOperationAction callOperationAction = UML
			.createCallOperationAction();
		assertValid(callOperationAction);
		acceptCallAction.getRedefinedNodes().add(callOperationAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(callOperationAction));

		LoopNode loopNode = UML.createLoopNode();
		assertValid(loopNode);
		acceptCallAction.getRedefinedNodes().add(loopNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(loopNode));

		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		acceptCallAction.getRedefinedNodes().add(valueSpecificationAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(valueSpecificationAction));

		AcceptCallAction acceptCallAction2 = UML.createAcceptCallAction();
		assertValid(acceptCallAction2);
		acceptCallAction.getRedefinedNodes().add(acceptCallAction2);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(acceptCallAction2));

		AddVariableValueAction addVariableValueAction = UML
			.createAddVariableValueAction();
		assertValid(addVariableValueAction);
		acceptCallAction.getRedefinedNodes().add(addVariableValueAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(addVariableValueAction));

		ReadLinkObjectEndAction readLinkObjectEndAction = UML
			.createReadLinkObjectEndAction();
		assertValid(readLinkObjectEndAction);
		acceptCallAction.getRedefinedNodes().add(readLinkObjectEndAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(readLinkObjectEndAction));

		UnmarshallAction unmarshallAction = UML.createUnmarshallAction();
		assertValid(unmarshallAction);
		acceptCallAction.getRedefinedNodes().add(unmarshallAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(unmarshallAction));

		OpaqueAction opaqueAction = UML.createOpaqueAction();
		assertValid(opaqueAction);
		acceptCallAction.getRedefinedNodes().add(opaqueAction);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(opaqueAction));

		MergeNode mergeNode = UML.createMergeNode();
		assertValid(mergeNode);
		acceptCallAction.getRedefinedNodes().add(mergeNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(mergeNode));

		SequenceNode sequenceNode = UML.createSequenceNode();
		assertValid(sequenceNode);
		acceptCallAction.getRedefinedNodes().add(sequenceNode);
		assertSuperset(
			acceptCallAction.getRedefinedElements().contains(sequenceNode));

		CreateObjectAction createObjectAction = UML.createCreateObjectAction();
		assertValid(createObjectAction);
		acceptCallAction.getRedefinedNodes().add(createObjectAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(createObjectAction));

		DestroyObjectAction destroyObjectAction = UML
			.createDestroyObjectAction();
		assertValid(destroyObjectAction);
		acceptCallAction.getRedefinedNodes().add(destroyObjectAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(destroyObjectAction));

		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		acceptCallAction.getRedefinedNodes().add(readStructuralFeatureAction);
		assertSuperset(acceptCallAction.getRedefinedElements()
			.contains(readStructuralFeatureAction));
	}

	public void testInPartition() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		ActivityPartition activityPartition = UML.createActivityPartition();
		assertValid(activityPartition);
		acceptCallAction.getInPartitions().add(activityPartition);
		assertSuperset(
			acceptCallAction.getInGroups().contains(activityPartition));
	}

	public void testHandler() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		ExceptionHandler exceptionHandler = UML.createExceptionHandler();
		assertValid(exceptionHandler);
		acceptCallAction.getHandlers().add(exceptionHandler);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(exceptionHandler));
	}

	public void testInput() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		EList<InputPin> inputPins = acceptCallAction.getInputs();
		EList<InputPin> inputPins2 = acceptCallAction.getInputs();
		assertSame(inputPins, inputPins2);
	}

	public void testLocalPostcondition() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		IntervalConstraint intervalConstraint = UML.createIntervalConstraint();
		assertValid(intervalConstraint);
		acceptCallAction.getLocalPostconditions().add(intervalConstraint);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(intervalConstraint));

		TimeConstraint timeConstraint = UML.createTimeConstraint();
		assertValid(timeConstraint);
		acceptCallAction.getLocalPostconditions().add(timeConstraint);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(timeConstraint));

		InteractionConstraint interactionConstraint = UML
			.createInteractionConstraint();
		assertValid(interactionConstraint);
		acceptCallAction.getLocalPostconditions().add(interactionConstraint);
		assertSuperset(acceptCallAction.getOwnedElements()
			.contains(interactionConstraint));

		Constraint constraint = UML.createConstraint();
		assertValid(constraint);
		acceptCallAction.getLocalPostconditions().add(constraint);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(constraint));

		DurationConstraint durationConstraint = UML.createDurationConstraint();
		assertValid(durationConstraint);
		acceptCallAction.getLocalPostconditions().add(durationConstraint);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(durationConstraint));
	}

	public void testLocalPrecondition() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		IntervalConstraint intervalConstraint = UML.createIntervalConstraint();
		assertValid(intervalConstraint);
		acceptCallAction.getLocalPreconditions().add(intervalConstraint);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(intervalConstraint));

		TimeConstraint timeConstraint = UML.createTimeConstraint();
		assertValid(timeConstraint);
		acceptCallAction.getLocalPreconditions().add(timeConstraint);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(timeConstraint));

		InteractionConstraint interactionConstraint = UML
			.createInteractionConstraint();
		assertValid(interactionConstraint);
		acceptCallAction.getLocalPreconditions().add(interactionConstraint);
		assertSuperset(acceptCallAction.getOwnedElements()
			.contains(interactionConstraint));

		Constraint constraint = UML.createConstraint();
		assertValid(constraint);
		acceptCallAction.getLocalPreconditions().add(constraint);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(constraint));

		DurationConstraint durationConstraint = UML.createDurationConstraint();
		assertValid(durationConstraint);
		acceptCallAction.getLocalPreconditions().add(durationConstraint);
		assertSuperset(
			acceptCallAction.getOwnedElements().contains(durationConstraint));
	}

	public void testOutput() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		EList<OutputPin> outputPins = acceptCallAction.getOutputs();
		EList<OutputPin> outputPins2 = acceptCallAction.getOutputs();
		assertSame(outputPins, outputPins2);
	}

	public void testResult() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		OutputPin outputPin = UML.createOutputPin();
		assertValid(outputPin);
		acceptCallAction.getResults().add(outputPin);
		assertSuperset(acceptCallAction.getOutputs().contains(outputPin));
	}

	public void testTrigger() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		Trigger trigger = UML.createTrigger();
		assertValid(trigger);
		acceptCallAction.getTriggers().add(trigger);
		assertSuperset(acceptCallAction.getOwnedElements().contains(trigger));
	}

	public void testReturnInformation() {
		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);

		OutputPin outputPin = UML.createOutputPin();
		assertValid(outputPin);
		acceptCallAction.setReturnInformation(outputPin);
		assertSuperset(acceptCallAction.getOutputs().contains(outputPin));
	}

}
