Interview notes can print each student's ranked events and a shared attribute legend from the same catalog as the ranking index, without leftover table markup or collapsed answer space. Co-authored-by: Cursor <cursoragent@cursor.com>
89 lines
2.9 KiB
C#
89 lines
2.9 KiB
C#
using Core.Entities;
|
|
using Core.Printing;
|
|
using Tests.Builders;
|
|
|
|
namespace Tests.Printing;
|
|
|
|
[TestFixture]
|
|
public class StudentRankTokens_Tests
|
|
{
|
|
[Test]
|
|
public void FromRankings_AlwaysIncludesEveryRankThroughMax()
|
|
{
|
|
var map = StudentRankTokens.FromRankings([]);
|
|
|
|
for (var rank = 1; rank <= StudentEventRanking.MaxRank; rank++)
|
|
{
|
|
Assert.That(map.ContainsKey(StudentRankTokens.NameToken(rank)), Is.True);
|
|
Assert.That(map.ContainsKey(StudentRankTokens.ShortNameToken(rank)), Is.True);
|
|
Assert.That(map[StudentRankTokens.NameToken(rank)], Is.Null);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void FromRankings_FillsNameAndShortNameForPresentRanks()
|
|
{
|
|
var coding = EventDefinitionBuilder.Individual("Coding")
|
|
.WithShortName("Code")
|
|
.Build();
|
|
var flight = EventDefinitionBuilder.Individual("Flight Endurance")
|
|
.WithShortName("Flight")
|
|
.Build();
|
|
var student = StudentBuilder.Create("Aria", "Cole")
|
|
.WithRanking(coding, 1)
|
|
.WithRanking(flight, 3)
|
|
.Build();
|
|
|
|
var map = StudentRankTokens.FromRankings(student.EventRankings);
|
|
|
|
Assert.That(map["Rank1"], Is.EqualTo("Coding"));
|
|
Assert.That(map["Rank1.ShortName"], Is.EqualTo("Code"));
|
|
Assert.That(map["Rank1.Attributes"], Is.EqualTo(EventAttributeMarks.For(coding)));
|
|
Assert.That(map["Rank3"], Is.EqualTo("Flight Endurance"));
|
|
Assert.That(map["Rank3.ShortName"], Is.EqualTo("Flight"));
|
|
Assert.That(map["Rank2"], Is.Null);
|
|
Assert.That(map["Rank2.Attributes"], Is.Null);
|
|
}
|
|
|
|
[Test]
|
|
public void FromRankings_IgnoresRanksOutsideOneToMax()
|
|
{
|
|
var evt = EventDefinitionBuilder.Individual("Coding").Build();
|
|
var rankings = new List<StudentEventRanking>
|
|
{
|
|
new() { EventDefinition = evt, Rank = 0 },
|
|
new() { EventDefinition = evt, Rank = StudentEventRanking.MaxRank + 1 }
|
|
};
|
|
|
|
var map = StudentRankTokens.FromRankings(rankings);
|
|
|
|
Assert.That(map["Rank1"], Is.Null);
|
|
}
|
|
|
|
[Test]
|
|
public void Merge_KnownEmptyRankPrintsBlank()
|
|
{
|
|
var map = PrintTokenMap.Build(null, StudentRankTokens.FromRankings([]), null);
|
|
|
|
var merged = NoteTemplateMerger.Merge("1. {{Rank1}}", map);
|
|
|
|
Assert.That(merged, Is.EqualTo("1. "));
|
|
}
|
|
|
|
[Test]
|
|
public void Merge_ReplacesRankTokens()
|
|
{
|
|
var evt = EventDefinitionBuilder.Individual("Video Game Design")
|
|
.WithShortName("VGD")
|
|
.Build();
|
|
var student = StudentBuilder.Create("Aria", "Cole")
|
|
.WithRanking(evt, 1)
|
|
.Build();
|
|
var map = PrintTokenMap.Build(null, StudentRankTokens.FromRankings(student.EventRankings), null);
|
|
|
|
var merged = NoteTemplateMerger.Merge("{{Rank1}} ({{Rank1.ShortName}})", map);
|
|
|
|
Assert.That(merged, Is.EqualTo("Video Game Design (VGD)"));
|
|
}
|
|
}
|