예제 #1
0
        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
        }