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"); }