/******************************************************************************
 * Copyright (c) 2008 IBM Corporation 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:
 *    IBM Corporation - initial API and implementation 
 ****************************************************************************/
package org.eclipse.gmf.examples.runtime.diagram.layout.graph;

import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.graph.DirectedGraph;
import org.eclipse.draw2d.graph.Edge;
import org.eclipse.draw2d.graph.EdgeList;
import org.eclipse.draw2d.graph.Node;
import org.eclipse.draw2d.graph.NodeList;
import org.eclipse.gmf.runtime.draw2d.ui.graph.BorderNode;
import org.eclipse.gmf.runtime.draw2d.ui.graph.ConstantSizeNode;
import org.eclipse.gmf.runtime.draw2d.ui.graph.ConstrainedEdge;
import org.eclipse.gmf.runtime.draw2d.ui.graph.GMFDirectedGraphLayout;

public class GMFGraphTests {
	
	public static DirectedGraph test1() {
		ConstantSizeNode hub, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10;
		ConstrainedEdge e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, temp;
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		Node extra = new ConstantSizeNode("Extra"); //$NON-NLS-1$
		nodes.add(extra);
		
		nodes.add(hub = new ConstantSizeNode("Hub")); //$NON-NLS-1$
		nodes.add(n1 = new ConstantSizeNode("n1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("n2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("n3")); //$NON-NLS-1$
		nodes.add(n4 = new ConstantSizeNode("n4")); //$NON-NLS-1$
		nodes.add(n5 = new ConstantSizeNode("n5")); //$NON-NLS-1$
		nodes.add(n6 = new ConstantSizeNode("n6")); //$NON-NLS-1$
		nodes.add(n7 = new ConstantSizeNode("n7")); //$NON-NLS-1$
		nodes.add(n8 = new ConstantSizeNode("n8")); //$NON-NLS-1$
		nodes.add(n9 = new ConstantSizeNode("n9")); //$NON-NLS-1$
		nodes.add(n10 = new ConstantSizeNode("n10")); //$NON-NLS-1$
		
		hub.width = 400;
		hub.setMinIncomingPadding(20);
		hub.setMinOutgoingPadding(20);
		n1.setMinIncomingPadding(10);
		n2.setMinIncomingPadding(10);
		n3.setMinIncomingPadding(10);
		n4.setMinIncomingPadding(10);
		n1.width = n6.width = n10.width = n4.width = 100;
		n5.width = 180;
		
		n10.setMinOutgoingPadding(10);
		n5.setMinIncomingPadding(10);
		
		edges.add(new Edge(extra, n1));
		edges.add(new Edge(extra, n2));
		edges.add(new Edge(extra, n2));
		
//		edges.add(new Edge(n10, n5));
		
		edges.add(e1 = new ConstrainedEdge(hub, n1));
		edges.add(e2 = new ConstrainedEdge(hub, n2));
		edges.add(e3 = new ConstrainedEdge(hub, n3));
		edges.add(e4 = new ConstrainedEdge(hub, n4));
		edges.add(e5 = new ConstrainedEdge(hub, n5));
		edges.add(e6 = new ConstrainedEdge(n6, hub));
		edges.add(e7 = new ConstrainedEdge(n7, hub));
		edges.add(e8 = new ConstrainedEdge(n8, hub));
		edges.add(e9 = new ConstrainedEdge(n9, hub));
		edges.add(e10 = new ConstrainedEdge(n10, hub));
				
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		new GMFDirectedGraphLayout().visit(g);
		
		return g;
		
	}
	
	public static DirectedGraph test2() {
		ConstantSizeNode head, n1, n2, n3, n4, n5, d1, d2, n6, n7, tail;
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		nodes.add(head = new ConstantSizeNode("head")); //$NON-NLS-1$
		nodes.add(n1 = new ConstantSizeNode("n1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("n2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("n3")); //$NON-NLS-1$
		nodes.add(n4 = new ConstantSizeNode("n4")); //$NON-NLS-1$
		nodes.add(n5 = new ConstantSizeNode("n5")); //$NON-NLS-1$
		nodes.add(d1 = new ConstantSizeNode("d1")); //$NON-NLS-1$
		nodes.add(d2 = new ConstantSizeNode("d2")); //$NON-NLS-1$
		nodes.add(n6 = new ConstantSizeNode("n6")); //$NON-NLS-1$
		nodes.add(n7 = new ConstantSizeNode("n7")); //$NON-NLS-1$
		nodes.add(tail = new ConstantSizeNode("tail")); //$NON-NLS-1$
		
		head.width = tail.width = 20;
		head.height = tail.height = 250;
		
		edges.add(new Edge(head, n1));
		edges.add(new Edge(head, n2));
		edges.add(new Edge(head, n3));
		edges.add(new Edge(head, n4));
		edges.add(new Edge(head, n5));
		
		edges.add(new Edge(n1, d1));
		edges.add(new Edge(n2, tail));
		edges.add(new Edge(n3, d2));
		edges.add(new Edge(n4, tail));
		edges.add(new Edge(n5, tail));
		
		edges.add(new Edge(d1, n6));
		edges.add(new Edge(n6, tail));
		edges.add(new Edge(d1, tail));
		
		edges.add(new Edge(d2, n7));
		edges.add(new Edge(n7, tail));
		edges.add(new Edge(d2, tail));
		
		for (int i = 0; i < nodes.size(); i++) {
			Node n = nodes.getNode(i);
			if (n instanceof ConstantSizeNode) {
				ConstantSizeNode cn = (ConstantSizeNode) n;
				cn.setMinIncomingPadding(5);
				cn.setMinOutgoingPadding(5);
			}
		}
		
		DirectedGraph graph = new DirectedGraph();
		graph.nodes = nodes;
		graph.edges = edges;
		graph.setDirection(PositionConstants.WEST);
		
		new GMFDirectedGraphLayout().visit(graph);
		return graph;
	}
	
	public static DirectedGraph test3() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		ConstantSizeNode hub, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10;
		ConstrainedEdge e1, e2, e3, e4, e5, e6, e7, e8, e9, e10;
		
		nodes.add(n1 = new ConstantSizeNode("n1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("n2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("n3")); //$NON-NLS-1$
		nodes.add(n4 = new ConstantSizeNode("n4")); //$NON-NLS-1$
		nodes.add(n5 = new ConstantSizeNode("n5")); //$NON-NLS-1$
		nodes.add(n6 = new ConstantSizeNode("n6")); //$NON-NLS-1$
		nodes.add(n7 = new ConstantSizeNode("n7")); //$NON-NLS-1$
		nodes.add(n8 = new ConstantSizeNode("n8")); //$NON-NLS-1$
		nodes.add(n9 = new ConstantSizeNode("n9")); //$NON-NLS-1$
		nodes.add(n10 = new ConstantSizeNode("n10")); //$NON-NLS-1$
		nodes.add(hub = new ConstantSizeNode("hub")); //$NON-NLS-1$
		
		hub.setMinIncomingPadding(10);
		hub.setMinOutgoingPadding(10);
		
		hub.width = 1500;
		hub.height = 500;
		
		//n1.width = n2.width = n3.width = n4.width = n5.width = n6.width = n7.width = n8.width = n9.width = n10.width = 300;
		
		
		BorderNode bn1 = new BorderNode("BN1", hub); //$NON-NLS-1$
		BorderNode bn2 = new BorderNode("BN2", hub); //$NON-NLS-1$
		BorderNode bn3 = new BorderNode("BN3", hub); //$NON-NLS-1$
		BorderNode bn4 = new BorderNode("BN4", hub); //$NON-NLS-1$
		BorderNode bn5 = new BorderNode("BN5", hub); //$NON-NLS-1$
		BorderNode bn6 = new BorderNode("BN6", hub); //$NON-NLS-1$
		BorderNode bn7 = new BorderNode("BN7", hub); //$NON-NLS-1$
		bn1.width = bn1.height = bn2.width = bn2.height = bn3.width = bn3.height = bn4.width = bn4.height = bn5.width = bn5.height = bn6.width = bn6.height = bn7.width = bn7.height = 50;
		
		bn7.setMinOutgoingPadding(5);
		bn6.setMinIncomingPadding(5);
		
		edges.add(e1 = new ConstrainedEdge(hub, n1));
		edges.add(e2 = new ConstrainedEdge(bn7, n2));
		edges.add(e3 = new ConstrainedEdge(hub, n3));
		edges.add(e4 = new ConstrainedEdge(hub, n4));
		edges.add(e5 = new ConstrainedEdge(bn7, n5));
		edges.add(e6 = new ConstrainedEdge(n6, bn6));
		edges.add(e7 = new ConstrainedEdge(n7, bn6));
		edges.add(e8 = new ConstrainedEdge(n8, hub));
		edges.add(e9 = new ConstrainedEdge(n9, hub));
		edges.add(e10 = new ConstrainedEdge(n10, bn6));
		
		DirectedGraph graph = new DirectedGraph();
		graph.nodes = nodes;
		graph.edges = edges;
		graph.setDefaultPadding(new Insets(50));
		
		new GMFDirectedGraphLayout().visit(graph);
		return graph;
	}

	public static DirectedGraph test2Orthogonal() {
		ConstantSizeNode head, n1, n2, n3, n4, n5, d1, d2, n6, n7, tail;
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		nodes.add(head = new ConstantSizeNode("head")); //$NON-NLS-1$
		nodes.add(n1 = new ConstantSizeNode("n1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("n2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("n3")); //$NON-NLS-1$
		nodes.add(n4 = new ConstantSizeNode("n4")); //$NON-NLS-1$
		nodes.add(n5 = new ConstantSizeNode("n5")); //$NON-NLS-1$
		nodes.add(d1 = new ConstantSizeNode("d1")); //$NON-NLS-1$
		nodes.add(d2 = new ConstantSizeNode("d2")); //$NON-NLS-1$
		nodes.add(n6 = new ConstantSizeNode("n6")); //$NON-NLS-1$
		nodes.add(n7 = new ConstantSizeNode("n7")); //$NON-NLS-1$
		nodes.add(tail = new ConstantSizeNode("tail")); //$NON-NLS-1$
		
		head.width = tail.width = 20;
		head.height = tail.height = 250;
		
		edges.add(new ConstrainedEdge(head, n1));
		edges.add(new ConstrainedEdge(head, n2));
		edges.add(new ConstrainedEdge(head, n3));
		edges.add(new ConstrainedEdge(head, n4));
		edges.add(new ConstrainedEdge(head, n5));
		
		edges.add(new ConstrainedEdge(n1, d1));
		edges.add(new ConstrainedEdge(n2, tail));
		edges.add(new ConstrainedEdge(n3, d2));
		edges.add(new ConstrainedEdge(n4, tail));
		edges.add(new ConstrainedEdge(n5, tail));
		
		edges.add(new ConstrainedEdge(d1, n6));
		edges.add(new ConstrainedEdge(n6, tail));
		edges.add(new ConstrainedEdge(d1, tail));
		
		edges.add(new ConstrainedEdge(d2, n7));
		edges.add(new ConstrainedEdge(n7, tail));
		edges.add(new ConstrainedEdge(d2, tail));
		
		for (int i = 0; i < nodes.size(); i++) {
			Node n = nodes.getNode(i);
			if (n instanceof ConstantSizeNode) {
				ConstantSizeNode cn = (ConstantSizeNode) n;
				cn.setMinIncomingPadding(5);
				cn.setMinOutgoingPadding(5);
			}
		}
		
		for (int i = 0; i < edges.size(); i++) {
			ConstrainedEdge ce = (ConstrainedEdge) edges.getEdge(i);
			ce.setStyle(ConstrainedEdge.ORTHOGONAL_ROUTING_STYLE);
		}
		
		DirectedGraph graph = new DirectedGraph();
		graph.nodes = nodes;
		graph.edges = edges;
		graph.setDirection(PositionConstants.WEST);
		
		new GMFDirectedGraphLayout().visit(graph);
		return graph;
	}
	
	public static DirectedGraph test4() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		ConstantSizeNode n1, n2, n3, n4, hub;
		BorderNode bn1, bn2;
		
		nodes.add(n1 = new ConstantSizeNode("n1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("n2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("n3")); //$NON-NLS-1$
		nodes.add(n4 = new ConstantSizeNode("n4")); //$NON-NLS-1$
		nodes.add(hub = new ConstantSizeNode("hub")); //$NON-NLS-1$
		
		n1.width = n1.height = n2.width = n2.height = n3.width = n3.height = n4.width = n4.height = 100;
		hub.width = 150;
		hub.height = 150;
		
		hub.setPadding(new Insets(20, 50, 20, 50)); 
		
		bn1 = new BorderNode("bn1", hub); //$NON-NLS-1$
		bn1.width = bn1.height = 20;
		bn2 = new BorderNode("bn2", hub); //$NON-NLS-1$
		bn2.width = bn2.height = 35;
		bn2.setOutsideRatio(0.2f);
		
		bn2.setMinIncomingPadding(5);
		bn1.setMinOutgoingPadding(5);
		
		edges.add(new ConstrainedEdge(n1, bn1));
		edges.add(new ConstrainedEdge(n2, bn2));
		edges.add(new ConstrainedEdge(bn1, n3));
		edges.add(new ConstrainedEdge(bn2, n4));
		
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		new GMFDirectedGraphLayout().visit(g);
		return g;
	}

	public static DirectedGraph test5() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		ConstantSizeNode n1, n2;
		BorderNode bn1, bn2;
		
		nodes.add(n1 = new ConstantSizeNode("n1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("n2")); //$NON-NLS-1$
		
		n1.width = n2.width = 100;
		n1.height = n2.height = 30; 
		
		bn1 = new BorderNode("bn1", n1); //$NON-NLS-1$
		bn2 = new BorderNode("bn2", n2); //$NON-NLS-1$
		bn1.width = bn2.width = bn1.height = bn2.height = 10;
		bn2.setOutsideRatio(1f);
		bn1.setOutsideRatio(1f);
		
		bn2.setMinIncomingPadding(5);
		bn1.setMinOutgoingPadding(5);
		
		edges.add(new ConstrainedEdge(bn1, bn2));
		
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		new GMFDirectedGraphLayout().visit(g);
		return g;
	}
	
	public static DirectedGraph variousHeights_Test1() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		ConstantSizeNode n1, n2, n3, n4, n5, n6;
		
		nodes.add(n1 = new ConstantSizeNode("n1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("n2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("n3")); //$NON-NLS-1$
		nodes.add(n4 = new ConstantSizeNode("n4")); //$NON-NLS-1$
		nodes.add(n5 = new ConstantSizeNode("n5")); //$NON-NLS-1$
		nodes.add(n6 = new ConstantSizeNode("n6")); //$NON-NLS-1$
		
		n2.height = 200;
		n1.height = n3.height = 30;
		
		edges.add(new Edge(n1, n4));
		edges.add(new Edge(n1, n5));
		edges.add(new Edge(n1, n6));
		edges.add(new Edge(n2, n4));
		edges.add(new Edge(n2, n5));
		edges.add(new Edge(n2, n6));
		edges.add(new Edge(n3, n4));
		edges.add(new Edge(n3, n5));
		edges.add(new Edge(n3, n6));
		
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		new GMFDirectedGraphLayout().visit(g);
		return g;
	}

	public static DirectedGraph variousHeights_Test2() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		ConstantSizeNode n1, n2, n3, n4, n5, n6;
		
		nodes.add(n1 = new ConstantSizeNode("n1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("n2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("n3")); //$NON-NLS-1$
		nodes.add(n4 = new ConstantSizeNode("n4")); //$NON-NLS-1$
		nodes.add(n5 = new ConstantSizeNode("n5")); //$NON-NLS-1$
		nodes.add(n6 = new ConstantSizeNode("n6")); //$NON-NLS-1$
		
		n1.setMinOutgoingPadding(5);
		n2.setMinOutgoingPadding(5);
		n3.setMinOutgoingPadding(5);
		
		n4.setMinIncomingPadding(5);
		n5.setMinIncomingPadding(5);
		n6.setMinIncomingPadding(5);
		
		n2.height = 150;
		n1.height = n3.height = 30;
		
		edges.add(new Edge(n1, n4));
		edges.add(new Edge(n1, n5));
		edges.add(new Edge(n1, n6));
		edges.add(new Edge(n2, n4));
		edges.add(new Edge(n2, n5));
		edges.add(new Edge(n2, n6));
		edges.add(new Edge(n3, n4));
		edges.add(new Edge(n3, n5));
		edges.add(new Edge(n3, n6));
		
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		new GMFDirectedGraphLayout().visit(g);
		return g;
	}
	
	public static DirectedGraph composite_test1() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		ConstantSizeNode n1, n2, n3, n4;
		BorderNode bn1, bn2, bn3, bn4;
		Edge e1, e2, e3, e4;
		
		nodes.add(n1 = new ConstantSizeNode("Node1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("Node2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("Node3")); //$NON-NLS-1$
		nodes.add(n4 = new ConstantSizeNode("Node4")); //$NON-NLS-1$
		
		bn1 = new BorderNode("bn1", n1); //$NON-NLS-1$
		bn2 = new BorderNode("bn2", n2); //$NON-NLS-1$
		bn3 = new BorderNode("bn3", n3); //$NON-NLS-1$
		bn4 = new BorderNode("bn4", n4); //$NON-NLS-1$
		
		bn1.width = bn2.width = bn3.width = bn4.width = bn1.height = bn2.height = bn3.height = bn4.height = 10;
		
		bn1.setMinIncomingPadding(5);
		bn2.setMinIncomingPadding(5);
		bn3.setMinIncomingPadding(5);
		bn4.setMinIncomingPadding(5);
		n1.setMinIncomingPadding(5);
		n2.setMinIncomingPadding(5);
		n3.setMinIncomingPadding(5);
		n4.setMinIncomingPadding(5);
		
		bn1.setMinOutgoingPadding(5);
		bn2.setMinOutgoingPadding(5);
		bn3.setMinOutgoingPadding(5);
		bn4.setMinOutgoingPadding(5);
		n1.setMinOutgoingPadding(5);
		n2.setMinOutgoingPadding(5);
		n3.setMinOutgoingPadding(5);
		n4.setMinOutgoingPadding(5);

		edges.add(e1 = new ConstrainedEdge(bn1, bn2));
		edges.add(e2 = new ConstrainedEdge(bn1, n3));
		edges.add(e3 = new ConstrainedEdge(bn2, bn3));
		edges.add(e4 = new ConstrainedEdge(bn4, bn3));
		
		e1.setPadding(20);
		e2.setPadding(20);
		e3.setPadding(20);
		e4.setPadding(20);
		
		n1.width = n3.width = 50;
		n3.height = n3.height = 20;
		
		n2.height = 200;
		n2.width = 150;
		
		n4.width = 120;
		n4.height = 120;
		
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		g.setDefaultPadding(new Insets(20));
		
		new GMFDirectedGraphLayout().visit(g);
		
		return g;
	}
	
	public static DirectedGraph cycle_test() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		ConstantSizeNode n1, n2, n3;
		Edge e1, e2, e3;
		
		nodes.add(n1 = new ConstantSizeNode("Node1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("Node2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("Node3")); //$NON-NLS-1$
		
		n1.setMinIncomingPadding(5);
		n2.setMinIncomingPadding(5);
		n3.setMinIncomingPadding(5);
		
		n1.setMinOutgoingPadding(5);
		n2.setMinOutgoingPadding(5);
		n3.setMinOutgoingPadding(5);

		edges.add(e1 = new ConstrainedEdge(n1, n2));
		edges.add(e2 = new ConstrainedEdge(n2, n3));
		edges.add(e3 = new ConstrainedEdge(n3, n1));		
		e1.setPadding(20);
		e2.setPadding(20);
		e3.setPadding(20);
		
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		g.setDefaultPadding(new Insets(20));
		
		new GMFDirectedGraphLayout().visit(g);
		
		return g;
	}
	
	public static DirectedGraph cycle_BorderNodes_test() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		ConstantSizeNode n1, n2, n3;
		BorderNode bn1, bn2, bn3, bn4, bn5, bn6;
		Edge e1, e2, e3;
		
		nodes.add(n1 = new ConstantSizeNode("Node1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("Node2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("Node3")); //$NON-NLS-1$
		bn1 = new BorderNode("bn1", n1); //$NON-NLS-1$
		bn2 = new BorderNode("bn2", n1); //$NON-NLS-1$
		bn3 = new BorderNode("bn3", n2); //$NON-NLS-1$
		bn4 = new BorderNode("bn4", n2); //$NON-NLS-1$
		bn5 = new BorderNode("bn5", n3); //$NON-NLS-1$
		bn6 = new BorderNode("bn6", n3); //$NON-NLS-1$
		
		n1.setMinIncomingPadding(5);
		n2.setMinIncomingPadding(5);
		n3.setMinIncomingPadding(5);
		n1.setMinOutgoingPadding(5);
		n2.setMinOutgoingPadding(5);
		n3.setMinOutgoingPadding(5);

		edges.add(e1 = new ConstrainedEdge(bn1, bn3));
		edges.add(e2 = new ConstrainedEdge(bn4, bn5));
		edges.add(e3 = new ConstrainedEdge(bn6, bn2));		
		e1.setPadding(20);
		e2.setPadding(20);
		e3.setPadding(20);
		
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		g.setDefaultPadding(new Insets(20));
		
		new GMFDirectedGraphLayout().visit(g);
		
		return g;
	}

	public static DirectedGraph cycle_BorderNodes_test2() {
		NodeList nodes = new NodeList();
		EdgeList edges = new EdgeList();
		
		ConstantSizeNode n1, n2, n3;
		BorderNode bn1, bn2, bn3;
		Edge e1, e2, e3;
		
		nodes.add(n1 = new ConstantSizeNode("Node1")); //$NON-NLS-1$
		nodes.add(n2 = new ConstantSizeNode("Node2")); //$NON-NLS-1$
		nodes.add(n3 = new ConstantSizeNode("Node3")); //$NON-NLS-1$
		bn1 = new BorderNode("bn1", n1); //$NON-NLS-1$
		bn2 = new BorderNode("bn2", n2); //$NON-NLS-1$
		bn3 = new BorderNode("bn3", n3); //$NON-NLS-1$
		
		n1.setMinIncomingPadding(5);
		n2.setMinIncomingPadding(5);
		n3.setMinIncomingPadding(5);
		n1.setMinOutgoingPadding(5);
		n2.setMinOutgoingPadding(5);
		n3.setMinOutgoingPadding(5);

		edges.add(e1 = new ConstrainedEdge(bn1, bn2));
		edges.add(e2 = new ConstrainedEdge(bn2, bn3));
		edges.add(e3 = new ConstrainedEdge(bn3, bn1));		
		e1.setPadding(20);
		e2.setPadding(20);
		e3.setPadding(20);
		
		DirectedGraph g = new DirectedGraph();
		g.nodes = nodes;
		g.edges = edges;
		
		g.setDefaultPadding(new Insets(20));
		
		new GMFDirectedGraphLayout().visit(g);
		
		return g;
	}
}
