using GeoVLog.Core.Parsers; using System; using System.Text; using Xunit; namespace GeoVLog.Tests.Parsers; public class GpsParserTests { [Fact] [Trait("Category", "Core")] public void ParsesValidRmc() { var msg = Encoding.ASCII.GetBytes("$GPRMC,103021.00,A,1754.84632,S,03105.65138,E,0.009,,061222,,,D*67"); var timestamp = new DateTime(2022, 12, 6, 10, 30, 21, DateTimeKind.Utc); var ok = GpsParser.TryParse(msg, timestamp, out var parsed); Assert.True(ok); Assert.Equal("$GPRMC", parsed.SentenceId); Assert.Equal(timestamp, parsed.TimestampUtc); Assert.Equal(-17.914105, parsed.LatitudeDeg!.Value, 6); Assert.Equal(31.094189, parsed.LongitudeDeg!.Value, 6); Assert.Equal(0.009, parsed.SpeedKnots!.Value, 3); Assert.Null(parsed.AltitudeM); Assert.Equal('D', parsed.Mode); } [Fact] [Trait("Category", "Core")] public void ParsesValidGga() { var msg = Encoding.ASCII.GetBytes("$GPGGA,103021.00,1754.84632,S,03105.65138,E,2,11,0.74,1496.3,M,1.0,M,,0000*4A"); var timestamp = new DateTime(2022, 12, 6, 10, 30, 21, DateTimeKind.Utc); var ok = GpsParser.TryParse(msg, timestamp, out var parsed); Assert.True(ok); Assert.Equal("$GPGGA", parsed.SentenceId); Assert.Equal(timestamp, parsed.TimestampUtc); Assert.Equal(1496.3, parsed.AltitudeM!.Value, 1); Assert.Equal(11, parsed.NumSatellites); Assert.Equal(0.74f, parsed.Hdop!.Value, 2); } [Fact] [Trait("Category", "Core")] public void RejectsInvalidChecksum() { var msg = Encoding.ASCII.GetBytes("$GPRMC,103021.00,A,1754.84632,S,03105.65138,E,0.009,,061222,,,D*00"); Assert.False(GpsParser.TryParse(msg, DateTime.UtcNow, out _)); } }