using Nonemm.Contests.Rules; using Nonemm.Core; namespace Nonemm.Contests.Tests; /// The contests whose rules are one table each: what a contact scores and /// where its multiplier comes from. public class SmallContestTests { private static ContestLog LogFor(Contest contest) => new(contest, TestLog.Germany, TestLog.CountryFile); [Theory] [InlineData("DL9XYZ", 5)] [InlineData("IK2XYZ", 10)] [InlineData("JA1XYZ", 15)] public void SartgScoresByCountryAndContinent(string call, int expected) => Assert.Equal( expected, LogFor(new SartgRtty()).Judge(TestLog.Contact(call, mode: Modes.Rtty)).Points); /// The SARTG call area is a second multiplier next to the country. [Fact] public void SartgCountsCallAreasAsWellAsCountries() => Assert.Equal( [1, 2], LogFor(new SartgRtty()) .Judge(TestLog.Contact("K1ABC", mode: Modes.Rtty, section: "K1")) .NewMultipliers.Select(m => m.Index).ToList()); [Theory] [InlineData(14_150, 1)] [InlineData(7_050, 2)] [InlineData(3_650, 3)] public void AllAsianScoresByBand(double kilohertz, int expected) => Assert.Equal( expected, LogFor(new AllAsian(ModeCategory.Phone)) .Judge(TestLog.Contact("JA1XYZ", kilohertz, mode: Modes.Usb, exchange: "46")) .Points); [Fact] public void AllAsianCountsOnlyAsia() => Assert.Equal( 0, LogFor(new AllAsian(ModeCategory.Phone)) .Judge(TestLog.Contact("IK2XYZ", mode: Modes.Usb, exchange: "46")) .Points); [Theory] [InlineData("PY2XYZ", 4)] [InlineData("IK2XYZ", 2)] public void SouthAmericaTenPaysMoreForSouthAmerica(string call, int expected) => Assert.Equal( expected, LogFor(new SouthAmerica10()) .Judge(TestLog.Contact(call, 28_400, mode: Modes.Usb, section: "11")) .Points); [Theory] [InlineData("YO3XYZ", 8)] [InlineData("DL9XYZ", 1)] [InlineData("IK2XYZ", 2)] [InlineData("JA1XYZ", 4)] public void YoDxHfPaysEightForRomania(string call, int expected) => Assert.Equal(expected, LogFor(new YoDxHf()).Judge(TestLog.Contact(call, section: "AR")).Points); [Theory] [InlineData("IK2XYZ", 5)] [InlineData("JA1XYZ", 10)] public void RussianDxRttyScoresByContinent(string call, int expected) => Assert.Equal( expected, LogFor(new RussianDxRtty()).Judge(TestLog.Contact(call, mode: Modes.Rtty, section: "14")).Points); [Theory] [InlineData("IK2XYZ/P", 5)] [InlineData("IK2XYZ", 2)] [InlineData("JA1XYZ", 3)] public void FieldDayPaysMostForAPortableStation(string call, int expected) => Assert.Equal( expected, LogFor(new FieldDayRegionOne()).Judge(TestLog.Contact(call, number: 22)).Points); /// Every contact is one point, and the continent counts once in the whole /// contest rather than once per band. [Fact] public void BartgCountsAContinentOnce() { ContestLog log = LogFor(new BartgSprint()); Assert.Equal(1, log.Judge(TestLog.Contact("IK2XYZ", mode: Modes.Rtty)).Points); log.Add(TestLog.Contact("IK2XYZ", mode: Modes.Rtty)); Assert.DoesNotContain( log.Judge(TestLog.Contact("F5XYZ", 7_040, mode: Modes.Rtty)).NewMultipliers, m => m.Index == 3); } }