using MeetingAssistant.Speakers; namespace MeetingAssistant.Tests; public sealed class SpeakerIdentityMergerTests { [Fact] public void MergeIntoRetainsNewestDistinctVoiceVectorsUpToConfiguredLimit() { var now = DateTimeOffset.UtcNow; var target = new SpeakerIdentity { CanonicalName = "Chris", VoiceVectors = [ Vector("oldest", 1, now.AddMinutes(-4)), Vector("duplicate", 2, now.AddMinutes(-3)) ] }; var source = new SpeakerIdentity { VoiceVectors = [ Vector("duplicate", 2, now.AddMinutes(-2)), Vector("newer", 3, now.AddMinutes(-1)), Vector("newest", 4, now) ] }; SpeakerIdentityMerger.MergeInto(target, source, maxSnippets: 3, maxVoiceVectors: 3); Assert.Equal(["duplicate", "newer", "newest"], target.VoiceVectors.Select(vector => vector.Fingerprint).Order()); Assert.All(target.VoiceVectors, vector => Assert.Same(target, vector.SpeakerIdentity)); } private static SpeakerVoiceVector Vector(string fingerprint, byte value, DateTimeOffset createdAt) { return new SpeakerVoiceVector { ModelId = "model", Dimensions = 256, VectorBytes = Enumerable.Repeat(value, 256 * sizeof(float)).ToArray(), Fingerprint = fingerprint, CreatedAt = createdAt }; } }