From d6e1a1d90d20077c80eb35fa39244c932031a521 Mon Sep 17 00:00:00 2001 From: X9VoiD Date: Thu, 29 Dec 2022 06:52:23 +0000 Subject: [PATCH] Add FileSystemEntry family classes --- OpenTabletDriver.Tests/Fakes/FakeDirectory.cs | 9 +++ OpenTabletDriver.Tests/Fakes/FakeFile.cs | 9 +++ .../Fakes/FakeFileSystemEntry.cs | 65 +++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 OpenTabletDriver.Tests/Fakes/FakeDirectory.cs create mode 100644 OpenTabletDriver.Tests/Fakes/FakeFile.cs create mode 100644 OpenTabletDriver.Tests/Fakes/FakeFileSystemEntry.cs diff --git a/OpenTabletDriver.Tests/Fakes/FakeDirectory.cs b/OpenTabletDriver.Tests/Fakes/FakeDirectory.cs new file mode 100644 index 000000000..b79441295 --- /dev/null +++ b/OpenTabletDriver.Tests/Fakes/FakeDirectory.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace OpenTabletDriver.Tests.Fakes +{ + public class FakeDirectory : FakeFileSystemEntry + { + public List Entries { get; } = new(); + } +} diff --git a/OpenTabletDriver.Tests/Fakes/FakeFile.cs b/OpenTabletDriver.Tests/Fakes/FakeFile.cs new file mode 100644 index 000000000..979014900 --- /dev/null +++ b/OpenTabletDriver.Tests/Fakes/FakeFile.cs @@ -0,0 +1,9 @@ +using System; + +namespace OpenTabletDriver.Tests.Fakes +{ + public class FakeFile : FakeFileSystemEntry + { + public byte[] Data { get; init; } = Array.Empty(); + } +} diff --git a/OpenTabletDriver.Tests/Fakes/FakeFileSystemEntry.cs b/OpenTabletDriver.Tests/Fakes/FakeFileSystemEntry.cs new file mode 100644 index 000000000..dcd46e34e --- /dev/null +++ b/OpenTabletDriver.Tests/Fakes/FakeFileSystemEntry.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Xunit.Sdk; + +namespace OpenTabletDriver.Tests.Fakes +{ + public abstract class FakeFileSystemEntry + { + public string Name { get; init; } = null!; + + public static async Task SetupFilesAsync(string directory, IEnumerable entries) + { + foreach (var entry in entries) + { + if (entry is FakeDirectory dir) + { + var dirPath = Path.Join(directory, dir.Name); + Directory.CreateDirectory(dirPath); + await SetupFilesAsync(dirPath, dir.Entries); + } + else if (entry is FakeFile file) + { + var filePath = Path.Join(directory, file.Name); + await File.WriteAllBytesAsync(filePath, file.Data); + } + } + } + + public static async Task VerifyFilesAsync(string directory, IEnumerable entries, bool strict = true) + { + var entriesCache = entries.ToArray(); + var dirEntries = Directory.GetFileSystemEntries(directory); + var dirEntriesMap = dirEntries.ToDictionary(e => Path.GetFileName(e)); + + if (strict && (entriesCache.Length != dirEntries.Length)) + throw new XunitException($"Expected {entriesCache.Length} file system entries, got {dirEntries.Length}"); + + foreach (var entry in entriesCache) + { + if (!dirEntriesMap.TryGetValue(entry.Name, out var path)) + throw new XunitException($"Expected file system entry '{entry.Name}' not found"); + + if (entry is FakeDirectory dir) + { + if (!Directory.Exists(path)) + throw new DirectoryNotFoundException($"Directory '{path}' does not exist."); + + await VerifyFilesAsync(path, dir.Entries); + } + else if (entry is FakeFile file) + { + if (!File.Exists(path)) + throw new FileNotFoundException($"File '{path}' does not exist."); + + var data = await File.ReadAllBytesAsync(path); + if (!data.AsSpan().SequenceEqual(file.Data)) + throw new Exception($"File {path} does not match expected data"); + } + } + } + } +}