public void TestDeuxCorpsRapides()
        {
            String filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                "TestDeuxCorpsRapides.xml");

            List<SpItem> objsInitiaux;
            using (Stream stream = File.Open(filePath, FileMode.Open))
            {
                var xmlformatter = new SpaceSerializer<List<SpItem>>();
                objsInitiaux = xmlformatter.Deserialize(stream);
            }
            List<SpItem> objsMouvants;
            using (Stream stream = File.Open(filePath, FileMode.Open))
            {
                var xmlformatter = new SpaceSerializer<List<SpItem>>();
                objsMouvants = xmlformatter.Deserialize(stream);
            }

            SpItem CorpLourd = objsMouvants.FirstOrDefault(i => i.Name == "CorpLourd");
            SpItem CorpRapide = objsMouvants.FirstOrDefault(i => i.Name == "CorpRapide");
            SpItem CorpRapideInitial = objsInitiaux.FirstOrDefault(i => i.Name == "CorpRapide");

            Assert.IsNotNull(CorpLourd, "CorpLourd item is missing from input file");
            Assert.IsNotNull(CorpRapide, "CorpRapide item is missing from input file");

            Double ratioCibleApprox = 0.00002;
            Double ratioMax = 2;
            Double periodeMax = 30 * 24 * 60 * 60 /*tours*/;

            // On met les deux corps dans un univers
            SpUnivers univers = new SpUnivers();
            univers.AddItem(CorpLourd);
            univers.AddItem(CorpRapide);
            // On fait tourner pendant 1 tours
            univers.Run();
            // On verifie que le CorpRapide bouge
            Assert.IsTrue(CorpRapide.S.Length2 > 0, "CorpRapide ne bouge pas");
            Assert.IsTrue(CorpRapideInitial.P != CorpRapide.P, "CorpRapide ne bouge pas");
            // On fait tourner pendant X tours
            for (int i = 0; i < periodeMax; i++)
            {
                univers.Run();
                // On verifie que le CorpRapide ne s'eloigne pas trop
                Assert.IsTrue(CorpRapide.P.Length2 < (ratioMax * CorpRapideInitial.P).Length2, "CorpRapide est parti a l'ouest");
            }
        }
        public void TestOrbiteMercureSoleil()
        {
            String filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                "TestOrbiteMercureSoleil.xml");

            List<SpItem> objs;
            using (Stream stream = File.Open(filePath, FileMode.Open))
            {
                var xmlformatter = new SpaceSerializer<List<SpItem>>();
                objs = xmlformatter.Deserialize(stream);
            }

            SpItem soleil = objs.FirstOrDefault(i => i.Name == "Soleil");
            SpItem mercure = objs.FirstOrDefault(i => i.Name == "Mercure");

            Assert.IsNotNull(soleil, "Soleil item is missing from input file");
            Assert.IsNotNull(mercure, "Mercure item is missing from input file");

            Double ratioCibleApprox = 0.05;
            Double ratioCibleApproxFinal = 0.00002;
            Double periodeRevolution = 87.96934 /*jours*/;

            SpVector initialPosition = mercure.P;
            SpVector initialVitesse = mercure.S;
            SpVector initialPositionSoleil = soleil.P;
            SpVector initialVitesseSoleil = soleil.S;
            SpVector approximation = initialPosition * ratioCibleApprox;

            // On met le Soleil et Mercure dans un univers
            SpUnivers univers = new SpUnivers();
            univers.AddItem(soleil);
            univers.AddItem(mercure);
            // On fait tourner pendant 88/4 jours
            for (int i = 0; i < periodeRevolution * 24 * 3600 / 4; i++)
                univers.Run();
            // On verifie que Mercure a bougé et toujours à une distance acceptable du Soleil
            Assert.IsFalse(initialPosition.AlmostEquals(mercure.P, approximation), "Mercure ne semble pas avoir bouge");
            Assert.IsTrue(initialPosition.Length2.AlmostEquals(mercure.P.Length2, approximation.Length2), "Mercure n'est plus a une distance acceptable du Soleil");
            // On fait tourner pendant 88/4 jours
            for (int i = 0; i < periodeRevolution * 24 * 3600 / 4; i++)
                univers.Run();
            // On verifie que Mercure est de l'autre coté du Soleil et toujours à une distance acceptable du Soleil
            Assert.IsTrue(initialPosition.AlmostEquals(-mercure.P, approximation), "Mercure ne tourne pas autour du Soleil");
            Assert.IsTrue(initialPosition.Length2.AlmostEquals(mercure.P.Length2, approximation.Length2), "Mercure n'est plus a une distance acceptable du Soleil");
            // On fait tourner pendant 88/2 jours
            for (int i = 0; i < periodeRevolution * 24 * 3600 / 2; i++)
                univers.Run();
            // On verifie que Mercure est revenue a son point de depart
            Assert.IsTrue(initialPosition.AlmostEquals(mercure.P, approximation), "Mercure n'est pas revenu a son point de depart");
            Assert.IsTrue(initialPosition.Length2.AlmostEquals(mercure.P.Length2, approximation.Length2), "Mercure n'est plus a une distance acceptable du Soleil");

            // On verifie que Mercure et le Soleil sont revenus dans une situation a peu pres identique a l'initiale
            Assert.IsTrue(initialPosition.AlmostRatio(mercure.P - soleil.P) < ratioCibleApproxFinal, "Le systeme n'est pas revenue a une position stable");
            Assert.IsTrue(initialVitesse.AlmostRatio(mercure.S - soleil.S) < ratioCibleApproxFinal, "Le systeme n'est pas revenue a une vitesse stable");
        }