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