From 418a58c5b51968a02b93dd4efa3505693f344bf9 Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Mon, 25 May 2026 14:37:16 +0800 Subject: [PATCH] feat: Basic core feature implementation. - Add Database integrated test. - Fix AudioFileScannerTests.cs namepsace. --- src/Core.Tests/AudioFileScannerTests.cs | 4 +- src/Core.Tests/IntegratedTest.cs | 80 +++++++++++++++++++++++++ src/Resonance.sln.DotSettings.user | 2 + 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/Core.Tests/IntegratedTest.cs diff --git a/src/Core.Tests/AudioFileScannerTests.cs b/src/Core.Tests/AudioFileScannerTests.cs index 7ebabf4..fc8e0b5 100755 --- a/src/Core.Tests/AudioFileScannerTests.cs +++ b/src/Core.Tests/AudioFileScannerTests.cs @@ -1,4 +1,6 @@ -namespace OCES.Resonance.Core.Tests; +using OCES.Resonance.Core; + +namespace Core.Tests; /// /// AudioFileScanner 单元测试 diff --git a/src/Core.Tests/IntegratedTest.cs b/src/Core.Tests/IntegratedTest.cs new file mode 100644 index 0000000..422268a --- /dev/null +++ b/src/Core.Tests/IntegratedTest.cs @@ -0,0 +1,80 @@ +using System.Data.SQLite; +using Dapper; +using OCES.Resonance.Core; + +namespace Core.Tests; + +public class IntegratedTest +{ + private static readonly string _dataSourceRoot = "/Volumes/Library/Boom Library/Boom Library - Alien Life/Alien_Life_DS"; + + private static string GetWavDir(string vendor) + { + string dir = Path.Combine(_dataSourceRoot, vendor); + return Directory.Exists(dir) ? dir : string.Empty; + } + + private static string GetDefaultDbPath() => + Path.Combine(PreferencesManager.GetDefaultDatabasePath(), "default.rdb"); + + private static void DeleteTestEntries(params string[] uniqueIds) + { + using var conn = new SQLiteConnection($"Data Source={GetDefaultDbPath()};Version=3;"); + conn.Open(); + foreach (var uid in uniqueIds) + conn.Execute("DELETE FROM audio_files WHERE unique_id = @UniqueId", new { UniqueId = uid }); + } + + [Fact] + public void ScanReadWritePipeline_ShouldGenerateDatabase() + { + string sourceDir = _dataSourceRoot; + if (string.IsNullOrEmpty(sourceDir)) + { + return; + } + + var scanner = new AudioFileScanner(); + var reader = new AudioMetadataReader(); + string[] wavFiles = scanner.ScanDirectory(sourceDir, recursive: true) + .Where(f => f.EndsWith(".wav", StringComparison.OrdinalIgnoreCase)) + .ToArray(); + + if (wavFiles.Length == 0) + { + return; + } + + var metaList = wavFiles.Select(f => reader.ReadMetadata(new FileInfo(f))).ToList(); + + Database.InitializeDatabase(); + int insertedCount = Database.AddEntries(metaList); + + try + { + Assert.Equal(wavFiles.Length, insertedCount); + + foreach (var meta in metaList) + { + var retrieved = Database.GetEntryByUniqueId(meta.UniqueId); + Assert.NotNull(retrieved); + + Assert.Equal(meta.Md5, retrieved!.Md5); + Assert.Equal(meta.Path, retrieved.Path); + Assert.Equal(meta.Filename, retrieved.Filename); + Assert.Equal(meta.Duration, retrieved.Duration); + Assert.Equal(meta.BitDepth, retrieved.BitDepth); + Assert.Equal(meta.Channels, retrieved.Channels); + Assert.Equal(meta.SampleRate, retrieved.SampleRate); + Assert.Equal(meta.Type, retrieved.Type); + + if (meta.Artwork != null) + Assert.NotNull(retrieved.Artwork); + } + } + finally + { + DeleteTestEntries(metaList.Select(m => m.UniqueId).ToArray()); + } + } +} diff --git a/src/Resonance.sln.DotSettings.user b/src/Resonance.sln.DotSettings.user index cd6f052..6f3ac52 100755 --- a/src/Resonance.sln.DotSettings.user +++ b/src/Resonance.sln.DotSettings.user @@ -20,5 +20,7 @@ <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests.InitializeDatabase_ShouldCreateAudioFilesTable</TestId> <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests.InitializeDatabase_ShouldBeIdempotent</TestId> <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests</TestId> + <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.IntegratedTest.ScanReadWritePipeline_ShouldGenerateDatabase</TestId> + <TestId>xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.IntegratedTest</TestId> </TestAncestor> </SessionState> \ No newline at end of file