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.");
    }
Esempio n. 5
0
        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);
    }