mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-05-30 11:40:47 +02:00
Update JsonMatcher to support IgnoreArrayOrder (#1468)
* Update JsonMatcher to support IgnoreArrayOrder * more tests
This commit is contained in:
@@ -32,6 +32,11 @@ public class JsonMatcher : IJsonMatcher
|
||||
/// </summary>
|
||||
public bool Regex { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Ignore array order when comparing
|
||||
/// </summary>
|
||||
public bool IgnoreArrayOrder { get; }
|
||||
|
||||
private readonly JToken _valueAsJToken;
|
||||
|
||||
/// <summary>
|
||||
@@ -40,7 +45,8 @@ public class JsonMatcher : IJsonMatcher
|
||||
/// <param name="value">The string value to check for equality.</param>
|
||||
/// <param name="ignoreCase">Ignore the case from the PropertyName and PropertyValue (string only).</param>
|
||||
/// <param name="regex">Support Regex.</param>
|
||||
public JsonMatcher(string value, bool ignoreCase = false, bool regex = false) : this(MatchBehaviour.AcceptOnMatch, value, ignoreCase, regex)
|
||||
/// <param name="ignoreArrayOrder">Ignore array element order when comparing.</param>
|
||||
public JsonMatcher(string value, bool ignoreCase = false, bool regex = false, bool ignoreArrayOrder = false) : this(MatchBehaviour.AcceptOnMatch, value, ignoreCase, regex, ignoreArrayOrder)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -50,7 +56,8 @@ public class JsonMatcher : IJsonMatcher
|
||||
/// <param name="value">The object value to check for equality.</param>
|
||||
/// <param name="ignoreCase">Ignore the case from the PropertyName and PropertyValue (string only).</param>
|
||||
/// <param name="regex">Support Regex.</param>
|
||||
public JsonMatcher(object value, bool ignoreCase = false, bool regex = false) : this(MatchBehaviour.AcceptOnMatch, value, ignoreCase, regex)
|
||||
/// <param name="ignoreArrayOrder">Ignore array element order when comparing.</param>
|
||||
public JsonMatcher(object value, bool ignoreCase = false, bool regex = false, bool ignoreArrayOrder = false) : this(MatchBehaviour.AcceptOnMatch, value, ignoreCase, regex, ignoreArrayOrder)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -61,13 +68,15 @@ public class JsonMatcher : IJsonMatcher
|
||||
/// <param name="value">The value to check for equality.</param>
|
||||
/// <param name="ignoreCase">Ignore the case from the PropertyName and PropertyValue (string only).</param>
|
||||
/// <param name="regex">Support Regex.</param>
|
||||
public JsonMatcher(MatchBehaviour matchBehaviour, object value, bool ignoreCase = false, bool regex = false)
|
||||
/// <param name="ignoreArrayOrder">Ignore array element order when comparing.</param>
|
||||
public JsonMatcher(MatchBehaviour matchBehaviour, object value, bool ignoreCase = false, bool regex = false, bool ignoreArrayOrder = false)
|
||||
{
|
||||
Guard.NotNull(value);
|
||||
|
||||
MatchBehaviour = matchBehaviour;
|
||||
IgnoreCase = ignoreCase;
|
||||
Regex = regex;
|
||||
IgnoreArrayOrder = ignoreArrayOrder;
|
||||
|
||||
Value = value;
|
||||
_valueAsJToken = ConvertValueToJToken(value);
|
||||
@@ -106,7 +115,8 @@ public class JsonMatcher : IJsonMatcher
|
||||
$"{MatchBehaviour.GetFullyQualifiedEnumValue()}, " +
|
||||
$"{CSharpFormatter.ConvertToAnonymousObjectDefinition(Value, 3)}, " +
|
||||
$"{CSharpFormatter.ToCSharpBooleanLiteral(IgnoreCase)}, " +
|
||||
$"{CSharpFormatter.ToCSharpBooleanLiteral(Regex)}" +
|
||||
$"{CSharpFormatter.ToCSharpBooleanLiteral(Regex)}, " +
|
||||
$"{CSharpFormatter.ToCSharpBooleanLiteral(IgnoreArrayOrder)}" +
|
||||
$")";
|
||||
}
|
||||
|
||||
@@ -183,6 +193,13 @@ public class JsonMatcher : IJsonMatcher
|
||||
return false;
|
||||
}
|
||||
|
||||
if (IgnoreArrayOrder)
|
||||
{
|
||||
// Sort both arrays by their string representation and compare
|
||||
valueArray = valueArray.OrderBy(t => t.ToString()).ToArray();
|
||||
inputArray = inputArray.OrderBy(t => t.ToString()).ToArray();
|
||||
}
|
||||
|
||||
return !valueArray.Where((valueToken, index) => !IsMatch(valueToken, inputArray[index])).Any();
|
||||
|
||||
default:
|
||||
|
||||
@@ -35,6 +35,11 @@ public class SystemTextJsonMatcher : IJsonMatcher
|
||||
/// </summary>
|
||||
public bool Regex { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Ignore array order when comparing
|
||||
/// </summary>
|
||||
public bool IgnoreArrayOrder { get; }
|
||||
|
||||
private readonly JsonElement _valueAsJsonElement;
|
||||
|
||||
/// <summary>
|
||||
@@ -43,8 +48,9 @@ public class SystemTextJsonMatcher : IJsonMatcher
|
||||
/// <param name="value">The string value to check for equality.</param>
|
||||
/// <param name="ignoreCase">Ignore the case from the PropertyName and PropertyValue (string only).</param>
|
||||
/// <param name="regex">Support Regex.</param>
|
||||
public SystemTextJsonMatcher(string value, bool ignoreCase = false, bool regex = false)
|
||||
: this(MatchBehaviour.AcceptOnMatch, value, ignoreCase, regex)
|
||||
/// <param name="ignoreArrayOrder">Ignore array element order when comparing.</param>
|
||||
public SystemTextJsonMatcher(string value, bool ignoreCase = false, bool regex = false, bool ignoreArrayOrder = false)
|
||||
: this(MatchBehaviour.AcceptOnMatch, value, ignoreCase, regex, ignoreArrayOrder)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -54,8 +60,9 @@ public class SystemTextJsonMatcher : IJsonMatcher
|
||||
/// <param name="value">The object value to check for equality.</param>
|
||||
/// <param name="ignoreCase">Ignore the case from the PropertyName and PropertyValue (string only).</param>
|
||||
/// <param name="regex">Support Regex.</param>
|
||||
public SystemTextJsonMatcher(object value, bool ignoreCase = false, bool regex = false)
|
||||
: this(MatchBehaviour.AcceptOnMatch, value, ignoreCase, regex)
|
||||
/// <param name="ignoreArrayOrder">Ignore array element order when comparing.</param>
|
||||
public SystemTextJsonMatcher(object value, bool ignoreCase = false, bool regex = false, bool ignoreArrayOrder = false)
|
||||
: this(MatchBehaviour.AcceptOnMatch, value, ignoreCase, regex, ignoreArrayOrder)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -66,13 +73,15 @@ public class SystemTextJsonMatcher : IJsonMatcher
|
||||
/// <param name="value">The value to check for equality.</param>
|
||||
/// <param name="ignoreCase">Ignore the case from the PropertyName and PropertyValue (string only).</param>
|
||||
/// <param name="regex">Support Regex.</param>
|
||||
public SystemTextJsonMatcher(MatchBehaviour matchBehaviour, object value, bool ignoreCase = false, bool regex = false)
|
||||
/// <param name="ignoreArrayOrder">Ignore array element order when comparing.</param>
|
||||
public SystemTextJsonMatcher(MatchBehaviour matchBehaviour, object value, bool ignoreCase = false, bool regex = false, bool ignoreArrayOrder = false)
|
||||
{
|
||||
Guard.NotNull(value);
|
||||
|
||||
MatchBehaviour = matchBehaviour;
|
||||
IgnoreCase = ignoreCase;
|
||||
Regex = regex;
|
||||
IgnoreArrayOrder = ignoreArrayOrder;
|
||||
|
||||
Value = value;
|
||||
_valueAsJsonElement = ConvertToJsonElement(value);
|
||||
@@ -111,7 +120,8 @@ public class SystemTextJsonMatcher : IJsonMatcher
|
||||
$"{MatchBehaviour.GetFullyQualifiedEnumValue()}, " +
|
||||
$"{CSharpFormatter.ConvertToAnonymousObjectDefinition(Value, 3)}, " +
|
||||
$"{CSharpFormatter.ToCSharpBooleanLiteral(IgnoreCase)}, " +
|
||||
$"{CSharpFormatter.ToCSharpBooleanLiteral(Regex)}" +
|
||||
$"{CSharpFormatter.ToCSharpBooleanLiteral(Regex)}, " +
|
||||
$"{CSharpFormatter.ToCSharpBooleanLiteral(IgnoreArrayOrder)}" +
|
||||
$")";
|
||||
}
|
||||
|
||||
@@ -202,6 +212,13 @@ public class SystemTextJsonMatcher : IJsonMatcher
|
||||
return false;
|
||||
}
|
||||
|
||||
if (IgnoreArrayOrder)
|
||||
{
|
||||
// Sort both arrays by their string representation and compare
|
||||
valueArray = valueArray.OrderBy(e => e.GetRawText()).ToArray();
|
||||
inputArray = inputArray.OrderBy(e => e.GetRawText()).ToArray();
|
||||
}
|
||||
|
||||
return !valueArray.Where((valueToken, index) => !IsMatch(valueToken, inputArray[index])).Any();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user