/*
 * 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.UnmarshallAction;
import org.eclipse.uml2.uml.ValuePin;
import org.eclipse.uml2.uml.ValueSpecificationAction;
import org.eclipse.uml2.uml.Variable;

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

	public void testEAnnotations() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

	public void testOwnedComment() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

	public void testOwnedElement() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		EList<Element> elements = removeVariableValueAction.getOwnedElements();
		EList<Element> elements2 = removeVariableValueAction.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		EList<Dependency> dependencys = removeVariableValueAction
			.getClientDependencies();
		EList<Dependency> dependencys2 = removeVariableValueAction
			.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

	public void testRedefinedElement() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		EList<RedefinableElement> redefinableElements = removeVariableValueAction
			.getRedefinedElements();
		EList<RedefinableElement> redefinableElements2 = removeVariableValueAction
			.getRedefinedElements();
		assertSame(redefinableElements, redefinableElements2);
	}

	public void testRedefinitionContext() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		EList<Classifier> classifiers = removeVariableValueAction
			.getRedefinitionContexts();
		EList<Classifier> classifiers2 = removeVariableValueAction
			.getRedefinitionContexts();
		assertSame(classifiers, classifiers2);
	}

	public void testInGroup() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		EList<ActivityGroup> activityGroups = removeVariableValueAction
			.getInGroups();
		EList<ActivityGroup> activityGroups2 = removeVariableValueAction
			.getInGroups();
		assertSame(activityGroups, activityGroups2);
	}

	public void testInInterruptibleRegion() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

	public void testInStructuredNode() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

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

		RemoveVariableValueAction removeVariableValueAction2 = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction2);

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

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

		RemoveVariableValueAction removeVariableValueAction3 = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction3);

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

	public void testIncoming() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

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

	public void testOutgoing() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

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

	public void testRedefinedNode() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	public void testInPartition() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

	public void testHandler() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

	public void testInput() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		EList<InputPin> inputPins = removeVariableValueAction.getInputs();
		EList<InputPin> inputPins2 = removeVariableValueAction.getInputs();
		assertSame(inputPins, inputPins2);
	}

	public void testLocalPostcondition() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

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

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

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

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

	public void testLocalPrecondition() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

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

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

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

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

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

	public void testOutput() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		EList<OutputPin> outputPins = removeVariableValueAction.getOutputs();
		EList<OutputPin> outputPins2 = removeVariableValueAction.getOutputs();
		assertSame(outputPins, outputPins2);
	}

	public void testVariable() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

		Variable variable = UML.createVariable();
		assertValid(variable);
		removeVariableValueAction.setVariable(variable);
	}

	public void testValue() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

		InputPin inputPin = UML.createInputPin();
		assertValid(inputPin);
		removeVariableValueAction.setValue(inputPin);
		assertSuperset(
			removeVariableValueAction.getInputs().contains(inputPin));

		ValuePin valuePin = UML.createValuePin();
		assertValid(valuePin);
		removeVariableValueAction.setValue(valuePin);
		assertSuperset(
			removeVariableValueAction.getInputs().contains(valuePin));

		RemoveVariableValueAction removeVariableValueAction2 = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction2);

		ActionInputPin actionInputPin = UML.createActionInputPin();
		assertValid(actionInputPin);
		removeVariableValueAction2.setValue(actionInputPin);
		assertSuperset(
			removeVariableValueAction2.getInputs().contains(actionInputPin));
	}

	public void testRemoveAt() {
		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);

		InputPin inputPin = UML.createInputPin();
		assertValid(inputPin);
		removeVariableValueAction.setRemoveAt(inputPin);
		assertSuperset(
			removeVariableValueAction.getInputs().contains(inputPin));

		ValuePin valuePin = UML.createValuePin();
		assertValid(valuePin);
		removeVariableValueAction.setRemoveAt(valuePin);
		assertSuperset(
			removeVariableValueAction.getInputs().contains(valuePin));

		RemoveVariableValueAction removeVariableValueAction2 = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction2);

		ActionInputPin actionInputPin = UML.createActionInputPin();
		assertValid(actionInputPin);
		removeVariableValueAction2.setRemoveAt(actionInputPin);
		assertSuperset(
			removeVariableValueAction2.getInputs().contains(actionInputPin));
	}

}
