using System; using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; namespace SharpGLTF { /// /// Encapsulates the access to test files. /// static class TestFiles { #region lifecycle static TestFiles() { var workingDir = TestContext.CurrentContext.WorkDirectory; _SchemaDir = System.IO.Path.Combine(workingDir, "glTF-Schema"); _SampleModelsDir = System.IO.Path.Combine(workingDir, "glTF-Sample-Models"); _PollyModelsDir = System.IO.Path.Combine(workingDir, "glTF-Blender-Exporter"); _BabylonJsDir = System.IO.Path.Combine(workingDir, "BabylonJS-MeshesLibrary"); } public static void DownloadReferenceModels() { if (_DonwloadCompleted) return; _DonwloadCompleted = true; TestContext.Progress.WriteLine("Downloading reference files... It might take a while, please, wait..."); var dstPath = System.IO.Path.Combine(TestContext.CurrentContext.WorkDirectory, "GeneratedReferenceModels", "v_0_6_1.zip"); _GeneratedModelsDir = DownloadUtils.DownloadFile("https://github.com/KhronosGroup/glTF-Asset-Generator/releases/download/v0.6.1/GeneratedAssets-0.6.1.zip", dstPath); TestContext.Progress.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/BabylonJS/MeshesLibrary.git", _BabylonJsDir); TestContext.Progress.WriteLine("... Download Completed."); } #endregion #region data private static Boolean _DonwloadCompleted = false; private static readonly string _SchemaDir; private static readonly string _SampleModelsDir; private static readonly string _PollyModelsDir; private static readonly string _BabylonJsDir; private static string _GeneratedModelsDir; #endregion #region API public static IReadOnlyList GetSchemaExtensionsModelsPaths() { return GetModelPathsInDirectory(_SchemaDir, "extensions", "2.0"); } public static IEnumerable<(string, bool)> GetReferenceModelPaths(bool useNegative = false) { var dirPath = _GeneratedModelsDir; if (dirPath.EndsWith(".zip")) dirPath = dirPath.Substring(0, dirPath.Length - 4); var manifestsPath = System.IO.Path.Combine(dirPath, useNegative? "Negative" : "Positive"); var manifests = System.IO.Directory.GetFiles(manifestsPath, "Manifest.json", System.IO.SearchOption.AllDirectories) .Skip(1) .ToArray(); foreach (var m in manifests) { var d = System.IO.Path.GetDirectoryName(m); var content = System.IO.File.ReadAllText(m); var doc = Newtonsoft.Json.Linq.JObject.Parse(content); var models = doc.SelectToken("models"); foreach(var model in models) { var mdlPath = (String)model.SelectToken("fileName"); var loadable = !useNegative; if (loadable) loadable = (Boolean)model.SelectToken("loadable"); mdlPath = System.IO.Path.Combine(d, mdlPath); yield return (mdlPath, loadable); } } yield break; } public static IReadOnlyList GetSampleModelsPaths() { var files = GetModelPathsInDirectory(_SampleModelsDir, "2.0"); return files .OrderBy(item => item) .Where(item => !item.Contains("\\glTF-Draco\\")) .ToList(); } public static IReadOnlyList GetBabylonJSModelsPaths() { var files = GetModelPathsInDirectory(_BabylonJsDir); return files .OrderBy(item => item) .Where(item => !item.Contains("\\AssetGenerator\\0.6\\")) .Where(item => !item.EndsWith("shaderBall.glb")) // invalid .ToList(); } public static string GetPollyFileModelPath() { return System.IO.Path.Combine(_PollyModelsDir, "polly", "project_polly.glb"); } private static IReadOnlyList GetModelPathsInDirectory(params string[] paths) { var dirPath = System.IO.Path.Combine(paths); if (dirPath.EndsWith(".zip")) dirPath = dirPath.Substring(0, dirPath.Length-4); if (!System.IO.Path.IsPathFullyQualified(dirPath)) throw new ArgumentException(nameof(dirPath)); var gltf = System.IO.Directory.GetFiles(dirPath, "*.gltf", System.IO.SearchOption.AllDirectories); var glbb = System.IO.Directory.GetFiles(dirPath, "*.glb", System.IO.SearchOption.AllDirectories); return gltf.Concat(glbb).ToList(); } #endregion } }