The box names in EntryWindowInfo are N1MM's LogItem.LogItemNameType members. We read four of them under names that are not in that enum, so a file naming its section box SectionText got no section box at all, and a zone or a power box was dropped whatever it was called. SectionText, CQZoneText and PowerText are now read. SectText stays as well: it is not one of N1MM's names but files in the wild use it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
110 lines
3.7 KiB
C#
110 lines
3.7 KiB
C#
using Nonemm.Contests.Udc;
|
|
using Nonemm.Core;
|
|
|
|
namespace Nonemm.Contests.Tests;
|
|
|
|
public class UserDefinedContestTests
|
|
{
|
|
private const string Sample = """
|
|
[Author]
|
|
AuthorName=Someone
|
|
[Contest]
|
|
Name=SAMPLETEST
|
|
DisplayName=Sample Test
|
|
CabrilloName=SAMPLE-TEST
|
|
Mode=CW
|
|
DupeType=2
|
|
Multiplier1Name=Countries
|
|
MultSqlString=CountryPrefix
|
|
IsMultPer=1
|
|
PointsPerContact=MyCountry, 1, SameContinent, 2, OtherContinent, 5
|
|
EntryWindowInfo=RCVText, 500, Exchange1Text, 500
|
|
FrameText=RcvRST Exch
|
|
DefaultContestExchange=599
|
|
""";
|
|
|
|
private static UserDefinedContest Contest() => new(UdcFile.Parse(Sample));
|
|
|
|
private static ContestLog LogFor(StationInfo me) =>
|
|
new(Contest(), me, TestLog.CountryFile);
|
|
|
|
[Fact]
|
|
public void NameAndCabrilloNameComeFromTheFile()
|
|
{
|
|
UserDefinedContest contest = Contest();
|
|
Assert.Equal("SAMPLETEST", contest.Name);
|
|
Assert.Equal("Sample Test", contest.DisplayName);
|
|
Assert.Equal("SAMPLE-TEST", contest.CabrilloName);
|
|
}
|
|
|
|
[Fact]
|
|
public void ExchangeBoxesComeFromTheEntryWindowSetting()
|
|
{
|
|
IReadOnlyList<ExchangeField> fields = Contest().ExchangeFieldsFor(TestLog.Germany);
|
|
Assert.Equal(2, fields.Count);
|
|
Assert.Equal("RcvRST", fields[0].Label);
|
|
Assert.Equal(ExchangeSlot.Exchange1, fields[1].Slot);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("DL9XYZ", 1)]
|
|
[InlineData("IK2XYZ", 2)]
|
|
[InlineData("JA1XYZ", 5)]
|
|
public void PointsFollowTheConditionList(string call, int expected) =>
|
|
Assert.Equal(expected, LogFor(TestLog.Germany).Judge(TestLog.Contact(call)).Points);
|
|
|
|
[Fact]
|
|
public void CountriesCountOncePerBand()
|
|
{
|
|
ContestLog log = LogFor(TestLog.Germany);
|
|
log.Add(TestLog.Contact("JA1XYZ"));
|
|
Assert.Empty(log.Judge(TestLog.Contact("JA2XYZ")).NewMultipliers);
|
|
Assert.Single(log.Judge(TestLog.Contact("JA2XYZ", 7_025)).NewMultipliers);
|
|
}
|
|
|
|
[Fact]
|
|
public void FileWithNoContestNameIsRejected() =>
|
|
Assert.Throws<FormatException>(() => UdcFile.Parse("[Author]\r\nAuthorName=Someone\r\n"));
|
|
|
|
[Fact]
|
|
public void DupeTypeFourNeverFlagsADupe()
|
|
{
|
|
UserDefinedContest contest = new(UdcFile.Parse(Sample.Replace("DupeType=2", "DupeType=4")));
|
|
ContestLog log = new(contest, TestLog.Germany, TestLog.CountryFile);
|
|
log.Add(TestLog.Contact("JA1XYZ"));
|
|
Assert.False(log.Judge(TestLog.Contact("JA1XYZ")).IsDupe);
|
|
}
|
|
|
|
/// The box names in a published file are N1MM's `LogItemNameType` members.
|
|
[Fact]
|
|
public void TheZoneStateAndPowerBoxesAreRead()
|
|
{
|
|
UserDefinedContest contest = new(UdcFile.Parse("""
|
|
[Contest]
|
|
Name=BOXTEST
|
|
EntryWindowInfo=RCVText, 400, CQZoneText, 300, SectionText, 300, PowerText, 300
|
|
FrameText=RST Zone Sect Pwr
|
|
"""));
|
|
|
|
Assert.Equal(
|
|
[ExchangeSlot.ReceivedReport, ExchangeSlot.Zone, ExchangeSlot.Section, ExchangeSlot.Power],
|
|
contest.ExchangeFieldsFor(TestLog.Germany).Select(f => f.Slot).ToList());
|
|
}
|
|
|
|
/// The sent-side boxes are in the same setting and are not exchange boxes.
|
|
[Fact]
|
|
public void TheSentBoxesAreLeftOutOfTheExchange()
|
|
{
|
|
UserDefinedContest contest = new(UdcFile.Parse("""
|
|
[Contest]
|
|
Name=SENTTEST
|
|
EntryWindowInfo=SNTText, 400, SntNrText, 300, RCVText, 400, RcvNrText, 300
|
|
FrameText=Snt SntNr RST Nr
|
|
"""));
|
|
|
|
Assert.Equal(
|
|
[ExchangeSlot.ReceivedReport, ExchangeSlot.SerialNumber],
|
|
contest.ExchangeFieldsFor(TestLog.Germany).Select(f => f.Slot).ToList());
|
|
}
|
|
}
|