/// <summary>
        /// Apply the test case selection rules detected by the plug-in.
        /// </summary>
        /// <param name="ruleGroupsBySelectedRules">The rule groups by selected rules.</param>
        /// <param name="targetFilterIndex">Target filter index</param>
        /// <param name="mappingFilterIndex">Mapping filter index</param>
        public void ApplyDetectedRules(out IEnumerable <Common.Types.RuleGroup> ruleGroupsBySelectedRules, int targetFilterIndex, int mappingFilterIndex)
        {
            // Get the filter.
            var filter = TestSuite.GetTestCaseFilter();

            // create mapping table for the filter.
            CreateMappingTableForTestCaseFilter(filter, targetFilterIndex, mappingFilterIndex);
            // Update selected rules for the filter.
            foreach (var rule in ValueDetector.GetSelectedRules())
            {
                Kernel.Rule r = filter.FindRuleByName(rule.Name);
                if (r == null)
                {
                    throw new Exception(string.Format("Cannot find rule by name {0}.", rule.Name));
                }
                switch (rule.Status)
                {
                case Microsoft.Protocols.TestManager.Detector.RuleStatus.Selected:
                    r.SelectStatus = Kernel.RuleSelectStatus.Selected;
                    r.Status       = RuleSupportStatus.Selected;
                    break;

                case Microsoft.Protocols.TestManager.Detector.RuleStatus.NotSupported:
                    r.SelectStatus = Kernel.RuleSelectStatus.UnSelected;
                    r.Status       = RuleSupportStatus.NotSupported;
                    break;

                case Microsoft.Protocols.TestManager.Detector.RuleStatus.Unknown:
                    r.SelectStatus = Kernel.RuleSelectStatus.UnSelected;
                    r.Status       = RuleSupportStatus.Unknown;
                    break;

                default:
                    r.SelectStatus = Kernel.RuleSelectStatus.UnSelected;
                    r.Status       = RuleSupportStatus.Default;
                    break;
                }
            }
            // Update filter to ruleGroups
            var ruleGroups = new List <Common.Types.RuleGroup>();

            foreach (var group in filter)
            {
                Common.Types.RuleGroup ruleGroup = new Common.Types.RuleGroup()
                {
                    Name        = group.Name,
                    DisplayName = group.Name,
                    Rules       = new List <Common.Types.Rule>()
                };
                AddItems(ruleGroup.Rules, group);
                ruleGroups.Add(ruleGroup);
            }
            // Update the selected rule groups.
            ruleGroupsBySelectedRules = ruleGroups;
        }
        private Dictionary <string, Kernel.Rule> CreateRuleTableFromRuleGroupForKernel(Kernel.RuleGroup ruleGroup)
        {
            Dictionary <string, Kernel.Rule> ruleTable = new Dictionary <string, Kernel.Rule>();
            Stack <Kernel.Rule> ruleStack = new Stack <Kernel.Rule>();

            foreach (Kernel.Rule r in ruleGroup)
            {
                ruleStack.Push(r);
            }
            while (ruleStack.Count > 0)
            {
                Kernel.Rule r = ruleStack.Pop();
                if (r.CategoryList.Count != 0 &&
                    !ruleTable.ContainsKey(r.CategoryList[0]))
                {
                    ruleTable.Add(r.CategoryList[0], r);
                }
                foreach (Kernel.Rule childRule in r)
                {
                    ruleStack.Push(childRule);
                }
            }
            return(ruleTable);
        }
 private void UpdateMappingTableForKernel(Dictionary <string, List <Kernel.Rule> > mappingTable, string target, Kernel.Rule currentRule)
 {
     if (mappingTable.ContainsKey(target))
     {
         if (!mappingTable[target].Contains(currentRule))
         {
             mappingTable[target].Add(currentRule);
         }
     }
     else
     {
         mappingTable[target] = new List <Kernel.Rule> {
             currentRule
         };
     }
 }