Checked by opening a log this program wrote in N1MM 1.0.11031. Three things it rejected: - a log naming a contest with no row in the Contest table throws "No current row" in Contest.FromRow, so the definition row is written whenever a contest is opened; - an empty overlay category is answered with "Invalid Overlay Category:", so an entry with no overlay now says "N/A", and the dialog offers N1MM's list; - the sent exchange omits the report, which is what N1MM's own contest dialog asks for. With those three fixed N1MM opens the log and shows the contacts. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
64 lines
2.0 KiB
C#
64 lines
2.0 KiB
C#
using Nonemm.Core;
|
|
using Nonemm.Storage;
|
|
|
|
namespace Nonemm.Session.Tests;
|
|
|
|
/// A log store that keeps everything in memory, so session tests do not need a
|
|
/// file. It keeps the one rule the sqlite store enforces: no two contacts with
|
|
/// the same call in the same second.
|
|
public sealed class FakeLogStore : LogStore
|
|
{
|
|
private readonly List<Qso> qsos = [];
|
|
private readonly List<ContestInstance> contests = [];
|
|
private readonly List<ContestDefinition> definitions = [];
|
|
|
|
public IReadOnlyList<ContestDefinition> Definitions => definitions;
|
|
|
|
public void SaveContestDefinition(ContestDefinition definition) =>
|
|
definitions.Add(definition);
|
|
|
|
public IReadOnlyList<ContestInstance> Contests() => contests;
|
|
|
|
public ContestInstance? Contest(int contestNumber) =>
|
|
contests.FirstOrDefault(c => c.ContestNumber == contestNumber);
|
|
|
|
public ContestInstance AddContest(ContestInstance instance)
|
|
{
|
|
ContestInstance stored = instance with { ContestNumber = contests.Count + 1 };
|
|
contests.Add(stored);
|
|
return stored;
|
|
}
|
|
|
|
public void UpdateContest(ContestInstance instance)
|
|
{
|
|
int at = contests.FindIndex(c => c.ContestNumber == instance.ContestNumber);
|
|
contests[at] = instance;
|
|
}
|
|
|
|
public IReadOnlyList<Qso> Qsos(int contestNumber) =>
|
|
qsos.Where(q => q.ContestNumber == contestNumber).OrderBy(q => q.TimestampUtc).ToList();
|
|
|
|
public Qso Add(Qso qso)
|
|
{
|
|
Qso candidate = qso;
|
|
while (qsos.Any(q => q.Call.Text == candidate.Call.Text && q.TimestampUtc == candidate.TimestampUtc))
|
|
{
|
|
candidate = candidate with { TimestampUtc = candidate.TimestampUtc.AddSeconds(1) };
|
|
}
|
|
qsos.Add(candidate);
|
|
return candidate;
|
|
}
|
|
|
|
public void Update(Qso qso)
|
|
{
|
|
int at = qsos.FindIndex(q => q.Id == qso.Id);
|
|
qsos[at] = qso;
|
|
}
|
|
|
|
public void Delete(string id) => qsos.RemoveAll(q => q.Id == id);
|
|
|
|
public void Dispose()
|
|
{
|
|
}
|
|
}
|