public static void CheckMessagesDoNotMatch <T>(List <T> messages, Expression <Func <T, bool> > predicate)
        {
            var binaryParts = ExpressionExtractor.GetBinaryChecks <T>(predicate).ToList();

            var messageList = messages.ToList();

            var errors = new List <Expression>();

            foreach (var binaryCheck in binaryParts)
            {
                messageList = messageList.Where(message => binaryCheck.Compile().Invoke(message)).ToList();

                if (messageList.Any())
                {
                    var expression = binaryCheck.Body as BinaryExpression;
                    errors.Add(expression);
                }
            }

            if (messageList.Any())
            {
                var sb = new StringBuilder();
                sb.AppendLine(typeof(T).Name + "(s) found with:");

                foreach (var err in errors)
                {
                    sb.AppendLine(GetAssertionString(err));
                }

                throw new Exception(sb.ToString());
            }
        }
        public static void CheckMessagesMatch <T>(List <T> messages, Expression <Func <T, bool> > predicate)
        {
            if (!messages.Any(predicate.Compile()))
            {
                var binaryParts = ExpressionExtractor.GetBinaryChecks <T>(predicate).ToList();

                var messageList = messages.ToList();

                foreach (var binaryCheck in binaryParts)
                {
                    messageList = messageList.Where(message => binaryCheck.Compile().Invoke(message)).ToList();

                    if (!messageList.Any())
                    {
                        throw new Exception(string.Format("No {0} found where {1}",
                                                          typeof(T).Name, GetAssertionString(binaryCheck.Body)));
                    }
                }
            }
        }