using Nonemm.Core; namespace Nonemm.Core.Tests; public class GridSquareTests { [Fact] public void FourCharacterSquareCentresOnTheSquare() { Assert.True(GridSquare.TryParse("JN88", out GridSquare grid)); Assert.Equal(48.5, grid.Latitude, 3); Assert.Equal(17.0, grid.Longitude, 3); } [Fact] public void SixCharacterSquareIsMorePrecise() { Assert.True(GridSquare.TryParse("FN31pr", out GridSquare grid)); Assert.Equal(41.7, grid.Latitude, 1); Assert.Equal(-72.7, grid.Longitude, 1); } [Theory] [InlineData("")] [InlineData("JN8")] [InlineData("SN89")] [InlineData("JNXY")] public void MalformedLocatorIsRejected(string text) => Assert.False(GridSquare.TryParse(text, out _)); [Fact] public void DistanceIsTheGreatCircleBetweenSquareCentres() { Assert.True(GridSquare.TryParse("JO99", out GridSquare jo99)); Assert.True(GridSquare.TryParse("IO91", out GridSquare io91)); Assert.InRange(jo99.DistanceTo(io91), 1525, 1540); } [Fact] public void BearingIsZeroDueNorth() { Assert.True(GridSquare.TryParse("JO99", out GridSquare south)); Assert.True(GridSquare.TryParse("JP90", out GridSquare north)); Assert.Equal(0, south.BearingTo(north), 6); } [Theory] [InlineData("JN88md")] [InlineData("FN31pr")] [InlineData("AA00aa")] [InlineData("RR99xx")] public void LocatorOfASquareCentreIsThatSquare(string locator) { Assert.True(GridSquare.TryParse(locator, out GridSquare grid)); Assert.Equal(locator, GridSquare.From(grid.Latitude, grid.Longitude)); } }