Skip to content

Commit 477f51c

Browse files
author
Edouard Poor
committed
BREAKING CHANGE: Update ExactMatch and SubsetMatch to use tuple returns
- Changed ExactMatch() and SubsetMatch() methods to return tuples instead of using out parameters - Both methods now return (bool IsMatch, Dictionary<string, JsonElement> ExtractedValues, List<string> Mismatches) - This creates consistency with the async method signatures - Updated all consuming code including tests, assertions, and sample application - All tests pass and functionality is preserved Migration guide: Old: bool result = comparer.ExactMatch(expected, actual, out var extractedValues, out var mismatches); New: var (result, extractedValues, mismatches) = comparer.ExactMatch(expected, actual); Or: var result = comparer.ExactMatch(expected, actual); // Access via result.IsMatch, result.ExtractedValues, result.Mismatches
1 parent c7b82b6 commit 477f51c

File tree

6 files changed

+126
-144
lines changed

6 files changed

+126
-144
lines changed

samples/PQSoft.JsonComparer.Sample/Program.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@
1212
string json1 = """{"name":"John","age":30,"city":"New York"}""";
1313
string json2 = """{"name":"John","age":30,"city":"New York"}""";
1414

15-
bool result1 = comparer.ExactMatch(json1, json2, out var extractedValues1, out var mismatches1);
15+
var (result1, extractedValues1, mismatches1) = comparer.ExactMatch(json1, json2);
1616
PrintResult(result1, extractedValues1, mismatches1);
1717

1818
// Example 2: Compare JSON objects with different values
1919
Console.WriteLine("\nExample 2: Compare JSON objects with different values");
2020
string json3 = """{"name":"John","age":30,"city":"New York"}""";
2121
string json4 = """{"name":"John","age":31,"city":"New York"}""";
2222

23-
bool result2 = comparer.ExactMatch(json3, json4, out var extractedValues2, out var mismatches2);
23+
var (result2, extractedValues2, mismatches2) = comparer.ExactMatch(json3, json4);
2424
PrintResult(result2, extractedValues2, mismatches2);
2525

2626
// Example 3: Compare JSON with tokens
2727
Console.WriteLine("\nExample 3: Compare JSON with tokens");
2828
string json5 = """{"id":"[[JOB_ID]]","name":"John","age":30}""";
2929
string json6 = """{"id":"12345","name":"John","age":30}""";
3030

31-
bool result3 = comparer.ExactMatch(json5, json6, out var extractedValues3, out var mismatches3);
31+
var (result3, extractedValues3, mismatches3) = comparer.ExactMatch(json5, json6);
3232
PrintResult(result3, extractedValues3, mismatches3);
3333
if (extractedValues3.TryGetValue("JOB_ID", out var jobId))
3434
{
@@ -44,15 +44,15 @@
4444
string json7 = """{"name":"John"}""";
4545
string json8 = """{"name":"John","age":30,"city":"New York"}""";
4646

47-
bool result4 = comparer.SubsetMatch(json7, json8, out var extractedValues4, out var mismatches4);
47+
var (result4, extractedValues4, mismatches4) = comparer.SubsetMatch(json7, json8);
4848
PrintResult(result4, extractedValues4, mismatches4);
4949

5050
// Example 5: Using functions
5151
Console.WriteLine("\nExample 5: Using functions");
5252
string json9 = """{"timestamp":"{{NOW()}}","status":"active"}""";
5353
string json10 = """{"timestamp":"2024-01-01T10:00:00.000+00:00","status":"active"}""";
5454

55-
bool result5 = comparer.ExactMatch(json9, json10, out var extractedValues5, out var mismatches5);
55+
var (result5, extractedValues5, mismatches5) = comparer.ExactMatch(json9, json10);
5656
PrintResult(result5, extractedValues5, mismatches5);
5757

5858
void PrintResult(bool areEqual, Dictionary<string, JsonElement> extractedValues, List<string> mismatches)

src/PQSoft.JsonComparer.AwesomeAssertions/JsonComparisonAssertions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ public class JsonSubjectAssertions(JsonSubject subject)
4848
public JsonSubjectAssertions FullyMatch([StringSyntax(StringSyntaxAttribute.Json)] string expectedJson, string because = "", params object[] becauseArgs)
4949
{
5050
var comparer = new JsonComparer(subject.TimeProvider);
51-
var result = comparer.ExactMatch(expectedJson, subject.Json, out Dictionary<string, JsonElement> extractedValues, out List<string> mismatches);
51+
var (isMatch, extractedValues, mismatches) = comparer.ExactMatch(expectedJson, subject.Json);
5252
ExtractedValues = extractedValues;
5353

54-
if (!result)
54+
if (!isMatch)
5555
{
5656
var reason = string.IsNullOrEmpty(because) ? "" : $" {string.Format(because, becauseArgs)}";
5757
throw new InvalidOperationException($"Expected JSON to be equivalent{reason}, but found the following mismatches: {string.Join(", ", mismatches)}");
@@ -70,10 +70,10 @@ public JsonSubjectAssertions FullyMatch([StringSyntax(StringSyntaxAttribute.Json
7070
public JsonSubjectAssertions ContainSubset([StringSyntax(StringSyntaxAttribute.Json)] string expectedJson, string because = "", params object[] becauseArgs)
7171
{
7272
var comparer = new JsonComparer(subject.TimeProvider);
73-
var result = comparer.SubsetMatch(expectedJson, subject.Json, out Dictionary<string, JsonElement> extractedValues, out List<string> mismatches);
73+
var (isMatch, extractedValues, mismatches) = comparer.SubsetMatch(expectedJson, subject.Json);
7474
ExtractedValues = extractedValues;
7575

76-
if (!result)
76+
if (!isMatch)
7777
{
7878
var reason = string.IsNullOrEmpty(because) ? "" : $" {string.Format(because, becauseArgs)}";
7979
throw new InvalidOperationException($"Expected JSON to contain the subset JSON{reason}, but found the following mismatches: {string.Join(", ", mismatches)}");

src/PQSoft.JsonComparer.UnitTests/JsonComparerCoverageTests.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void ExactMatch_FunctionExecutionFailure_ShouldThrowInvalidOperationExcep
9292

9393
// Act & Assert
9494
var exception = Assert.Throws<InvalidOperationException>(() =>
95-
comparer.ExactMatch(expectedJson, actualJson, out _, out _));
95+
comparer.ExactMatch(expectedJson, actualJson));
9696
Assert.Contains("Failed to execute function 'FAIL'", exception.Message);
9797
}
9898

@@ -106,7 +106,7 @@ public void ExactMatch_UnregisteredFunction_ShouldThrowInvalidOperationException
106106

107107
// Act & Assert
108108
var exception = Assert.Throws<InvalidOperationException>(() =>
109-
comparer.ExactMatch(expectedJson, actualJson, out _, out _));
109+
comparer.ExactMatch(expectedJson, actualJson));
110110
Assert.Contains("Failed to execute function 'UNKNOWN'", exception.Message);
111111
}
112112

@@ -151,12 +151,12 @@ public void ExactMatch_BothNullJsonElements_ShouldReturnTrue()
151151
var actualJson = """{"value": null}""";
152152

153153
// Act
154-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
154+
var result = comparer.ExactMatch(expectedJson, actualJson);
155155

156156
// Assert
157-
Assert.True(result);
158-
Assert.Empty(extractedValues);
159-
Assert.Empty(mismatches);
157+
Assert.True(result.IsMatch);
158+
Assert.Empty(result.ExtractedValues);
159+
Assert.Empty(result.Mismatches);
160160
}
161161

162162
[Fact]
@@ -168,11 +168,11 @@ public void ExactMatch_ExpectedNullActualValue_ShouldReturnFalse()
168168
var actualJson = """{"value": "test"}""";
169169

170170
// Act
171-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
171+
var result = comparer.ExactMatch(expectedJson, actualJson);
172172

173173
// Assert
174-
Assert.False(result);
175-
Assert.Single(mismatches);
174+
Assert.False(result.IsMatch);
175+
Assert.Single(result.Mismatches);
176176
}
177177

178178
[Fact]
@@ -184,11 +184,11 @@ public void ExactMatch_ExpectedValueActualNull_ShouldReturnFalse()
184184
var actualJson = """{"value": null}""";
185185

186186
// Act
187-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
187+
var result = comparer.ExactMatch(expectedJson, actualJson);
188188

189189
// Assert
190-
Assert.False(result);
191-
Assert.Single(mismatches);
190+
Assert.False(result.IsMatch);
191+
Assert.Single(result.Mismatches);
192192
}
193193

194194
private class TestFunction : IJsonFunction

src/PQSoft.JsonComparer.UnitTests/JsonComparerFunctionTests.cs

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ public void ExactMatch_WithGuidFunction_ShouldExecuteAndMatch()
1515

1616
// Act
1717
var comparer = new JsonComparer();
18-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
18+
var result = comparer.ExactMatch(expectedJson, actualJson);
1919

2020
// Assert - This will fail because GUIDs are different, but that's expected behavior
2121
// The test verifies that function processing works without JSON parsing errors
22-
Assert.False(result); // Different GUIDs should not match
23-
Assert.Empty(extractedValues);
24-
Assert.Single(mismatches); // Should have one mismatch for the different GUID values
22+
Assert.False(result.IsMatch); // Different GUIDs should not match
23+
Assert.Empty(result.ExtractedValues);
24+
Assert.Single(result.Mismatches); // Should have one mismatch for the different GUID values
2525
}
2626

2727
[Fact]
@@ -36,12 +36,12 @@ public void ExactMatch_WithTimeProvider_ShouldUseControlledTime()
3636

3737
// Act
3838
var comparer = new JsonComparer(fakeTimeProvider);
39-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
39+
var result = comparer.ExactMatch(expectedJson, actualJson);
4040

4141
// Assert
42-
Assert.True(result);
43-
Assert.Empty(mismatches);
44-
Assert.Empty(extractedValues);
42+
Assert.True(result.IsMatch);
43+
Assert.Empty(result.Mismatches);
44+
Assert.Empty(result.ExtractedValues);
4545
}
4646

4747
[Fact]
@@ -75,14 +75,14 @@ public void ExactMatch_WithMixedTokensAndFunctions_ShouldProcessCorrectly()
7575

7676
// Act
7777
var comparer = new JsonComparer(fakeTimeProvider);
78-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
78+
var result = comparer.ExactMatch(expectedJson, actualJson);
7979

8080
// Assert
81-
Assert.True(result);
82-
Assert.Empty(mismatches);
83-
Assert.Equal(2, extractedValues.Count);
84-
Assert.Equal("user123", extractedValues["USER_ID"].GetString());
85-
Assert.Equal("req456", extractedValues["REQUEST_ID"].GetString());
81+
Assert.True(result.IsMatch);
82+
Assert.Empty(result.Mismatches);
83+
Assert.Equal(2, result.ExtractedValues.Count);
84+
Assert.Equal("user123", result.ExtractedValues["USER_ID"].GetString());
85+
Assert.Equal("req456", result.ExtractedValues["REQUEST_ID"].GetString());
8686
}
8787

8888
[Fact]
@@ -95,7 +95,7 @@ public void ExactMatch_WithInvalidFunction_ShouldThrowException()
9595
// Act & Assert
9696
var comparer = new JsonComparer();
9797
var exception = Assert.Throws<InvalidOperationException>(() =>
98-
comparer.ExactMatch(expectedJson, actualJson, out _, out _));
98+
comparer.ExactMatch(expectedJson, actualJson));
9999

100100
Assert.Contains("Failed to execute function 'INVALID_FUNCTION'", exception.Message);
101101
}
@@ -112,12 +112,12 @@ public void SubsetMatch_WithFunctions_ShouldWork()
112112

113113
// Act
114114
var comparer = new JsonComparer(fakeTimeProvider);
115-
var result = comparer.SubsetMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
115+
var result = comparer.SubsetMatch(expectedJson, actualJson);
116116

117117
// Assert
118-
Assert.True(result);
119-
Assert.Empty(mismatches);
120-
Assert.Empty(extractedValues);
118+
Assert.True(result.IsMatch);
119+
Assert.Empty(result.Mismatches);
120+
Assert.Empty(result.ExtractedValues);
121121
}
122122

123123
[Fact]
@@ -133,12 +133,12 @@ public void RegisterFunction_WithCustomFunction_ShouldWork()
133133
const string actualJson = """{ "value": "custom_result", "type": "custom" }""";
134134

135135
// Act
136-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
136+
var result = comparer.ExactMatch(expectedJson, actualJson);
137137

138138
// Assert
139-
Assert.True(result);
140-
Assert.Empty(mismatches);
141-
Assert.Empty(extractedValues);
139+
Assert.True(result.IsMatch);
140+
Assert.Empty(result.Mismatches);
141+
Assert.Empty(result.ExtractedValues);
142142
}
143143

144144
[Fact]
@@ -182,13 +182,13 @@ public void ExactMatch_WithFunctionInArray_ShouldWork()
182182

183183
// Act
184184
var comparer = new JsonComparer(fakeTimeProvider);
185-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
185+
var result = comparer.ExactMatch(expectedJson, actualJson);
186186

187187
// Assert
188-
Assert.True(result);
189-
Assert.Empty(mismatches);
190-
Assert.Single(extractedValues);
191-
Assert.Equal("item2", extractedValues["SECOND_ID"].GetString());
188+
Assert.True(result.IsMatch);
189+
Assert.Empty(result.Mismatches);
190+
Assert.Single(result.ExtractedValues);
191+
Assert.Equal("item2", result.ExtractedValues["SECOND_ID"].GetString());
192192
}
193193

194194
[Fact]
@@ -222,12 +222,12 @@ public void ExactMatch_WithFunctionInNestedObject_ShouldWork()
222222

223223
// Act
224224
var comparer = new JsonComparer(fakeTimeProvider);
225-
var result = comparer.ExactMatch(expectedJson, actualJson, out var extractedValues, out var mismatches);
225+
var result = comparer.ExactMatch(expectedJson, actualJson);
226226

227227
// Assert
228-
Assert.True(result);
229-
Assert.Empty(mismatches);
230-
Assert.Empty(extractedValues);
228+
Assert.True(result.IsMatch);
229+
Assert.Empty(result.Mismatches);
230+
Assert.Empty(result.ExtractedValues);
231231
}
232232

233233
// Helper classes for testing

0 commit comments

Comments
 (0)