using Flaro.Core.Media;
namespace Flaro.Core.Tests;
/// Der Abgleich an echten Chromaprint-Abdrücken.
///
///
/// Bisher nur mit erfundenen Zahlen geprüft. Die sagen, ob die Suche
/// rechnet; sie sagen nicht, ob die Schwellen zu echtem Material passen.
/// Genau dazwischen kann alles liegen: zwei Aufnahmen desselben Stücks sind
/// nie bitgleich, und wie unähnlich sie sind, weiss man erst, wenn man es
/// misst.
///
/// Die beiden Abdrücke liegen als Prüfdaten daneben: zwei Tonspuren mit
/// demselben dreissigsekündigen Stück an verschiedenen Stellen und in
/// verschiedener Bitrate, durch fpcalc gedreht. Zwanzig Kilobyte
/// Text — der Preis dafür, dass diese Zusage nicht bloss behauptet ist.
///
public class EchteAbdrueckeTests
{
private const double JeAbdruck = 4096.0 / 3.0 / 11025.0;
private static IReadOnlyList? Lesen(string name)
{
var pfad = Path.Combine(TestContext.CurrentContext.TestDirectory, "Abdruecke", name);
if (!File.Exists(pfad)) return null;
return File.ReadAllText(pfad)
.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(t => unchecked((uint)long.Parse(t)))
.ToList();
}
[Test]
public void Dasselbe_Stueck_wird_in_zwei_Aufnahmen_gefunden()
{
var a = Lesen("folgeA.txt");
var b = Lesen("folgeB.txt");
if (a is null || b is null) Assert.Ignore("Keine Abdrücke zum Prüfen da.");
var treffer = Tonabgleich.Finden(a, b, JeAbdruck);
TestContext.Out.WriteLine($"A {a.Count} Werte, B {b.Count} Werte");
TestContext.Out.WriteLine(treffer is null
? "NICHTS GEFUNDEN"
: $"A {treffer.AVon:0.0}–{treffer.ABis:0.0} s, B {treffer.BVon:0.0}–{treffer.BBis:0.0} s");
Assert.That(treffer, Is.Not.Null, "das Stück steckt in beiden");
Assert.Multiple(() =>
{
Assert.That(treffer!.AVon, Is.EqualTo(20).Within(3));
Assert.That(treffer.BVon, Is.EqualTo(75).Within(3));
Assert.That(treffer.Laenge, Is.EqualTo(30).Within(4));
});
}
}