using Nonemm.Contests; using Nonemm.Contests.Rules; using Nonemm.Core; using Nonemm.Core.Country; using Nonemm.Storage; namespace Nonemm.Session.Tests; /// Two radios sharing one contest. public class ContestSessionTests { private static readonly StationInfo Me = new() { Callsign = "DL1ABC", CqZone = 14, Continent = "EU", CountryPrefix = "DL", }; private static ContestSession Session() { FakeLogStore store = new(); ContestInstance instance = store.AddContest(new ContestInstance { ContestNumber = 0, ContestName = "CQWPXCW", }); return new ContestSession(store, new CqWpx(ModeCategory.Cw), instance, Me, null); } private static void Type(OperatingPosition radio, string call, string number) { radio.Entry.Call = call; radio.Entry.Set(ExchangeSlot.ReceivedReport, "599"); radio.Entry.Set(ExchangeSlot.SerialNumber, number); } [Fact] public void BothRadiosLogIntoTheSameLog() { ContestSession session = Session(); OperatingPosition first = new(session, 1); OperatingPosition second = new(session, 2); Type(first, "JA1XYZ", "1"); first.LogContact(); Type(second, "W3LPL", "2"); second.LogContact(); Assert.Equal(2, session.Log.Qsos.Count); Assert.Equal([1, 2], session.Log.Qsos.Select(q => q.RadioNumber)); } /// Serial numbers belong to the station, not to a radio, so the second /// radio carries on where the first left off. [Fact] public void SerialNumbersCountUpAcrossBothRadios() { ContestSession session = Session(); OperatingPosition first = new(session, 1); OperatingPosition second = new(session, 2); Type(first, "JA1XYZ", "1"); Assert.Equal(1, first.LogContact().SentNumber); Type(second, "W3LPL", "2"); Assert.Equal(2, second.LogContact().SentNumber); } /// A station worked on radio 1 is a dupe on radio 2, or the second radio /// spends the contest working stations again. [Fact] public void AStationWorkedOnOneRadioIsADupeOnTheOther() { ContestSession session = Session(); OperatingPosition first = new(session, 1); OperatingPosition second = new(session, 2); Type(first, "JA1XYZ", "1"); first.LogContact(); Type(second, "JA1XYZ", "2"); Assert.True(second.Verdict()?.IsDupe); } /// The two radios are on different bands and are running or searching /// independently, so neither of those can be shared. [Fact] public void EachRadioKeepsItsOwnFrequencyAndRunState() { ContestSession session = Session(); OperatingPosition first = new(session, 1); OperatingPosition second = new(session, 2); first.Tune(Frequency.FromKilohertz(14_025)); first.IsRunning = true; second.Tune(Frequency.FromKilohertz(7_025)); Assert.Equal(14_025_000, first.Frequency.Hertz); Assert.Equal(7_025_000, second.Frequency.Hertz); Assert.True(first.IsRunning); Assert.False(second.IsRunning); } [Fact] public void WhatIsTypedOnOneRadioStaysThere() { ContestSession session = Session(); OperatingPosition first = new(session, 1); OperatingPosition second = new(session, 2); Type(first, "JA1XYZ", "1"); Assert.Equal("", second.Entry.Call); } }