using System; using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; using WireMock.Util; using WireMock.Validation; namespace WireMock.Matchers.Request { /// /// The request parameters matcher. /// public class RequestMessageParamMatcher : IRequestMatcher { /// /// The funcs /// public Func>, bool>[] Funcs { get; } /// /// The key /// public string Key { get; } /// /// The values /// public IEnumerable Values { get; } /// /// Initializes a new instance of the class. /// /// /// The key. /// /// /// The values. /// public RequestMessageParamMatcher([NotNull] string key, [CanBeNull] IEnumerable values) { Check.NotNull(key, nameof(key)); Key = key; Values = values; } /// /// Initializes a new instance of the class. /// /// The funcs. public RequestMessageParamMatcher([NotNull] params Func>, bool>[] funcs) { Check.NotNull(funcs, nameof(funcs)); Funcs = funcs; } /// /// Determines whether the specified RequestMessage is match. /// /// The RequestMessage. /// The RequestMatchResult. /// /// A value between 0.0 - 1.0 of the similarity. /// public double GetMatchingScore(RequestMessage requestMessage, RequestMatchResult requestMatchResult) { double score = IsMatch(requestMessage); requestMatchResult.TotalScore += score; requestMatchResult.TotalNumber++; return score; } private double IsMatch(RequestMessage requestMessage) { if (Funcs != null) return MatchScores.ToScore(requestMessage.Query != null && Funcs.Any(f => f(requestMessage.Query))); List values = requestMessage.GetParameter(Key); return MatchScores.ToScore(values?.Intersect(Values).Count() == Values.Count()); } } }