Prechádzať zdrojové kódy

Added more tests against invalid files (WIP)

Vicente Penades 5 rokov pred
rodič
commit
2781d93431

+ 15 - 8
SharpGLTF.sln

@@ -18,8 +18,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.CodeGen", "build\
 EndProject
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Core", "src\SharpGLTF.Core\SharpGLTF.Core.csproj", "{B1DA4F42-AB6A-4021-9989-674B1394E8A2}"
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Core", "src\SharpGLTF.Core\SharpGLTF.Core.csproj", "{B1DA4F42-AB6A-4021-9989-674B1394E8A2}"
 EndProject
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Tests", "tests\SharpGLTF.Tests\SharpGLTF.Tests.csproj", "{4FCBB910-67D4-4628-9B2B-F5F2C8D92257}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{D7D51F42-D08C-4DDA-88DA-AF008F10B644}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{D7D51F42-D08C-4DDA-88DA-AF008F10B644}"
 EndProject
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Toolkit", "src\SharpGLTF.Toolkit\SharpGLTF.Toolkit.csproj", "{41690879-1F91-4555-A40A-F67B01868D7E}"
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Toolkit", "src\SharpGLTF.Toolkit\SharpGLTF.Toolkit.csproj", "{41690879-1F91-4555-A40A-F67B01868D7E}"
@@ -38,7 +36,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoGameScene", "examples\M
 EndProject
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.DownloadTestFiles", "tests\SharpGLTF.DownloadTestFiles\SharpGLTF.DownloadTestFiles.csproj", "{7CC20DF6-14B5-4C1C-B4FC-151E97AED4F4}"
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.DownloadTestFiles", "tests\SharpGLTF.DownloadTestFiles\SharpGLTF.DownloadTestFiles.csproj", "{7CC20DF6-14B5-4C1C-B4FC-151E97AED4F4}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpGLTF.NUnit", "tests\SharpGLTF.NUnit\SharpGLTF.NUnit.csproj", "{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.NUnit", "tests\SharpGLTF.NUnit\SharpGLTF.NUnit.csproj", "{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Core.Tests", "tests\SharpGLTF.Tests\SharpGLTF.Core.Tests.csproj", "{56FE769E-6B09-462B-9947-A9B64161CD80}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Toolkit.Tests", "tests\SharpGLTF.Toolkit.Tests\SharpGLTF.Toolkit.Tests.csproj", "{7FEFC259-51D6-4409-8724-8DE0EA8D5CD9}"
 EndProject
 EndProject
 Global
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -54,10 +56,6 @@ Global
 		{B1DA4F42-AB6A-4021-9989-674B1394E8A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B1DA4F42-AB6A-4021-9989-674B1394E8A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B1DA4F42-AB6A-4021-9989-674B1394E8A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{B1DA4F42-AB6A-4021-9989-674B1394E8A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{B1DA4F42-AB6A-4021-9989-674B1394E8A2}.Release|Any CPU.Build.0 = Release|Any CPU
 		{B1DA4F42-AB6A-4021-9989-674B1394E8A2}.Release|Any CPU.Build.0 = Release|Any CPU
-		{4FCBB910-67D4-4628-9B2B-F5F2C8D92257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{4FCBB910-67D4-4628-9B2B-F5F2C8D92257}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{4FCBB910-67D4-4628-9B2B-F5F2C8D92257}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{4FCBB910-67D4-4628-9B2B-F5F2C8D92257}.Release|Any CPU.Build.0 = Release|Any CPU
 		{41690879-1F91-4555-A40A-F67B01868D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{41690879-1F91-4555-A40A-F67B01868D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{41690879-1F91-4555-A40A-F67B01868D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{41690879-1F91-4555-A40A-F67B01868D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{41690879-1F91-4555-A40A-F67B01868D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{41690879-1F91-4555-A40A-F67B01868D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -90,6 +88,14 @@ Global
 		{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A}.Release|Any CPU.Build.0 = Release|Any CPU
 		{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{56FE769E-6B09-462B-9947-A9B64161CD80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{56FE769E-6B09-462B-9947-A9B64161CD80}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{56FE769E-6B09-462B-9947-A9B64161CD80}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{56FE769E-6B09-462B-9947-A9B64161CD80}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7FEFC259-51D6-4409-8724-8DE0EA8D5CD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7FEFC259-51D6-4409-8724-8DE0EA8D5CD9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7FEFC259-51D6-4409-8724-8DE0EA8D5CD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7FEFC259-51D6-4409-8724-8DE0EA8D5CD9}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 		HideSolutionNode = FALSE
@@ -97,7 +103,6 @@ Global
 	GlobalSection(NestedProjects) = preSolution
 	GlobalSection(NestedProjects) = preSolution
 		{E15F8DCC-987D-4FA8-B7B0-1F0614DC93DD} = {D7D51F42-D08C-4DDA-88DA-AF008F10B644}
 		{E15F8DCC-987D-4FA8-B7B0-1F0614DC93DD} = {D7D51F42-D08C-4DDA-88DA-AF008F10B644}
 		{B1DA4F42-AB6A-4021-9989-674B1394E8A2} = {072B725F-773F-4751-9616-E9778897C1D2}
 		{B1DA4F42-AB6A-4021-9989-674B1394E8A2} = {072B725F-773F-4751-9616-E9778897C1D2}
-		{4FCBB910-67D4-4628-9B2B-F5F2C8D92257} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
 		{41690879-1F91-4555-A40A-F67B01868D7E} = {072B725F-773F-4751-9616-E9778897C1D2}
 		{41690879-1F91-4555-A40A-F67B01868D7E} = {072B725F-773F-4751-9616-E9778897C1D2}
 		{68662AA0-8523-4B9E-9230-DE79F2B07EAB} = {83E7E49D-8A28-45E8-9DBD-1F3AEDEF3E42}
 		{68662AA0-8523-4B9E-9230-DE79F2B07EAB} = {83E7E49D-8A28-45E8-9DBD-1F3AEDEF3E42}
 		{53B7933A-DD1B-4E75-90EC-94E46101C6CC} = {83E7E49D-8A28-45E8-9DBD-1F3AEDEF3E42}
 		{53B7933A-DD1B-4E75-90EC-94E46101C6CC} = {83E7E49D-8A28-45E8-9DBD-1F3AEDEF3E42}
@@ -106,6 +111,8 @@ Global
 		{894781CA-F508-43AE-8526-6AA6B6EDF613} = {83E7E49D-8A28-45E8-9DBD-1F3AEDEF3E42}
 		{894781CA-F508-43AE-8526-6AA6B6EDF613} = {83E7E49D-8A28-45E8-9DBD-1F3AEDEF3E42}
 		{7CC20DF6-14B5-4C1C-B4FC-151E97AED4F4} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
 		{7CC20DF6-14B5-4C1C-B4FC-151E97AED4F4} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
 		{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
 		{7A5EAF7E-D6A6-4861-9488-F98E4AA00A3A} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
+		{56FE769E-6B09-462B-9947-A9B64161CD80} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
+		{7FEFC259-51D6-4409-8724-8DE0EA8D5CD9} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {1D7BBAD9-834C-4981-AC96-0AA5226FC43F}
 		SolutionGuid = {1D7BBAD9-834C-4981-AC96-0AA5226FC43F}

+ 1 - 1
src/SharpGLTF.Core/IO/JsonSerializable.cs

@@ -315,7 +315,7 @@ namespace SharpGLTF.IO
                 return;
                 return;
             }
             }
 
 
-            throw new NotImplementedException();
+            throw new JSONEXCEPTION($"Unexpected token {reader.TokenType}");
         }
         }
 
 
         protected static Object DeserializeUnknownObject(ref Utf8JsonReader reader)
         protected static Object DeserializeUnknownObject(ref Utf8JsonReader reader)

+ 6 - 6
src/SharpGLTF.Core/IO/ReadContext.cs

@@ -216,14 +216,14 @@ namespace SharpGLTF.IO
 
 
             var reader = new Utf8JsonReader(jsonUtf8Bytes);
             var reader = new Utf8JsonReader(jsonUtf8Bytes);
 
 
-            if (!reader.Read())
-            {
-                vcontext.AddError(new Validation.ModelException(root, "Json is empty"));
-                return (null, vcontext);
-            }
-
             try
             try
             {
             {
+                if (!reader.Read())
+                {
+                    vcontext.AddError(new Validation.SchemaException(root, "Json is empty"));
+                    return (null, vcontext);
+                }
+
                 root.Deserialize(ref reader);
                 root.Deserialize(ref reader);
                 root.OnDeserializationCompleted();
                 root.OnDeserializationCompleted();
             }
             }

+ 10 - 0
src/SharpGLTF.Core/Schema2/gltf.Node.cs

@@ -404,8 +404,18 @@ namespace SharpGLTF.Schema2
 
 
             var pidx = thisIndex;
             var pidx = thisIndex;
 
 
+            var sequence = new List<int>();
+
             while (true)
             while (true)
             {
             {
+                if (sequence.Contains(pidx))
+                {
+                    result.AddLinkError("is a part of a node loop.");
+                    break;
+                }
+
+                sequence.Add(pidx);
+
                 result = result.GetContext(result.Root.LogicalNodes[pidx]);
                 result = result.GetContext(result.Root.LogicalNodes[pidx]);
 
 
                 // every node must have 0 or 1 parents.
                 // every node must have 0 or 1 parents.

+ 19 - 11
tests/SharpGLTF.DownloadTestFiles/ExampleFiles.cs

@@ -16,12 +16,15 @@ namespace SharpGLTF
         {
         {
             _WorkingDirectory = workingDirectory;            
             _WorkingDirectory = workingDirectory;            
 
 
-            _SchemaDir = System.IO.Path.Combine(_WorkingDirectory, "glTF-Schema");
-            _SampleModelsDir = System.IO.Path.Combine(_WorkingDirectory, "glTF-Sample-Models");
-            _PollyModelsDir = System.IO.Path.Combine(_WorkingDirectory, "glTF-Blender-Exporter");
-            _UniVRMModelsDir = System.IO.Path.Combine(_WorkingDirectory, "UniVRM");
+            _KhronosSchemaDir = System.IO.Path.Combine(_WorkingDirectory, "glTF-Schema");
+            _KhronosValidatorDir = System.IO.Path.Combine(_WorkingDirectory, "glTF-Validator");
+            _KhronosSampleModelsDir = System.IO.Path.Combine(_WorkingDirectory, "glTF-Sample-Models");
+
             _BabylonJsMeshesDir = System.IO.Path.Combine(_WorkingDirectory, "BabylonJS-MeshesLibrary");
             _BabylonJsMeshesDir = System.IO.Path.Combine(_WorkingDirectory, "BabylonJS-MeshesLibrary");
             _BabylonJsPlaygroundDir = System.IO.Path.Combine(_WorkingDirectory, "BabylonJS-PlaygroundScenes");
             _BabylonJsPlaygroundDir = System.IO.Path.Combine(_WorkingDirectory, "BabylonJS-PlaygroundScenes");
+
+            _PollyModelsDir = System.IO.Path.Combine(_WorkingDirectory, "glTF-Blender-Exporter");
+            _UniVRMModelsDir = System.IO.Path.Combine(_WorkingDirectory, "UniVRM");            
         }
         }
 
 
         public void DownloadReferenceModels()
         public void DownloadReferenceModels()
@@ -34,13 +37,16 @@ namespace SharpGLTF
             dstPath = System.IO.Path.Combine(_UniVRMModelsDir, "AliciaSolid_vrm-0.40.vrm");
             dstPath = System.IO.Path.Combine(_UniVRMModelsDir, "AliciaSolid_vrm-0.40.vrm");
             DownloadUtils.DownloadFile("https://github.com/vrm-c/UniVRMTest/raw/master/Models/Alicia_vrm-0.40/AliciaSolid_vrm-0.40.vrm", dstPath);
             DownloadUtils.DownloadFile("https://github.com/vrm-c/UniVRMTest/raw/master/Models/Alicia_vrm-0.40/AliciaSolid_vrm-0.40.vrm", dstPath);
 
 
-            Console.WriteLine("Checking out test files... It might take a while, please, wait...");            
+            Console.WriteLine("Checking out test files... It might take a while, please, wait...");
 
 
-            DownloadUtils.SyncronizeGitRepository("https://github.com/KhronosGroup/glTF-Sample-Models.git", _SampleModelsDir);
-            DownloadUtils.SyncronizeGitRepository("https://github.com/KhronosGroup/glTF-Blender-Exporter.git", _PollyModelsDir);            
-            DownloadUtils.SyncronizeGitRepository("https://github.com/KhronosGroup/glTF.git", _SchemaDir);
+            DownloadUtils.SyncronizeGitRepository("https://github.com/KhronosGroup/glTF.git", _KhronosSchemaDir);
+            DownloadUtils.SyncronizeGitRepository("https://github.com/KhronosGroup/glTF-Validator.git", _KhronosValidatorDir);
+            DownloadUtils.SyncronizeGitRepository("https://github.com/KhronosGroup/glTF-Sample-Models.git", _KhronosSampleModelsDir);
+            
             DownloadUtils.SyncronizeGitRepository("https://github.com/BabylonJS/MeshesLibrary.git", _BabylonJsMeshesDir);
             DownloadUtils.SyncronizeGitRepository("https://github.com/BabylonJS/MeshesLibrary.git", _BabylonJsMeshesDir);
-            // DownloadUtils.SyncronizeGitRepository("https://github.com/BabylonJS/Babylon.js.git", _BabylonJsPlaygroundDir);
+            // DownloadUtils.SyncronizeGitRepository("https://github.com/BabylonJS/Babylon.js.git", _BabylonJsPlaygroundDir);        
+
+            DownloadUtils.SyncronizeGitRepository("https://github.com/KhronosGroup/glTF-Blender-Exporter.git", _PollyModelsDir);
 
 
             Console.WriteLine("... Download Completed.");
             Console.WriteLine("... Download Completed.");
         }
         }
@@ -51,8 +57,10 @@ namespace SharpGLTF
 
 
         private readonly string _WorkingDirectory;
         private readonly string _WorkingDirectory;
 
 
-        private readonly string _SchemaDir;
-        private readonly string _SampleModelsDir;
+        private readonly string _KhronosSchemaDir;
+        private readonly string _KhronosValidatorDir;
+        private readonly string _KhronosSampleModelsDir;
+        
         private readonly string _PollyModelsDir;
         private readonly string _PollyModelsDir;
         private readonly string _UniVRMModelsDir;
         private readonly string _UniVRMModelsDir;
         private readonly string _BabylonJsMeshesDir;
         private readonly string _BabylonJsMeshesDir;

+ 16 - 0
tests/SharpGLTF.NUnit/TestFiles.cs

@@ -36,9 +36,12 @@ namespace SharpGLTF
             _Check();
             _Check();
 
 
             _SchemaDir = System.IO.Path.Combine(_RootDir, "glTF-Schema");
             _SchemaDir = System.IO.Path.Combine(_RootDir, "glTF-Schema");
+            _ValidationDir = System.IO.Path.Combine(_RootDir, "glTF-Validator");
             _SampleModelsDir = System.IO.Path.Combine(_RootDir, "glTF-Sample-Models");
             _SampleModelsDir = System.IO.Path.Combine(_RootDir, "glTF-Sample-Models");
+
             _PollyModelsDir = System.IO.Path.Combine(_RootDir, "glTF-Blender-Exporter");
             _PollyModelsDir = System.IO.Path.Combine(_RootDir, "glTF-Blender-Exporter");
             _UniVRMModelsDir = System.IO.Path.Combine(_RootDir, "UniVRM");
             _UniVRMModelsDir = System.IO.Path.Combine(_RootDir, "UniVRM");
+
             _BabylonJsMeshesDir = System.IO.Path.Combine(_RootDir, "BabylonJS-MeshesLibrary");
             _BabylonJsMeshesDir = System.IO.Path.Combine(_RootDir, "BabylonJS-MeshesLibrary");
             _BabylonJsPlaygroundDir = System.IO.Path.Combine(_RootDir, "BabylonJS-PlaygroundScenes");
             _BabylonJsPlaygroundDir = System.IO.Path.Combine(_RootDir, "BabylonJS-PlaygroundScenes");
 
 
@@ -54,7 +57,9 @@ namespace SharpGLTF
         private static readonly string _RootDir;
         private static readonly string _RootDir;
 
 
         private static readonly string _SchemaDir;
         private static readonly string _SchemaDir;
+        private static readonly string _ValidationDir;
         private static readonly string _SampleModelsDir;
         private static readonly string _SampleModelsDir;
+
         private static readonly string _PollyModelsDir;
         private static readonly string _PollyModelsDir;
         private static readonly string _UniVRMModelsDir;
         private static readonly string _UniVRMModelsDir;
         private static readonly string _BabylonJsMeshesDir;
         private static readonly string _BabylonJsMeshesDir;
@@ -136,6 +141,17 @@ namespace SharpGLTF
                 .ToList();
                 .ToList();
         }
         }
 
 
+        public static IReadOnlyList<string> GetKhronosValidationPaths()
+        {
+            _Check();
+
+            var files = GetModelPathsInDirectory(_ValidationDir, "test");
+
+            return files
+                .OrderBy(item => item)                
+                .ToList();
+        }
+
         public static IReadOnlyList<string> GetBabylonJSValidModelsPaths()
         public static IReadOnlyList<string> GetBabylonJSValidModelsPaths()
         {
         {
             _Check();
             _Check();

+ 60 - 0
tests/SharpGLTF.Tests/Validation/InvalidFilesTests.cs

@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Linq;
+
+using NUnit.Framework;
+
+namespace SharpGLTF.Validation
+{
+    [Category("Invalid files")]
+    public class InvalidFilesTests
+    {
+        [Test]
+        public void CheckInvalidJsonFiles()
+        {
+            var files = TestFiles
+                .GetKhronosValidationPaths()
+                .Where(item => item.EndsWith(".gltf"))
+                .Where(item => item.Contains("\\data\\json\\"));
+
+            foreach (var f in files)
+            {
+                TestContext.Progress.WriteLine($"{f}...");
+                TestContext.Write($"{f}...");
+
+                var result = Schema2.ModelRoot.Validate(f);
+
+                Assert.IsTrue(result.HasErrors);                
+            }
+        }
+
+        [Test]
+        public void CheckExceptionOnInvalidFiles()
+        {
+            var files = TestFiles
+                .GetKhronosValidationPaths()
+                .Where(item => item.EndsWith(".gltf"));
+
+            foreach (var f in files)
+            {
+                TestContext.Progress.WriteLine($"{f}...");
+
+                TestContext.Write($"{f}...");
+
+                try
+                {
+
+                    var result = Schema2.ModelRoot.Validate(f);
+
+                    TestContext.WriteLine($"{result.HasErrors}");
+                }
+                catch(Exception ex)
+                {
+                    TestContext.WriteLine("THROW!");
+                }                
+            }
+        }        
+
+    }
+}