Add CW keying, function key messages and the documentation

The function keys send through cwdaemon or a WinKeyer, with N1MM's message
macros. Escape stops sending.

Settings are read with the reflection serializer rather than a generated one:
the generated one hands back null for every property the file leaves out
instead of the value the property is declared with, which crashed the program
the first time a new setting was added.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik
2026-08-27 11:23:30 +00:00
parent d96cbe146b
commit f5aa77ece3
25 changed files with 1002 additions and 26 deletions

View File

@@ -0,0 +1,54 @@
using Nonemm.Contests;
using Nonemm.Contests.Rules;
using Nonemm.Core;
using Nonemm.Storage;
namespace Nonemm.Session.Tests;
public class MessageExpanderTests
{
private static LoggingSession Session()
{
FakeLogStore store = new();
ContestInstance instance = store.AddContest(new ContestInstance
{
ContestNumber = 0,
ContestName = "CQWW",
SentExchange = "14",
});
return new LoggingSession(
store,
new CqWorldWide(ModeCategory.Cw),
instance,
new StationInfo { Callsign = "DL1ABC", CqZone = 14, Name = "Erik" },
null);
}
[Fact]
public void MyCallAndTheirCallAreFilledIn()
{
LoggingSession 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()));
}