Beispiel #1
0
 public void ValidateTransition(ITransitionEvent previous, ITransitionEvent current, bool expected)
 {
     this.Given(_ => PreviousEventIs(previous))
     .And(_ => CurrentEventIs(current))
     .When(_ => TransitionValidated())
     .Then(_ => IsValid(expected))
     .BDDfy();
 }
        private List <IRule> LoadRule(IRule rule, ITransitionEvent data, ITransitionEventComparer comparer)
        {
            List <IRule>  nextRules = new List <IRule>();
            Stack <IRule> ruleStack = new Stack <IRule>();

            ruleStack.Push(rule);
            int count = 0;

            while (ruleStack.Count > 0)
            {
                rule = ruleStack.Pop();
                foreach (SCXMLTransition transition in rule.Transitions)
                {
                    if ((count == 0 && comparer.Compare(transition.Event, data) > -1) ||
                        transition.Event == null)
                    {
                        SCXMLRule nextRule = PrepareRule(transition.TargetRuleName);
                        nextRules.Add(nextRule);
                        ruleStack.Push(nextRule);

                        if (callback != null)
                        {
                            foreach (SCXMLDataEvent dataEvent in transition.DataEvents)
                            {
                                if (!dataEvent.IsTriggered)
                                {
                                    callback.OnEvent(dataEvent);
                                    dataEvent.IsTriggered = true;
                                }
                            }
                        }

                        // TODO: Comment break to suppport NFA
                        break;
                    }
                }

                if (callback != null)
                {
                    foreach (SCXMLDataEvent dataEvent in rule.DataEvents)
                    {
                        if (!dataEvent.IsTriggered)
                        {
                            callback.OnEvent(dataEvent);
                            dataEvent.IsTriggered = true;
                        }
                    }
                }

                count++;
            }

            return(nextRules);
        }
        public bool IsValid(ITransitionEvent previous, ITransitionEvent current)
        {
            if (previous == null && current == null)
            {
                return(false);
            }

            switch (current.Transition)
            {
            case Transition.Start when previous == null || previous.Transition.Equals(Transition.End):
            case Transition.End when previous != null && previous.Transition.Equals(Transition.Start):
                return(true);

            default:
                return(false);
            }
        }
 public int Compare(ITransitionEvent x, ITransitionEvent y)
 {
     return(1);
 }
 protected void CurrentEventIs(ITransitionEvent current) =>
 _current = current;
 protected void PreviousEventIs(ITransitionEvent previous) =>
 _previous = previous;
 public List <IRule> LoadEvent <String>(IRule rule, ITransitionEvent data, ITransitionEventComparer comparer)
 {
     return(LoadRule(rule, data, comparer));
 }
 public List <IRule> LoadEvent <String>(IRule rule, ITransitionEvent data)
 {
     return(LoadRule(rule, data));
 }
 private List <IRule> LoadRule(IRule rule, ITransitionEvent data)
 {
     return(LoadRule(rule, data, scxmlTransitionEventComparer));
 }