Esempio n. 1
0
        public void Pn2Fsm_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.CanResolveLeft);
                inconsistency.ResolveLeft();
            }

            AssertPetriNetLikeFsm(fsm, context);

            if (changePropagation == ChangePropagationMode.TwoWay)
            {
                Assert.AreEqual(0, context.Inconsistencies.Count);
            }
        }
Esempio n. 2
0
 public SynchronizationContext(Synchronization synchronization, SynchronizationDirection direction, ChangePropagationMode changePropagation)
     : base(synchronization)
 {
     Direction         = direction;
     ChangePropagation = changePropagation;
     Inconsistencies   = new ObservableSet <IInconsistency>();
 }
Esempio n. 3
0
        public static Model Transform(Model pcmModel, ChangePropagationMode changePropagation)
        {
            var result = new Model();

            var inputContainer  = new PcmToMM06.InputModelContainer(pcmModel);
            var outputContainer = new PcmToMM06.OutputModelContainer(result);

            var transformation = new PcmToMM06.PCMto06(inputContainer, outputContainer);

            transformation.Synchronize(transformation.SynchronizationRule <PcmToMM06.PCMto06.Model2ModelMainRule>(), ref inputContainer, ref outputContainer, NMF.Synchronizations.SynchronizationDirection.LeftToRight, changePropagation);

            return(result);
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        public ISynchronizationContext Synchronize <TLeft, TRight>(SynchronizationRule <TLeft, TRight> startRule, ref TLeft left, ref TRight right, SynchronizationDirection direction, ChangePropagationMode changePropagation)
            where TLeft : class
            where TRight : class
        {
            if (startRule == null)
            {
                throw new ArgumentNullException("startRule");
            }

            Initialize();

            var context = new SynchronizationContext(this, direction, changePropagation);

            switch (direction)
            {
            case SynchronizationDirection.LeftToRight:
            case SynchronizationDirection.LeftToRightForced:
            case SynchronizationDirection.LeftWins:
                var c1 = TransformationRunner.Transform(new object[] { left }, right != null ? new Axiom(right) : null, startRule.LeftToRight, context);
                right = c1.Output as TRight;
                break;

            case SynchronizationDirection.RightToLeft:
            case SynchronizationDirection.RightToLeftForced:
            case SynchronizationDirection.RightWins:
                var c2 = TransformationRunner.Transform(new object[] { right }, left != null ? new Axiom(left) : null, startRule.RightToLeft, context);
                left = c2.Output as TLeft;
                break;

            case SynchronizationDirection.CheckOnly:
                if (left == null)
                {
                    throw new ArgumentException("Passed model must not be null when running in check-only mode", nameof(left));
                }
                if (right == null)
                {
                    throw new ArgumentException("Passed model must not be null when running in check-only mode", nameof(right));
                }
                TransformationRunner.Transform(new object[] { left }, new Axiom(right), startRule.LeftToRight, context);
                break;

            default:
                throw new ArgumentOutOfRangeException("direction");
            }
            return(context);
        }
Esempio n. 6
0
 public ISynchronizationContext Synchronize <TLeft, TRight>(ref TLeft left, ref TRight right, SynchronizationDirection direction, ChangePropagationMode changePropagation)
     where TLeft : class
     where TRight : class
 {
     return(Synchronize <TLeft, TRight>(GetSynchronizationRuleForSignature(typeof(TLeft), typeof(TRight)) as SynchronizationRule <TLeft, TRight>, ref left, ref right, direction, changePropagation));
 }
Esempio n. 7
0
        public ISynchronizationContext SynchronizeMany <TLeft, TRight>(SynchronizationRule <TLeft, TRight> startRule, ICollection <TLeft> lefts, ICollection <TRight> rights, SynchronizationDirection direction, ChangePropagationMode changePropagation)
            where TLeft : class
            where TRight : class
        {
            if (startRule == null)
            {
                throw new ArgumentNullException("startRule");
            }

            var context = new SynchronizationContext(this, direction, changePropagation);

            switch (direction)
            {
            case SynchronizationDirection.LeftToRight:
                var c1 = TransformationRunner.TransformMany(lefts.Select(l => new object[] { l }), rights, startRule.LeftToRight, context);
                rights.Clear();
                rights.AddRange(c1.Select(c => c.Output as TRight));
                break;

            case SynchronizationDirection.RightToLeft:
                var c2 = TransformationRunner.TransformMany(rights.Select(r => new object[] { r }), lefts, startRule.RightToLeft, context);
                lefts.Clear();
                lefts.AddRange(c2.Select(c => c.Output as TLeft));
                break;

            default:
                throw new ArgumentOutOfRangeException("direction");
            }
            return(context);
        }
Esempio n. 8
0
 public SynchronizationContext(Synchronization synchronization, SynchronizationDirection direction, ChangePropagationMode changePropagation)
     : base(synchronization)
 {
     this.direction = direction;
     this.changePropagation = changePropagation;
 }
Esempio n. 9
0
 public SynchronizationContext(Synchronization synchronization, SynchronizationDirection direction, ChangePropagationMode changePropagation)
     : base(synchronization)
 {
     this.direction         = direction;
     this.changePropagation = changePropagation;
 }
Esempio n. 10
0
        public ISynchronizationContext Synchronize <TLeft, TRight>(SynchronizationRule <TLeft, TRight> startRule, ref TLeft left, ref TRight right, SynchronizationDirection direction, ChangePropagationMode changePropagation)
            where TLeft : class
            where TRight : class
        {
            if (startRule == null)
            {
                throw new ArgumentNullException("startRule");
            }

            Initialize();

            var context = new SynchronizationContext(this, direction, changePropagation);

            switch (direction)
            {
            case SynchronizationDirection.LeftToRight:
            case SynchronizationDirection.LeftToRightForced:
            case SynchronizationDirection.LeftWins:
                var c1 = TransformationRunner.Transform(new object[] { left }, new object[] { right }, startRule.LeftToRight, context);
                right = c1.Output as TRight;
                break;

            case SynchronizationDirection.RightToLeft:
            case SynchronizationDirection.RightToLeftForced:
            case SynchronizationDirection.RightWins:
                var c2 = TransformationRunner.Transform(new object[] { right }, new object[] { left }, startRule.RightToLeft, context);
                left = c2.Output as TLeft;
                break;

            default:
                throw new ArgumentOutOfRangeException("direction");
            }
            return(context);
        }
Esempio n. 11
0
        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);
            }
        }