Files
Nonemm/tests/Nonemm.Session.Tests/MessageExpanderTests.cs
ericek111 654adda080 Keep an operator's windows, colours and recordings
Ctrl+O asks who is at the radio, as it does in N1MM, and the callsign goes on
every contact logged from then on. A multi-operator station changes hands every
few hours, so each operator also keeps what he wants the program to look like:
where the windows sit, the theme, and the folder his recordings are in.

The windows on the screen are stored against the operator leaving, before the
dialog opens, and the operator taking over gets his own back. A window he opens
later is placed as it appears. An operator who is new to the list starts with
whatever is on the screen.

Nothing plays the recordings yet, so the folder is stored and waits on voice
keying. {OPERATOR} in a message sends the callsign.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoGtneMQaz4M9w7Kk49AVD
2026-08-31 22:28:18 +00:00

135 lines
4.3 KiB
C#

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 OperatingPosition Session(CallHistory? history = null, int radioNumber = 1)
{
FakeLogStore store = new();
ContestInstance instance = store.AddContest(new ContestInstance
{
ContestNumber = 0,
ContestName = "CQWW",
SentExchange = "14",
});
return new OperatingPosition(
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()
{
OperatingPosition 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()
{
OperatingPosition session = Session();
session.Entry.Call = "JA1XYZ";
Assert.Equal("JA1XYZ 599 1 DE DL1ABC", MessageExpander.Expand("! 599 # DE *", session));
}
[Fact]
public void TheirCallFallsBackToTheLastOneLogged()
{
OperatingPosition 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()
{
OperatingPosition session = Session();
session.Tune(Frequency.FromKilohertz(14_025.5));
Assert.Equal("14025R5 14026", MessageExpander.Expand("{FREQ} {FREQROUND}", session));
}
[Fact]
public void TheOtherRadioFillsInTheOtherMacros()
{
OperatingPosition here = Session();
OperatingPosition 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()
{
OperatingPosition 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()
{
OperatingPosition session = Session(CallHistory.Parse("!!Order!!,Call,LOC1\nJA1XYZ,PM95"));
session.Entry.Call = "JA1XYZ";
Assert.Equal("JN88 PM95", MessageExpander.Expand("{GRID} {GRIDSQUARE}", session));
}
/// N1MM's {OPERATOR}: who is at the radio, which is not always whose
/// callsign the station is on the air with.
[Fact]
public void TheOperatorIsWhoeverIsAtTheRadio()
{
OperatingPosition session = Session();
Assert.Equal("DL1ABC", MessageExpander.Expand("{OPERATOR}", session));
session.Session.Operator = "OM3KFF";
Assert.Equal("OM3KFF", MessageExpander.Expand("{OPERATOR}", session));
}
}