using Nonemm.Contests; using Nonemm.Session; namespace Nonemm.Session.Tests; /// Where a word clicked in the receive pane goes. public class DigitalElementTests { private static readonly ExchangeField[] SweepstakesLike = [ new ExchangeField("Nr", ExchangeSlot.SerialNumber, ExchangeFieldKind.Number), new ExchangeField("Prec", ExchangeSlot.Precedence, ExchangeFieldKind.Precedence), new ExchangeField("Ck", ExchangeSlot.Check, ExchangeFieldKind.Check), new ExchangeField("Sect", ExchangeSlot.Section, ExchangeFieldKind.ArrlSection), ]; private static readonly ExchangeField[] NameAndState = [ new ExchangeField("RST", ExchangeSlot.ReceivedReport, ExchangeFieldKind.Report), new ExchangeField("Name", ExchangeSlot.Name, ExchangeFieldKind.Text), new ExchangeField("S/P", ExchangeSlot.Exchange1, ExchangeFieldKind.UsStateOrCanadianProvince), ]; [Fact] public void EachKindOfValueFindsItsOwnBox() { EntryFields fields = new(SweepstakesLike); Assert.Equal(1, DigitalElement.FieldFor(fields, "123")); Assert.Equal(2, DigitalElement.FieldFor(fields, "A")); Assert.Equal(3, DigitalElement.FieldFor(fields, "72")); Assert.Equal(4, DigitalElement.FieldFor(fields, "STX")); } /// A state is not put in the name box just because that box comes first. [Fact] public void ABoxWithAListBehindItComesBeforeAPlainTextBox() { EntryFields fields = new(NameAndState); Assert.Equal(3, DigitalElement.FieldFor(fields, "OH")); Assert.Equal(2, DigitalElement.FieldFor(fields, "PETER")); } [Fact] public void TheReportBoxIsNeverClickedInto() { EntryFields fields = new(NameAndState); Assert.False(DigitalElement.Fits(NameAndState[0], "599")); Assert.NotEqual(1, DigitalElement.FieldFor(fields, "599")); } [Fact] public void AnEmptyBoxIsFilledBeforeOneThatAlreadyHasAValue() { EntryFields fields = new(NameAndState); fields[2] = "JOE"; Assert.Equal(2, DigitalElement.FieldFor(fields, "MIKE")); } /// Every box that takes the word is full, so the first one is written over /// rather than the click doing nothing. [Fact] public void AFullBoxIsWrittenOverWhenNoOtherBoxTakesIt() { EntryFields fields = new(SweepstakesLike); fields[4] = "EMA"; Assert.Equal(4, DigitalElement.FieldFor(fields, "STX")); } /// N1MM puts a clicked word in the box the cursor is in, and so does this /// where that box takes the word: a two-figure serial number typed into the /// serial box is not moved to the check box behind the operator's back. [Fact] public void TheBoxWithTheCursorComesFirst() { EntryFields fields = new(SweepstakesLike); fields.FocusOn(1); Assert.Equal(1, DigitalElement.FieldFor(fields, "72")); } [Fact] public void NothingTakesAWordTheContestDoesNotExchange() { EntryFields fields = new(SweepstakesLike); Assert.Null(DigitalElement.FieldFor(fields, "TU")); } [Theory] [InlineData("599123", "123")] [InlineData("599", "599")] [InlineData("OH:", "OH")] [InlineData("1234Z", "1234")] [InlineData(" om5m ", "OM5M")] public void WhatRttyCarriesAroundAValueIsCutOff(string clicked, string expected) => Assert.Equal(expected, DigitalElement.Trim(clicked)); [Fact] public void APowerIsTakenWithOrWithoutItsUnit() { ExchangeField power = new("Pwr", ExchangeSlot.Section, ExchangeFieldKind.Power); Assert.True(DigitalElement.Fits(power, "100")); Assert.True(DigitalElement.Fits(power, "5W")); Assert.True(DigitalElement.Fits(power, "1KW")); Assert.False(DigitalElement.Fits(power, "KILOWATT")); } [Fact] public void AGridIsFourOrSixCharacters() { ExchangeField grid = new("Grid", ExchangeSlot.GridSquare, ExchangeFieldKind.Grid); Assert.True(DigitalElement.Fits(grid, "JN88")); Assert.True(DigitalElement.Fits(grid, "JN88DS")); Assert.False(DigitalElement.Fits(grid, "JN8")); Assert.False(DigitalElement.Fits(grid, "8888")); } }