Skip to content

Commit 2520b56

Browse files
committed
1.2.1 - Support KeyValuePair<,> object type
1 parent 6da8b07 commit 2520b56

File tree

5 files changed

+75
-1
lines changed

5 files changed

+75
-1
lines changed

src/MDAT/MDAT.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<Company>MESS</Company>
1111
<PackageProjectUrl>https://github.com/MTESSDev/mdAT</PackageProjectUrl>
1212
<RepositoryUrl>https://github.com/MTESSDev/mdAT</RepositoryUrl>
13-
<Version>1.2.0</Version>
13+
<Version>1.2.1</Version>
1414
<Description>Markdown Auto-Tests for .net 6+, based on MSTestsV2 DataSource.</Description>
1515
</PropertyGroup>
1616

src/MDAT/MarkdownTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ private static IDeserializer NewDeserializer(INodeTypeResolver resolver, string
212212
DeserializerBuilder deserializer = new DeserializerBuilder()
213213
.WithTypeConverter(new ByteArayConverter(), e => e.OnBottom())
214214
.WithNodeTypeResolver(resolver)
215+
.WithNodeDeserializer(new KeyValuePairNodeDeserializer())
215216
.IgnoreUnmatchedProperties()
216217
.WithAttemptingUnquotedStringTypeDeserialization()
217218
.WithTagMapping(MdatConstants.IncludeTag, typeof(IncludeRef));
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using YamlDotNet.Core.Events;
2+
using YamlDotNet.Core;
3+
using YamlDotNet.Serialization;
4+
5+
namespace MDAT.Resolver
6+
{
7+
internal class KeyValuePairNodeDeserializer : INodeDeserializer
8+
{
9+
public bool Deserialize(IParser parser, Type expectedType, Func<IParser, Type, object?> nestedObjectDeserializer, out object? value)
10+
{
11+
if (expectedType.IsGenericType && expectedType.GetGenericTypeDefinition() == typeof(KeyValuePair<,>))
12+
{
13+
parser.Consume<MappingStart>();
14+
15+
var pairArgs = expectedType.GetGenericArguments();
16+
17+
object? key = null;
18+
object? val = null;
19+
20+
if (parser.Accept<Scalar>(out var skey)
21+
&& skey.Value.ToLower().Equals("key")
22+
&& parser.Consume<Scalar>() is { })
23+
key = nestedObjectDeserializer(parser, pairArgs[0]);
24+
25+
if (parser.Accept<Scalar>(out var svalue)
26+
&& svalue.Value.ToLower().Equals("value")
27+
&& parser.Consume<Scalar>() is { })
28+
val = nestedObjectDeserializer(parser, pairArgs[1]);
29+
30+
value = Activator.CreateInstance(expectedType, key, val);
31+
32+
parser.Consume<MappingEnd>();
33+
return true;
34+
}
35+
36+
value = null;
37+
return false;
38+
}
39+
}
40+
}

src/MDATTests/MarkdownTestAttributeTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,18 @@ public async Task TestObjectOrExceptionAsync(
327327
_ = await Verify.Assert(async () => await new Test().ReturnTestAsync(mock.Object), expected);
328328
}
329329

330+
/// <summary>
331+
/// Test object deserialization
332+
/// </summary>
333+
[TestMethod]
334+
[MarkdownTest("~\\Tests\\{method}.md")]
335+
public async Task Test_keypairvalues(List<KeyValuePair<string, string>> input, Expected expected)
336+
{
337+
338+
object value = await Verify.Assert(() =>
339+
Task.FromResult(input), expected);
340+
}
341+
330342
/// <summary>
331343
/// Test class
332344
/// </summary>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Test_keypairvalues
2+
3+
> Test object deserialization
4+
5+
## Case with keyvaluepair<,>
6+
7+
``````yaml
8+
input:
9+
- key: testK
10+
value: testV
11+
expected:
12+
name: null
13+
generateExpectedData: null
14+
verify:
15+
- type: match
16+
jsonPath: $
17+
allowAdditionalProperties: false
18+
data:
19+
- Key: testK
20+
Value: testV
21+
``````

0 commit comments

Comments
 (0)