public void Clone() { var net = new PetriNet <int>(); AssertEmpty(net); var clonedNet = net.Clone(); Assert.IsNotNull(clonedNet); AssertEmpty(clonedNet); clonedNet = (PetriNet <int>)((ICloneable)net).Clone(); Assert.IsNotNull(clonedNet); AssertEmpty(clonedNet); var place1 = net.AddPlace("p1"); var place2 = net.AddPlace("p2"); var transition1 = net.AddTransition("t1"); AssertHasVertices(net.Graph, new IPetriVertex[] { place1, place2, transition1 }); AssertNoEdge(net.Graph); clonedNet = net.Clone(); Assert.IsNotNull(clonedNet); AssertAreEqual(net, clonedNet); clonedNet = (PetriNet <int>)((ICloneable)net).Clone(); Assert.IsNotNull(clonedNet); AssertAreEqual(net, clonedNet); var place3 = net.AddPlace("p3"); var transition2 = net.AddTransition("t2"); var arc1 = net.AddArc(place1, transition1); var arc2 = net.AddArc(place2, transition1); var arc3 = net.AddArc(place3, transition2); var arc4 = net.AddArc(transition1, place3); var arc5 = net.AddArc(transition2, place1); AssertHasVertices(net.Graph, new IPetriVertex[] { place1, place2, place3, transition1, transition2 }); AssertHasEdges(net.Graph, new[] { arc1, arc2, arc3, arc4, arc5 }); clonedNet = net.Clone(); Assert.IsNotNull(clonedNet); AssertAreEqual(net, clonedNet); clonedNet = (PetriNet <int>)((ICloneable)net).Clone(); Assert.IsNotNull(clonedNet); AssertAreEqual(net, clonedNet); var place4 = net.AddPlace("p4"); var transition3 = net.AddTransition("t3"); AssertHasVertices(net.Graph, new IPetriVertex[] { place1, place2, place3, place4, transition1, transition2, transition3 }); AssertHasEdges(net.Graph, new[] { arc1, arc2, arc3, arc4, arc5 }); clonedNet = net.Clone(); Assert.IsNotNull(clonedNet); AssertAreEqual(net, clonedNet); clonedNet = (PetriNet <int>)((ICloneable)net).Clone(); Assert.IsNotNull(clonedNet); AssertAreEqual(net, clonedNet); #region Local function void AssertEmpty <TToken>(PetriNet <TToken> n) { CollectionAssert.IsEmpty(n.Places); CollectionAssert.IsEmpty(n.Transitions); CollectionAssert.IsEmpty(n.Arcs); AssertEmptyGraph(n.Graph); } void AssertAreEqual <TToken>(PetriNet <TToken> expected, PetriNet <TToken> actual) { CollectionAssert.AreEqual(expected.Places, actual.Places); CollectionAssert.AreEqual(expected.Transitions, actual.Transitions); CollectionAssert.AreEqual(expected.Arcs, actual.Arcs); AssertEquivalentGraphs(expected.Graph, actual.Graph); } #endregion }