public void TestEinzelstrecke()
        {
            var target = new VerbindungsErzeugung(new FahrplanProviderMock());
            this.results = new List<Verbindung>();

            target.OnVerbindung += MerkeVerbindungInListe;

            Strecke s = new Strecke();
            s.Linienname = "U1";
            s.Zielhaltestellenname = "H2";

            Pfad pfad = new Pfad();
            pfad.Starthaltestellenname = "H1";
            pfad.Strecken = new Strecke[1];
            pfad.Strecken[0] = s;

            target.Verbindugen_zu_Pfad_bilden(pfad, Time(9, 0));

            Assert.AreEqual(1, this.results.Count);
            var res = this.results[0];
            Assert.AreEqual("H1", res.Pfad.Starthaltestellenname);
            Assert.AreEqual(1, res.Pfad.Strecken.Length);
            Assert.AreEqual("H2", res.Pfad.Strecken[0].Zielhaltestellenname);
            Assert.AreEqual(1, res.Fahrtzeiten.Length);
            Assert.AreEqual(Time(9, 0), res.Fahrtzeiten[0].Abfahrtszeit);
            Assert.AreEqual(Time(9, 2), res.Fahrtzeiten[0].Ankunftszeit);
        }
        /// <summary>
        /// Aus Pfaden Verbindungen bilden.
        /// </summary>
        /// <param name="pfad">
        /// The pfad.
        /// </param>
        /// <param name="startzeit">
        /// The startzeit.
        /// </param>
        public void Verbindugen_zu_Pfad_bilden(Pfad pfad, DateTime startzeit)
        {
            if (this.OnVerbindung == null)
            {
                throw new InvalidOperationException("Event OnVerbindung is not specified.");
            }

            if (pfad == null)
            {
                this.OnVerbindung(null);
                return;
            }

            foreach (var verbindungOhneZeit in this.Verbindungenerzeugen(pfad))
            {
                var verbindungMitZeit = this.FahrzeitenZuordnen(verbindungOhneZeit);

                if (verbindungMitZeit == null)
                {
                    continue;
                }

                var verbindungEingeschraenkt = this.EinschraenkenNachFahrzeit(verbindungMitZeit, startzeit);

                if (verbindungEingeschraenkt == null)
                {
                    continue;
                }

                this.OnVerbindung(verbindungEingeschraenkt);
            }
        }
        public Pfad ErstellePfad()
        {
            var pfad = new Pfad()
             {
            Starthaltestellenname = this.Starthaltestelle.Name,
            Strecken = GetStreckenArray()
             };

             return pfad;
        }
        /// <summary>
        /// Erzeugt die Verbindungen aus den gegebenen Pfaden.
        /// </summary>
        /// <param name="pfad">
        /// The pfad.
        /// </param>
        /// <returns>
        /// The <see cref="Verbindung"/>.
        /// </returns>
        internal IEnumerable<Verbindung> Verbindungenerzeugen(Pfad pfad)
        {
            var linienName = pfad.Strecken.First().Linienname;
            var startHalteStelle = pfad.Starthaltestellenname;

            var abfahrtszeiten = this.fahrplanProvider.Abfahrtszeiten_bei_Haltestelle(linienName, startHalteStelle);

            foreach (var zeit in abfahrtszeiten)
            {
                var verbindung = new Verbindung { Pfad = pfad, Fahrtzeiten = new Fahrtzeit[pfad.Strecken.Length] };

                for (int i = 0; i < pfad.Strecken.Length; i++)
                {
                    verbindung.Fahrtzeiten[i] = new Fahrtzeit();
                }

                // Startzeit der Verbindung ist nur hier bekannt
                verbindung.Fahrtzeiten[0].Abfahrtszeit = zeit;
                yield return verbindung;
            }
        }
        public void TestNullEvent()
        {
            var target = new VerbindungsErzeugung(new FahrplanProviderMock());
            this.results = new List<Verbindung>();

            Strecke s = new Strecke();
            s.Linienname = "U1";
            s.Zielhaltestellenname = "H2";
            Pfad p = new Pfad();
            p.Starthaltestellenname = "H1";
            p.Strecken = new Strecke[1];
            p.Strecken[0] = s;

            target.Verbindugen_zu_Pfad_bilden(p, Time(8, 0));
        }
        public void TestZweiStreckenMehrereVerbindungen()
        {
            var target = new VerbindungsErzeugung(new FahrplanProviderMock());
            this.results = new List<Verbindung>();

            target.OnVerbindung += MerkeVerbindungInListe;

            Pfad pfad = new Pfad();
            pfad.Starthaltestellenname = "H1";
            pfad.Strecken = new Strecke[2];

            Strecke s = new Strecke();
            s.Linienname = "U1";
            s.Zielhaltestellenname = "H2";
            pfad.Strecken[0] = s;

            s = new Strecke();
            s.Linienname = "U3";
            s.Zielhaltestellenname = "H3";
            pfad.Strecken[1] = s;

            target.Verbindugen_zu_Pfad_bilden(pfad, Time(8, 40));

            Assert.AreEqual(3, this.results.Count);
            Assert.AreEqual(Time(8, 48), this.results[0].Fahrtzeiten[1].Ankunftszeit);
            Assert.AreEqual(Time(8, 58), this.results[1].Fahrtzeiten[1].Ankunftszeit);
            Assert.AreEqual(Time(9, 08), this.results[2].Fahrtzeiten[1].Ankunftszeit);
        }
        public void TestUmsteigezeitZuSpät()
        {
            var target = new VerbindungsErzeugung(new FahrplanProviderMock());
            this.results = new List<Verbindung>();

            target.OnVerbindung += MerkeVerbindungInListe;

            Pfad pfad = new Pfad();
            pfad.Starthaltestellenname = "H1";
            pfad.Strecken = new Strecke[2];

            Strecke s = new Strecke();
            s.Linienname = "U2";
            s.Zielhaltestellenname = "H2";
            pfad.Strecken[0] = s;

            s = new Strecke();
            s.Linienname = "U1";
            s.Zielhaltestellenname = "H3";
            pfad.Strecken[1] = s;

            target.Verbindugen_zu_Pfad_bilden(pfad, Time(9, 07));

            Assert.AreEqual(0, this.results.Count);
        }