/// <summary>
        /// Hauptmethode
        /// </summary>
        public static void Run()
        {
            Console.WriteLine("\n\n----- Datenhaltung -----\n");

            Console.WriteLine("--- Laden der Datenbank");

            // Test der Ausnahmen vor Laden der Datenbank
            object dummy;

            CompareAndPrint(Datenbank.IstGeladen, false);
            ProvokeException(() => dummy = Datenbank.PeriodenIDs);
            ProvokeException(() => dummy = Datenbank.VolumenProMitarbeiter);
            ProvokeException(() => dummy = Datenbank.Durchschnittsgrößen(1));
            ProvokeException(() => dummy = Datenbank.Personalkosten(1));
            ProvokeException(() => dummy = Datenbank.Mitarbeiter(1));
            ProvokeException(() => dummy = Datenbank.Periode(1));
            ProvokeException(() => dummy = Datenbank.VolumenNeugeschäft(1));

            // Test der Plausibilitätsprüfungen
            ProvokeException(() => Datenbank.DatenbankAuslesen(null));
            ProvokeException(() => Datenbank.DatenbankAuslesen(" "));

            // Test, ob der Pfad auch wirklich genutzt wird
            ProvokeException(() => Datenbank.DatenbankAuslesen("AA:cf4rfnu"));

            // Datenbank laden
            Datenbank.DatenbankAuslesen(_LOCATION + _DBNAME);


            Console.WriteLine("--- Testen der Eigenschaften");

            Console.WriteLine("IstGeladen");
            CompareAndPrint(Datenbank.IstGeladen, true);
            IsNull(typeof(Datenbank).GetProperty("IstGeladen").GetSetMethod());

            Console.WriteLine("PeriodenIDs");
            CompareAndPrint(Enumerable.SequenceEqual(Datenbank.PeriodenIDs, new int[] { 1, 2, 3, 4, 5 }), true);
            IsNull(typeof(Datenbank).GetProperty("PeriodenIDs").GetSetMethod());
            Datenbank.PeriodenIDs[2] = 222;
            CompareAndPrint(Datenbank.PeriodenIDs[2], 3);

            Console.WriteLine("VolumenProMitarbeiter");
            VolumenProMitarbeiter volumenProMitarbeiter = Datenbank.VolumenProMitarbeiter;

            CompareAndPrint(volumenProMitarbeiter.Konsumkredite, 200);
            CompareAndPrint(volumenProMitarbeiter.Autokredite, 150);
            CompareAndPrint(volumenProMitarbeiter.Hypothekenkredite, 50);
            CompareAndPrint(volumenProMitarbeiter.Girokonten, 900);
            CompareAndPrint(volumenProMitarbeiter.Spareinlagen, 1200);
            CompareAndPrint(volumenProMitarbeiter.Termingelder, 1200);
            IsNull(typeof(Datenbank).GetProperty("VolumenProMitarbeiter").GetSetMethod());


            Console.WriteLine("--- Testen der Methoden");

            decimal f = 1000.0M;

            VorgabeZeile <Durchschnittsgrößen>[] vorgabeDurchschnittsgrößen = new VorgabeZeile <Durchschnittsgrößen>[]
            {
                new VorgabeZeile <Durchschnittsgrößen>(1, new Durchschnittsgrößen(29 * f, 38 * f, 80 * f, 6 * f, 9 * f, 18 * f)),
                new VorgabeZeile <Durchschnittsgrößen>(2, new Durchschnittsgrößen(29 * f, 38 * f, 85 * f, 6 * f, 9 * f, 18 * f)),
                new VorgabeZeile <Durchschnittsgrößen>(3, new Durchschnittsgrößen(30 * f, 40 * f, 90 * f, 6 * f, 10 * f, 20 * f)),
                new VorgabeZeile <Durchschnittsgrößen>(4, new Durchschnittsgrößen(30 * f, 40 * f, 95 * f, 6 * f, 10 * f, 20 * f)),
                new VorgabeZeile <Durchschnittsgrößen>(5, new Durchschnittsgrößen(30 * f, 40 * f, 100 * f, 6 * f, 10 * f, 20 * f))
            };
            TestDurchführen <Durchschnittsgrößen>(vorgabeDurchschnittsgrößen, Datenbank.Durchschnittsgrößen);

            VorgabeZeile <Mitarbeiter>[] vorgabeMitarbeiter = new VorgabeZeile <Mitarbeiter>[]
            {
                new VorgabeZeile <Mitarbeiter>(1, new Mitarbeiter(550, 500, 410, 0.095, 5)),
                new VorgabeZeile <Mitarbeiter>(2, new Mitarbeiter(560, 510, 400, 0.10, 5)),
                new VorgabeZeile <Mitarbeiter>(3, new Mitarbeiter(560, 505, 405, 0.09, 5)),
                new VorgabeZeile <Mitarbeiter>(4, new Mitarbeiter(550, 500, 410, 0.095, 5)),
                new VorgabeZeile <Mitarbeiter>(5, new Mitarbeiter(560, 510, 400, 0.10, 5))
            };
            TestDurchführen <Mitarbeiter>(vorgabeMitarbeiter, Datenbank.Mitarbeiter);

            VorgabeZeile <Periode>[] vorgabePeriode = new VorgabeZeile <Periode>[]
            {
                new VorgabeZeile <Periode>(1, new Periode(1, new DateTime(2014, 1, 1), new DateTime(2014, 12, 31))),
                new VorgabeZeile <Periode>(2, new Periode(2, new DateTime(2015, 1, 1), new DateTime(2015, 12, 31))),
                new VorgabeZeile <Periode>(3, new Periode(3, new DateTime(2016, 1, 1), new DateTime(2016, 12, 31))),
                new VorgabeZeile <Periode>(4, new Periode(4, new DateTime(2017, 1, 1), new DateTime(2017, 12, 31))),
                new VorgabeZeile <Periode>(5, new Periode(5, new DateTime(2018, 1, 1), new DateTime(2018, 12, 31)))
            };
            TestDurchführen <Periode>(vorgabePeriode, Datenbank.Periode);

            VorgabeZeile <Personalkosten>[] vorgabePersonalkosten = new VorgabeZeile <Personalkosten>[]
            {
                new VorgabeZeile <Personalkosten>(1, new Personalkosten(34000.00M, 9100.00M, 17500.00M, 470.00M)),
                new VorgabeZeile <Personalkosten>(2, new Personalkosten(35000.00M, 9400.00M, 18000.00M, 480.00M)),
                new VorgabeZeile <Personalkosten>(3, new Personalkosten(36000.00M, 9700.00M, 18500.00M, 490.00M)),
                new VorgabeZeile <Personalkosten>(4, new Personalkosten(37000.00M, 10000.00M, 19000.00M, 500.00M)),
                new VorgabeZeile <Personalkosten>(5, new Personalkosten(38000.00M, 10300.00M, 19500.00M, 510.00M))
            };
            TestDurchführen <Personalkosten>(vorgabePersonalkosten, Datenbank.Personalkosten);

            f = 10000000.0M;
            VorgabeZeile <VolumenNeugeschäft>[] vorgabeVolumenNeugeschäft = new VorgabeZeile <VolumenNeugeschäft>[]
            {
                new VorgabeZeile <VolumenNeugeschäft>(1, new VolumenNeugeschäft(135 * f, 100 * f, 90 * f, 130 * f, 220 * f, 110 * f)),
                new VorgabeZeile <VolumenNeugeschäft>(2, new VolumenNeugeschäft(150 * f, 108 * f, 100 * f, 135 * f, 240 * f, 120 * f)),
                new VorgabeZeile <VolumenNeugeschäft>(3, new VolumenNeugeschäft(140 * f, 110 * f, 95 * f, 140 * f, 222 * f, 115 * f)),
                new VorgabeZeile <VolumenNeugeschäft>(4, new VolumenNeugeschäft(135 * f, 100 * f, 90 * f, 130 * f, 220 * f, 110 * f)),
                new VorgabeZeile <VolumenNeugeschäft>(5, new VolumenNeugeschäft(150 * f, 108 * f, 100 * f, 135 * f, 240 * f, 120 * f))
            };
            TestDurchführen <VolumenNeugeschäft>(vorgabeVolumenNeugeschäft, Datenbank.VolumenNeugeschäft);


            Console.WriteLine("\n\n--- ERGEBNIS ---\n");

            if (_errors > 0)
            {
                ColorPrint("Fehler: " + _errors.ToString(), _bad_color);
            }
            else
            {
                ColorPrint("keine Fehler", _good_color);
            }

            Console.ReadKey();
        }
        /// <summary>
        /// Hauptmethode
        /// </summary>
        public static void Run()
        {
            #region Klasse BenötigteMitarbeiter
            Console.WriteLine("\n\n--- Klasse BenötigteMitarbeiter ---\n");

            // vorgegebene Werte
            const int anzahlKonsumkredite     = 10;
            const int anzahlAutokredite       = 20;
            const int anzahlHypothekenkredite = 30;
            const int anzahlGirokonten        = 40;
            const int anzahlSpareinlagen      = 50;
            const int anzahlTermingelder      = 60;
            const int backoffice                  = 70;
            const int frontoffice                 = 210;
            const int insgesamt                   = 280;
            const int nachFluktuation             = 300;
            const int nachFluktuationUndTraining1 = 290;
            const int nachFluktuationUndTraining2 = 280;
            const int nachFluktuationUndTraining3 = 270;
            const int neueinstellungen1           = 0;
            const int entlassungen1               = 10;
            const int neueinstellungen2           = 0;
            const int entlassungen2               = 0;
            const int neueinstellungen3           = 10;
            const int entlassungen3               = 0;

            // Objekte anlegen
            BenötigteMitarbeiter benötigteMitarbeiter1 = new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                                                  anzahlAutokredite,
                                                                                  anzahlHypothekenkredite,
                                                                                  anzahlGirokonten,
                                                                                  anzahlSpareinlagen,
                                                                                  anzahlTermingelder,
                                                                                  backoffice,
                                                                                  nachFluktuation,
                                                                                  nachFluktuationUndTraining1);
            BenötigteMitarbeiter benötigteMitarbeiter2 = new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                                                  anzahlAutokredite,
                                                                                  anzahlHypothekenkredite,
                                                                                  anzahlGirokonten,
                                                                                  anzahlSpareinlagen,
                                                                                  anzahlTermingelder,
                                                                                  backoffice,
                                                                                  nachFluktuation,
                                                                                  nachFluktuationUndTraining2);
            BenötigteMitarbeiter benötigteMitarbeiter3 = new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                                                  anzahlAutokredite,
                                                                                  anzahlHypothekenkredite,
                                                                                  anzahlGirokonten,
                                                                                  anzahlSpareinlagen,
                                                                                  anzahlTermingelder,
                                                                                  backoffice,
                                                                                  nachFluktuation,
                                                                                  nachFluktuationUndTraining3);

            // Test auf korrekte Werte der Eigenschaften
            CompareAndPrint(benötigteMitarbeiter1.Konsumkredite, anzahlKonsumkredite);
            CompareAndPrint(benötigteMitarbeiter1.Autokredite, anzahlAutokredite);
            CompareAndPrint(benötigteMitarbeiter1.Hypothekenkredite, anzahlHypothekenkredite);
            CompareAndPrint(benötigteMitarbeiter1.Girokonten, anzahlGirokonten);
            CompareAndPrint(benötigteMitarbeiter1.Spareinlagen, anzahlSpareinlagen);
            CompareAndPrint(benötigteMitarbeiter1.Termingelder, anzahlTermingelder);
            CompareAndPrint(benötigteMitarbeiter1.Backoffice, backoffice);
            CompareAndPrint(benötigteMitarbeiter1.Frontoffice, frontoffice);
            CompareAndPrint(benötigteMitarbeiter1.Insgesamt, insgesamt);
            CompareAndPrint(benötigteMitarbeiter1.VorhandeneMitarbeiterNachFluktuation, nachFluktuation);
            CompareAndPrint(benötigteMitarbeiter1.VorhandeneMitarbeiterNachFluktuationUndTraining, nachFluktuationUndTraining1);
            CompareAndPrint(benötigteMitarbeiter1.Neueinstellungen, neueinstellungen1);
            CompareAndPrint(benötigteMitarbeiter1.Entlassungen, entlassungen1);

            CompareAndPrint(benötigteMitarbeiter2.VorhandeneMitarbeiterNachFluktuationUndTraining, nachFluktuationUndTraining2);
            CompareAndPrint(benötigteMitarbeiter2.Neueinstellungen, neueinstellungen2);
            CompareAndPrint(benötigteMitarbeiter2.Entlassungen, entlassungen2);

            CompareAndPrint(benötigteMitarbeiter3.VorhandeneMitarbeiterNachFluktuationUndTraining, nachFluktuationUndTraining3);
            CompareAndPrint(benötigteMitarbeiter3.Neueinstellungen, neueinstellungen3);
            CompareAndPrint(benötigteMitarbeiter3.Entlassungen, entlassungen3);

            // Test auf Nicht-Änderbarkeit der Eigenschaften
            foreach (PropertyInfo pi in typeof(BenötigteMitarbeiter).GetProperties())
            {
                Console.Write(pi.Name + " änderbar: ");
                CompareAndPrint(pi.CanWrite, false);
            }

            // Test der Konstruktor-Plausibilitätsprüfungen
            new BenötigteMitarbeiter(0,
                                     anzahlAutokredite,
                                     anzahlHypothekenkredite,
                                     anzahlGirokonten,
                                     anzahlSpareinlagen,
                                     anzahlTermingelder,
                                     backoffice,
                                     nachFluktuation,
                                     nachFluktuationUndTraining1);
            ProvokeException(() => new BenötigteMitarbeiter(-1,
                                                            anzahlAutokredite,
                                                            anzahlHypothekenkredite,
                                                            anzahlGirokonten,
                                                            anzahlSpareinlagen,
                                                            anzahlTermingelder,
                                                            backoffice,
                                                            nachFluktuation,
                                                            nachFluktuationUndTraining1));
            new BenötigteMitarbeiter(anzahlKonsumkredite,
                                     0,
                                     anzahlHypothekenkredite,
                                     anzahlGirokonten,
                                     anzahlSpareinlagen,
                                     anzahlTermingelder,
                                     backoffice,
                                     nachFluktuation,
                                     nachFluktuationUndTraining1);
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            -1,
                                                            anzahlHypothekenkredite,
                                                            anzahlGirokonten,
                                                            anzahlSpareinlagen,
                                                            anzahlTermingelder,
                                                            backoffice,
                                                            nachFluktuation,
                                                            nachFluktuationUndTraining1));
            new BenötigteMitarbeiter(anzahlKonsumkredite,
                                     anzahlAutokredite,
                                     0,
                                     anzahlGirokonten,
                                     anzahlSpareinlagen,
                                     anzahlTermingelder,
                                     backoffice,
                                     nachFluktuation,
                                     nachFluktuationUndTraining1);
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            anzahlAutokredite,
                                                            -1,
                                                            anzahlGirokonten,
                                                            anzahlSpareinlagen,
                                                            anzahlTermingelder,
                                                            backoffice,
                                                            nachFluktuation,
                                                            nachFluktuationUndTraining1));
            new BenötigteMitarbeiter(anzahlKonsumkredite,
                                     anzahlAutokredite,
                                     anzahlHypothekenkredite,
                                     0,
                                     anzahlSpareinlagen,
                                     anzahlTermingelder,
                                     backoffice,
                                     nachFluktuation,
                                     nachFluktuationUndTraining1);
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            anzahlAutokredite,
                                                            anzahlHypothekenkredite,
                                                            -1,
                                                            anzahlSpareinlagen,
                                                            anzahlTermingelder,
                                                            backoffice,
                                                            nachFluktuation,
                                                            nachFluktuationUndTraining1));
            new BenötigteMitarbeiter(anzahlKonsumkredite,
                                     anzahlAutokredite,
                                     anzahlHypothekenkredite,
                                     anzahlGirokonten,
                                     0,
                                     anzahlTermingelder,
                                     backoffice,
                                     nachFluktuation,
                                     nachFluktuationUndTraining1);
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            anzahlAutokredite,
                                                            anzahlHypothekenkredite,
                                                            anzahlGirokonten,
                                                            -1,
                                                            anzahlTermingelder,
                                                            backoffice,
                                                            nachFluktuation,
                                                            nachFluktuationUndTraining1));
            new BenötigteMitarbeiter(anzahlKonsumkredite,
                                     anzahlAutokredite,
                                     anzahlHypothekenkredite,
                                     anzahlGirokonten,
                                     anzahlSpareinlagen,
                                     0,
                                     backoffice,
                                     nachFluktuation,
                                     nachFluktuationUndTraining1);
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            anzahlAutokredite,
                                                            anzahlHypothekenkredite,
                                                            anzahlGirokonten,
                                                            anzahlSpareinlagen,
                                                            -1,
                                                            backoffice,
                                                            nachFluktuation,
                                                            nachFluktuationUndTraining1));
            new BenötigteMitarbeiter(anzahlKonsumkredite,
                                     anzahlAutokredite,
                                     anzahlHypothekenkredite,
                                     anzahlGirokonten,
                                     anzahlSpareinlagen,
                                     anzahlTermingelder,
                                     0,
                                     nachFluktuation,
                                     nachFluktuationUndTraining1);
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            anzahlAutokredite,
                                                            anzahlHypothekenkredite,
                                                            anzahlGirokonten,
                                                            anzahlSpareinlagen,
                                                            anzahlTermingelder,
                                                            -1,
                                                            nachFluktuation,
                                                            nachFluktuationUndTraining1));
            new BenötigteMitarbeiter(anzahlKonsumkredite,
                                     anzahlAutokredite,
                                     anzahlHypothekenkredite,
                                     anzahlGirokonten,
                                     anzahlSpareinlagen,
                                     anzahlTermingelder,
                                     backoffice,
                                     0,
                                     0);
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            anzahlAutokredite,
                                                            anzahlHypothekenkredite,
                                                            anzahlGirokonten,
                                                            anzahlSpareinlagen,
                                                            anzahlTermingelder,
                                                            backoffice,
                                                            -1,
                                                            nachFluktuationUndTraining1));
            new BenötigteMitarbeiter(anzahlKonsumkredite,
                                     anzahlAutokredite,
                                     anzahlHypothekenkredite,
                                     anzahlGirokonten,
                                     anzahlSpareinlagen,
                                     anzahlTermingelder,
                                     backoffice,
                                     nachFluktuation,
                                     0);
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            anzahlAutokredite,
                                                            anzahlHypothekenkredite,
                                                            anzahlGirokonten,
                                                            anzahlSpareinlagen,
                                                            anzahlTermingelder,
                                                            backoffice,
                                                            nachFluktuation,
                                                            -1));
            ProvokeException(() => new BenötigteMitarbeiter(anzahlKonsumkredite,
                                                            anzahlAutokredite,
                                                            anzahlHypothekenkredite,
                                                            anzahlGirokonten,
                                                            anzahlSpareinlagen,
                                                            anzahlTermingelder,
                                                            backoffice,
                                                            nachFluktuation,
                                                            nachFluktuation + 1));
            #endregion

            #region Klasse Personalaufwand
            Console.WriteLine("\n\n--- Klasse Personalaufwand ---\n");

            // vorgegebene Werte
            Währung gehaltskosten       = 30000M;
            Währung kostenEinstellungen = 10000M;
            Währung kostenEntlassungen  = 12000M;
            Währung kostenTraining      = 300M;
            Währung aufwandInsgesamt1   = 40300M;
            Währung aufwandInsgesamt2   = 42300M;

            // Objekte anlegen
            Personalaufwand personalaufwand1 = new Personalaufwand(gehaltskosten,
                                                                   kostenEinstellungen,
                                                                   0.0M,
                                                                   kostenTraining);
            Personalaufwand personalaufwand2 = new Personalaufwand(gehaltskosten,
                                                                   0.0M,
                                                                   kostenEntlassungen,
                                                                   kostenTraining);

            // Test auf korrekte Werte der Eigenschaften
            CompareAndPrint(personalaufwand1.Gehaltskosten, gehaltskosten);
            CompareAndPrint(personalaufwand1.KostenEinstellungen, kostenEinstellungen);
            CompareAndPrint(personalaufwand2.KostenEinstellungen, new Währung(0.0M));
            CompareAndPrint(personalaufwand1.KostenEntlassungen, new Währung(0.0M));
            CompareAndPrint(personalaufwand2.KostenEntlassungen, kostenEntlassungen);
            CompareAndPrint(personalaufwand1.KostenTraining, kostenTraining);
            CompareAndPrint(personalaufwand1.Insgesamt, aufwandInsgesamt1);
            CompareAndPrint(personalaufwand2.Insgesamt, aufwandInsgesamt2);

            // Test auf Nicht-Änderbarkeit der Eigenschaften
            foreach (PropertyInfo pi in typeof(Personalaufwand).GetProperties())
            {
                Console.Write(pi.Name + " änderbar: ");
                CompareAndPrint(pi.CanWrite, false);
            }

            // Test der Konstruktor-Plausibilitätsprüfungen
            new Personalaufwand(0.0M,
                                kostenEinstellungen,
                                0.0M,
                                kostenTraining);
            ProvokeException(() => new Personalaufwand(-0.01M,
                                                       kostenEinstellungen,
                                                       0.0M,
                                                       kostenTraining));
            new Personalaufwand(gehaltskosten,
                                0.0M,
                                0.0M,
                                kostenTraining);
            ProvokeException(() => new Personalaufwand(gehaltskosten,
                                                       -0.01M,
                                                       0.0M,
                                                       kostenTraining));
            new Personalaufwand(gehaltskosten,
                                kostenEinstellungen,
                                0.0M,
                                kostenTraining);
            ProvokeException(() => new Personalaufwand(gehaltskosten,
                                                       kostenEinstellungen,
                                                       -0.01M,
                                                       kostenTraining));
            new Personalaufwand(gehaltskosten,
                                kostenEinstellungen,
                                0.0M,
                                0.0M);
            ProvokeException(() => new Personalaufwand(gehaltskosten,
                                                       kostenEinstellungen,
                                                       0.0M,
                                                       -0.01M));
            ProvokeException(() => new Personalaufwand(gehaltskosten,
                                                       kostenEinstellungen,
                                                       kostenEntlassungen,
                                                       kostenTraining));

            #endregion

            #region Klasse Berechnungen
            Console.WriteLine("\n\n--- Klasse Berechnungen ---\n");

            // sind Klasse und Methode statisch?
            CompareAndPrint(typeof(Berechnungen).IsAbstract && typeof(Berechnungen).IsSealed, true);
            CompareAndPrint(typeof(Berechnungen).GetMethod("Rechnen").IsStatic, true);

            // vorgegebene Werte
            VolumenNeugeschäft volumenNeugeschäftAP = new VolumenNeugeschäft(1500000000.0M,
                                                                             1080000000.0M,
                                                                             1000000000.0M,
                                                                             1350000000.0M,
                                                                             2400000000.0M,
                                                                             1200000000.0M);
            VolumenNeugeschäft volumenNeugeschäftAPB = new VolumenNeugeschäft(1350000000.0M,
                                                                              972000000.0M,
                                                                              900000000.0M,
                                                                              1215000000.0M,
                                                                              2160000000.0M,
                                                                              1080000000.0M);
            Durchschnittsgrößen durchschnittsgrößenAP = new Durchschnittsgrößen(30000.0M,
                                                                                40000.0M,
                                                                                100000.0M,
                                                                                6000.0M,
                                                                                10000.0M,
                                                                                20000.0M);
            VolumenProMitarbeiter volumenProMitarbeiter = new VolumenProMitarbeiter(200,
                                                                                    150,
                                                                                    50,
                                                                                    900,
                                                                                    1200,
                                                                                    1200);
            int            benötigteMitarbeiterBackOfficeAP = 400;
            int            vorhandeneMitarbeiterVP          = 1470;
            Prozent        fluktuationAP  = new Prozent(0.1);
            Prozent        fluktuationAPB = new Prozent(0.0);
            int            trainigstageProMitarbeiterAP  = 5;
            int            trainigstageProMitarbeiterAPB = 2;
            Personalkosten personalkostenAP = new Personalkosten(38000.0M,
                                                                 10300.0M,
                                                                 19500.0M,
                                                                 510.0M);

            Berechnungen.Rechnen(volumenNeugeschäftAP,
                                 durchschnittsgrößenAP,
                                 volumenProMitarbeiter,
                                 benötigteMitarbeiterBackOfficeAP,
                                 vorhandeneMitarbeiterVP,
                                 fluktuationAP,
                                 trainigstageProMitarbeiterAP,
                                 personalkostenAP,
                                 out Anzahlen anzahlen,
                                 out BenötigteMitarbeiter benötigteMitarbeiter,
                                 out Personalaufwand personalaufwand);
            Berechnungen.Rechnen(volumenNeugeschäftAPB,
                                 durchschnittsgrößenAP,
                                 volumenProMitarbeiter,
                                 benötigteMitarbeiterBackOfficeAP,
                                 vorhandeneMitarbeiterVP,
                                 fluktuationAPB,
                                 trainigstageProMitarbeiterAPB,
                                 personalkostenAP,
                                 out Anzahlen anzahlenB,
                                 out BenötigteMitarbeiter benötigteMitarbeiterB,
                                 out Personalaufwand personalaufwandB);

            // Test auf korrekte Werte der Ergebnisse

            CompareAndPrint(anzahlen.Konsumkredite, 50000);
            CompareAndPrint(anzahlen.Autokredite, 27000);
            CompareAndPrint(anzahlen.Hypothekenkredite, 10000);
            CompareAndPrint(anzahlen.Girokonten, 225000);
            CompareAndPrint(anzahlen.Spareinlagen, 240000);
            CompareAndPrint(anzahlen.Termingelder, 60000);

            CompareAndPrint(benötigteMitarbeiter.Konsumkredite, 250);
            CompareAndPrint(benötigteMitarbeiter.Autokredite, 180);
            CompareAndPrint(benötigteMitarbeiter.Hypothekenkredite, 200);
            CompareAndPrint(benötigteMitarbeiter.Girokonten, 250);
            CompareAndPrint(benötigteMitarbeiter.Spareinlagen, 200);
            CompareAndPrint(benötigteMitarbeiter.Termingelder, 50);
            CompareAndPrint(benötigteMitarbeiter.Frontoffice, 1130);
            CompareAndPrint(benötigteMitarbeiter.Backoffice, 400);
            CompareAndPrint(benötigteMitarbeiter.Insgesamt, 1530);
            CompareAndPrint(benötigteMitarbeiter.VorhandeneMitarbeiterNachFluktuation, 1323);
            CompareAndPrint(benötigteMitarbeiter.VorhandeneMitarbeiterNachFluktuationUndTraining, 1293);
            CompareAndPrint(benötigteMitarbeiter.Neueinstellungen, 237);
            CompareAndPrint(benötigteMitarbeiter.Entlassungen, 0);

            CompareAndPrint(personalaufwand.Gehaltskosten, new Währung(58140000.0M));
            CompareAndPrint(personalaufwand.KostenEinstellungen, new Währung(2441100.0M));
            CompareAndPrint(personalaufwand.KostenEntlassungen, new Währung(0.0M));
            CompareAndPrint(personalaufwand.KostenTraining, new Währung(3901500.0M));
            CompareAndPrint(personalaufwand.Insgesamt, new Währung(64482600.0M));

            CompareAndPrint(anzahlenB.Konsumkredite, 45000);
            CompareAndPrint(anzahlenB.Autokredite, 24300);
            CompareAndPrint(anzahlenB.Hypothekenkredite, 9000);
            CompareAndPrint(anzahlenB.Girokonten, 202500);
            CompareAndPrint(anzahlenB.Spareinlagen, 216000);
            CompareAndPrint(anzahlenB.Termingelder, 54000);

            CompareAndPrint(benötigteMitarbeiterB.Konsumkredite, 225);
            CompareAndPrint(benötigteMitarbeiterB.Autokredite, 162);
            CompareAndPrint(benötigteMitarbeiterB.Hypothekenkredite, 180);
            CompareAndPrint(benötigteMitarbeiterB.Girokonten, 225);
            CompareAndPrint(benötigteMitarbeiterB.Spareinlagen, 180);
            CompareAndPrint(benötigteMitarbeiterB.Termingelder, 45);
            CompareAndPrint(benötigteMitarbeiterB.Frontoffice, 1017);
            CompareAndPrint(benötigteMitarbeiterB.Backoffice, 400);
            CompareAndPrint(benötigteMitarbeiterB.Insgesamt, 1417);
            CompareAndPrint(benötigteMitarbeiterB.VorhandeneMitarbeiterNachFluktuation, 1470);
            CompareAndPrint(benötigteMitarbeiterB.VorhandeneMitarbeiterNachFluktuationUndTraining, 1457);
            CompareAndPrint(benötigteMitarbeiterB.Neueinstellungen, 0);
            CompareAndPrint(benötigteMitarbeiterB.Entlassungen, 40);

            CompareAndPrint(personalaufwandB.Gehaltskosten, new Währung(53846000.0M));
            CompareAndPrint(personalaufwandB.KostenEinstellungen, new Währung(0.0M));
            CompareAndPrint(personalaufwandB.KostenEntlassungen, new Währung(780000.0M));
            CompareAndPrint(personalaufwandB.KostenTraining, new Währung(1445340.0M));
            CompareAndPrint(personalaufwandB.Insgesamt, new Währung(56071340.0M));

            // Test der Plausibilitätsprüfungen

            ProvokeException(() => Berechnungen.Rechnen(null,
                                                        durchschnittsgrößenAP,
                                                        volumenProMitarbeiter,
                                                        benötigteMitarbeiterBackOfficeAP,
                                                        vorhandeneMitarbeiterVP,
                                                        fluktuationAP,
                                                        trainigstageProMitarbeiterAP,
                                                        personalkostenAP,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));
            ProvokeException(() => Berechnungen.Rechnen(volumenNeugeschäftAP,
                                                        null,
                                                        volumenProMitarbeiter,
                                                        benötigteMitarbeiterBackOfficeAP,
                                                        vorhandeneMitarbeiterVP,
                                                        fluktuationAP,
                                                        trainigstageProMitarbeiterAP,
                                                        personalkostenAP,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));
            ProvokeException(() => Berechnungen.Rechnen(volumenNeugeschäftAP,
                                                        durchschnittsgrößenAP,
                                                        null,
                                                        benötigteMitarbeiterBackOfficeAP,
                                                        vorhandeneMitarbeiterVP,
                                                        fluktuationAP,
                                                        trainigstageProMitarbeiterAP,
                                                        personalkostenAP,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));
            ProvokeException(() => Berechnungen.Rechnen(volumenNeugeschäftAP,
                                                        durchschnittsgrößenAP,
                                                        volumenProMitarbeiter,
                                                        -1,
                                                        vorhandeneMitarbeiterVP,
                                                        fluktuationAP,
                                                        trainigstageProMitarbeiterAP,
                                                        personalkostenAP,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));
            ProvokeException(() => Berechnungen.Rechnen(volumenNeugeschäftAP,
                                                        durchschnittsgrößenAP,
                                                        volumenProMitarbeiter,
                                                        benötigteMitarbeiterBackOfficeAP,
                                                        -1,
                                                        fluktuationAP,
                                                        trainigstageProMitarbeiterAP,
                                                        personalkostenAP,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));
            ProvokeException(() => Berechnungen.Rechnen(volumenNeugeschäftAP,
                                                        durchschnittsgrößenAP,
                                                        volumenProMitarbeiter,
                                                        benötigteMitarbeiterBackOfficeAP,
                                                        vorhandeneMitarbeiterVP,
                                                        new Prozent(-0.001),
                                                        trainigstageProMitarbeiterAP,
                                                        personalkostenAP,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));
            ProvokeException(() => Berechnungen.Rechnen(volumenNeugeschäftAP,
                                                        durchschnittsgrößenAP,
                                                        volumenProMitarbeiter,
                                                        benötigteMitarbeiterBackOfficeAP,
                                                        vorhandeneMitarbeiterVP,
                                                        new Prozent(1.001),
                                                        trainigstageProMitarbeiterAP,
                                                        personalkostenAP,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));
            ProvokeException(() => Berechnungen.Rechnen(volumenNeugeschäftAP,
                                                        durchschnittsgrößenAP,
                                                        volumenProMitarbeiter,
                                                        benötigteMitarbeiterBackOfficeAP,
                                                        vorhandeneMitarbeiterVP,
                                                        fluktuationAP,
                                                        -1,
                                                        personalkostenAP,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));
            ProvokeException(() => Berechnungen.Rechnen(volumenNeugeschäftAP,
                                                        durchschnittsgrößenAP,
                                                        volumenProMitarbeiter,
                                                        benötigteMitarbeiterBackOfficeAP,
                                                        vorhandeneMitarbeiterVP,
                                                        fluktuationAP,
                                                        trainigstageProMitarbeiterAP,
                                                        null,
                                                        out anzahlen,
                                                        out benötigteMitarbeiter,
                                                        out personalaufwand));

            #endregion

            Console.WriteLine("\n\n--- ERGEBNIS ---\n");

            if (_errors > 0)
            {
                ColorPrint("Fehler: " + _errors.ToString(), _bad_color);
            }
            else
            {
                ColorPrint("keine Fehler", _good_color);
            }

            Console.ReadKey();
        }