/// <summary>
 /// Filter the list of active test methods to those matching the tag
 /// expression.
 /// </summary>
 /// <param name="groups">The test groups.</param>
 public override void Filter(IList<TestGroup> groups)
 {
     string tagExpression = this.Settings.TagExpression;
     if (!string.IsNullOrEmpty(tagExpression))
     {
         this.Settings.TestRunStatusMessage += " - Tag Expression '" + tagExpression + "'";
         foreach (TestGroup group in groups)
         {
             List<TestMethod> activeMethods =
                 new TagManager(group).EvaluateExpression(tagExpression).ToList();
             Remove(group.Methods, m => !activeMethods.Contains(m));                    
         }
         Remove(groups, g => g.Methods.Count == 0);
     }
 }
 /// <summary>
 /// Create an expression evaluator.
 /// </summary>
 /// <param name="owner">The owner object.</param>
 /// <param name="tagExpression">Expression object.</param>
 private ExpressionEvaluator(TagManager owner, string tagExpression)
 {
     if (tagExpression == null)
     {
         throw new ArgumentNullException("tagExpression");
     }
     else if (tagExpression.Length == 0)
     {
         throw new ArgumentOutOfRangeException("tagExpression");
     }
     _owner = owner;
     _tagExpression = tagExpression;
 }
 /// <summary>
 /// Evaluate a tag expression.
 /// </summary>
 /// <param name="owner">The owner object.</param>
 /// <param name="tagExpression">Tag expression.</param>
 /// <returns>Test methods associated with the tag expression.</returns>
 public static IEnumerable<TestMethod> Evaluate(TagManager owner, string tagExpression)
 {
     return new ExpressionEvaluator(owner, tagExpression).Evaluate();
 }
 /// <summary>
 /// Evaluate a tag expression.
 /// </summary>
 /// <param name="owner">The owner object.</param>
 /// <param name="tagExpression">Tag expression.</param>
 /// <returns>Test methods associated with the tag expression.</returns>
 public static IEnumerable <TestMethod> Evaluate(TagManager owner, string tagExpression)
 {
     return(new ExpressionEvaluator(owner, tagExpression).Evaluate());
 }