/*
 * 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.Activity;
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.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.DurationInterval;
import org.eclipse.uml2.uml.Element;
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.InterruptibleActivityRegion;
import org.eclipse.uml2.uml.Interval;
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.ProtocolStateMachine;
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.StateMachine;
import org.eclipse.uml2.uml.StringExpression;
import org.eclipse.uml2.uml.StructuredActivityNode;
import org.eclipse.uml2.uml.TestIdentityAction;
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 ObjectFlowTest
		extends _Abstract_Compliance_Test_ {

	public void testEAnnotations() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

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

	public void testOwnedComment() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

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

	public void testOwnedElement() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);
		EList<Element> elements = objectFlow.getOwnedElements();
		EList<Element> elements2 = objectFlow.getOwnedElements();
		assertSame(elements, elements2);
	}

	public void testClientDependency() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);
		EList<Dependency> dependencys = objectFlow.getClientDependencies();
		EList<Dependency> dependencys2 = objectFlow.getClientDependencies();
		assertSame(dependencys, dependencys2);
	}

	public void testNameExpression() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

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

	public void testRedefinedElement() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);
		EList<RedefinableElement> redefinableElements = objectFlow
			.getRedefinedElements();
		EList<RedefinableElement> redefinableElements2 = objectFlow
			.getRedefinedElements();
		assertSame(redefinableElements, redefinableElements2);
	}

	public void testRedefinitionContext() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);
		EList<Classifier> classifiers = objectFlow.getRedefinitionContexts();
		EList<Classifier> classifiers2 = objectFlow.getRedefinitionContexts();
		assertSame(classifiers, classifiers2);
	}

	public void testActivity() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		Activity activity = UML.createActivity();
		assertValid(activity);
		objectFlow.setActivity(activity);
		assertSuperset(objectFlow.getOwner() == activity);
	}

	public void testGuard() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		LiteralBoolean literalBoolean = UML.createLiteralBoolean();
		assertValid(literalBoolean);
		objectFlow.setGuard(literalBoolean);
		assertSuperset(objectFlow.getOwnedElements().contains(literalBoolean));

		Interval interval = UML.createInterval();
		assertValid(interval);
		objectFlow.setGuard(interval);
		assertSuperset(objectFlow.getOwnedElements().contains(interval));

		ObjectFlow objectFlow2 = UML.createObjectFlow();
		assertValid(objectFlow2);

		OpaqueExpression opaqueExpression = UML.createOpaqueExpression();
		assertValid(opaqueExpression);
		objectFlow2.setGuard(opaqueExpression);
		assertSuperset(
			objectFlow2.getOwnedElements().contains(opaqueExpression));

		Expression expression = UML.createExpression();
		assertValid(expression);
		objectFlow2.setGuard(expression);
		assertSuperset(objectFlow2.getOwnedElements().contains(expression));

		ObjectFlow objectFlow3 = UML.createObjectFlow();
		assertValid(objectFlow3);

		LiteralReal literalReal = UML.createLiteralReal();
		assertValid(literalReal);
		objectFlow3.setGuard(literalReal);
		assertSuperset(objectFlow3.getOwnedElements().contains(literalReal));

		LiteralString literalString = UML.createLiteralString();
		assertValid(literalString);
		objectFlow3.setGuard(literalString);
		assertSuperset(objectFlow3.getOwnedElements().contains(literalString));

		ObjectFlow objectFlow4 = UML.createObjectFlow();
		assertValid(objectFlow4);

		LiteralNull literalNull = UML.createLiteralNull();
		assertValid(literalNull);
		objectFlow4.setGuard(literalNull);
		assertSuperset(objectFlow4.getOwnedElements().contains(literalNull));

		Duration duration = UML.createDuration();
		assertValid(duration);
		objectFlow4.setGuard(duration);
		assertSuperset(objectFlow4.getOwnedElements().contains(duration));

		ObjectFlow objectFlow5 = UML.createObjectFlow();
		assertValid(objectFlow5);

		LiteralInteger literalInteger = UML.createLiteralInteger();
		assertValid(literalInteger);
		objectFlow5.setGuard(literalInteger);
		assertSuperset(objectFlow5.getOwnedElements().contains(literalInteger));

		DurationInterval durationInterval = UML.createDurationInterval();
		assertValid(durationInterval);
		objectFlow5.setGuard(durationInterval);
		assertSuperset(
			objectFlow5.getOwnedElements().contains(durationInterval));

		ObjectFlow objectFlow6 = UML.createObjectFlow();
		assertValid(objectFlow6);

		StringExpression stringExpression = UML.createStringExpression();
		assertValid(stringExpression);
		objectFlow6.setGuard(stringExpression);
		assertSuperset(
			objectFlow6.getOwnedElements().contains(stringExpression));

		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);
		objectFlow6.setGuard(literalUnlimitedNatural);
		assertSuperset(
			objectFlow6.getOwnedElements().contains(literalUnlimitedNatural));

		ObjectFlow objectFlow7 = UML.createObjectFlow();
		assertValid(objectFlow7);

		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);
		objectFlow7.setGuard(timeInterval);
		assertSuperset(objectFlow7.getOwnedElements().contains(timeInterval));

		TimeExpression timeExpression = UML.createTimeExpression();
		assertValid(timeExpression);
		objectFlow7.setGuard(timeExpression);
		assertSuperset(objectFlow7.getOwnedElements().contains(timeExpression));

		ObjectFlow objectFlow8 = UML.createObjectFlow();
		assertValid(objectFlow8);

		InstanceValue instanceValue = UML.createInstanceValue();
		assertValid(instanceValue);
		objectFlow8.setGuard(instanceValue);
		assertSuperset(objectFlow8.getOwnedElements().contains(instanceValue));
	}

	public void testInPartition() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

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

	public void testInterrupts() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		InterruptibleActivityRegion interruptibleActivityRegion = UML
			.createInterruptibleActivityRegion();
		assertValid(interruptibleActivityRegion);
		objectFlow.setInterrupts(interruptibleActivityRegion);
	}

	public void testInStructuredNode() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

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

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

		ObjectFlow objectFlow2 = UML.createObjectFlow();
		assertValid(objectFlow2);

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

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

		ObjectFlow objectFlow3 = UML.createObjectFlow();
		assertValid(objectFlow3);

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

	public void testTarget() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		StartClassifierBehaviorAction startClassifierBehaviorAction = UML
			.createStartClassifierBehaviorAction();
		assertValid(startClassifierBehaviorAction);
		objectFlow.setTarget(startClassifierBehaviorAction);

		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		objectFlow.setTarget(removeVariableValueAction);

		ObjectFlow objectFlow2 = UML.createObjectFlow();
		assertValid(objectFlow2);

		ReadSelfAction readSelfAction = UML.createReadSelfAction();
		assertValid(readSelfAction);
		objectFlow2.setTarget(readSelfAction);

		InputPin inputPin = UML.createInputPin();
		assertValid(inputPin);
		objectFlow2.setTarget(inputPin);

		ObjectFlow objectFlow3 = UML.createObjectFlow();
		assertValid(objectFlow3);

		ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction = UML
			.createReadLinkObjectEndQualifierAction();
		assertValid(readLinkObjectEndQualifierAction);
		objectFlow3.setTarget(readLinkObjectEndQualifierAction);

		JoinNode joinNode = UML.createJoinNode();
		assertValid(joinNode);
		objectFlow3.setTarget(joinNode);

		ObjectFlow objectFlow4 = UML.createObjectFlow();
		assertValid(objectFlow4);

		CreateLinkObjectAction createLinkObjectAction = UML
			.createCreateLinkObjectAction();
		assertValid(createLinkObjectAction);
		objectFlow4.setTarget(createLinkObjectAction);

		SendSignalAction sendSignalAction = UML.createSendSignalAction();
		assertValid(sendSignalAction);
		objectFlow4.setTarget(sendSignalAction);

		ObjectFlow objectFlow5 = UML.createObjectFlow();
		assertValid(objectFlow5);

		ReadLinkAction readLinkAction = UML.createReadLinkAction();
		assertValid(readLinkAction);
		objectFlow5.setTarget(readLinkAction);

		ReplyAction replyAction = UML.createReplyAction();
		assertValid(replyAction);
		objectFlow5.setTarget(replyAction);

		ObjectFlow objectFlow6 = UML.createObjectFlow();
		assertValid(objectFlow6);

		ClearAssociationAction clearAssociationAction = UML
			.createClearAssociationAction();
		assertValid(clearAssociationAction);
		objectFlow6.setTarget(clearAssociationAction);

		FlowFinalNode flowFinalNode = UML.createFlowFinalNode();
		assertValid(flowFinalNode);
		objectFlow6.setTarget(flowFinalNode);

		ObjectFlow objectFlow7 = UML.createObjectFlow();
		assertValid(objectFlow7);

		ClearStructuralFeatureAction clearStructuralFeatureAction = UML
			.createClearStructuralFeatureAction();
		assertValid(clearStructuralFeatureAction);
		objectFlow7.setTarget(clearStructuralFeatureAction);

		ExpansionRegion expansionRegion = UML.createExpansionRegion();
		assertValid(expansionRegion);
		objectFlow7.setTarget(expansionRegion);

		ObjectFlow objectFlow8 = UML.createObjectFlow();
		assertValid(objectFlow8);

		StructuredActivityNode structuredActivityNode = UML
			.createStructuredActivityNode();
		assertValid(structuredActivityNode);
		objectFlow8.setTarget(structuredActivityNode);

		ValuePin valuePin = UML.createValuePin();
		assertValid(valuePin);
		objectFlow8.setTarget(valuePin);

		ObjectFlow objectFlow9 = UML.createObjectFlow();
		assertValid(objectFlow9);

		StartObjectBehaviorAction startObjectBehaviorAction = UML
			.createStartObjectBehaviorAction();
		assertValid(startObjectBehaviorAction);
		objectFlow9.setTarget(startObjectBehaviorAction);

		ForkNode forkNode = UML.createForkNode();
		assertValid(forkNode);
		objectFlow9.setTarget(forkNode);

		ObjectFlow objectFlow10 = UML.createObjectFlow();
		assertValid(objectFlow10);

		DecisionNode decisionNode = UML.createDecisionNode();
		assertValid(decisionNode);
		objectFlow10.setTarget(decisionNode);

		CallBehaviorAction callBehaviorAction = UML.createCallBehaviorAction();
		assertValid(callBehaviorAction);
		objectFlow10.setTarget(callBehaviorAction);

		ObjectFlow objectFlow11 = UML.createObjectFlow();
		assertValid(objectFlow11);

		ConditionalNode conditionalNode = UML.createConditionalNode();
		assertValid(conditionalNode);
		objectFlow11.setTarget(conditionalNode);

		ReadExtentAction readExtentAction = UML.createReadExtentAction();
		assertValid(readExtentAction);
		objectFlow11.setTarget(readExtentAction);

		ObjectFlow objectFlow12 = UML.createObjectFlow();
		assertValid(objectFlow12);

		ActionInputPin actionInputPin = UML.createActionInputPin();
		assertValid(actionInputPin);
		objectFlow12.setTarget(actionInputPin);

		ReadIsClassifiedObjectAction readIsClassifiedObjectAction = UML
			.createReadIsClassifiedObjectAction();
		assertValid(readIsClassifiedObjectAction);
		objectFlow12.setTarget(readIsClassifiedObjectAction);

		ObjectFlow objectFlow13 = UML.createObjectFlow();
		assertValid(objectFlow13);

		ActivityParameterNode activityParameterNode = UML
			.createActivityParameterNode();
		assertValid(activityParameterNode);
		objectFlow13.setTarget(activityParameterNode);

		AddStructuralFeatureValueAction addStructuralFeatureValueAction = UML
			.createAddStructuralFeatureValueAction();
		assertValid(addStructuralFeatureValueAction);
		objectFlow13.setTarget(addStructuralFeatureValueAction);

		ObjectFlow objectFlow14 = UML.createObjectFlow();
		assertValid(objectFlow14);

		ReadVariableAction readVariableAction = UML.createReadVariableAction();
		assertValid(readVariableAction);
		objectFlow14.setTarget(readVariableAction);

		ClearVariableAction clearVariableAction = UML
			.createClearVariableAction();
		assertValid(clearVariableAction);
		objectFlow14.setTarget(clearVariableAction);

		ObjectFlow objectFlow15 = UML.createObjectFlow();
		assertValid(objectFlow15);

		RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction = UML
			.createRemoveStructuralFeatureValueAction();
		assertValid(removeStructuralFeatureValueAction);
		objectFlow15.setTarget(removeStructuralFeatureValueAction);

		CreateLinkAction createLinkAction = UML.createCreateLinkAction();
		assertValid(createLinkAction);
		objectFlow15.setTarget(createLinkAction);

		ObjectFlow objectFlow16 = UML.createObjectFlow();
		assertValid(objectFlow16);

		ReclassifyObjectAction reclassifyObjectAction = UML
			.createReclassifyObjectAction();
		assertValid(reclassifyObjectAction);
		objectFlow16.setTarget(reclassifyObjectAction);

		DataStoreNode dataStoreNode = UML.createDataStoreNode();
		assertValid(dataStoreNode);
		objectFlow16.setTarget(dataStoreNode);

		ObjectFlow objectFlow17 = UML.createObjectFlow();
		assertValid(objectFlow17);

		SendObjectAction sendObjectAction = UML.createSendObjectAction();
		assertValid(sendObjectAction);
		objectFlow17.setTarget(sendObjectAction);

		ReduceAction reduceAction = UML.createReduceAction();
		assertValid(reduceAction);
		objectFlow17.setTarget(reduceAction);

		ObjectFlow objectFlow18 = UML.createObjectFlow();
		assertValid(objectFlow18);

		AcceptEventAction acceptEventAction = UML.createAcceptEventAction();
		assertValid(acceptEventAction);
		objectFlow18.setTarget(acceptEventAction);

		DestroyLinkAction destroyLinkAction = UML.createDestroyLinkAction();
		assertValid(destroyLinkAction);
		objectFlow18.setTarget(destroyLinkAction);

		ObjectFlow objectFlow19 = UML.createObjectFlow();
		assertValid(objectFlow19);

		ExpansionNode expansionNode = UML.createExpansionNode();
		assertValid(expansionNode);
		objectFlow19.setTarget(expansionNode);

		InitialNode initialNode = UML.createInitialNode();
		assertValid(initialNode);
		objectFlow19.setTarget(initialNode);

		ObjectFlow objectFlow20 = UML.createObjectFlow();
		assertValid(objectFlow20);

		TestIdentityAction testIdentityAction = UML.createTestIdentityAction();
		assertValid(testIdentityAction);
		objectFlow20.setTarget(testIdentityAction);

		OutputPin outputPin = UML.createOutputPin();
		assertValid(outputPin);
		objectFlow20.setTarget(outputPin);

		ObjectFlow objectFlow21 = UML.createObjectFlow();
		assertValid(objectFlow21);

		CentralBufferNode centralBufferNode = UML.createCentralBufferNode();
		assertValid(centralBufferNode);
		objectFlow21.setTarget(centralBufferNode);

		BroadcastSignalAction broadcastSignalAction = UML
			.createBroadcastSignalAction();
		assertValid(broadcastSignalAction);
		objectFlow21.setTarget(broadcastSignalAction);

		ObjectFlow objectFlow22 = UML.createObjectFlow();
		assertValid(objectFlow22);

		RaiseExceptionAction raiseExceptionAction = UML
			.createRaiseExceptionAction();
		assertValid(raiseExceptionAction);
		objectFlow22.setTarget(raiseExceptionAction);

		ActivityFinalNode activityFinalNode = UML.createActivityFinalNode();
		assertValid(activityFinalNode);
		objectFlow22.setTarget(activityFinalNode);

		ObjectFlow objectFlow23 = UML.createObjectFlow();
		assertValid(objectFlow23);

		CallOperationAction callOperationAction = UML
			.createCallOperationAction();
		assertValid(callOperationAction);
		objectFlow23.setTarget(callOperationAction);

		LoopNode loopNode = UML.createLoopNode();
		assertValid(loopNode);
		objectFlow23.setTarget(loopNode);

		ObjectFlow objectFlow24 = UML.createObjectFlow();
		assertValid(objectFlow24);

		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		objectFlow24.setTarget(valueSpecificationAction);

		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		objectFlow24.setTarget(acceptCallAction);

		ObjectFlow objectFlow25 = UML.createObjectFlow();
		assertValid(objectFlow25);

		AddVariableValueAction addVariableValueAction = UML
			.createAddVariableValueAction();
		assertValid(addVariableValueAction);
		objectFlow25.setTarget(addVariableValueAction);

		ReadLinkObjectEndAction readLinkObjectEndAction = UML
			.createReadLinkObjectEndAction();
		assertValid(readLinkObjectEndAction);
		objectFlow25.setTarget(readLinkObjectEndAction);

		ObjectFlow objectFlow26 = UML.createObjectFlow();
		assertValid(objectFlow26);

		UnmarshallAction unmarshallAction = UML.createUnmarshallAction();
		assertValid(unmarshallAction);
		objectFlow26.setTarget(unmarshallAction);

		OpaqueAction opaqueAction = UML.createOpaqueAction();
		assertValid(opaqueAction);
		objectFlow26.setTarget(opaqueAction);

		ObjectFlow objectFlow27 = UML.createObjectFlow();
		assertValid(objectFlow27);

		MergeNode mergeNode = UML.createMergeNode();
		assertValid(mergeNode);
		objectFlow27.setTarget(mergeNode);

		SequenceNode sequenceNode = UML.createSequenceNode();
		assertValid(sequenceNode);
		objectFlow27.setTarget(sequenceNode);

		ObjectFlow objectFlow28 = UML.createObjectFlow();
		assertValid(objectFlow28);

		CreateObjectAction createObjectAction = UML.createCreateObjectAction();
		assertValid(createObjectAction);
		objectFlow28.setTarget(createObjectAction);

		DestroyObjectAction destroyObjectAction = UML
			.createDestroyObjectAction();
		assertValid(destroyObjectAction);
		objectFlow28.setTarget(destroyObjectAction);

		ObjectFlow objectFlow29 = UML.createObjectFlow();
		assertValid(objectFlow29);

		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		objectFlow29.setTarget(readStructuralFeatureAction);
	}

	public void testSource() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		StartClassifierBehaviorAction startClassifierBehaviorAction = UML
			.createStartClassifierBehaviorAction();
		assertValid(startClassifierBehaviorAction);
		objectFlow.setSource(startClassifierBehaviorAction);

		RemoveVariableValueAction removeVariableValueAction = UML
			.createRemoveVariableValueAction();
		assertValid(removeVariableValueAction);
		objectFlow.setSource(removeVariableValueAction);

		ObjectFlow objectFlow2 = UML.createObjectFlow();
		assertValid(objectFlow2);

		ReadSelfAction readSelfAction = UML.createReadSelfAction();
		assertValid(readSelfAction);
		objectFlow2.setSource(readSelfAction);

		InputPin inputPin = UML.createInputPin();
		assertValid(inputPin);
		objectFlow2.setSource(inputPin);

		ObjectFlow objectFlow3 = UML.createObjectFlow();
		assertValid(objectFlow3);

		ReadLinkObjectEndQualifierAction readLinkObjectEndQualifierAction = UML
			.createReadLinkObjectEndQualifierAction();
		assertValid(readLinkObjectEndQualifierAction);
		objectFlow3.setSource(readLinkObjectEndQualifierAction);

		JoinNode joinNode = UML.createJoinNode();
		assertValid(joinNode);
		objectFlow3.setSource(joinNode);

		ObjectFlow objectFlow4 = UML.createObjectFlow();
		assertValid(objectFlow4);

		CreateLinkObjectAction createLinkObjectAction = UML
			.createCreateLinkObjectAction();
		assertValid(createLinkObjectAction);
		objectFlow4.setSource(createLinkObjectAction);

		SendSignalAction sendSignalAction = UML.createSendSignalAction();
		assertValid(sendSignalAction);
		objectFlow4.setSource(sendSignalAction);

		ObjectFlow objectFlow5 = UML.createObjectFlow();
		assertValid(objectFlow5);

		ReadLinkAction readLinkAction = UML.createReadLinkAction();
		assertValid(readLinkAction);
		objectFlow5.setSource(readLinkAction);

		ReplyAction replyAction = UML.createReplyAction();
		assertValid(replyAction);
		objectFlow5.setSource(replyAction);

		ObjectFlow objectFlow6 = UML.createObjectFlow();
		assertValid(objectFlow6);

		ClearAssociationAction clearAssociationAction = UML
			.createClearAssociationAction();
		assertValid(clearAssociationAction);
		objectFlow6.setSource(clearAssociationAction);

		FlowFinalNode flowFinalNode = UML.createFlowFinalNode();
		assertValid(flowFinalNode);
		objectFlow6.setSource(flowFinalNode);

		ObjectFlow objectFlow7 = UML.createObjectFlow();
		assertValid(objectFlow7);

		ClearStructuralFeatureAction clearStructuralFeatureAction = UML
			.createClearStructuralFeatureAction();
		assertValid(clearStructuralFeatureAction);
		objectFlow7.setSource(clearStructuralFeatureAction);

		ExpansionRegion expansionRegion = UML.createExpansionRegion();
		assertValid(expansionRegion);
		objectFlow7.setSource(expansionRegion);

		ObjectFlow objectFlow8 = UML.createObjectFlow();
		assertValid(objectFlow8);

		StructuredActivityNode structuredActivityNode = UML
			.createStructuredActivityNode();
		assertValid(structuredActivityNode);
		objectFlow8.setSource(structuredActivityNode);

		ValuePin valuePin = UML.createValuePin();
		assertValid(valuePin);
		objectFlow8.setSource(valuePin);

		ObjectFlow objectFlow9 = UML.createObjectFlow();
		assertValid(objectFlow9);

		StartObjectBehaviorAction startObjectBehaviorAction = UML
			.createStartObjectBehaviorAction();
		assertValid(startObjectBehaviorAction);
		objectFlow9.setSource(startObjectBehaviorAction);

		ForkNode forkNode = UML.createForkNode();
		assertValid(forkNode);
		objectFlow9.setSource(forkNode);

		ObjectFlow objectFlow10 = UML.createObjectFlow();
		assertValid(objectFlow10);

		DecisionNode decisionNode = UML.createDecisionNode();
		assertValid(decisionNode);
		objectFlow10.setSource(decisionNode);

		CallBehaviorAction callBehaviorAction = UML.createCallBehaviorAction();
		assertValid(callBehaviorAction);
		objectFlow10.setSource(callBehaviorAction);

		ObjectFlow objectFlow11 = UML.createObjectFlow();
		assertValid(objectFlow11);

		ConditionalNode conditionalNode = UML.createConditionalNode();
		assertValid(conditionalNode);
		objectFlow11.setSource(conditionalNode);

		ReadExtentAction readExtentAction = UML.createReadExtentAction();
		assertValid(readExtentAction);
		objectFlow11.setSource(readExtentAction);

		ObjectFlow objectFlow12 = UML.createObjectFlow();
		assertValid(objectFlow12);

		ActionInputPin actionInputPin = UML.createActionInputPin();
		assertValid(actionInputPin);
		objectFlow12.setSource(actionInputPin);

		ReadIsClassifiedObjectAction readIsClassifiedObjectAction = UML
			.createReadIsClassifiedObjectAction();
		assertValid(readIsClassifiedObjectAction);
		objectFlow12.setSource(readIsClassifiedObjectAction);

		ObjectFlow objectFlow13 = UML.createObjectFlow();
		assertValid(objectFlow13);

		ActivityParameterNode activityParameterNode = UML
			.createActivityParameterNode();
		assertValid(activityParameterNode);
		objectFlow13.setSource(activityParameterNode);

		AddStructuralFeatureValueAction addStructuralFeatureValueAction = UML
			.createAddStructuralFeatureValueAction();
		assertValid(addStructuralFeatureValueAction);
		objectFlow13.setSource(addStructuralFeatureValueAction);

		ObjectFlow objectFlow14 = UML.createObjectFlow();
		assertValid(objectFlow14);

		ReadVariableAction readVariableAction = UML.createReadVariableAction();
		assertValid(readVariableAction);
		objectFlow14.setSource(readVariableAction);

		ClearVariableAction clearVariableAction = UML
			.createClearVariableAction();
		assertValid(clearVariableAction);
		objectFlow14.setSource(clearVariableAction);

		ObjectFlow objectFlow15 = UML.createObjectFlow();
		assertValid(objectFlow15);

		RemoveStructuralFeatureValueAction removeStructuralFeatureValueAction = UML
			.createRemoveStructuralFeatureValueAction();
		assertValid(removeStructuralFeatureValueAction);
		objectFlow15.setSource(removeStructuralFeatureValueAction);

		CreateLinkAction createLinkAction = UML.createCreateLinkAction();
		assertValid(createLinkAction);
		objectFlow15.setSource(createLinkAction);

		ObjectFlow objectFlow16 = UML.createObjectFlow();
		assertValid(objectFlow16);

		ReclassifyObjectAction reclassifyObjectAction = UML
			.createReclassifyObjectAction();
		assertValid(reclassifyObjectAction);
		objectFlow16.setSource(reclassifyObjectAction);

		DataStoreNode dataStoreNode = UML.createDataStoreNode();
		assertValid(dataStoreNode);
		objectFlow16.setSource(dataStoreNode);

		ObjectFlow objectFlow17 = UML.createObjectFlow();
		assertValid(objectFlow17);

		SendObjectAction sendObjectAction = UML.createSendObjectAction();
		assertValid(sendObjectAction);
		objectFlow17.setSource(sendObjectAction);

		ReduceAction reduceAction = UML.createReduceAction();
		assertValid(reduceAction);
		objectFlow17.setSource(reduceAction);

		ObjectFlow objectFlow18 = UML.createObjectFlow();
		assertValid(objectFlow18);

		AcceptEventAction acceptEventAction = UML.createAcceptEventAction();
		assertValid(acceptEventAction);
		objectFlow18.setSource(acceptEventAction);

		DestroyLinkAction destroyLinkAction = UML.createDestroyLinkAction();
		assertValid(destroyLinkAction);
		objectFlow18.setSource(destroyLinkAction);

		ObjectFlow objectFlow19 = UML.createObjectFlow();
		assertValid(objectFlow19);

		ExpansionNode expansionNode = UML.createExpansionNode();
		assertValid(expansionNode);
		objectFlow19.setSource(expansionNode);

		InitialNode initialNode = UML.createInitialNode();
		assertValid(initialNode);
		objectFlow19.setSource(initialNode);

		ObjectFlow objectFlow20 = UML.createObjectFlow();
		assertValid(objectFlow20);

		TestIdentityAction testIdentityAction = UML.createTestIdentityAction();
		assertValid(testIdentityAction);
		objectFlow20.setSource(testIdentityAction);

		OutputPin outputPin = UML.createOutputPin();
		assertValid(outputPin);
		objectFlow20.setSource(outputPin);

		ObjectFlow objectFlow21 = UML.createObjectFlow();
		assertValid(objectFlow21);

		CentralBufferNode centralBufferNode = UML.createCentralBufferNode();
		assertValid(centralBufferNode);
		objectFlow21.setSource(centralBufferNode);

		BroadcastSignalAction broadcastSignalAction = UML
			.createBroadcastSignalAction();
		assertValid(broadcastSignalAction);
		objectFlow21.setSource(broadcastSignalAction);

		ObjectFlow objectFlow22 = UML.createObjectFlow();
		assertValid(objectFlow22);

		RaiseExceptionAction raiseExceptionAction = UML
			.createRaiseExceptionAction();
		assertValid(raiseExceptionAction);
		objectFlow22.setSource(raiseExceptionAction);

		ActivityFinalNode activityFinalNode = UML.createActivityFinalNode();
		assertValid(activityFinalNode);
		objectFlow22.setSource(activityFinalNode);

		ObjectFlow objectFlow23 = UML.createObjectFlow();
		assertValid(objectFlow23);

		CallOperationAction callOperationAction = UML
			.createCallOperationAction();
		assertValid(callOperationAction);
		objectFlow23.setSource(callOperationAction);

		LoopNode loopNode = UML.createLoopNode();
		assertValid(loopNode);
		objectFlow23.setSource(loopNode);

		ObjectFlow objectFlow24 = UML.createObjectFlow();
		assertValid(objectFlow24);

		ValueSpecificationAction valueSpecificationAction = UML
			.createValueSpecificationAction();
		assertValid(valueSpecificationAction);
		objectFlow24.setSource(valueSpecificationAction);

		AcceptCallAction acceptCallAction = UML.createAcceptCallAction();
		assertValid(acceptCallAction);
		objectFlow24.setSource(acceptCallAction);

		ObjectFlow objectFlow25 = UML.createObjectFlow();
		assertValid(objectFlow25);

		AddVariableValueAction addVariableValueAction = UML
			.createAddVariableValueAction();
		assertValid(addVariableValueAction);
		objectFlow25.setSource(addVariableValueAction);

		ReadLinkObjectEndAction readLinkObjectEndAction = UML
			.createReadLinkObjectEndAction();
		assertValid(readLinkObjectEndAction);
		objectFlow25.setSource(readLinkObjectEndAction);

		ObjectFlow objectFlow26 = UML.createObjectFlow();
		assertValid(objectFlow26);

		UnmarshallAction unmarshallAction = UML.createUnmarshallAction();
		assertValid(unmarshallAction);
		objectFlow26.setSource(unmarshallAction);

		OpaqueAction opaqueAction = UML.createOpaqueAction();
		assertValid(opaqueAction);
		objectFlow26.setSource(opaqueAction);

		ObjectFlow objectFlow27 = UML.createObjectFlow();
		assertValid(objectFlow27);

		MergeNode mergeNode = UML.createMergeNode();
		assertValid(mergeNode);
		objectFlow27.setSource(mergeNode);

		SequenceNode sequenceNode = UML.createSequenceNode();
		assertValid(sequenceNode);
		objectFlow27.setSource(sequenceNode);

		ObjectFlow objectFlow28 = UML.createObjectFlow();
		assertValid(objectFlow28);

		CreateObjectAction createObjectAction = UML.createCreateObjectAction();
		assertValid(createObjectAction);
		objectFlow28.setSource(createObjectAction);

		DestroyObjectAction destroyObjectAction = UML
			.createDestroyObjectAction();
		assertValid(destroyObjectAction);
		objectFlow28.setSource(destroyObjectAction);

		ObjectFlow objectFlow29 = UML.createObjectFlow();
		assertValid(objectFlow29);

		ReadStructuralFeatureAction readStructuralFeatureAction = UML
			.createReadStructuralFeatureAction();
		assertValid(readStructuralFeatureAction);
		objectFlow29.setSource(readStructuralFeatureAction);
	}

	public void testRedefinedEdge() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		ControlFlow controlFlow = UML.createControlFlow();
		assertValid(controlFlow);
		objectFlow.getRedefinedEdges().add(controlFlow);
		assertSuperset(objectFlow.getRedefinedElements().contains(controlFlow));

		ObjectFlow objectFlow2 = UML.createObjectFlow();
		assertValid(objectFlow2);
		objectFlow.getRedefinedEdges().add(objectFlow2);
		assertSuperset(objectFlow.getRedefinedElements().contains(objectFlow2));
	}

	public void testWeight() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		LiteralBoolean literalBoolean = UML.createLiteralBoolean();
		assertValid(literalBoolean);
		objectFlow.setWeight(literalBoolean);
		assertSuperset(objectFlow.getOwnedElements().contains(literalBoolean));

		Interval interval = UML.createInterval();
		assertValid(interval);
		objectFlow.setWeight(interval);
		assertSuperset(objectFlow.getOwnedElements().contains(interval));

		ObjectFlow objectFlow2 = UML.createObjectFlow();
		assertValid(objectFlow2);

		OpaqueExpression opaqueExpression = UML.createOpaqueExpression();
		assertValid(opaqueExpression);
		objectFlow2.setWeight(opaqueExpression);
		assertSuperset(
			objectFlow2.getOwnedElements().contains(opaqueExpression));

		Expression expression = UML.createExpression();
		assertValid(expression);
		objectFlow2.setWeight(expression);
		assertSuperset(objectFlow2.getOwnedElements().contains(expression));

		ObjectFlow objectFlow3 = UML.createObjectFlow();
		assertValid(objectFlow3);

		LiteralReal literalReal = UML.createLiteralReal();
		assertValid(literalReal);
		objectFlow3.setWeight(literalReal);
		assertSuperset(objectFlow3.getOwnedElements().contains(literalReal));

		LiteralString literalString = UML.createLiteralString();
		assertValid(literalString);
		objectFlow3.setWeight(literalString);
		assertSuperset(objectFlow3.getOwnedElements().contains(literalString));

		ObjectFlow objectFlow4 = UML.createObjectFlow();
		assertValid(objectFlow4);

		LiteralNull literalNull = UML.createLiteralNull();
		assertValid(literalNull);
		objectFlow4.setWeight(literalNull);
		assertSuperset(objectFlow4.getOwnedElements().contains(literalNull));

		Duration duration = UML.createDuration();
		assertValid(duration);
		objectFlow4.setWeight(duration);
		assertSuperset(objectFlow4.getOwnedElements().contains(duration));

		ObjectFlow objectFlow5 = UML.createObjectFlow();
		assertValid(objectFlow5);

		LiteralInteger literalInteger = UML.createLiteralInteger();
		assertValid(literalInteger);
		objectFlow5.setWeight(literalInteger);
		assertSuperset(objectFlow5.getOwnedElements().contains(literalInteger));

		DurationInterval durationInterval = UML.createDurationInterval();
		assertValid(durationInterval);
		objectFlow5.setWeight(durationInterval);
		assertSuperset(
			objectFlow5.getOwnedElements().contains(durationInterval));

		ObjectFlow objectFlow6 = UML.createObjectFlow();
		assertValid(objectFlow6);

		StringExpression stringExpression = UML.createStringExpression();
		assertValid(stringExpression);
		objectFlow6.setWeight(stringExpression);
		assertSuperset(
			objectFlow6.getOwnedElements().contains(stringExpression));

		LiteralUnlimitedNatural literalUnlimitedNatural = UML
			.createLiteralUnlimitedNatural();
		assertValid(literalUnlimitedNatural);
		objectFlow6.setWeight(literalUnlimitedNatural);
		assertSuperset(
			objectFlow6.getOwnedElements().contains(literalUnlimitedNatural));

		ObjectFlow objectFlow7 = UML.createObjectFlow();
		assertValid(objectFlow7);

		TimeInterval timeInterval = UML.createTimeInterval();
		assertValid(timeInterval);
		objectFlow7.setWeight(timeInterval);
		assertSuperset(objectFlow7.getOwnedElements().contains(timeInterval));

		TimeExpression timeExpression = UML.createTimeExpression();
		assertValid(timeExpression);
		objectFlow7.setWeight(timeExpression);
		assertSuperset(objectFlow7.getOwnedElements().contains(timeExpression));

		ObjectFlow objectFlow8 = UML.createObjectFlow();
		assertValid(objectFlow8);

		InstanceValue instanceValue = UML.createInstanceValue();
		assertValid(instanceValue);
		objectFlow8.setWeight(instanceValue);
		assertSuperset(objectFlow8.getOwnedElements().contains(instanceValue));
	}

	public void testInGroup() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);
		EList<ActivityGroup> activityGroups = objectFlow.getInGroups();
		EList<ActivityGroup> activityGroups2 = objectFlow.getInGroups();
		assertSame(activityGroups, activityGroups2);
	}

	public void testSelection() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		ProtocolStateMachine protocolStateMachine = UML
			.createProtocolStateMachine();
		assertValid(protocolStateMachine);
		objectFlow.setSelection(protocolStateMachine);

		StateMachine stateMachine = UML.createStateMachine();
		assertValid(stateMachine);
		objectFlow.setSelection(stateMachine);
	}

	public void testTransformation() {
		ObjectFlow objectFlow = UML.createObjectFlow();
		assertValid(objectFlow);

		ProtocolStateMachine protocolStateMachine = UML
			.createProtocolStateMachine();
		assertValid(protocolStateMachine);
		objectFlow.setTransformation(protocolStateMachine);

		StateMachine stateMachine = UML.createStateMachine();
		assertValid(stateMachine);
		objectFlow.setTransformation(stateMachine);
	}

}
