using AIStudio.Assistants.ModelComparison;
namespace AIStudio.Tests.Assistants.ModelComparison;
///
/// Checks how the user's own votes across a batch are tallied.
///
///
/// Mirrors : the tally has to survive the
/// presentation order changing from run to run, and a run without a vote must not be counted.
///
[TestFixture]
public sealed class ModelComparisonBatchVoteSummaryTests
{
[Test]
public void AnEmptyBatchScoresNothing()
{
var summary = ModelComparisonBatchVoteSummary.From([], []);
Assert.Multiple(() =>
{
Assert.That(summary.TotalRunCount, Is.Zero);
Assert.That(summary.ScoredRunCount, Is.Zero);
Assert.That(summary.FirstModelWins, Is.Zero);
Assert.That(summary.SecondModelWins, Is.Zero);
Assert.That(summary.Ties, Is.Zero);
});
}
[Test]
public void WinsAreCountedByModelNotByColumn()
{
var entries = new[]
{
Entry(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST),
Entry(ModelComparisonPresentationOrder.SECOND_MODEL_FIRST),
Entry(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST),
};
// The first model stands in column A twice and in column B once, and the user votes for it every time:
var votes = new ModelComparisonVote?[]
{
ModelComparisonVote.COLUMN_A,
ModelComparisonVote.COLUMN_B,
ModelComparisonVote.COLUMN_A,
};
var summary = ModelComparisonBatchVoteSummary.From(entries, votes);
Assert.Multiple(() =>
{
Assert.That(summary.TotalRunCount, Is.EqualTo(3));
Assert.That(summary.ScoredRunCount, Is.EqualTo(3));
Assert.That(summary.FirstModelWins, Is.EqualTo(3));
Assert.That(summary.SecondModelWins, Is.Zero);
});
}
[Test]
public void ARunWithoutAVoteIsNotScored()
{
var entries = new[]
{
Entry(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST),
Entry(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST),
};
var votes = new ModelComparisonVote?[] { ModelComparisonVote.COLUMN_A, null };
var summary = ModelComparisonBatchVoteSummary.From(entries, votes);
Assert.Multiple(() =>
{
Assert.That(summary.TotalRunCount, Is.EqualTo(2), "Both runs happened.");
Assert.That(summary.ScoredRunCount, Is.EqualTo(1), "Only one run was voted on.");
Assert.That(summary.FirstModelWins, Is.EqualTo(1));
});
}
[Test]
public void AVoteWithNoMatchingEntryIndexIsNotScored()
{
// Fewer votes than entries -- the batch was left before reaching the rest:
var entries = new[]
{
Entry(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST),
Entry(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST),
};
var votes = new ModelComparisonVote?[] { ModelComparisonVote.TIE };
var summary = ModelComparisonBatchVoteSummary.From(entries, votes);
Assert.Multiple(() =>
{
Assert.That(summary.TotalRunCount, Is.EqualTo(2));
Assert.That(summary.ScoredRunCount, Is.EqualTo(1));
Assert.That(summary.Ties, Is.EqualTo(1));
});
}
private static ModelComparisonBatchEntry Entry(ModelComparisonPresentationOrder order) => new()
{
PresentationOrder = order,
Result = new ModelComparisonRunResult
{
First = Answer("First"),
Second = Answer("Second"),
},
};
private static ModelComparisonAnswer Answer(string label) => new()
{
Label = label,
Text = $"The answer of {label}.",
Completed = true,
};
}