/*
 * 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.Duration;
import org.eclipse.uml2.uml.DurationConstraint;
import org.eclipse.uml2.uml.DurationInterval;
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.Expression;
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.InstanceValue;
import org.eclipse.uml2.uml.InteractionConstraint;
import org.eclipse.uml2.uml.InterruptibleActivityRegion;
import org.eclipse.uml2.uml.Interval;
import org.eclipse.uml2.uml.IntervalConstraint;
import org.eclipse.uml2.uml.JoinNode;
import org.eclipse.uml2.uml.LiteralBoolean;
import org.eclipse.uml2.uml.LiteralInteger;
import org.eclipse.uml2.uml.LiteralNull;
import org.eclipse.uml2.uml.LiteralReal;
import org.eclipse.uml2.uml.LiteralString;
import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
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.OpaqueExpression;
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.TimeExpression;
import org.eclipse.uml2.uml.TimeInterval;
import org.eclipse.uml2.uml.UnmarshallAction;
import org.eclipse.uml2.uml.ValuePin;
import org.eclipse.uml2.uml.ValueSpecificationAction;

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

	public void testEAnnotations() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

	public void testOwnedComment() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

	public void testOwnedElement() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		EList<Element> elements = valueSpecificationAction.getOwnedElements();
		EList<Element> elements2 = valueSpecificationAction.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		EList<Dependency> dependencys = valueSpecificationAction
			.getClientDependencies();
		EList<Dependency> dependencys2 = valueSpecificationAction
			.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

	public void testRedefinedElement() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		EList<RedefinableElement> redefinableElements = valueSpecificationAction
			.getRedefinedElements();
		EList<RedefinableElement> redefinableElements2 = valueSpecificationAction
			.getRedefinedElements();
		assertSame(redefinableElements, redefinableElements2);
	}

	public void testRedefinitionContext() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		EList<Classifier> classifiers = valueSpecificationAction
			.getRedefinitionContexts();
		EList<Classifier> classifiers2 = valueSpecificationAction
			.getRedefinitionContexts();
		assertSame(classifiers, classifiers2);
	}

	public void testInGroup() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		EList<ActivityGroup> activityGroups = valueSpecificationAction
			.getInGroups();
		EList<ActivityGroup> activityGroups2 = valueSpecificationAction
			.getInGroups();
		assertSame(activityGroups, activityGroups2);
	}

	public void testInInterruptibleRegion() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

	public void testInStructuredNode() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

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

		ValueSpecificationAction valueSpecificationAction2 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction2);

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

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

		ValueSpecificationAction valueSpecificationAction3 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction3);

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

	public void testIncoming() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

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

	public void testOutgoing() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

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

	public void testRedefinedNode() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	public void testInPartition() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

	public void testHandler() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

	public void testInput() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		EList<InputPin> inputPins = valueSpecificationAction.getInputs();
		EList<InputPin> inputPins2 = valueSpecificationAction.getInputs();
		assertSame(inputPins, inputPins2);
	}

	public void testLocalPostcondition() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

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

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

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

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

	public void testLocalPrecondition() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

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

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

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

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

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

	public void testOutput() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		EList<OutputPin> outputPins = valueSpecificationAction.getOutputs();
		EList<OutputPin> outputPins2 = valueSpecificationAction.getOutputs();
		assertSame(outputPins, outputPins2);
	}

	public void testResult() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

		OutputPin outputPin = UML.createOutputPin();
		assertValid(outputPin);
		valueSpecificationAction.setResult(outputPin);
		assertSuperset(
			valueSpecificationAction.getOutputs().contains(outputPin));
	}

	public void testValue() {
		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);

		LiteralBoolean literalBoolean = UML.createLiteralBoolean();
		assertValid(literalBoolean);
		valueSpecificationAction.setValue(literalBoolean);
		assertSuperset(valueSpecificationAction.getOwnedElements()
			.contains(literalBoolean));

		Interval interval = UML.createInterval();
		assertValid(interval);
		valueSpecificationAction.setValue(interval);
		assertSuperset(
			valueSpecificationAction.getOwnedElements().contains(interval));

		ValueSpecificationAction valueSpecificationAction2 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction2);

		OpaqueExpression opaqueExpression = UML.createOpaqueExpression();
		assertValid(opaqueExpression);
		valueSpecificationAction2.setValue(opaqueExpression);
		assertSuperset(valueSpecificationAction2.getOwnedElements()
			.contains(opaqueExpression));

		Expression expression = UML.createExpression();
		assertValid(expression);
		valueSpecificationAction2.setValue(expression);
		assertSuperset(
			valueSpecificationAction2.getOwnedElements().contains(expression));

		ValueSpecificationAction valueSpecificationAction3 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction3);

		LiteralReal literalReal = UML.createLiteralReal();
		assertValid(literalReal);
		valueSpecificationAction3.setValue(literalReal);
		assertSuperset(
			valueSpecificationAction3.getOwnedElements().contains(literalReal));

		LiteralString literalString = UML.createLiteralString();
		assertValid(literalString);
		valueSpecificationAction3.setValue(literalString);
		assertSuperset(valueSpecificationAction3.getOwnedElements()
			.contains(literalString));

		ValueSpecificationAction valueSpecificationAction4 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction4);

		LiteralNull literalNull = UML.createLiteralNull();
		assertValid(literalNull);
		valueSpecificationAction4.setValue(literalNull);
		assertSuperset(
			valueSpecificationAction4.getOwnedElements().contains(literalNull));

		Duration duration = UML.createDuration();
		assertValid(duration);
		valueSpecificationAction4.setValue(duration);
		assertSuperset(
			valueSpecificationAction4.getOwnedElements().contains(duration));

		ValueSpecificationAction valueSpecificationAction5 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction5);

		LiteralInteger literalInteger = UML.createLiteralInteger();
		assertValid(literalInteger);
		valueSpecificationAction5.setValue(literalInteger);
		assertSuperset(valueSpecificationAction5.getOwnedElements()
			.contains(literalInteger));

		DurationInterval durationInterval = UML.createDurationInterval();
		assertValid(durationInterval);
		valueSpecificationAction5.setValue(durationInterval);
		assertSuperset(valueSpecificationAction5.getOwnedElements()
			.contains(durationInterval));

		ValueSpecificationAction valueSpecificationAction6 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction6);

		StringExpression stringExpression = UML.createStringExpression();
		assertValid(stringExpression);
		valueSpecificationAction6.setValue(stringExpression);
		assertSuperset(valueSpecificationAction6.getOwnedElements()
			.contains(stringExpression));

		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);
		valueSpecificationAction6.setValue(literalUnlimitedNatural);
		assertSuperset(valueSpecificationAction6.getOwnedElements()
			.contains(literalUnlimitedNatural));

		ValueSpecificationAction valueSpecificationAction7 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction7);

		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);
		valueSpecificationAction7.setValue(timeInterval);
		assertSuperset(valueSpecificationAction7.getOwnedElements()
			.contains(timeInterval));

		TimeExpression timeExpression = UML.createTimeExpression();
		assertValid(timeExpression);
		valueSpecificationAction7.setValue(timeExpression);
		assertSuperset(valueSpecificationAction7.getOwnedElements()
			.contains(timeExpression));

		ValueSpecificationAction valueSpecificationAction8 = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction8);

		InstanceValue instanceValue = UML.createInstanceValue();
		assertValid(instanceValue);
		valueSpecificationAction8.setValue(instanceValue);
		assertSuperset(valueSpecificationAction8.getOwnedElements()
			.contains(instanceValue));
	}

}
