feat: merge event rankings and attribute badges into the page printer
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>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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)"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user