예제 #1
0
        public void Fsm2Pn_CheckOnly_SameAfterApplyAllChanges(ChangePropagationMode changePropagation)
        {
            var fsm = this.fsm;
            var pn  = this.pn;

            FillStateMachine();
            FillPetriNet();

            fsm2pn.Initialize();

            var context = fsm2pn.Synchronize(fsm2pn.SynchronizationRule <FSM2PN.AutomataToNet>(), ref fsm, ref pn, SynchronizationDirection.CheckOnly, changePropagation);

            var s1 = AssertOriginalFsm(fsm, context);

            AssertOriginalPetriNet(pn, context, null);

            foreach (var inconsistency in context.Inconsistencies.ToArray())
            {
                Assert.IsTrue(inconsistency.CanResolveRight);
                inconsistency.ResolveRight();
            }

            AssertFsmLikePetriNet(pn, context, s1);

            if (changePropagation == ChangePropagationMode.TwoWay)
            {
                Assert.AreEqual(0, context.Inconsistencies.Count);
            }
        }
예제 #2
0
        static void Main(string[] args)
        {
            FSM2PN fsm2pn = new FSM2PN();

            FSM.FiniteStateMachine fsm = new FSM.FiniteStateMachine();
            PN.PetriNet            pn  = new PN.PetriNet();


            FillStateMachine(fsm);

            var direction          = SynchronizationDirection.LeftToRightForced;
            var changePropagartion = ChangePropagationMode.None;

            var context = fsm2pn.Synchronize(fsm2pn.SynchronizationRule <FSM2PN.AutomataToNet>(), ref fsm, ref pn, direction, changePropagartion);


            var s4 = new FSM.State()
            {
                Name = "s4", IsStartState = false
            };

            fsm.States.Add(s4);
        }
예제 #3
0
파일: Fsm2PnTest.cs 프로젝트: walcher/NMF
        private void TestFsm2Pn(SynchronizationDirection direction, ChangePropagationMode changePropagartion, bool initializeFsm, bool initializePn)
        {
            Assert.IsTrue(initializeFsm | initializePn);

            var fsm = this.fsm;
            var pn  = this.pn;

            if (initializeFsm)
            {
                FillStateMachine();
            }
            if (initializePn)
            {
                FillPetriNet();
            }

            fsm2pn.Initialize();

            var context       = fsm2pn.Synchronize(fsm2pn.SynchronizationRule <FSM2PN.AutomataToNet>(), ref fsm, ref pn, direction, changePropagartion);
            var isLeftToRight = direction == SynchronizationDirection.LeftToRight || direction == SynchronizationDirection.LeftToRightForced || direction == SynchronizationDirection.LeftWins;
            var isForced      = direction == SynchronizationDirection.LeftToRightForced || direction == SynchronizationDirection.RightToLeftForced;
            var isJoined      = direction == SynchronizationDirection.LeftWins || direction == SynchronizationDirection.RightWins;

            Fsm.State s1;
            Pn.Place  p1;

            if (initializeFsm && initializePn)
            {
                if (isForced)
                {
                    if (isLeftToRight)
                    {
                        s1 = AssertOriginalFsm(fsm, context);
                    }
                    else
                    {
                        s1 = AssertPetriNetLikeFsm(fsm, context);
                    }
                }
                else if (isJoined || !isLeftToRight)
                {
                    s1 = AssertJoinedFsm(fsm, context);
                }
                else
                {
                    s1 = AssertOriginalFsm(fsm, context);
                }
            }
            else if (!initializeFsm)
            {
                if (!isLeftToRight || isJoined)
                {
                    s1 = AssertPetriNetLikeFsm(fsm, context);
                }
                else
                {
                    s1 = AssertEmptyFsm(fsm);
                }
            }
            else if (!initializePn)
            {
                if (isForced && !isLeftToRight)
                {
                    s1 = AssertEmptyFsm(fsm);
                }
                else
                {
                    s1 = AssertOriginalFsm(fsm, context);
                }
            }
            else
            {
                s1 = null;
                Assert.Fail();
            }

            if (initializeFsm && initializePn)
            {
                if (isForced)
                {
                    if (!isLeftToRight)
                    {
                        p1 = AssertOriginalPetriNet(pn, context, s1);
                    }
                    else
                    {
                        p1 = AssertFsmLikePetriNet(pn, context, s1);
                    }
                }
                else if (isJoined || isLeftToRight)
                {
                    p1 = AssertJoinedPetriNet(pn, context, s1);
                }
                else
                {
                    p1 = AssertOriginalPetriNet(pn, context, s1);
                }
            }
            else if (!initializePn)
            {
                if (isLeftToRight || isJoined)
                {
                    p1 = AssertFsmLikePetriNet(pn, context, s1);
                }
                else
                {
                    p1 = AssertEmptyPetriNet(pn);
                }
            }
            else if (!initializeFsm)
            {
                if (isForced && isLeftToRight)
                {
                    p1 = AssertEmptyPetriNet(pn);
                }
                else
                {
                    p1 = AssertOriginalPetriNet(pn, context, s1);
                }
            }
            else
            {
                p1 = null;
                Assert.Fail();
            }

            if (changePropagartion == ChangePropagationMode.TwoWay ||
                (changePropagartion == ChangePropagationMode.OneWay && isLeftToRight))
            {
                AssertOneWayUpdatesFsmToPetriNet(s1, p1);
            }

            if (changePropagartion == ChangePropagationMode.TwoWay ||
                (changePropagartion == ChangePropagationMode.OneWay && !isLeftToRight))
            {
                AssertOneWayUpdatesPetriNetToFsm(p1, s1);
            }
        }