feat: Basic core feature implementation.

- Add Database integrated test.
- Fix AudioFileScannerTests.cs namepsace.
This commit is contained in:
2026-05-25 14:37:16 +08:00
parent 33e1a758ef
commit 418a58c5b5
3 changed files with 85 additions and 1 deletions
+3 -1
View File
@@ -1,4 +1,6 @@
namespace OCES.Resonance.Core.Tests;
using OCES.Resonance.Core;
namespace Core.Tests;
/// <summary>
/// AudioFileScanner 单元测试
+80
View File
@@ -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());
}
}
}
+2
View File
@@ -20,5 +20,7 @@
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests.InitializeDatabase_ShouldCreateAudioFilesTable&lt;/TestId&gt;
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests.InitializeDatabase_ShouldBeIdempotent&lt;/TestId&gt;
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.DatabaseTests&lt;/TestId&gt;
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.IntegratedTest.ScanReadWritePipeline_ShouldGenerateDatabase&lt;/TestId&gt;
&lt;TestId&gt;xUnit::24F92458-FB39-44BE-A32F-41275183AF1B::net10.0::Core.Tests.IntegratedTest&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String></wpf:ResourceDictionary>