public void TestParseInvalid() { // launch decoding (forecast was cancelled) var d = TafDecoder.ParseNotStrict("TAF LFMT 032244Z 0318/0206 CNL"); Assert.IsFalse(d.IsValid); // launch decoding (surface wind is invalid) d = TafDecoder.ParseNotStrict("TAF TAF LIRU 032244Z 0318/0420 2300ABKT PSSM\nBKN020CB TX05/0318Z TNM03/0405Z\n"); Assert.IsFalse(d.IsValid); }
public void TestParseDefaultStrictMode() { // strict mode, max 1 error triggered TafDecoder.SetStrictParsing(true); var d = TafDecoder.Parse("TAF TAF LIR 032244Z 0318/0206 23010KT P6SM BKN020CB TX05/0318Z TNM03/0405Z\n"); Assert.AreEqual(1, d.DecodingExceptions.Count); // not strict: several errors triggered (6 because the icao failure causes the next ones to fail too) TafDecoder.SetStrictParsing(false); d = TafDecoder.Parse("TAF TAF LIR 032244Z 0318/0206 23010KT\n"); Assert.AreEqual(6, d.DecodingExceptions.Count); }
static void Main(string[] args) { TafDecoder.SetStrictParsing(true); var options = new Options(); if (Parser.Default.ParseArguments(args, options)) { var decodedTaf = TafDecoder.ParseWithMode(options.Taf); Display(decodedTaf); } }
public void TestParseErrors(Tuple <string, Type, string> source) { // launch decoding DecodedTaf decodedTaf = TafDecoder.ParseNotStrict(source.Item1); // check the error triggered Assert.NotNull(decodedTaf); Assert.False(decodedTaf.IsValid, "DecodedTaf should be invalid."); var errors = decodedTaf.DecodingExceptions; Assert.AreEqual(source.Item2, errors.FirstOrDefault().ChunkDecoder.GetType(), "ChunkDecoder type is incorrect."); Assert.AreEqual(source.Item3, errors.FirstOrDefault().RemainingTaf, "RemainingTaf is incorrect."); decodedTaf.ResetDecodingExceptions(); Assert.AreEqual(0, decodedTaf.DecodingExceptions.Count, "DecodingExceptions should be empty."); }
public void TestParse(EvolutionChunkDecoderTester chunk) { var decodedTaf = TafDecoder.ParseStrict(chunk.Base); evoDecoder.IsStrict = chunk.Strict; evoDecoder.Parse(chunk.EvoChunk + " END", decodedTaf); var windEvolutions = decodedTaf?.SurfaceWind?.Evolutions; Assert.IsNotNull(windEvolutions, "No surface winds!"); if (windEvolutions.Count == 0) { Assert.Fail("No wind evolution!"); } // global evolution attributes (no point testing them in each evolution as they never change) Assert.AreEqual(chunk.Type, windEvolutions[0].Type); Assert.AreEqual(chunk.Probability, windEvolutions[0].Probability); Assert.AreEqual(chunk.FromDay, windEvolutions[0].FromDay); Assert.AreEqual(chunk.FromTime, windEvolutions[0].FromTime); Assert.AreEqual(chunk.ToDay, windEvolutions[0].ToDay); Assert.AreEqual(chunk.ToTime, windEvolutions[0].ToTime); if (!string.IsNullOrEmpty(chunk.Element.EmbEvolutionType)) { // it's embedded in the second evolution Assert.LessOrEqual(2, windEvolutions.Count); var embEvolutions = windEvolutions[1].Evolutions; Assert.AreEqual(chunk.Element.EmbEvolutionType, embEvolutions[0].Type); } // surfaceWind attributes Assert.AreEqual(chunk.Element.WindDirection, (windEvolutions[0].Entity as SurfaceWind).MeanDirection.ActualValue); Assert.AreEqual(chunk.Element.WindSpeed, (windEvolutions[0].Entity as SurfaceWind).MeanSpeed.ActualValue); var visiEvolutions = decodedTaf.Visibility.Evolutions; Assert.IsNotNull(visiEvolutions); Assert.AreEqual(chunk.Element.Cavok, visiEvolutions[0].Cavok); if (!visiEvolutions[0].Cavok) { // cavok and visibility are mutually exclusive Assert.AreEqual(chunk.Element.Visibility, (visiEvolutions[0].Entity as Visibility).ActualVisibility.ActualValue); Assert.AreEqual(chunk.Element.Greater, (visiEvolutions[0].Entity as Visibility).Greater); } if (chunk.Element.WeatherPhenomena.Count > 0) { if (decodedTaf.WeatherPhenomenons.Count > 0) { var proxyWeatherPhenomena = decodedTaf.WeatherPhenomenons; var weatherPhenomena = proxyWeatherPhenomena[0].Evolutions; var entity = weatherPhenomena[0].Entity as List <WeatherPhenomenon>; Assert.AreEqual(chunk.Element.WeatherIntensity, entity[0].IntensityProximity); Assert.AreEqual(chunk.Element.WeatherDesc, entity[0].Descriptor); Assert.AreEqual(chunk.Element.WeatherPhenomena, entity[0].Phenomena); } } var clouds = decodedTaf.Clouds; if (chunk.Element.CloudsBaseHeight.HasValue) { // 1 instead of 0 because each evo is considered a new layer var cloudsEvolutions = clouds[1].Evolutions; Assert.AreEqual(chunk.Type, cloudsEvolutions[0].Type); var cloudsLayers = cloudsEvolutions[0].Entity as List <CloudLayer>; Assert.AreEqual(chunk.Element.CloudsAmount, cloudsLayers[0].Amount); Assert.AreEqual(chunk.Element.CloudsBaseHeight, cloudsLayers[0].BaseHeight.ActualValue); } if (chunk.Element.MinimumTemperatureValue.HasValue) { Assert.IsNotNull(decodedTaf.MinimumTemperature); Assert.IsNotNull(decodedTaf.MaximumTemperature); var minTemps = decodedTaf.MinimumTemperature.Evolutions; var maxTemps = decodedTaf.MaximumTemperature.Evolutions; Assert.AreEqual(chunk.Element.MinimumTemperatureValue, (minTemps[0].Entity as Temperature).TemperatureValue.ActualValue); Assert.AreEqual(chunk.Element.MaximumTemperatureValue, (maxTemps[0].Entity as Temperature).TemperatureValue.ActualValue); } }
public void Setup() { DecodedTafs = TestTafSource.Select(taf => TafDecoder.ParseWithMode(taf)).ToList(); }
public void TestParseSecond() { var rawTaf = "TAF TAF LIRU 032244Z 0318/0406 23010KT P6SM +TSRA FG BKN020CB TX05/0318Z TNM03/0405Z"; var decoderTaf = TafDecoder.ParseWithMode(rawTaf); Assert.True(decoderTaf.IsValid); Assert.AreEqual("TAF TAF LIRU 032244Z 0318/0406 23010KT P6SM +TSRA FG BKN020CB TX05/0318Z TNM03/0405Z", decoderTaf.RawTaf); Assert.AreEqual(TafType.TAF, decoderTaf.Type); Assert.AreEqual("LIRU", decoderTaf.Icao); Assert.AreEqual(3, decoderTaf.Day); Assert.AreEqual("22:44 UTC", decoderTaf.Time); var forecastPeriod = decoderTaf.ForecastPeriod; Assert.AreEqual(3, forecastPeriod.FromDay); Assert.AreEqual(18, forecastPeriod.FromHour); Assert.AreEqual(4, forecastPeriod.ToDay); Assert.AreEqual(6, forecastPeriod.ToHour); var surfaceWind = decoderTaf.SurfaceWind; Assert.False(surfaceWind.VariableDirection); Assert.AreEqual(230, surfaceWind.MeanDirection.ActualValue); Assert.AreEqual(Value.Unit.Degree, surfaceWind.MeanDirection.ActualUnit); Assert.Null(surfaceWind.DirectionVariations); Assert.AreEqual(10, surfaceWind.MeanSpeed.ActualValue); Assert.AreEqual(Value.Unit.Knot, surfaceWind.MeanSpeed.ActualUnit); Assert.Null(surfaceWind.SpeedVariations); var visibility = decoderTaf.Visibility; Assert.AreEqual(6, visibility.ActualVisibility.ActualValue); Assert.AreEqual(Value.Unit.StatuteMile, visibility.ActualVisibility.ActualUnit); Assert.True(visibility.Greater); var weatherPhenomenons = decoderTaf.WeatherPhenomenons; Assert.AreEqual("+", weatherPhenomenons[0].IntensityProximity); Assert.AreEqual("TS", weatherPhenomenons[0].Descriptor); var phenomena = weatherPhenomenons[0].Phenomena; Assert.AreEqual("RA", phenomena[0]); phenomena = weatherPhenomenons[1].Phenomena; Assert.AreEqual("FG", phenomena[0]); var cloud = decoderTaf.Clouds[0]; Assert.AreEqual(CloudLayer.CloudAmount.BKN, cloud.Amount); Assert.AreEqual(2000, cloud.BaseHeight.ActualValue); Assert.AreEqual(Value.Unit.Feet, cloud.BaseHeight.ActualUnit); Assert.AreEqual(CloudLayer.CloudType.CB, cloud.Type); var minimumTemperature = decoderTaf.MinimumTemperature; Assert.AreEqual(-3, minimumTemperature.TemperatureValue.ActualValue); Assert.AreEqual(Value.Unit.DegreeCelsius, minimumTemperature.TemperatureValue.ActualUnit); Assert.AreEqual(4, minimumTemperature.Day); Assert.AreEqual(5, minimumTemperature.Hour); var maximumTemperature = decoderTaf.MaximumTemperature; Assert.AreEqual(5, maximumTemperature.TemperatureValue.ActualValue); Assert.AreEqual(Value.Unit.DegreeCelsius, maximumTemperature.TemperatureValue.ActualUnit); Assert.AreEqual(3, maximumTemperature.Day); Assert.AreEqual(18, maximumTemperature.Hour); }