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

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

	public void testEAnnotations() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

	public void testOwnedComment() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

	public void testOwnedElement() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		EList<Element> elements = readStructuralFeatureAction
			.getOwnedElements();
		EList<Element> elements2 = readStructuralFeatureAction
			.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		EList<Dependency> dependencys = readStructuralFeatureAction
			.getClientDependencies();
		EList<Dependency> dependencys2 = readStructuralFeatureAction
			.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

	public void testRedefinedElement() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		EList<RedefinableElement> redefinableElements = readStructuralFeatureAction
			.getRedefinedElements();
		EList<RedefinableElement> redefinableElements2 = readStructuralFeatureAction
			.getRedefinedElements();
		assertSame(redefinableElements, redefinableElements2);
	}

	public void testRedefinitionContext() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		EList<Classifier> classifiers = readStructuralFeatureAction
			.getRedefinitionContexts();
		EList<Classifier> classifiers2 = readStructuralFeatureAction
			.getRedefinitionContexts();
		assertSame(classifiers, classifiers2);
	}

	public void testInGroup() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		EList<ActivityGroup> activityGroups = readStructuralFeatureAction
			.getInGroups();
		EList<ActivityGroup> activityGroups2 = readStructuralFeatureAction
			.getInGroups();
		assertSame(activityGroups, activityGroups2);
	}

	public void testInInterruptibleRegion() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

	public void testInStructuredNode() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

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

		ReadStructuralFeatureAction readStructuralFeatureAction2 = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction2);

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

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

		ReadStructuralFeatureAction readStructuralFeatureAction3 = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction3);

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

	public void testIncoming() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

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

	public void testOutgoing() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

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

	public void testRedefinedNode() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	public void testInPartition() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

	public void testHandler() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

	public void testInput() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		EList<InputPin> inputPins = readStructuralFeatureAction.getInputs();
		EList<InputPin> inputPins2 = readStructuralFeatureAction.getInputs();
		assertSame(inputPins, inputPins2);
	}

	public void testLocalPostcondition() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

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

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

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

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

	public void testLocalPrecondition() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

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

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

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

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

	public void testOutput() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		EList<OutputPin> outputPins = readStructuralFeatureAction.getOutputs();
		EList<OutputPin> outputPins2 = readStructuralFeatureAction.getOutputs();
		assertSame(outputPins, outputPins2);
	}

	public void testObject() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

		InputPin inputPin = UML.createInputPin();
		assertValid(inputPin);
		readStructuralFeatureAction.setObject(inputPin);
		assertSuperset(
			readStructuralFeatureAction.getInputs().contains(inputPin));

		ValuePin valuePin = UML.createValuePin();
		assertValid(valuePin);
		readStructuralFeatureAction.setObject(valuePin);
		assertSuperset(
			readStructuralFeatureAction.getInputs().contains(valuePin));

		ReadStructuralFeatureAction readStructuralFeatureAction2 = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction2);

		ActionInputPin actionInputPin = UML.createActionInputPin();
		assertValid(actionInputPin);
		readStructuralFeatureAction2.setObject(actionInputPin);
		assertSuperset(
			readStructuralFeatureAction2.getInputs().contains(actionInputPin));
	}

	public void testStructuralFeature() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

		Port port = UML.createPort();
		assertValid(port);
		readStructuralFeatureAction.setStructuralFeature(port);

		ExtensionEnd extensionEnd = UML.createExtensionEnd();
		assertValid(extensionEnd);
		readStructuralFeatureAction.setStructuralFeature(extensionEnd);

		ReadStructuralFeatureAction readStructuralFeatureAction2 = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction2);

		Property property = UML.createProperty();
		assertValid(property);
		readStructuralFeatureAction2.setStructuralFeature(property);
	}

	public void testResult() {
		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);

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

}
