using System; using System.Collections.Generic; using System.Linq; namespace WireMock.Matchers.Request; /// /// RequestMatchResult /// public class RequestMatchResult : IRequestMatchResult { /// public double TotalScore => MatchDetails.Sum(md => md.Score); /// public int TotalNumber => MatchDetails.Count; /// public bool IsPerfectMatch => Math.Abs(TotalScore - TotalNumber) < MatchScores.Tolerance; /// public double AverageTotalScore => TotalNumber == 0 ? 0.0 : TotalScore / TotalNumber; /// public IList MatchDetails { get; } = new List(); /// /// Adds the score. /// /// The matcher Type. /// The score. /// The score. public double AddScore(Type matcherType, double score) { MatchDetails.Add(new MatchDetail { MatcherType = matcherType, Score = score }); return score; } /// /// Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. /// /// An object to compare with this instance. /// /// A value that indicates the relative order of the objects being compared. The return value has these meanings: Value Meaning Less than zero This instance precedes in the sort order. Zero This instance occurs in the same position in the sort order as . Greater than zero This instance follows in the sort order. /// public int CompareTo(object obj) { var compareObj = (RequestMatchResult)obj; int averageTotalScoreResult = compareObj.AverageTotalScore.CompareTo(AverageTotalScore); // In case the score is equal, prefer the one with the most matchers. return averageTotalScoreResult == 0 ? compareObj.TotalNumber.CompareTo(TotalNumber) : averageTotalScoreResult; } }