using Nonemm.Core; using Nonemm.Core.Calls; using Nonemm.Core.Country; namespace Nonemm.Spotting.Tests; public class SpotFilterTests { private static readonly DateTime Now = new(2026, 5, 30, 12, 0, 0, DateTimeKind.Utc); /// Enough of a country file to place the spotters these tests use. private static readonly CountryFile Countries = CountryFile.Parse( """ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: K,W,N,AA; Germany: 14: 28: EU: 51.00: -10.00: -1.0: DL: DL,DK,DJ; Japan: 25: 45: AS: 36.00: -138.00: -9.0: JA: JA,JH,JR; """); private static Spot From(string spotter, string call = "OM5M", double kilohertz = 14_025, string comment = "") => new(Callsign.Parse(call), Frequency.FromKilohertz(kilohertz), Now, SpotSource.Cluster, spotter, comment); [Fact] public void AFilterNobodyHasTouchedTakesEverything() { Assert.True(new SpotFilter().Accepts(From("W3LPL"))); } [Fact] public void OnlyTheChosenBandsGetThrough() { SpotFilter filter = new() { Bands = [Bands.Band20M] }; Assert.True(filter.Accepts(From("W3LPL", kilohertz: 14_025))); Assert.False(filter.Accepts(From("W3LPL", kilohertz: 21_025))); } [Fact] public void TheModeComesFromTheBandPlan() { SpotFilter filter = new() { Modes = [ModeCategory.Cw] }; Assert.True(filter.Accepts(From("W3LPL", kilohertz: 14_025))); Assert.False(filter.Accepts(From("W3LPL", kilohertz: 14_250))); } [Fact] public void BeaconsAreDroppedWhenTheyAreTurnedOff() { SpotFilter filter = new() { ShowBeacons = false }; Assert.False(filter.Accepts(From("W3LPL", comment: "NCDXF BCN"))); Assert.True(filter.Accepts(From("W3LPL", comment: "CQ contest"))); } [Fact] public void ABlacklistedSpotterAndABlacklistedCallAreDropped() { SpotFilter filter = new() { BlockedSpotters = ["W3LPL"], BlockedCalls = ["OM5M"] }; Assert.False(filter.Accepts(From("w3lpl", call: "DL1ABC"))); Assert.False(filter.Accepts(From("K1TTT", call: "OM5M"))); Assert.True(filter.Accepts(From("K1TTT", call: "DL1ABC"))); } [Fact] public void MyContinentOnlyKeepsTheSpottersFromIt() { SpotFilter filter = new() { Countries = Countries, MyContinent = "EU", MyContinentOnly = true, }; Assert.True(filter.Accepts(From("DL1ABC"))); Assert.False(filter.Accepts(From("JA1XYZ"))); } [Fact] public void MyCountryOnlyKeepsTheSpottersFromIt() { SpotFilter filter = new() { Countries = Countries, MyCountry = "K", MyCountryOnly = true, }; Assert.True(filter.Accepts(From("W3LPL"))); Assert.False(filter.Accepts(From("DL1ABC"))); } [Fact] public void ASpotterMatchingAnyOfTheChoicesGetsThrough() { SpotFilter filter = new() { Countries = Countries, MyCountry = "K", MyCountryOnly = true, CallAreas = ["JA1"], }; Assert.True(filter.Accepts(From("W3LPL"))); Assert.True(filter.Accepts(From("JA1XYZ"))); Assert.False(filter.Accepts(From("DL1ABC"))); } [Fact] public void WithoutACountryFileTheCountryFiltersLetSpotsThrough() { SpotFilter filter = new() { MyContinent = "EU", MyContinentOnly = true }; Assert.True(filter.Accepts(From("JA1XYZ"))); } [Fact] public void WhatTheOperatorSpottedIsNeverFiltered() { SpotFilter filter = new() { Bands = [Bands.Band20M] }; Spot mine = new( Callsign.Parse("OM5M"), Frequency.FromKilohertz(21_025), Now, SpotSource.Operator); Assert.True(filter.Accepts(mine)); } [Fact] public void ACallOneCharacterOffAKnownCallIsABust() { SpotFilter filter = new() { Calls = CallDatabase.Parse("OM5M\nDL1ABC\nJA1XYZ"), RemoveBustedSpots = true, }; Assert.True(filter.Accepts(From("W3LPL", call: "OM5M"))); Assert.False(filter.Accepts(From("W3LPL", call: "OM5N"))); Assert.False(filter.Accepts(From("W3LPL", call: "DL1AB"))); Assert.False(filter.Accepts(From("W3LPL", call: "DL1ABCD"))); } [Fact] public void ACallNothingResemblesIsKept() { SpotFilter filter = new() { Calls = CallDatabase.Parse("OM5M\nDL1ABC"), RemoveBustedSpots = true, }; Assert.True(filter.Accepts(From("W3LPL", call: "VK9XY"))); } [Fact] public void WithoutACallsignDatabaseNothingIsCalledBusted() { SpotFilter filter = new() { RemoveBustedSpots = true }; Assert.True(filter.Accepts(From("W3LPL", call: "OM5N"))); } [Fact] public void OnlyTheStationsInTheCallHistoryGetThrough() { SpotFilter filter = new() { History = CallHistory.Parse("!!Order!!,Call,Name\nOM5M,Erik"), OnlyInCallHistory = true, }; Assert.True(filter.Accepts(From("W3LPL", call: "OM5M"))); Assert.False(filter.Accepts(From("W3LPL", call: "DL1ABC"))); } }