using DeepDrftContent.Services.FileDatabase.Models; using DeepDrftContent.Services.FileDatabase.Utils; namespace DeepDrftTests; /// /// Tests for utility classes like StructuralMap and StructuralSet /// [TestFixture] public class UtilityTests { [TestFixture] public class StructuralMapTests { [Test] public void StructuralMap_CanAddAndRetrieveEntries() { // Arrange var map = new StructuralMap(); var key = "test"; var value = "test-value"; // Act map.Set(key, value); // Assert Assert.That(map.Has(key), Is.True, "Map should contain the key"); Assert.That(map.Get(key), Is.EqualTo(value), "Retrieved value should match"); Assert.That(map.Size, Is.EqualTo(1), "Map should have one entry"); } [Test] public void StructuralMap_HandlesStructuralEquality() { // Arrange var map = new StructuralMap(); var key1 = "test"; var key2 = "test"; // Same values var value = "test-value"; // Act map.Set(key1, value); // Assert Assert.That(map.Has(key2), Is.True, "Map should use structural equality"); Assert.That(map.Get(key2), Is.EqualTo(value), "Should retrieve value using structurally equal key"); } [Test] public void StructuralMap_CanRemoveEntries() { // Arrange var map = new StructuralMap(); var key = "test"; var value = "test-value"; map.Set(key, value); // Act var removed = map.Delete(key); // Assert Assert.That(removed, Is.True, "Delete should return true"); Assert.That(map.Has(key), Is.False, "Map should not contain the key after removal"); Assert.That(map.Size, Is.EqualTo(0), "Map should be empty"); } [Test] public void StructuralMap_CanEnumerateEntries() { // Arrange var map = new StructuralMap(); var entries = new[] { ("key1", "value1"), ("key2", "value2"), ("key3", "value3") }; foreach (var (key, value) in entries) { map.Set(key, value); } // Act var retrievedEntries = map.ToList(); // Assert Assert.That(retrievedEntries.Count, Is.EqualTo(3), "Should enumerate all entries"); foreach (var (key, value) in entries) { Assert.That(retrievedEntries.Any(kvp => kvp.Key.Equals(key) && kvp.Value == value), Is.True, $"Should contain entry ({key}, {value})"); } } } [TestFixture] public class StructuralSetTests { [Test] public void StructuralSet_CanAddAndContainEntries() { // Arrange var set = new StructuralSet(); var key = "test"; // Act set.Add(key); // Assert Assert.That(set.Has(key), Is.True, "Set should contain the key"); Assert.That(set.Size, Is.EqualTo(1), "Set should have one entry"); } [Test] public void StructuralSet_HandlesStructuralEquality() { // Arrange var set = new StructuralSet(); var key1 = "test"; var key2 = "test"; // Same values // Act set.Add(key1); set.Add(key2); // Assert Assert.That(set.Has(key2), Is.True, "Should contain structurally equal key"); Assert.That(set.Size, Is.EqualTo(1), "Set should still have only one entry due to structural equality"); } [Test] public void StructuralSet_CanRemoveEntries() { // Arrange var set = new StructuralSet(); var key = "test"; set.Add(key); // Act var removed = set.Delete(key); // Assert Assert.That(removed, Is.True, "Delete should return true"); Assert.That(set.Has(key), Is.False, "Set should not contain the key after removal"); Assert.That(set.Size, Is.EqualTo(0), "Set should be empty"); } [Test] public void StructuralSet_CanEnumerateEntries() { // Arrange var set = new StructuralSet(); var keys = new[] { "key1", "key2", "key3" }; foreach (var key in keys) { set.Add(key); } // Act var retrievedKeys = set.ToList(); // Assert Assert.That(retrievedKeys.Count, Is.EqualTo(3), "Should enumerate all entries"); foreach (var key in keys) { Assert.That(retrievedKeys.Contains(key), Is.True, $"Should contain key {key}"); } } } [TestFixture] public class FileUtilsTests { private string _testDirectory = null!; [SetUp] public void SetUp() { _testDirectory = Path.Combine(Path.GetTempPath(), "DeepDrftTests", "FileUtils", Guid.NewGuid().ToString()); Directory.CreateDirectory(_testDirectory); } [TearDown] public void TearDown() { if (Directory.Exists(_testDirectory)) { Directory.Delete(_testDirectory, true); } } [Test] public async Task FileUtils_CanWriteAndReadFile() { // Arrange var testFile = Path.Combine(_testDirectory, "test.dat"); var testData = TestData.TestPngBytes; // Act await FileUtils.PutFileAsync(testFile, testData); var fileBinary = await FileUtils.FetchFileAsync(testFile); // Assert Assert.That(File.Exists(testFile), Is.True, "File should exist after writing"); Assert.That(fileBinary, Is.Not.Null, "FileBinary should not be null"); Assert.That(fileBinary.Buffer.Length, Is.EqualTo(testData.Length), "Read data length should match"); for (int i = 0; i < testData.Length; i++) { Assert.That(fileBinary.Buffer[i], Is.EqualTo(testData[i]), $"Byte at index {i} should match"); } } [Test] public async Task FileUtils_CanWriteAndReadJson() { // Arrange var testFile = Path.Combine(_testDirectory, "test.json"); var testObject = new { Name = "Test", Value = 42, IsActive = true }; // Act await FileUtils.PutObjectAsync(testFile, testObject); var readObject = await FileUtils.FetchObjectAsync(testFile); // Assert Assert.That(File.Exists(testFile), Is.True, "JSON file should exist after writing"); Assert.That(readObject, Is.Not.Null, "Read object should not be null"); } [Test] public void FileUtils_HandlesNonExistentFile() { // Arrange var nonExistentFile = Path.Combine(_testDirectory, "does-not-exist.dat"); // Act & Assert Assert.ThrowsAsync(async () => { await FileUtils.FetchFileAsync(nonExistentFile); }, "Should throw FileNotFoundException for non-existent file"); } } }