Browse Source

Updated unit tests to use external GltfValidator nuget package

Vicente Penades 4 years ago
parent
commit
66b77badaf

+ 1 - 1
src/SharpGLTF.Core/SharpGLTF.Core.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>    
-    <TargetFrameworks>netstandard2.0;netcoreapp3.1;net5.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0</TargetFrameworks>
     <AssemblyName>SharpGLTF.Core</AssemblyName>
     <RootNamespace>SharpGLTF</RootNamespace>
     <LangVersion>7.3</LangVersion>    

+ 1 - 1
src/SharpGLTF.Toolkit/SharpGLTF.Toolkit.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>netstandard2.0;netcoreapp3.1;net5.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0</TargetFrameworks>
     <AssemblyName>SharpGLTF.Toolkit</AssemblyName>
     <RootNamespace>SharpGLTF</RootNamespace>    
     <LangVersion>7.3</LangVersion>    

+ 4 - 4
tests/SharpGLTF.Core.Tests/Schema2/LoadAndSave/LoadGeneratedTests.cs

@@ -40,17 +40,17 @@ namespace SharpGLTF.Schema2.LoadAndSave
 
                 var gltfJson = filePath.EndsWith(".gltf") ? System.IO.File.ReadAllText(filePath) : string.Empty;
 
-                var report = gltf_validator.ValidateFile(filePath);                
+                var report = GltfValidator.ValidationReport.Validate(filePath);                
 
                 if (report == null) continue; // ??
 
-                if (report.Warnings.Any(item => item.Contains("Cannot validate an extension"))) continue;
+                if (report.HasUnsupportedExtensions) continue;
 
                 try
                 {
                     var model = ModelRoot.Load(filePath);
 
-                    if (report.HasErrors)
+                    if (report.Severity == GltfValidator.Severity.Error)
                     {
                         TestContext.Error.WriteLine($"{filePath.ToShortDisplayPath()} 👎😦 Should not load!");
                         passed = false;
@@ -62,7 +62,7 @@ namespace SharpGLTF.Schema2.LoadAndSave
                 }
                 catch (Exception ex)
                 {
-                    if (!report.HasErrors)
+                    if (report.Severity != GltfValidator.Severity.Error)
                     {
                         TestContext.Error.WriteLine($"{filePath.ToShortDisplayPath()} 👎😦 Should load!");
                         TestContext.Error.WriteLine($"   ERROR: {ex.Message}");

+ 1 - 7
tests/SharpGLTF.Core.Tests/Schema2/LoadAndSave/LoadSampleTests.cs

@@ -165,13 +165,7 @@ namespace SharpGLTF.Schema2.LoadAndSave
 
         [TestCase("SpecGlossVsMetalRough.gltf")]
         [TestCase(@"TextureTransformTest.gltf")]
-        [TestCase(@"UnlitTest\glTF-Binary\UnlitTest.glb")]
-        [TestCase(@"glTF-pbrSpecularGlossiness\Avocado.gltf")]
-        [TestCase(@"glTF-pbrSpecularGlossiness\BarramundiFish.gltf")]
-        [TestCase(@"glTF-pbrSpecularGlossiness\BoomBox.gltf")]
-        [TestCase(@"glTF-pbrSpecularGlossiness\Corset.gltf")]
-        [TestCase(@"glTF-pbrSpecularGlossiness\Lantern.gltf")]
-        [TestCase(@"glTF-pbrSpecularGlossiness\WaterBottle.gltf")]
+        [TestCase(@"UnlitTest\glTF-Binary\UnlitTest.glb")]                                                
         [TestCase(@"glTF-Quantized\Avocado.gltf")]
         [TestCase(@"glTF-Quantized\AnimatedMorphCube.gltf")]
         [TestCase(@"glTF-Quantized\AnimatedMorphCube.gltf")]

+ 4 - 4
tests/SharpGLTF.Core.Tests/SharpGLTF.Core.Tests.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>netcoreapp3.1;net471;net5.0</TargetFrameworks>
+    <TargetFrameworks>net471;netcoreapp3.1;net5.0-windows</TargetFrameworks>
     <IsPackable>false</IsPackable>
     <RootNamespace>SharpGLTF</RootNamespace>
     <LangVersion>latest</LangVersion>
@@ -20,13 +20,13 @@
     <!--
     <PackageReference Include="Mono.ApiTools.NuGetDiff" Version="1.3.1" />    
     <PackageReference Include="Mono.ApiTools" Version="5.14.0.2" />
-    -->
+    -->    
     
     <PackageReference Include="NUnit3TestAdapter" Version="4.0.0">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
-  </ItemGroup>  
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />    
+  </ItemGroup>    
 
 </Project>

+ 8 - 5
tests/SharpGLTF.Core.Tests/Validation/InvalidFilesTests.cs

@@ -20,7 +20,8 @@ namespace SharpGLTF.Validation
 
             foreach (var f in files)
             {
-                var report = ValidationReport.Load(f + ".report.json");
+                var json = System.IO.File.ReadAllText(f + ".report.json");
+                var report = GltfValidator.ValidationReport.Parse(json);
 
                 TestContext.Progress.WriteLine($"{f}...");
                 TestContext.Write($"{f}...");
@@ -40,7 +41,8 @@ namespace SharpGLTF.Validation
 
             foreach (var f in files)
             {
-                var report = ValidationReport.Load(f + ".report.json");
+                var json = System.IO.File.ReadAllText(f + ".report.json");
+                var report = GltfValidator.ValidationReport.Parse(json);
 
                 TestContext.Progress.WriteLine($"{f}...");
                 TestContext.WriteLine($"{f}...");
@@ -63,15 +65,16 @@ namespace SharpGLTF.Validation
                 // System.Diagnostics.Debug.Assert(!f.EndsWith("invalid_uri_scheme.gltf"));
 
                 var gltfJson = f.EndsWith(".gltf") ? System.IO.File.ReadAllText(f) : string.Empty;
-
-                var report = ValidationReport.Load($"{f}.report.json");
                 
+                var json = System.IO.File.ReadAllText($"{f}.report.json");
+                var report = GltfValidator.ValidationReport.Parse(json);
+
                 var result = Schema2.ModelRoot.Validate(f);
 
                 if (result.HasErrors != report.Issues.NumErrors > 0)
                 {
                     TestContext.WriteLine($"Failed: {f}");
-                    foreach (var e in report.Issues.Messages.Where(item => item.Severity == 0)) TestContext.WriteLine($"    {e.Message}");
+                    foreach (var e in report.Issues.Messages.Where(item => item.Severity == 0)) TestContext.WriteLine($"    {e.Text}");
                 }
 
                 Assert.AreEqual(report.Issues.NumErrors > 0, result.HasErrors);                                

+ 1 - 1
tests/SharpGLTF.DownloadTestFiles/SharpGLTF.DownloadTestFiles.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net5.0</TargetFramework>
     <RootNamespace>SharpGLTF</RootNamespace>
   </PropertyGroup>
 

+ 4 - 3
tests/SharpGLTF.NUnit/NUnitGltfUtils.cs

@@ -98,15 +98,16 @@ namespace SharpGLTF
 
             if (validationPath != null)
             {
-                var report = gltf_validator.ValidateFile(fileName);
+                var report = GltfValidator.ValidationReport.Validate(fileName);                
+
                 if (report == null) return fileName;
 
-                if (report.HasErrors || report.HasWarnings)
+                if (report.Severity == GltfValidator.Severity.Error || report.Severity == GltfValidator.Severity.Warning)
                 {
                     TestContext.WriteLine(report.ToString());
                 }
 
-                Assert.IsFalse(report.HasErrors);
+                Assert.AreNotEqual(GltfValidator.Severity.Error, report.Severity);
             }
 
             return fileName;

+ 3 - 11
tests/SharpGLTF.NUnit/SharpGLTF.NUnit.csproj

@@ -1,22 +1,14 @@
 <Project Sdk="Microsoft.NET.Sdk">
   
   <PropertyGroup>
-    <TargetFrameworks>netstandard2.0</TargetFrameworks>
+    <TargetFramework>netstandard2.0</TargetFramework>
     <IsPackable>false</IsPackable>
     <RootNamespace>SharpGLTF</RootNamespace>
     <LangVersion>latest</LangVersion>
   </PropertyGroup>
 
-  <ItemGroup>
-    <Content Include="..\..\tools\linux64\gltf_validator" Link="gltf_validator">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="..\..\tools\win64\gltf_validator.exe" Link="gltf_validator.exe">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-  </ItemGroup>
-
-  <ItemGroup>
+  <ItemGroup>    
+    <PackageReference Include="GltfValidator" Version="2.0.0-dev.3.5.202109201056" />    
     <PackageReference Include="nunit" Version="3.13.2" />
     <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
   </ItemGroup>

+ 0 - 70
tests/SharpGLTF.NUnit/ValidationResult.cs

@@ -1,70 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-
-namespace SharpGLTF
-{
-    /// <summary>
-    /// Represents the resulting report of a glTF validation.
-    /// </summary>
-    public sealed class ValidationReport
-    {
-        public static ValidationReport Load(string filePath)
-        {
-            var json = System.IO.File.ReadAllText(filePath);
-            return Parse(json);
-        }
-
-        public static ValidationReport Parse(string json)
-        {
-            var options = new JsonSerializerOptions();
-            options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
-
-            return JsonSerializer.Deserialize<ValidationReport>(json, options);
-        }
-
-        public string Uri { get; set; }
-        public string MimeType { get; set; }
-        public string ValidatorVersion { get; set; }
-        public ValidationIssues Issues { get; set; }
-        public ValidationInfo Info { get; set; }
-    }
-
-    public sealed class ValidationIssues
-    {
-        public int NumErrors { get; set; }
-        public int NumWarnings { get; set; }
-        public int NumInfos { get; set; }
-        public int NumHints { get; set; }
-        public ValidationMessage[] Messages { get; set; }
-        public bool Truncated { get; set; }
-    }
-
-    [System.Diagnostics.DebuggerDisplay("{Code} {Severity} {Message}")]
-    public sealed class ValidationMessage
-    {
-        public string Code { get; set; }
-        public string Message { get; set; }
-        public int Severity { get; set; }
-        public string Pointer { get; set; }
-    }
-
-    public sealed class ValidationInfo
-    {
-        public string Version { get; set; }
-        public string Generator { get; set; }
-        public int AnimationCount { get; set; }
-        public int MaterialCount { get; set; }
-        public bool HasMorphTargets { get; set; }
-        public bool HasSkins { get; set; }
-        public bool HasTextures { get; set; }
-        public bool HasDefaultScene { get; set; }
-        public int DrawCallCount { get; set; }
-        public int TotalTriangleCount { get; set; }
-        public int MaxUVs { get; set; }
-        public int MaxInfluences { get; set; }
-        public int MaxAttributes { get; set; }
-    }
-}

+ 0 - 186
tests/SharpGLTF.NUnit/gltf_validator.cs

@@ -1,186 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-using System.Linq;
-using System.Text;
-using System.Text.Json;
-
-namespace SharpGLTF
-{
-    /// <summary>
-    /// Wraps Khronos GLTF Validator command line tool.
-    /// </summary>
-    /// <see href="https://github.com/KhronosGroup/glTF-Validator"/>
-    /// <remarks>
-    /// LINUX execution path has not been tested!
-    /// </remarks>
-    public static class gltf_validator
-    {
-        static gltf_validator()
-        {
-            if (RuntimeInformation.OSArchitecture != Architecture.X64) return;
-
-            ValidatorExePath = System.IO.Path.GetDirectoryName(typeof(gltf_validator).Assembly.Location);
-
-            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
-            {
-                ValidatorExePath = System.IO.Path.Combine(ValidatorExePath, "gltf_validator.exe");
-            }
-
-            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
-            {
-                ValidatorExePath = System.IO.Path.Combine(ValidatorExePath, "gltf_validator");
-            }
-        }
-
-        public static string ValidatorExePath { get; set; }
-
-        public static ValidationReport ValidateFile(string gltfFilePath)
-        {
-            if (string.IsNullOrWhiteSpace(ValidatorExePath)) return null;
-
-            if (!System.IO.File.Exists(ValidatorExePath)) throw new System.IO.FileNotFoundException(ValidatorExePath);
-
-            if (!System.IO.Path.IsPathRooted(gltfFilePath)) gltfFilePath = System.IO.Path.GetFullPath(gltfFilePath);
-
-            var psi = new System.Diagnostics.ProcessStartInfo(ValidatorExePath);
-            psi.Arguments = $"-p -r -a --stdout \"{gltfFilePath}\"";
-            psi.UseShellExecute = false;
-            psi.RedirectStandardOutput = true;            
-
-            using (var p = System.Diagnostics.Process.Start(psi))
-            {
-                // To avoid deadlocks, always read the output stream first and then wait.  
-                var mainReport = p.StandardOutput.ReadToEnd();
-
-                if (!p.WaitForExit(1000 * 10)) // wait for a reasonable timeout
-                {
-                    try { p.Kill(); } catch { return null; }
-                }                
-
-                if (string.IsNullOrWhiteSpace(mainReport)) return null;
-                var report = ValidationReport.Parse(mainReport);
-                
-                if (report.Messages.Any(item => item.Code == "UNSUPPORTED_EXTENSION")) return null;
-
-                return report;
-            }
-        }
-
-        /// <summary>
-        /// Represents the report generated by glTF validator
-        /// </summary>
-        /// <see href="https://github.com/KhronosGroup/glTF-Validator/blob/898f53944b40650aacef550c4977de04c46990ab/docs/validation.schema.json"/>
-        public sealed class ValidationReport
-        {
-            public static ValidationReport Parse(string json)
-            {
-                var options = new JsonSerializerOptions();
-                options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
-
-                return JsonSerializer.Deserialize<ValidationReport>(json, options);
-            }
-
-            public string Uri { get; set; }
-            public string MimeType { get; set; }
-            public string ValidatorVersion { get; set; }
-            public string ValidatedAt { get; set; }
-            public ValidationIssues Issues { get; set; }
-            public ValidationInfo Info { get; set; }
-
-            public bool HasWarnings => Issues.NumWarnings > 0;
-            public bool HasErrors => Issues.NumErrors > 0;
-
-            public IEnumerable<ValidationMessage> Messages => Issues.Messages == null
-                ? Enumerable.Empty<ValidationMessage>()
-                : Issues.Messages;
-
-            public IEnumerable<String> Hints => Messages
-                .Where(item => item.Severity == 3)
-                .Select(item => item.Message);
-
-            public IEnumerable<String> Infos => Messages
-                .Where(item => item.Severity == 2)
-                .Select(item => item.Message);
-
-            public IEnumerable<String> Warnings => Messages
-                .Where(item => item.Severity == 1)
-                .Select(item => item.Message);
-
-            public IEnumerable<String> Errors => Messages
-                .Where(item => item.Severity == 0)
-                .Select(item => item.Message);
-
-            public override string ToString()
-            {
-                var options = new JsonSerializerOptions();
-                options.WriteIndented = true;
-                options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
-                return JsonSerializer.Serialize(this, options);
-            }
-        }
-
-        public sealed class ValidationIssues
-        {
-            public int NumErrors { get; set; }
-            public int NumWarnings { get; set; }
-            public int NumInfos { get; set; }
-            public int NumHints { get; set; }
-            public ValidationMessage[] Messages { get; set; }
-            public bool Truncated { get; set; }
-        }
-
-        public sealed class ValidationMessage
-        {
-            public string Code { get; set; }
-            public string Message { get; set; }
-            public int Severity { get; set; }
-            public string Pointer { get; set; }
-            public int? Offset { get; set; }
-        }
-
-        public sealed class ValidationInfo
-        {
-            public string Version { get; set; }
-            public string MinVersion { get; set; }
-            public string Generator { get; set; }
-            public string[] ExtensionsUsed { get; set; }
-            public string[] ExtensionsRequired { get; set; }
-            public ValidationResources[] Resources { get; set; }
-            public int AnimationCount { get; set; }
-            public int MaterialCount { get; set; }
-            public bool HasMorphTargets { get; set; }
-            public bool HasSkins { get; set; }
-            public bool HasTextures { get; set; }
-            public bool HasDefaultScene { get; set; }
-            public int DrawCallCount { get; set; }
-            public int TotalVertexCount { get; set; }
-            public int TotalTriangleCount { get; set; }
-            public int MaxUVs { get; set; }
-            public int  MaxInfluences { get; set; }
-            public int  MaxAttributes { get; set; }
-        }
-
-        public sealed class ValidationResources
-        {
-            public string Pointer { get; set; }
-            public string Storage { get; set; }
-            public string MimeType { get; set; }            
-            public string Uri { get; set; }
-            public int ByteLength { get; set; }
-            public ValidationImage Image { get; set; }
-        }
-
-        public sealed class ValidationImage
-        {
-            public int Width { get; set; }
-            public int Height { get; set; }
-            public string Format { get; set; }
-            public string Primaries { get; set; }
-            public string Transfer { get; set; }
-            public int Bits { get; set; }
-        }
-
-        
-    }
-}

+ 3 - 3
tests/SharpGLTF.ThirdParty.Tests/SharpGLTF.ThirdParty.Tests.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>netcoreapp3.1;net471;net5.0</TargetFrameworks>
+    <TargetFrameworks>net471;netcoreapp3.1;net5.0-windows</TargetFrameworks>
     <IsPackable>false</IsPackable>
     <RootNamespace>SharpGLTF.ThirdParty</RootNamespace>
     <LangVersion>latest</LangVersion>
@@ -10,7 +10,7 @@
   <ItemGroup>
     <PackageReference Include="NUnit" Version="3.13.2" />
     <PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />    
   </ItemGroup>
 
   <ItemGroup>

+ 3 - 3
tests/SharpGLTF.Toolkit.Tests/SharpGLTF.Toolkit.Tests.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>netcoreapp3.1;net471;net5.0</TargetFrameworks>
+    <TargetFrameworks>net471;netcoreapp3.1;net5.0-windows</TargetFrameworks>
     <IsPackable>false</IsPackable>
     <RootNamespace>SharpGLTF</RootNamespace>
     <LangVersion>latest</LangVersion>
@@ -26,7 +26,7 @@
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />    
   </ItemGroup>  
 
 </Project>

BIN
tools/linux64/gltf_validator


BIN
tools/win64/gltf_validator.exe