Beispiel #1
0
        public void ContainsSelfLoops()
        {
            var net =new BasicAdjList(Guid.NewGuid());
            BasicNode nodeA = net.CreateNode() as BasicNode;
            BasicNode nodeB = net.CreateNode() as BasicNode;
            BasicNode nodeC = net.CreateNode() as BasicNode;
            BasicNode nodeD = net.CreateNode() as BasicNode;

            net.CreateEdge(nodeA, nodeB);
            net.CreateEdge(nodeA, nodeA);
            net.CreateEdge(nodeA, nodeD);
            net.CreateEdge(nodeD, nodeD);
            net.CreateEdge(nodeD, nodeD);

            bool result = nodeA.ContainsSelfLoops();
            Assert.True(result);

            result = nodeB.ContainsSelfLoops();
            Assert.False(result);

            result = nodeC.ContainsSelfLoops();
            Assert.False(result);

            result = nodeD.ContainsSelfLoops();
            Assert.True(result);
        }
Beispiel #2
0
 public void Contains_ReturnsTrueWhenAnEdgeExists()
 {
     //Arrange
     var net = new BasicAdjList(Guid.NewGuid());
     INode nodeA = net.CreateNode();
     INode nodeB = net.CreateNode();
     IEdge edge = net.CreateEdge(nodeA, nodeB);
     bool result = net.Contains(edge);
     Assert.True(result);
 }
Beispiel #3
0
 public void CreateEdge_Assigns_Edge_Index()
 {
     //Arrange
     var net = new BasicAdjList(Guid.NewGuid());
     INode nodeA = net.CreateNode();
     INode nodeB = net.CreateNode();
     INode nodeC = net.CreateNode();
     BasicEdge edgeA = net.CreateEdge(nodeA, nodeB) as BasicEdge;
     BasicEdge edgeB = net.CreateEdge(nodeC, nodeB) as BasicEdge;
     Assert.Equal(0, edgeA.Index);
     Assert.Equal(1, edgeB.Index);
 }
        public void ChangeEventsEnabled_When_False_Prevents_NetworkChanged_Fired_When_RemoveEdge_Is_Called(int nodeCount, int edgeCount, int edgesToRemove)
        {
            //Arrange
            var net = new BasicAdjList(Guid.NewGuid());
            Random rand = new Random();
            for (int i = 0; i < nodeCount; i++)
                net.CreateNode();

            INode nodeA = null;
            INode nodeB = null;

            IEdge[] edges = new IEdge[edgeCount];
            for (int i = 0; i < edgeCount; i++)
            {
                nodeA = net.Nodes[rand.Next(nodeCount)];
                nodeB = net.Nodes[rand.Next(nodeCount)];
                edges[i] = net.CreateEdge(nodeA, nodeB);
            }
            //---------------------

            var helper = new NetworkChangedEventsTestHelper();
            net.NetworkChanged += new NetworkChangedEventHandler<INetwork, NetworkChangedEventArgs>(helper.NetworkChanged_DummyHandler);

            net.ChangeEventsEnabled = false;
            for (int i = 0; i < edges.Length; i++)
            {
                net.RemoveEdge(edges[i]);
            }

            Assert.Equal(0, helper.NetworkChanged_TimesCalled);
        }
        public void AddingEdges_Adds_Row_With_Matching_Key_In_EdgeData(int nodeCount, int edgeCount)
        {
            Random rand = new Random();
            var net = new BasicAdjList(Guid.NewGuid());
            var table = new DataAttributeTable<IEdge>();
            table.Network = net;
            net.EdgeData = table;

            for (int i = 0; i < nodeCount; i++)
            {
                var node = net.CreateNode();
            }

            INode nodeA = null;
            INode nodeB = null;
            IEdge edge = null;
            for (int i = 0; i < edgeCount; i++)
            {
                nodeA = net.Nodes[rand.Next(nodeCount)];
                nodeB = net.Nodes[rand.Next(nodeCount)];
                edge = net.CreateEdge(nodeA, nodeB);
                Assert.Equal((i + 1), net.EdgeCount);
                Assert.Equal((i + 1), table.RowCount);
                Assert.True(table.RowOwnerMap.ContainsKey(edge));
            }
        }
Beispiel #6
0
 public void Contains_ReturnsTrueWhenANodeExists()
 {
     //Arrange
     var net = new BasicAdjList(Guid.NewGuid());
     INode node = net.CreateNode();
     bool result = net.Contains(node);
     Assert.True(result);
 }
Beispiel #7
0
        public void AddRow(int testId, Type[] dataTypes)
        {
            BasicAdjList net = new BasicAdjList(Guid.NewGuid());
            DataAttributeMgr mgr = new DataAttributeMgr(NODE_ATTRIB_LIST, net);

            IAttributeList list = null;

            CreateLists(dataTypes, mgr);

            // add a node --------------
            int expected = 1;
            net.CreateNode();
            Assert.AreEqual(expected, net.NodeCount, "net.NodeCount should match expected");

            // add a row
            mgr.AddRow();

            // check
            Assert.AreEqual(expected, mgr.Depth, "mgr.Depth should match expected");
            list = mgr[0];
            Assert.AreEqual(expected, list.Count, "list Count should match expected");
            list = mgr[1];
            Assert.AreEqual(expected, list.Count, "list Count should match expected");

            // add a node --------------
            expected = 2;
            net.CreateNode();
            Assert.AreEqual(expected, net.NodeCount, "net.NodeCount should match expected");

            // add a row
            mgr.AddRow();

            // check
            Assert.AreEqual(expected, mgr.Depth, "mgr.Depth should match expected");
            list = mgr[0];
            Assert.AreEqual(expected, list.Count, "list Count should match expected");
            list = mgr[1];
            Assert.AreEqual(expected, list.Count, "list Count should match expected");
        }
        public void ChangeEventsEnabled_When_False_Prevents_NetworkChanged_Fired_When_CreateNode_Is_Called(int nodeCount)
        {
            //Arrange
            var net = new BasicAdjList(Guid.NewGuid());
            var helper = new NetworkChangedEventsTestHelper();
            net.NetworkChanged += new NetworkChangedEventHandler<INetwork, NetworkChangedEventArgs>(helper.NetworkChanged_DummyHandler);

            net.ChangeEventsEnabled = false;
            for (int i = 0; i < nodeCount; i++)
                net.CreateNode();

            Assert.Equal(0, helper.NetworkChanged_TimesCalled);
        }
        public void AddingNodes_Adds_Row_With_Matching_Key_In_NodeData(int nodeCount)
        {
            var net = new BasicAdjList(Guid.NewGuid());
            var table = new DataAttributeTable<INode>();
            table.Network = net;
            net.NodeData = table;

            for(int i=0; i<nodeCount; i++)
            {
                var node = net.CreateNode();
                Assert.Equal((i+1), net.NodeCount);
                Assert.Equal((i+1), table.RowCount);
                Assert.True(table.RowOwnerMap.ContainsKey(node));
            }
        }
Beispiel #10
0
        /// <summary>
        /// Parses a particular string format to a network.  Format is
        /// "n,e,d|pair;pair;pair" where n = node count, e = edge count, d = true/false for directedness and
        /// pair is a number pair of node indices indicating an edges.  Ex:  "5,3,false|0,1;1,2;3,5"  *note that the
        /// number of pairs should match the number of edges
        /// </summary>
        public static IBasicAdjList ParseToNetwork(string input, bool enableNodeData, bool enableEdgeData)
        {
            // n,e,directed|pair;
            // 7,23,false|0,3;0,2;0,4;1,4;1,2;1,3;2,5;2,4;2,4;3,5;3,1;3,6;3,0;4,4;4,5;4,3;5,1;5,1;5,4;5,6;5,0;6,3;6,1;
            IBasicAdjList network = null;
            var split1 = input.Split(new[] {'|'});
            var split2 = split1[0].Split(new[] { ',' });

            int n = int.Parse(split2[0]);
            int m = int.Parse(split2[1]);
            bool directed = bool.Parse(split2[2]);

            var split3 = split1[1].Split(new[] { ';' }); // pairs

            if(split3.Length != m)
                throw new ArgumentException(string.Format("The number of pairs {0} did not match the number of edges {1} in {2}", split3.Length, m, input));
            INode a = null;
            INode b = null;

            using (var fac = new BasicAdjListFactory())
            {
                network = new BasicAdjList(Guid.NewGuid(), directed);
                for(int i=0; i<n; i++)
                    network.CreateNode();
            }

            string[] pair = null;
            int indexA = -1;
            int indexB = -1;
            for (int i = 0; i < split3.Length; i++ )
            {
                pair = split3[i].Split(new[] { ',' });
                indexA = int.Parse(pair[0]);
                indexB = int.Parse(pair[1]);
                a = network.Nodes[indexA];
                b = network.Nodes[indexB];
                network.CreateEdge(a, b);
            }

            using (var fac = new DataAttributeTableFactory(network))
            {
                if (enableNodeData)
                    fac.CreateNodeDataTable();
                if (enableEdgeData)
                    fac.CreateEdgeDataTable();
            }
            return network;
        }
        public void SetValue_Of_T_Assigns_Object_To_Cell_Val_By_Owner_And_ColIndex()
        {
            //Arrange
            var net = new BasicAdjList(Guid.NewGuid());

            var table = new DataAttributeTable<IEdge>();
            table.Network = net;

            table.Columns.Add(new DataColumn("X", typeof (string)));

            var nodeA = net.CreateNode();
            var nodeB = net.CreateNode();
            var nodeC = net.CreateNode();

            var edgeA = net.CreateEdge(nodeB, nodeC);
            var edgeB = net.CreateEdge(nodeA, nodeC);

            table.AddRow(edgeA);
            table.AddRow(edgeB);

            //Act
            table.SetValue<string>(edgeA, 0, "valA");
            table.SetValue<string>(edgeB, 0, "valB");

            string val0 = (string)table.Rows[0][0];
            string val1 = (string)table.Rows[1][0];
            // verify primary keys

            //Assert
            Assert.Equal(val0, "valA");
            Assert.Equal(val1, "valB");
        }
        public void ItemGetter_Returns_Cell_Val_By_RowIndex_And_ColIndex()
        {
            //Arrange
            var net = new BasicAdjList(Guid.NewGuid());

            var table = new DataAttributeTable<IEdge>();
            table.Network = net;

            table.Columns.Add(new DataColumn("X", typeof(string)));

            var nodeA = net.CreateNode();
            var nodeB = net.CreateNode();
            var nodeC = net.CreateNode();

            var edgeA = net.CreateEdge(nodeB, nodeC);
            var edgeB = net.CreateEdge(nodeA, nodeC);

            table.AddRow(edgeA);
            table.AddRow(edgeB);

            table.SetValue<string>(edgeA, 0, "valA");
            table.SetValue<string>(edgeB, 0, "valB");

            //Act
            string val0 = (string)table[0, 0];
            string val1 = (string)table[1, 0];
            // verify primary keys

            //Assert
            Assert.Equal(val0, "valA");
            Assert.Equal(val1, "valB");
        }
Beispiel #13
0
        public void AdjustToCapacity(int nodeCount, int padToCount, int expectedCount)
        {
            string defaultVal = "";
            _Net = new BasicAdjList(Guid.NewGuid());
            for (int i = 0; i < nodeCount; i++)     // set capacity
                _Net.CreateNode();

            _Mgr = new DataAttributeMgr(AttributeListMgrFixture.NODE_ATTRIB_LIST, _Net);

            AttributeList<string> list = new AttributeList<string>(_Mgr, defaultVal, "test list");

            Assert.AreEqual(nodeCount, list.Count, "list.Count should be nodeCount");

            list.AdjustToCapacity(padToCount);

            Assert.AreEqual(expectedCount, list.Count, "list.Count should match expected");

            for (int i = 0; i < list.Count; i++)
            {
                Assert.AreEqual(defaultVal, list[i], string.Format("list[{0}] should match expected", i));
            }
        }
Beispiel #14
0
        public static IBasicAdjList GenerateAdjListWithDataAttribs(List<Point> edgeList, bool directed, bool enableNodeDataAttribs, bool enableEdgeDataAttribs)
        {
            var q = ((from p in edgeList
                      select p.X)
                .Union((from p in edgeList
                        select p.Y))).Distinct();

            var nodeIndices = q.ToList();
            nodeIndices.Sort();

            var net = new BasicAdjList(Guid.NewGuid(), directed);
            for (int i = 0; i < nodeIndices.Count; i++)
                net.CreateNode();

            INode srcNode = null;
            INode targNode = null;
            for (int i = 0; i < edgeList.Count; i++)
            {
                srcNode = net.Nodes[edgeList[i].X];
                targNode = net.Nodes[edgeList[i].Y];
                net.CreateEdge(srcNode, targNode);
            }

            using (var fac = new DataAttributeTableFactory(net))
            {
                if (enableNodeDataAttribs)
                    fac.CreateNodeDataTable();
                if (enableEdgeDataAttribs)
                    fac.CreateEdgeDataTable();
            }

            return net;
        }
        public void SetValue_Of_T_Assigns_Object_To_Cell_Val_By_ColIndex(string[] colNames, Type[] colTypes)
        {
            var net = new BasicAdjList(Guid.NewGuid());
            var nodeA = net.CreateNode();
            var nodeB = net.CreateNode();
            var nodeC = net.CreateNode();

            _table = _fac.CreateNodeDataTable(net, colNames, colTypes);

            _table.SetValue<string>(nodeB, 1, "val1");
            _table.SetValue<double>(nodeB, 2, -22.2);

            Assert.AreEqual(_table.Rows.Count, 3, "Rowcount should match expected");

            string val1 = (string)_table.Rows[1][1];
            double val2 = (double)_table.Rows[1][2];
            // verify primary keys

            Assert.AreEqual(val1, "val1", "[1][1] should match expected");
            Assert.AreEqual(val2, -22.2, "[1][2] should match expected");
        }
        public void ItemGetter_Returns_Cell_Val_By_Row_And_ColIndex(string[] colNames, Type[] colTypes)
        {
            var net = new BasicAdjList(Guid.NewGuid());
            var nodeA = net.CreateNode();
            var nodeB = net.CreateNode();
            var nodeC = net.CreateNode();

            _table = _fac.CreateNodeDataTable(net, colNames, colTypes);

            _table.Rows[1][1] = "val1";
            _table.Rows[1][2] = -22.2;

            Assert.AreEqual(_table.Rows.Count, 3, "Rowcount should match expected");

            string val1 = (string)_table[1, 1];
            double val2 = (double)_table[1, 2];
            // verify primary keys

            Assert.AreEqual(val1, "val1", "[1][1] should match expected");
            Assert.AreEqual(val2, -22.2, "[1][2] should match expected");
        }
        public void AddRow_Appends_New_Row_With_Default_Vals(string[] colNames, Type[] colTypes)
        {
            var net = new BasicAdjList(Guid.NewGuid());
            var nodeA = net.CreateNode();

            _table = _fac.CreateNodeDataTable(net, colNames, colTypes);

            var mockNode = new Mock<INode>();
            mockNode.Setup(f => f.Index).Returns(2);
            int rowIndex = _table.AddRow(mockNode.Object);

            Assert.AreEqual(_table.Rows.Count, 2, "Row Count should match expected");

            int key = (int)_table.Rows[rowIndex]["Index"];
            Assert.AreEqual(key, 2, "Key should match expected");
        }
Beispiel #18
0
 public void IsEdge_Throws_When_Invalid_Type_Passed_In_For_Dest_Node()
 {
     var net = new BasicAdjList(Guid.NewGuid());
     INode nodeA = net.CreateNode();
     INode nodeB = new DummyBasicNode();
     var ex = Assert.Throws<ArgumentException>(() => net.IsEdge(nodeA, nodeB));
 }
        public void RemoveRow_Deletes_Row_For_Specified_Node(string[] colNames, Type[] colTypes, int nodeCount, int targetIndex)
        {
            var net = new BasicAdjList(Guid.NewGuid());
            var nodeA = net.CreateNode();
            var nodeB = net.CreateNode();
            var nodeC = net.CreateNode();

            _table = _fac.CreateNodeDataTable(net, colNames, colTypes);

            _table.RemoveRow(nodeB);

            Assert.AreEqual(_table.Rows.Count, 2, "Rowcount should match expected");
            // verify primary keys

            var key = (int)_table.Rows[0]["Index"];
            Assert.AreEqual(key, 0, "Key 0 should match expected");
            Assert.AreEqual(key, nodeA.Index, "Key 0 should match expected");
            key = (int)_table.Rows[1]["Index"];
            Assert.AreEqual(key, 2, "Key C should match expected");
            Assert.AreEqual(key, nodeC.Index, "Key C should match expected");
        }
Beispiel #20
0
 public void IsEdge_Throws_When_NullPassed_In_For_Source_Node()
 {
     var net = new BasicAdjList(Guid.NewGuid());
     INode nodeA = null;
     INode nodeB = net.CreateNode();
     var ex = Assert.Throws<ArgumentNullException>(() => net.IsEdge(nodeA, nodeB));
 }
Beispiel #21
0
        internal BasicAdjList CreateBasicAdjList(Guid id, int nodeCount, bool directed, bool enableNodeData, bool enableEdgeData)
        {
            #region Progress events setup

            int step = nodeCount / 100;
            int ctr = 0;
            int progress = 0;
            int progressIncrement = 1;
            if (nodeCount < 100 && nodeCount > 0)
                progressIncrement = (int)Math.Ceiling(100.0 / (double)nodeCount);
            #endregion

            var net = new BasicAdjList(id, directed);

            net.ChangeEventsEnabled = false;
            for (int i = 0; i < nodeCount; i++)
            {
                net.CreateNode();

                #region Send progress
                ctr++;
                if (ctr >= step && progress < 100)
                {
                    OnProgressChanged(new ProgressEventArgs(progress));
                    ctr = 0;
                    progress += progressIncrement;
                }
                #endregion
            }
            net.ChangeEventsEnabled = true;

            if (enableNodeData || enableEdgeData)
            {
                using (var fac = new DataAttributeTableFactory(net))
                {
                    if (enableNodeData)
                        fac.CreateNodeDataTable();
                    if (enableEdgeData)
                        fac.CreateEdgeDataTable();
                }
            }

            OnProgressChanged(new ProgressEventArgs(progress = 100));

            net.Name = !string.IsNullOrEmpty(NetworkName) ? NetworkName : "network";

            OnProgressCompleted(new ProgressCompletedEventArgs(progress));

            return net;
        }
Beispiel #22
0
        public void IsEmpty(int nodeCount, bool expectedResult)
        {
            var net = new BasicAdjList(Guid.NewGuid());
            for (int i = 0; i < nodeCount; i++)
                net.CreateNode();

            bool result = net.IsEmpty;
            Assert.Equal(expectedResult, result);
        }
Beispiel #23
0
        public void Clear_ClearsAll()
        {
            _Net = new BasicAdjList(Guid.NewGuid());
            // increase capacity
            _Net.CreateNode();
            _Net.CreateNode();
            _Mgr = new DataAttributeMgr(AttributeListMgrFixture.NODE_ATTRIB_LIST, _Net);

            AttributeList<string> list = new AttributeList<string>(_Mgr);
            list.Name = "Blah";

            Assert.AreEqual(_Net.NodeCount, list.Count, "list.Count should match expected");
            Assert.IsNotNull(list.Manager, "list.Manager should not be null");
            Assert.IsNotNull(list.Name, "list.Name should not be null");

            list.Clear();

            Assert.AreEqual(0, list.Count, "list.Count should match 0");
            Assert.IsNull(list.Manager, "list.Manager should not null");
            Assert.IsNull(list.Name, "list.Name should not null");
        }
Beispiel #24
0
        public void NodeCount(int nodeCount)
        {
            var net = new BasicAdjList(Guid.NewGuid());
            for (int i = 0; i < nodeCount; i++)
                net.CreateNode();

            Assert.Equal(nodeCount, net.NodeCount);
        }
        public void AddRow_Appends_New_Row_And_Updates_Map()
        {
            //Arrange
            var net = new BasicAdjList(Guid.NewGuid());
            var table = new DataAttributeTable<IEdge>();
            table.Network = net;

            var nodeA = net.CreateNode();
            var nodeB = net.CreateNode();
            var edge = net.CreateEdge(nodeA, nodeB);

            //Act
            table.AddRow(edge);

            //Assert
            Assert.Equal(table.Rows.Count, 1);

            Assert.Equal(table.RowOwnerMap.Count, 1);
            Assert.True(table.RowOwnerMap.ContainsKey(edge));
        }
Beispiel #26
0
 public void Nodes_Contains_Returns_True_When_A_Node_Exists()
 {
     //Arrange
     var net = new BasicAdjList(Guid.NewGuid());
     INode node = net.CreateNode();
     bool result = net.Nodes.Contains(node);
     Assert.True(result);
 }
        public void RemoveRow_Deletes_Row_For_Specified_Node_And_Updates_Map()
        {
            //Arrange
            var net = new BasicAdjList(Guid.NewGuid());

            var nodeA = net.CreateNode();
            var nodeB = net.CreateNode();
            var nodeC = net.CreateNode();

            var edgeA = net.CreateEdge(nodeB, nodeC);
            var edgeB = net.CreateEdge(nodeA, nodeC);

            var table = new DataAttributeTable<IEdge>();
            table.Network = net;

            table.AddRow(edgeA);
            table.AddRow(edgeB);

            Assert.Equal(table.Rows.Count, 2);
            Assert.Equal(table.RowOwnerMap.Count, 2);

            //Act
            table.RemoveRow(edgeB);

            //Assert
            Assert.Equal(table.Rows.Count, 1);
            Assert.Equal(table.RowOwnerMap.Count, 1);

            Assert.False(table.RowOwnerMap.ContainsKey(edgeB));
        }
Beispiel #28
0
        public void Nodes_Count_Returns_The_Number_Of_Nodes(int nodeCount)
        {
            var net = new BasicAdjList(Guid.NewGuid());
            for (int i = 0; i < nodeCount; i++)
                net.CreateNode();

            Assert.Equal(nodeCount, net.Nodes.Count);
        }
        public void Copy_For_Nodes_For_Empty_Network(int numNodes, int numEdges, bool isDirected, bool selfLoops, bool multiEdges, int[] intVals, double[] doubleVals, bool[] boolVals, string[] stringVals)
        {
            //Arrange
            var copier = new DataAttributeTableCopier();

            #region Create src and target networks

            IBasicAdjList src = BasicAdjListGenerator.GenerateAdjListWithDataAttribs(numNodes, numEdges, isDirected, true, false);
            var builder = new DataAttributesBuilder();
            var colIndex = builder.AddColumn((INodeAttributes)src, typeof(int));
            builder.PopulateCol<int, INode>(src.NodeData, colIndex, intVals);
            colIndex = builder.AddColumn((INodeAttributes)src, typeof(double));
            builder.PopulateCol<double, INode>(src.NodeData, colIndex, doubleVals);
            colIndex = builder.AddColumn((INodeAttributes)src, typeof(bool));
            builder.PopulateCol<bool, INode>(src.NodeData, colIndex, boolVals);
            colIndex = builder.AddColumn((INodeAttributes)src, typeof(string));
            builder.PopulateCol<string, INode>(src.NodeData, colIndex, stringVals);

            // create a copy of src network and enable node data attribs
            IBasicAdjList targ = new BasicAdjList(Guid.NewGuid(), isDirected);
            foreach (var srcNode in src.Nodes)
            {
                targ.CreateNode();
            }
            INode a;
            INode b;
            foreach (var srcEdge in src.Edges)
            {
                a = targ.Nodes[srcEdge.SourceNode.Index];
                b = targ.Nodes[srcEdge.DestinationNode.Index];
                targ.CreateEdge(a, b);
            }
            using (var fac = new DataAttributeTableFactory(targ))
            {
                fac.CreateNodeDataTable();
            }

            #endregion

            //Act
            copier.Copy(src.NodeData, targ.NodeData);

            //Assert
            Assert.NotNull(targ.NodeData);
            Assert.Equal(src.NodeData.ColumnCount, targ.NodeData.ColumnCount);
            Assert.Equal(numNodes, targ.NodeData.RowCount);

            for (int i = 0; i < targ.NodeDataAttributeCount; i++)
            {
                Assert.Equal(src.NodeData.DataTypes[i], targ.NodeData.DataTypes[i]);
                Assert.Equal(src.NodeData.ColumnNames[i], targ.NodeData.ColumnNames[i]);
                Assert.Equal(src.NodeData.ColumnDefaultValues[i], targ.NodeData.ColumnDefaultValues[i]);
            }
        }
Beispiel #30
0
 public void CreateEdge_Increments_Edge_Count_By_1_For_Self_Looped_Edge()
 {
     //Arrange
     var net = new BasicAdjList(Guid.NewGuid());
     Assert.Equal(0, net.EdgeCount);
     INode nodeA = net.CreateNode();
     INode nodeB = net.CreateNode();
     IEdge edge = net.CreateEdge(nodeB, nodeB);
     Assert.Equal(1, net.EdgeCount);
 }