using AIStudio.Assistants.ModelComparison;
namespace AIStudio.Tests.Assistants.ModelComparison;
///
/// Checks which answer stands in which column.
///
///
/// A wrong assignment does not crash. It shows the answer of one model under the name of the other
/// once the vote is in, and nothing on the screen looks off.
///
[TestFixture]
public sealed class ModelComparisonPresentationOrderTests
{
[TestCase(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST, "The first model", "The second model")]
[TestCase(ModelComparisonPresentationOrder.SECOND_MODEL_FIRST, "The second model", "The first model")]
public void TheColumnsShowTheAnswersOfTheModelsTheOrderSays(ModelComparisonPresentationOrder order, string expectedInColumnA, string expectedInColumnB)
{
var run = CreateRunResult();
Assert.Multiple(() =>
{
Assert.That(order.InColumnA(run).Label, Is.EqualTo(expectedInColumnA));
Assert.That(order.InColumnB(run).Label, Is.EqualTo(expectedInColumnB));
});
}
[Test]
public void TheTextOfAColumnIsTheTextOfTheModelWhoseNameItCarries()
{
// The name and the text travel together in one answer, so a column can never mix them up:
var run = CreateRunResult();
foreach (var order in Enum.GetValues())
{
Assert.That(order.InColumnA(run).Text, Does.Contain(order.InColumnA(run).Label), $"{order}, column A");
Assert.That(order.InColumnB(run).Text, Does.Contain(order.InColumnB(run).Label), $"{order}, column B");
}
}
[Test]
public void AnswersInTheTwoColumnsAreNeverTheSame()
{
var run = CreateRunResult();
foreach (var order in Enum.GetValues())
Assert.That(order.InColumnA(run).Label, Is.Not.EqualTo(order.InColumnB(run).Label), order.ToString());
}
[Test]
public void EveryOrderIsKnown()
{
var run = CreateRunResult();
foreach (var order in Enum.GetValues())
{
Assert.DoesNotThrow(() => order.InColumnA(run), order.ToString());
Assert.DoesNotThrow(() => order.InColumnB(run), order.ToString());
}
}
[TestCase(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST, ModelComparisonVote.COLUMN_A, ModelComparisonModelChoice.FIRST)]
[TestCase(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST, ModelComparisonVote.COLUMN_B, ModelComparisonModelChoice.SECOND)]
[TestCase(ModelComparisonPresentationOrder.SECOND_MODEL_FIRST, ModelComparisonVote.COLUMN_A, ModelComparisonModelChoice.SECOND)]
[TestCase(ModelComparisonPresentationOrder.SECOND_MODEL_FIRST, ModelComparisonVote.COLUMN_B, ModelComparisonModelChoice.FIRST)]
[TestCase(ModelComparisonPresentationOrder.FIRST_MODEL_FIRST, ModelComparisonVote.TIE, ModelComparisonModelChoice.TIE)]
[TestCase(ModelComparisonPresentationOrder.SECOND_MODEL_FIRST, ModelComparisonVote.TIE, ModelComparisonModelChoice.TIE)]
public void AColumnBasedVoteIsTranslatedBackToItsModel(ModelComparisonPresentationOrder order, ModelComparisonVote vote, ModelComparisonModelChoice expected)
{
Assert.That(order.ToModelChoice(vote), Is.EqualTo(expected));
}
[Test]
public void TranslatingAVoteAndBackAgainIsConsistentWithTheColumns()
{
// Whichever model a column names, translating that model's vote back must land on the model actually standing there:
var run = CreateRunResult();
foreach (var order in Enum.GetValues())
{
var modelInColumnA = order.InColumnA(run).Label;
var choiceForColumnA = order.ToModelChoice(ModelComparisonVote.COLUMN_A);
var expectedLabel = choiceForColumnA is ModelComparisonModelChoice.FIRST ? "The first model" : "The second model";
Assert.That(modelInColumnA, Is.EqualTo(expectedLabel), order.ToString());
}
}
private static ModelComparisonRunResult CreateRunResult() => new()
{
First = new ModelComparisonAnswer
{
Label = "The first model",
Text = "The answer of The first model.",
Completed = true,
},
Second = new ModelComparisonAnswer
{
Label = "The second model",
Text = "The answer of The second model.",
Completed = true,
},
};
}