diff --git a/src/SLNX-validator.Core/ServiceCollectionExtensions.cs b/src/SLNX-validator.Core/ServiceCollectionExtensions.cs index 000c08c..1e1a29d 100644 --- a/src/SLNX-validator.Core/ServiceCollectionExtensions.cs +++ b/src/SLNX-validator.Core/ServiceCollectionExtensions.cs @@ -11,6 +11,7 @@ public static IServiceCollection AddSlnxValidator(this IServiceCollection servic { services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/SLNX-validator.Core/Validation/ISlnxXsdProvider.cs b/src/SLNX-validator.Core/Validation/ISlnxXsdProvider.cs new file mode 100644 index 0000000..dcfe58c --- /dev/null +++ b/src/SLNX-validator.Core/Validation/ISlnxXsdProvider.cs @@ -0,0 +1,6 @@ +namespace JulianVerdurmen.SlnxValidator.Core.Validation; + +public interface ISlnxXsdProvider +{ + Stream GetXsdStream(); +} diff --git a/src/SLNX-validator.Core/Validation/SlnxXsdProvider.cs b/src/SLNX-validator.Core/Validation/SlnxXsdProvider.cs new file mode 100644 index 0000000..c68eaba --- /dev/null +++ b/src/SLNX-validator.Core/Validation/SlnxXsdProvider.cs @@ -0,0 +1,16 @@ +using System.Reflection; + +namespace JulianVerdurmen.SlnxValidator.Core.Validation; + +public sealed class SlnxXsdProvider : ISlnxXsdProvider +{ + // Source: https://github.com/microsoft/vs-solutionpersistence/blob/main/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/Xml/Slnx.xsd + private const string XsdResourceName = "JulianVerdurmen.SlnxValidator.Slnx.xsd"; + + public Stream GetXsdStream() + { + return Assembly + .GetExecutingAssembly() + .GetManifestResourceStream(XsdResourceName) ?? throw new InvalidOperationException($"XSD resource '{XsdResourceName}' not found in assembly"); + } +} diff --git a/src/SLNX-validator.Core/Validation/XsdValidator.cs b/src/SLNX-validator.Core/Validation/XsdValidator.cs index f57e9cb..eb46a2d 100644 --- a/src/SLNX-validator.Core/Validation/XsdValidator.cs +++ b/src/SLNX-validator.Core/Validation/XsdValidator.cs @@ -1,22 +1,16 @@ -using System.Reflection; using System.Xml; using System.Xml.Schema; using JulianVerdurmen.SlnxValidator.Core.ValidationResults; namespace JulianVerdurmen.SlnxValidator.Core.Validation; -public sealed class XsdValidator : IXsdValidator +public sealed class XsdValidator(ISlnxXsdProvider xsdProvider) : IXsdValidator { - // Source: https://github.com/microsoft/vs-solutionpersistence/blob/main/src/Microsoft.VisualStudio.SolutionPersistence/Serializer/Xml/Slnx.xsd - private const string XsdResourceName = "JulianVerdurmen.SlnxValidator.Slnx.xsd"; - public async Task ValidateAsync(string slnxContent, ValidationResult result, CancellationToken cancellationToken) { var schemas = new XmlSchemaSet(); - await using var xsdStream = Assembly - .GetExecutingAssembly() - .GetManifestResourceStream(XsdResourceName) ?? throw new InvalidOperationException("XSD file not found"); + await using var xsdStream = xsdProvider.GetXsdStream(); using var xsdReader = XmlReader.Create(xsdStream); schemas.Add(null, xsdReader); diff --git a/tests/SLNX-validator.Core.Tests/SlnxValidatorTests.cs b/tests/SLNX-validator.Core.Tests/SlnxValidatorTests.cs index 4f4ac46..30013a7 100644 --- a/tests/SLNX-validator.Core.Tests/SlnxValidatorTests.cs +++ b/tests/SLNX-validator.Core.Tests/SlnxValidatorTests.cs @@ -7,7 +7,7 @@ namespace JulianVerdurmen.SlnxValidator.Core.Tests; public class SlnxValidatorTests { private static Validation.SlnxValidator ValidatorWithFiles(params string[] existingPaths) - => new(new MockFileSystem(existingPaths), new XsdValidator()); + => new(new MockFileSystem(existingPaths), new XsdValidator(new SlnxXsdProvider())); private static readonly string RepoRoot = OperatingSystem.IsWindows() ? @"C:\repo" : "/repo"; diff --git a/tests/SLNX-validator.Core.Tests/SolutionIntegrationTests.cs b/tests/SLNX-validator.Core.Tests/SolutionIntegrationTests.cs index 9280404..6eb2f04 100644 --- a/tests/SLNX-validator.Core.Tests/SolutionIntegrationTests.cs +++ b/tests/SLNX-validator.Core.Tests/SolutionIntegrationTests.cs @@ -21,7 +21,7 @@ public async Task OwnSlnxFile_HasNoValidationErrors() var slnxFile = directory!.EnumerateFiles("*.slnx").First(); var content = await File.ReadAllTextAsync(slnxFile.FullName); - var validator = new CoreSlnxValidator(new RealFileSystem(), new XsdValidator()); + var validator = new CoreSlnxValidator(new RealFileSystem(), new XsdValidator(new SlnxXsdProvider())); var result = await validator.ValidateAsync(content, slnxFile.DirectoryName!); result.Errors.Should().BeEmpty(); diff --git a/tests/SLNX-validator.Tests/ValidatorRunnerTests.cs b/tests/SLNX-validator.Tests/ValidatorRunnerTests.cs index c486b54..1c45d43 100644 --- a/tests/SLNX-validator.Tests/ValidatorRunnerTests.cs +++ b/tests/SLNX-validator.Tests/ValidatorRunnerTests.cs @@ -11,7 +11,7 @@ public class ValidatorRunnerTests private static ValidatorRunner CreateRunner(IFileSystem fileSystem) { var resolver = new SlnxFileResolver(fileSystem); - var validator = new CoreSlnxValidator(fileSystem, new XsdValidator()); + var validator = new CoreSlnxValidator(fileSystem, new XsdValidator(new SlnxXsdProvider())); var collector = new ValidationCollector(fileSystem, validator); var sonarReporter = new SonarReporter(fileSystem); return new ValidatorRunner(resolver, collector, sonarReporter);