Files
Nonemm/tests/Nonemm.Contests.Tests/UserDefinedContestTests.cs
ericek111 0ef12ff8be Read the exchange boxes a published .udc file actually names
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>
2026-08-27 23:37:54 +00:00

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());
}
}