using Flaro.Media; namespace Flaro.Media.Tests; /// Die Ausgabe von fpcalc -raw lesen. /// /// /// Ohne das Programm selbst. Ob Chromaprint rechnen kann, ist nicht /// unsere Frage; ob wir seine Ausgabe richtig verstehen, schon. Die Zahlen /// kommen mit Vorzeichen, gemeint sind die Bitmuster — wer das verwechselt, /// bekommt einen Fingerprint, der nie zu einem zweiten passt. /// public class FingerprintleserTests { [Test] public void Die_Zahlen_werden_als_Bitmuster_gelesen() { var fingerprint = Fingerprintleser.Lesen("DURATION=120\nFINGERPRINT=1,-1,2147483647,-2147483648\n"); Assert.That(fingerprint, Is.EqualTo(new uint[] { 1u, 0xFFFFFFFFu, 0x7FFFFFFFu, 0x80000000u })); } [Test] public void Ohne_Fingerprintzeile_kommt_nichts() { Assert.That(Fingerprintleser.Lesen("DURATION=120\n"), Is.Empty); } [Test] public void Eine_leere_Zeile_ergibt_keinen_Fingerprint() { Assert.That(Fingerprintleser.Lesen("FINGERPRINT=\n"), Is.Empty); } /// Eine Zeitscheibe ist rund 124 Millisekunden. /// /// /// Daran hängt jede Zeitangabe, die aus einem Fingerprint entsteht. Stimmt /// die Zahl nicht, liegt jedes Segment um denselben Faktor daneben — und /// das sähe aus wie ein Fehler in der Erkennung. /// [Test] public void Eine_Zeitscheibe_dauert_124_Millisekunden() { Assert.That(Fingerprintleser.SekundenJeFingerprint, Is.EqualTo(0.1238).Within(0.0005)); } } /// Was fpcalc wirklich kann — nachgemessen, nicht angenommen. /// /// /// Der Anlass ist ein Fehler, der im Betrieb stand. Hier wurde /// -ts 0 übergeben, in der Annahme, das sei ein Startpunkt. Es ist /// ein Schalter („gib Zeitstempel aus"), und die Null las fpcalc als /// zweiten Dateinamen: Code 2, „No such file or directory" — über Dateien, /// die da waren. Einen Startpunkt gibt es bei fpcalc nicht. /// /// Gemessen am Binärprogramm aus dem Abbild, an einer Datei von 2700 /// Sekunden: -length 0 ergibt 21 786 Werte, also 0,1239 Sekunden je /// Wert; -length 120 bricht nach 948 Werten ab. /// public class FingerprintRateTests { [Test] public void Die_Rate_stimmt_mit_der_Messung_ueberein() { // 21 786 Werte für 2700 Sekunden. var gemessen = 2700.0 / 21786; Assert.That(Math.Abs(gemessen - Fingerprintleser.SekundenJeFingerprint), Is.LessThan(0.0005)); } /// Eine Stunde Fingerprint passt in eine überschaubare Reihe. /// /// /// Damit niemand auf die Idee kommt, den Fingerprint einer ganzen Folge für /// zu gross zu halten und wieder in Ausschnitten zu lesen: eine Stunde /// sind knapp 29 000 Werte, also 116 Kilobyte. /// [Test] public void Eine_Stunde_sind_rund_29000_Werte() { var werte = (int)(3600 / Fingerprintleser.SekundenJeFingerprint); Assert.That(werte, Is.InRange(28500, 29500)); } }