using AIStudio.Assistants.ModelComparison; namespace AIStudio.Tests.Assistants.ModelComparison; /// /// Checks how the judge's raw answer is turned into a verdict. /// /// /// The judge is asked for one JSON object and nothing else, but a model rarely holds to that /// perfectly. Parsing has to look past a stray sentence around the object, and has to end up with a /// verdict which is not rather than throw when /// there is nothing usable to read. /// [TestFixture] public sealed class ModelComparisonJudgeVerdictTests { [Test] public void APlainJsonObjectIsRead() { var verdict = ModelComparisonJudgeVerdict.Parse("Judge", true, """{"preferred": "A", "reasoning": "It kept every number from the document."}"""); Assert.Multiple(() => { Assert.That(verdict.Completed, Is.True); Assert.That(verdict.Label, Is.EqualTo("Judge")); Assert.That(verdict.Preferred, Is.EqualTo(ModelComparisonVote.COLUMN_A)); Assert.That(verdict.Reasoning, Is.EqualTo("It kept every number from the document.")); }); } [Test] public void APreferenceIsReadWithoutRegardToCase() { var verdict = ModelComparisonJudgeVerdict.Parse("Judge", true, """{"preferred": "tie", "reasoning": "Both cover the same points."}"""); Assert.That(verdict.Preferred, Is.EqualTo(ModelComparisonVote.TIE)); } [Test] public void TextAroundTheJsonObjectIsIgnored() { var verdict = ModelComparisonJudgeVerdict.Parse("Judge", true, """ Sure, here is my verdict: ```json {"preferred": "B", "reasoning": "It is shorter and just as complete."} ``` """); Assert.Multiple(() => { Assert.That(verdict.Completed, Is.True); Assert.That(verdict.Preferred, Is.EqualTo(ModelComparisonVote.COLUMN_B)); }); } [Test] public void AJudgeWhichDidNotAnswerIsNotCompleted() { var verdict = ModelComparisonJudgeVerdict.Parse("Judge", false, string.Empty); Assert.Multiple(() => { Assert.That(verdict.Completed, Is.False); Assert.That(verdict.Preferred, Is.Null); Assert.That(verdict.Reasoning, Is.Empty); }); } [TestCase("Sorry, I cannot help with that.")] [TestCase("""{"reasoning": "Missing the preference field."}""")] [TestCase("""{"preferred": "C", "reasoning": "Not one of the three allowed values."}""")] [TestCase("""{"preferred": "A", "reasoning": }""")] public void AnUnreadableAnswerIsNotCompleted(string judgeText) { var verdict = ModelComparisonJudgeVerdict.Parse("Judge", true, judgeText); Assert.That(verdict.Completed, Is.False); } }