Files
ReFuel.Gltf/tests/ReFuel.Gltf.Tests/GltfTestDocument.cs
T
2026-10-24 20:51:43 +03:00

86 lines
2.7 KiB
C#

using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using YamlDotNet.Core;
using YamlDotNet.RepresentationModel;
using YamlDotNet.Serialization;
namespace ReFuel.Gltf.Tests;
[DebuggerDisplay("{Kind,nq} path={DocumentUnderTestPath}")]
public class GltfTestDocument(FileInfo documentUnderTestPath) : IDisposable
{
public FileInfo DocumentUnderTestPath { get; } = documentUnderTestPath;
public FileInfo? SummaryDocumentFile { get; init; } = FindSummary(documentUnderTestPath);
public DirectoryInfo WorkingDirectory { get; init; } = documentUnderTestPath.Directory ?? new DirectoryInfo(Environment.CurrentDirectory);
public GltfDocumentKind Kind { get; init; } = documentUnderTestPath.Extension.ToLowerInvariant() switch
{
".gltf" => GltfDocumentKind.Json,
".glb" => GltfDocumentKind.Binary,
_ => GltfDocumentKind.Any,
};
public FileStream? Stream { get; private set; }
public GltfDocument? DocumentUnderTest { get; private set; }
public YamlDocument? SummaryDocument { get; private set; }
public ValidationDocument? ValidationDocument { get; private set; }
public bool HasValidation => SummaryDocumentFile != null;
public GltfDocument Parse()
{
Stream = DocumentUnderTestPath.OpenRead();
return DocumentUnderTest = GltfDocument.Open(Stream);
}
[MemberNotNullWhen(true, nameof(ValidationDocument))]
public bool LoadValidationDocument()
{
if (SummaryDocumentFile == null)
return false;
using StreamReader reader = new StreamReader(SummaryDocumentFile.OpenRead());
ValidationDocument = Deserializer.Deserialize<ValidationDocument>(reader.ReadToEnd());
return true;
}
public void Dispose()
{
DocumentUnderTest?.Dispose();
DocumentUnderTest = null;
Stream?.Dispose();
Stream = null;
}
private static FileInfo? FindSummary(FileInfo documentUnderTest)
{
return
documentUnderTest.Directory?
.EnumerateFiles()
.FirstOrDefault(x => string.Equals(x.Name, "conversion.yaml", StringComparison.InvariantCultureIgnoreCase));
}
public override string ToString()
{
string kind = Kind switch
{
GltfDocumentKind.Json => "Gltf JSON",
GltfDocumentKind.Binary => "Gltf Binary",
_ => "Unknown Gltf",
};
return $"{kind} \"{DocumentUnderTestPath.Name}\" HasValidation={(HasValidation ? "Yes" : "No")}";
}
private static IDeserializer Deserializer { get; }
static GltfTestDocument()
{
Deserializer = new DeserializerBuilder()
.IgnoreUnmatchedProperties()
.Build();
}
}