Exemplo n.º 1
0
        public List <ActivityTest> AcvityLint()
        {
            //make sure logictest was run
            var runLogicTests = this.LogicLint();


            /*for each root activity
             * need to get all equations involved
             * merge those test cases from top down without adding duplicates on EvaluatorID|context
             * example
             * if (a & b) -> X ->
             *    if !a & c -> y
             * result should be
             *  a, b, c (not a,!a,b,c)
             *
             */
            List <ActivityTest> toReturn = new List <ActivityTest>();



            string   rootName     = this.WorkflowManager.RootActivityId;
            Activity rootActivity = this.WorkflowManager.GetActivity(rootName);


            List <string> equationsWithCases = new List <string>();

            equationsWithCases = (from z in logicTests where z.TestCases.Count > 0 select z.EquationId).ToList();
            List <List <string> > cases = new List <List <string> >();

            foreach (string eq in equationsWithCases)
            {
                LogicTest             eqTest  = logicTests.First(g => g.EquationId == eq);
                List <List <string> > thisRun = new List <List <string> >();
                foreach (Case testCase in eqTest.TestCases)
                {
                    List <string> ruleCases = (from g in testCase.Rules select g.ToString()).ToList();
                    if (cases.Count == 0)
                    {
                        thisRun.Add(ruleCases);
                    }
                    else
                    {
                        foreach (List <string> lastRun in cases)
                        {
                            List <string> copyOfLastRun = (from s in lastRun select s).ToList();
                            //whittle out any dupes where id and context match.
                            List <string> justIdsFromLastRun = (from s in lastRun select((Rule)s).RuleIdWithContext).ToList();

                            List <string> deduped = (from s in ruleCases where !justIdsFromLastRun.Contains(((Rule)s).RuleIdWithContext) select s).ToList();

                            List <string> thisCase = copyOfLastRun;

                            if (deduped.Count > 0)
                            {
                                thisCase = copyOfLastRun.Union(deduped).ToList();
                                thisRun.Add(thisCase);
                            }
                        }
                    }
                }
                if (thisRun.Count > 0)
                {
                    cases = thisRun;
                }
            }

            List <Case> testCases = (from z in cases select new Case((from x in z select(Rule) x).ToList())).ToList();

            ActivityTest toAdd = new ActivityTest(rootName)
            {
                TestCases = testCases
            };

            toReturn.Add(toAdd);



            int counter = 0;

            toReturn.ForEach(t =>
            {
                t.TestCases.ForEach(c => { counter++; c.Id = counter; });
            });

            return(toReturn);
        }
Exemplo n.º 2
0
        public List <LogicTest> LogicLint()
        {
            int        id    = 1;
            Func <int> newId = () =>
            {
                return(id += 1);
            };

            List <bool> tf = new List <bool>()
            {
                true, false
            };

            Func <Equation, List <Rule> > getAllRulesForEquation = null;

            getAllRulesForEquation = (eq) =>
            {
                List <Rule> rules = new List <Rule>();
                //left hand side of equation

                if (ConventionHelper.MatchesConvention(NamePrefixOptions.Equation, eq.First.Id, this.configuration.Convention))
                {
                    Equation    traverse = this.WorkflowManager.GetEquation(eq.First.Id);
                    List <Rule> parsed   = getAllRulesForEquation(traverse);

                    rules = rules.Union(parsed, new RuleEqualityComparer()).ToList();
                }
                else
                {
                    if (!rules.Contains(eq.First, new RuleEqualityComparer()))
                    {
                        rules.Add((Rule)eq.First.Clone());
                    }
                }

                if (ConventionHelper.MatchesConvention(NamePrefixOptions.Equation, eq.Second.Id, this.configuration.Convention))
                {
                    Equation    traverse = this.WorkflowManager.GetEquation(eq.Second.Id);
                    List <Rule> parsed   = getAllRulesForEquation(traverse);

                    rules = rules.Union(parsed, new RuleEqualityComparer()).ToList();
                }
                else
                {
                    if (!rules.Contains(eq.Second, new RuleEqualityComparer()))
                    {
                        rules.Add((Rule)eq.Second.Clone());
                    }
                }

                string trueId = ConventionHelper.TrueEvaluator(this.configuration.Convention);
                return((from r in rules where r.Id != trueId select r).ToList());
            };

            Func <Stack <List <Case> >, List <Case> > mergeCases = null;

            mergeCases = (llc) =>
            {
                List <Case> merged = llc.Pop();
                if (llc.Count > 0)
                {
                    List <Case> toMerge  = mergeCases(llc);
                    List <Case> newMerge = new List <Case>();
                    merged.ForEach(m =>
                    {
                        toMerge.ForEach(g =>
                        {
                            List <Rule> newCaseRules = new List <Rule>(from r in m.Rules select(Rule) r.Clone());
                            newCaseRules.AddRange(from r in g.Rules select(Rule) r.Clone());
                            Case newCase = new Case(newCaseRules);
                            newMerge.Add(newCase);
                        });
                    });

                    merged = newMerge;
                }

                return(merged);
            };



            if (this.logicTests == default)
            {
                this.logicTests = new List <LogicTest>();
                //get the root
                foreach (string rootEquationId in this.roots)
                {
                    Stack <List <Case> > preMerge  = new Stack <List <Case> >();
                    Equation             root      = this.WorkflowManager.GetEquation(rootEquationId);
                    List <Rule>          evalRules = getAllRulesForEquation(root);
                    foreach (Rule evalRule in evalRules)
                    {
                        List <Case> evalRuleCases = new List <Case>();
                        if (evalRule.Context == null)
                        {
                            evalRuleCases.AddRange(from c in tf
                                                   select new Case(new List <Rule>()
                            {
                                new Rule()
                                {
                                    Context       = evalRule.Context,
                                    Id            = evalRule.Id,
                                    TrueCondition = c
                                }
                            }));
                        }
                        else
                        {
                            Stack <List <Case> > contextCases = new Stack <List <Case> >();

                            evalRule.Context.Keys.ForEach(k =>
                            {
                                List <Case> cases = new List <Case>();
                                cases.AddRange(from c in tf
                                               select new Case(new List <Rule>()
                                {
                                    new Rule()
                                    {
                                        Context = new Context(new List <string>()
                                        {
                                            k
                                        }, evalRule.Context.Name),
                                        Id            = evalRule.Id,
                                        TrueCondition = c
                                    }
                                }));
                                contextCases.Push(cases);
                                evalRuleCases = mergeCases(contextCases);
                                contextCases.Push(evalRuleCases);
                            });
                            var contextDef = this.WorkflowManager.GetContextDefinition(evalRule.Context.Name);
                            if (contextDef.Validate == ValidateOptions.OneOf)
                            {
                                evalRuleCases.RemoveAll(c => c.Rules.Count(r => r.TrueCondition) != 1 && c.Rules.Any(r => r.TrueCondition));
                            }
                            if (contextDef.Exclusive)
                            {
                                evalRuleCases.RemoveAll(c => c.Rules.Count(r => !r.TrueCondition) == c.Rules.Count() && c.Rules.Count == contextDef.Items.Count);
                            }
                        }

                        preMerge.Push(evalRuleCases);
                    }
                    List <Case> finalCases = mergeCases(preMerge);
                    LogicTest   eqTest     = new LogicTest(rootEquationId, true)
                    {
                        TestCases = finalCases
                    };
                    this.logicTests.Add(eqTest);
                }
            }

            return(this.logicTests);
        }