using Nonemm.Core; namespace Nonemm.Session.Tests; public class StatisticsTableTests { private static readonly DateTime Start = new(2026, 1, 1, 0, 0, 0, DateTimeKind.Utc); private static Qso Contact(double kilohertz, Mode? mode = null, int minute = 0) => new() { Id = Qso.NewId(), TimestampUtc = Start.AddMinutes(minute), Call = Callsign.Parse("DL1ABC"), Frequency = Frequency.FromKilohertz(kilohertz), Mode = mode ?? Modes.Cw, ContestName = "CQWW", }; private static StatisticsTable Of(IReadOnlyList log, string row = "Band", string column = "Mode") => StatisticsTable.Of(StatisticsPivot.Of( log, StatisticsFields.Find(StatisticsFields.Rows, row), StatisticsFields.Find(StatisticsFields.Columns, column), Start)); [Fact] public void HeadsTheCountsWithTheColumnValuesAndEndsWithTotAndAccum() { StatisticsTable table = Of([Contact(14_030), Contact(7_030, Modes.Usb)]); Assert.Equal(["Band", "CW", "USB", "Tot", "Accum"], table.Headings); Assert.Equal(1, table.LabelColumns); } [Fact] public void PutsTheTotalLineLast() { StatisticsTable table = Of([Contact(14_030), Contact(14_040), Contact(7_030)]); Assert.Equal(["40M", "1", "1", "1"], table.Rows[0]); Assert.Equal(["20M", "2", "2", "3"], table.Rows[1]); Assert.Equal(["Total", "3", "3", "3"], table.Rows[^1]); } [Fact] public void LinesTheColumnsUpUnderTheirHeadings() { string text = Of([Contact(14_030), Contact(3_530, Modes.Usb), Contact(3_540, Modes.Usb)]).ToText(); Assert.Equal( """ Band CW USB Tot Accum 80M 2 2 2 20M 1 1 3 Total 1 2 3 3 """, text.TrimEnd('\n')); } [Fact] public void KeepsTheTwoLabelColumnsOfAFieldThatHasThem() { StatisticsTable table = Of([Contact(14_030, minute: 5), Contact(14_040, minute: 70)], row: "Hour"); Assert.Equal(2, table.LabelColumns); Assert.Equal(["Day", "Hr", "CW", "Tot", "Accum"], table.Headings); Assert.Equal(["2026-01-01", "00", "1", "1", "1"], table.Rows[0]); Assert.Equal(["Total", "", "2", "2", "2"], table.Rows[^1]); } [Fact] public void LeavesNoSpacesHangingOffTheEndOfALine() { string text = Of([Contact(14_030)]).ToText(); Assert.All(text.Split('\n'), line => Assert.Equal(line.TrimEnd(), line)); } }