public static CollectorState GetState(CollectorReturnValueCheckSequenceType st,
                                              CollectorReturnValueCompareMatchType goodMatchType, string goodMatchFilter,
                                              CollectorReturnValueCompareMatchType warningMatchType, string warningMatchFilter,
                                              CollectorReturnValueCompareMatchType errorMatchType, string errorMatchFilter,
                                              object value)
        {
            CollectorState currentState = CollectorState.Good;

            if (st == CollectorReturnValueCheckSequenceType.GWE)
            {
                if (TestResult(goodMatchType, goodMatchFilter, value))
                {
                    currentState = CollectorState.Good;
                }
                else if (TestResult(warningMatchType, warningMatchFilter, value))
                {
                    currentState = CollectorState.Warning;
                }
                else
                {
                    currentState = CollectorState.Error;
                }
            }
            else
            {
                if (TestResult(errorMatchType, errorMatchFilter, value))
                {
                    currentState = CollectorState.Error;
                }
                else if (TestResult(warningMatchType, warningMatchFilter, value))
                {
                    currentState = CollectorState.Warning;
                }
                else
                {
                    currentState = CollectorState.Good;
                }
            }
            return(currentState);
        }
        public static bool TestResult(CollectorReturnValueCompareMatchType tcmt, string matchFilter, object resultToTest)
        {
            if (matchFilter.ToLower() == "[any]")
            {
                return(true);
            }
            else if (matchFilter.ToLower() == "[null]" && (resultToTest == null || resultToTest.ToString() == "[null]"))
            {
                return(true);
            }
            switch (tcmt)
            {
            case CollectorReturnValueCompareMatchType.Match:
                return(matchFilter.ToLower() == resultToTest.ToString().ToLower());

            case CollectorReturnValueCompareMatchType.Contains:
                return(resultToTest.ToString().ToLower().Contains(matchFilter.ToLower()));

            case CollectorReturnValueCompareMatchType.StartsWith:
                return(resultToTest.ToString().ToLower().StartsWith(matchFilter.ToLower()));

            case CollectorReturnValueCompareMatchType.EndsWith:
                return(resultToTest.ToString().ToLower().EndsWith(matchFilter.ToLower()));

            case CollectorReturnValueCompareMatchType.RegEx:
                System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(resultToTest.ToString(), matchFilter, System.Text.RegularExpressions.RegexOptions.Multiline);
                return(match.Success);

            case CollectorReturnValueCompareMatchType.IsNumber:
                if (!resultToTest.IsNumber())
                {
                    return(false);
                }
                else if (matchFilter.StartsWith("["))
                {
                    if (matchFilter.ToLower().StartsWith("[between]") && matchFilter.ToLower().Contains("[and]"))
                    {
                        string[] queryItems = matchFilter.Split(' ');
                        if (resultToTest.IsNumber() && queryItems.Length == 4 && queryItems[1].IsNumber() && queryItems[3].IsNumber())
                        {
                            return((double.Parse(queryItems[1]) < double.Parse(resultToTest.ToString())) &&
                                   (double.Parse(resultToTest.ToString()) < double.Parse(queryItems[3])));
                        }
                        else
                        {
                            throw new Exception("Value is not a number or macro syntax invalid!");
                        }
                    }
                    else
                    {
                        throw new Exception("Unknown or invalid macro syntax!");
                    }
                }
                else
                {
                    if (!matchFilter.IsNumber())
                    {
                        throw new Exception("Test script is not a number or macro syntax invalid!");
                    }
                    else
                    {
                        return(double.Parse(matchFilter) == double.Parse(resultToTest.ToString()));
                    }
                }

            case CollectorReturnValueCompareMatchType.LargerThan:
                if (!resultToTest.IsNumber() || !matchFilter.IsNumber())
                {
                    throw new Exception("Test script or value is not a number!");
                }
                else
                {
                    return(double.Parse(resultToTest.ToString()) > double.Parse(matchFilter));
                }

            case CollectorReturnValueCompareMatchType.SmallerThan:
                if (!resultToTest.IsNumber() || !matchFilter.IsNumber())
                {
                    throw new Exception("Test script or value is not a number!");
                }
                else
                {
                    return(double.Parse(resultToTest.ToString()) < double.Parse(matchFilter));
                }

            case CollectorReturnValueCompareMatchType.Between:
                if (!resultToTest.IsNumber())
                {
                    throw new Exception("Value is not a number!");
                }
                else
                {
                    string[] betweenMatchParts = matchFilter.Split(new string[] { " ", ",", "and" }, StringSplitOptions.RemoveEmptyEntries);
                    if (betweenMatchParts.Length < 2)
                    {
                        throw new Exception("Test script format invalid!");
                    }
                    else
                    {
                        return
                            (double.Parse(betweenMatchParts[0]) < double.Parse(resultToTest.ToString()) &&
                             double.Parse(resultToTest.ToString()) < double.Parse(betweenMatchParts[betweenMatchParts.Length - 1]));
                    }
                }

            default:
                return(matchFilter.ToLower() == resultToTest.ToString().ToLower());
            }
        }