using Nonemm.Contests; using Nonemm.Contests.Rules; using Nonemm.Core; using Nonemm.Core.Calls; using Nonemm.Storage; namespace Nonemm.Session.Tests; public class MessageExpanderTests { private static RadioPosition Session(CallHistory? history = null, int radioNumber = 1) { FakeLogStore store = new(); ContestInstance instance = store.AddContest(new ContestInstance { ContestNumber = 0, ContestName = "CQWW", SentExchange = "14", }); return new RadioPosition( new ContestSession( store, new CqWorldWide(ModeCategory.Cw), instance, new StationInfo { Callsign = "DL1ABC", CqZone = 14, Name = "Erik", GridSquare = "JN88" }, null, history), radioNumber); } [Fact] public void MyCallAndTheirCallAreFilledIn() { RadioPosition session = Session(); session.Entry.Call = "JA1XYZ"; Assert.Equal("JA1XYZ DE DL1ABC", MessageExpander.Expand("{CALL} DE {MYCALL}", session)); } [Fact] public void TheSentExchangeComesFromTheContestSetup() => Assert.Equal("599 14", MessageExpander.Expand("{SENTRST} {EXCH}", Session())); [Fact] public void HashIsTheSerialNumber() => Assert.Equal("NR 1", MessageExpander.Expand("NR #", Session())); [Fact] public void CutNumbersReplaceZeroAndNine() => Assert.Equal("5NN", MessageExpander.Expand("{SENTRSTCUT}", Session())); [Fact] public void AMacroThatIsNotKnownDisappears() => Assert.Equal("TU ", MessageExpander.Expand("TU {NOTAMACRO}", Session())); [Fact] public void AnUnclosedMacroIsLeftAsTyped() => Assert.Equal("TU {MYCALL", MessageExpander.Expand("TU {MYCALL", Session())); [Fact] public void TheSingleCharacterMacrosAreTheirCallMyCallAndTheSerial() { RadioPosition session = Session(); session.Entry.Call = "JA1XYZ"; Assert.Equal("JA1XYZ 599 1 DE DL1ABC", MessageExpander.Expand("! 599 # DE *", session)); } [Fact] public void TheirCallFallsBackToTheLastOneLogged() { RadioPosition session = Session(); session.Entry.Call = "JA1XYZ"; session.Entry.Set(ExchangeSlot.ReceivedReport, "599"); session.Entry.Set(ExchangeSlot.Zone, "25"); session.LogContact(); Assert.Equal("JA1XYZ JA1XYZ", MessageExpander.Expand("{CALL} {LASTCALL}", session)); } [Fact] public void TheFrequencySendsRForTheDecimalPointOnCw() { RadioPosition session = Session(); session.Tune(Frequency.FromKilohertz(14_025.5)); Assert.Equal("14025R5 14026", MessageExpander.Expand("{FREQ} {FREQROUND}", session)); } [Fact] public void TheOtherRadioFillsInTheOtherMacros() { RadioPosition here = Session(); RadioPosition there = Session(radioNumber: 2); there.Tune(Frequency.FromKilohertz(3_525)); Assert.Equal("3525R0 3R5 80M", MessageExpander.Expand("{OTHERFREQ} {OTHERMHZ} {OTHERBAND}", here, there)); } [Fact] public void WithOneRadioTheOtherMacrosStandForNothing() => Assert.Equal("", MessageExpander.Expand("{OTHERFREQ}{OTHERMHZ}{OTHERBAND}", Session())); [Fact] public void TheNameComesFromTheCallHistoryWhenTheContestHasNoNameBox() { RadioPosition session = Session(CallHistory.Parse("!!Order!!,Call,Name\nJA1XYZ,Ken")); session.Entry.Call = "JA1XYZ"; Assert.Equal("TU Ken GL", MessageExpander.Expand("TU {NAMEANDSPACE}GL", session)); } [Fact] public void MyGridAndTheirsAreDifferentMacros() { RadioPosition session = Session(CallHistory.Parse("!!Order!!,Call,LOC1\nJA1XYZ,PM95")); session.Entry.Call = "JA1XYZ"; Assert.Equal("JN88 PM95", MessageExpander.Expand("{GRID} {GRIDSQUARE}", session)); } }