Files
Nonemm/tests/Nonemm.Session.Tests/FakeLogStore.cs
Erik d96cbe146b Write what N1MM needs before it will open a log
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>
2026-08-27 11:15:48 +00:00

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()
{
}
}