diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 8c785c5..94b383f 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -6,6 +6,7 @@ name: .NET permissions: pull-requests: write + on: push: branches: [ "main" ] @@ -26,7 +27,11 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 9.0.x + dotnet-version: | + 6.0.x + 7.0.x + 8.0.x + 9.0.x - name: Restore dependencies run: dotnet restore - name: Build diff --git a/src/MDAT/MDAT.csproj b/src/MDAT/MDAT.csproj index b6eb877..500dcca 100644 --- a/src/MDAT/MDAT.csproj +++ b/src/MDAT/MDAT.csproj @@ -10,7 +10,7 @@ MESS https://github.com/MTESSDev/mdAT https://github.com/MTESSDev/mdAT - 1.4.1 + 1.5.0 Markdown Auto-Tests for .net 6+, based on MSTestsV2 DataSource. @@ -34,13 +34,20 @@ + - + - + + + + + + + diff --git a/src/MDAT/MarkdownTest.cs b/src/MDAT/MarkdownTest.cs index 56ee364..3454321 100644 --- a/src/MDAT/MarkdownTest.cs +++ b/src/MDAT/MarkdownTest.cs @@ -223,12 +223,18 @@ private static IDeserializer NewDeserializer(INodeTypeResolver resolver, string .WithTypeConverter(new ByteArayConverter(), e => e.OnBottom()) .WithTypeConverter(new SystemTextJsonYamlTypeConverter()) .WithTypeInspector(x => new SystemTextJsonTypeInspector(x)) + .WithTypeConverter(new StringValuesConverter()) .WithNodeTypeResolver(resolver) .WithNodeDeserializer(new KeyValuePairNodeDeserializer()) .IgnoreUnmatchedProperties() .WithAttemptingUnquotedStringTypeDeserialization() .WithTagMapping(MdatConstants.IncludeTag, typeof(IncludeRef)); + foreach(var typeConverter in MdatConfig.ListeTypeConverter) + { + _ = typeConverter.Where is { } ? deserializer.WithTypeConverter(typeConverter.TypeConverter!, typeConverter.Where) : deserializer.WithTypeConverter(typeConverter.TypeConverter!); + } + var includeNodeDeserializerOptions = new YamlIncludeNodeDeserializerOptions { DirectoryName = directoryName, diff --git a/src/MDAT/MdatConfig.cs b/src/MDAT/MdatConfig.cs new file mode 100644 index 0000000..16397de --- /dev/null +++ b/src/MDAT/MdatConfig.cs @@ -0,0 +1,19 @@ +using YamlDotNet.Serialization; + +namespace MDAT; + +public static class MdatConfig +{ + public static List ListeTypeConverter { get; set; } = new List(); + + public static void AddYamlTypeConverter(IYamlTypeConverter typeConverter, Action>? where = null) + { + ListeTypeConverter.Add(new ConfigTypeConverter() { TypeConverter = typeConverter, Where = where }); + } +} + +public class ConfigTypeConverter +{ + public IYamlTypeConverter? TypeConverter { get; set; } + public Action>? Where { get; set; } +} \ No newline at end of file diff --git a/src/MDAT/Resolver/StringValuesConverter.cs b/src/MDAT/Resolver/StringValuesConverter.cs new file mode 100644 index 0000000..681ede7 --- /dev/null +++ b/src/MDAT/Resolver/StringValuesConverter.cs @@ -0,0 +1,62 @@ +using YamlDotNet.Core.Events; +using YamlDotNet.Core; +using YamlDotNet.Serialization; +using Microsoft.Extensions.Primitives; + +namespace MDAT.Resolver; + +internal class StringValuesConverter : IYamlTypeConverter +{ + private static readonly Type _sequenceStartType = typeof(SequenceStart); + private static readonly Type _sequenceEndType = typeof(SequenceEnd); + + public bool Accepts(Type type) => + type == typeof(StringValues) || type == typeof(StringValues?); + + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + { + List strList = new List(); + + if (parser.Current is Scalar) + { + strList.Add(GetScalarValue(parser)); + } + else if (parser.Current!.GetType() == _sequenceStartType) + { + parser.Consume(); + do + { + strList.Add(GetScalarValue(parser)); + parser.MoveNext(); + } while (parser.Current.GetType() != _sequenceEndType); + } + else + { + parser.MoveNext(); + return null; + } + + parser.MoveNext(); + + return new StringValues(strList.ToArray()); + } + + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + { + throw new NotImplementedException(); + } + + private static string GetScalarValue(IParser parser) + { + Scalar? scalar; + + scalar = parser.Current as Scalar; + + if (scalar == null) + { + throw new InvalidDataException("Failed to retrieve scalar value."); + } + + return scalar.Value; + } +} \ No newline at end of file diff --git a/src/MDATTests/CustomResolverTests.cs b/src/MDATTests/CustomResolverTests.cs new file mode 100644 index 0000000..aa6143f --- /dev/null +++ b/src/MDATTests/CustomResolverTests.cs @@ -0,0 +1,29 @@ +using MDAT; +using MDATTests.Resolver; +using Microsoft.Extensions.Primitives; + +[assembly: Parallelize(Workers = 0, Scope = ExecutionScope.MethodLevel)] + +namespace MDAT.Tests; + +[TestClass] +public class CustomResolverTests +{ + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + MdatConfig.AddYamlTypeConverter(new StringValuesTestYamlTypeConverter()); + } + + /// + /// Test AddYamlTypeConverter + /// + [TestMethod] + [DoNotParallelize] + [MarkdownTest("~\\Tests\\{method}.md")] + public async Task Test_AddYamlTypeConverter(StringValues input, Expected expected) + { + _ = await Verify.Assert(() => + Task.FromResult(input), expected); + } +} diff --git a/src/MDATTests/MDATTests.csproj b/src/MDATTests/MDATTests.csproj index bd94373..59a0e0a 100644 --- a/src/MDATTests/MDATTests.csproj +++ b/src/MDATTests/MDATTests.csproj @@ -20,8 +20,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/MDATTests/MarkdownTestAttributeTests.cs b/src/MDATTests/MarkdownTestAttributeTests.cs index 9ec8c25..5d6c01e 100644 --- a/src/MDATTests/MarkdownTestAttributeTests.cs +++ b/src/MDATTests/MarkdownTestAttributeTests.cs @@ -1,5 +1,6 @@ using MDATTests; using MDATTests.Models; +using Microsoft.Extensions.Primitives; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; @@ -396,6 +397,17 @@ public async Task Test_keypairvalues(List> input, E Task.FromResult(input), expected); } + /// + /// Test StringValues + /// + [TestMethod] + [MarkdownTest("~\\Tests\\{method}.md")] + public async Task Test_StringValues(StringValues input, Expected expected) + { + _ = await Verify.Assert(() => + Task.FromResult(input), expected); + } + /// /// Test class /// diff --git a/src/MDATTests/Resolver/StringValuesTestYamlTypeConverter .cs b/src/MDATTests/Resolver/StringValuesTestYamlTypeConverter .cs new file mode 100644 index 0000000..f88b254 --- /dev/null +++ b/src/MDATTests/Resolver/StringValuesTestYamlTypeConverter .cs @@ -0,0 +1,30 @@ +using Microsoft.Extensions.Primitives; +using YamlDotNet.Core; +using YamlDotNet.Core.Events; +using YamlDotNet.Serialization; + +namespace MDATTests.Resolver; + +public class StringValuesTestYamlTypeConverter : IYamlTypeConverter +{ + public bool Accepts(Type type) + { + return type == typeof(StringValues); + } + + public object ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + { + var scalar = parser.Consume(); + + var values = scalar.Value.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) + .Select(s => s.Trim()) + .ToArray(); + + return new StringValues(values); + } + + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + { + throw new NotImplementedException(); + } +} diff --git a/src/MDATTests/Tests/test-add-yaml-type-converter.md b/src/MDATTests/Tests/test-add-yaml-type-converter.md new file mode 100644 index 0000000..25f64c6 --- /dev/null +++ b/src/MDATTests/Tests/test-add-yaml-type-converter.md @@ -0,0 +1,21 @@ +# Test_AddYamlTypeConverter + +> Test AddYamlTypeConverter + +## Case 1 + +Description + +``````yaml +input: un;test +expected: + name: null + generateExpectedData: null + verify: + - type: match + jsonPath: $ + allowAdditionalProperties: false + data: + - un + - test +`````` \ No newline at end of file diff --git a/src/MDATTests/Tests/test-string-values.md b/src/MDATTests/Tests/test-string-values.md new file mode 100644 index 0000000..dab9b61 --- /dev/null +++ b/src/MDATTests/Tests/test-string-values.md @@ -0,0 +1,23 @@ +# Test_StringValues + +> Test StringValues + +## Case 1 + +Description + +``````yaml +input: + - un + - test +expected: + name: null + generateExpectedData: null + verify: + - type: match + jsonPath: $ + allowAdditionalProperties: false + data: + - un + - test +`````` \ No newline at end of file