/* * RocksimLoaderTest.java * */ package net.sf.openrocket.file.rocksim.importt; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.OpenRocketDocumentFactory; import net.sf.openrocket.file.DatabaseMotorFinder; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.RocketLoadException; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.Stage; import net.sf.openrocket.util.BaseTestCase.BaseTestCase; import org.junit.Assert; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; /** * RocksimLoader Tester. */ public class RocksimLoaderTest extends BaseTestCase { /** * Test a bug reported via automated bug report. I have been unable to reproduce this bug (hanging finset off of an inner body tube) when creating * a Rocksim file using Rocksim. The bug is reproducible when manually modifying the Rocksim file, which is what is tested here. */ @org.junit.Test public void testFinsOnInnerTube() throws Exception { RocksimLoader loader = new RocksimLoader(); InputStream stream = this.getClass().getResourceAsStream("PodFins.rkt"); Assert.assertNotNull("Could not open PodFins.rkt", stream); try { OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket(); DocumentLoadingContext context = new DocumentLoadingContext(); context.setOpenRocketDocument(doc); context.setMotorFinder(new DatabaseMotorFinder()); loader.loadFromStream(context, new BufferedInputStream(stream)); Rocket rocket = doc.getRocket(); Assert.assertNotNull(rocket); } catch (IllegalStateException ise) { Assert.fail(ise.getMessage()); } Assert.assertTrue(loader.getWarnings().size() == 2); } /** * Method: loadFromStream(InputStream source) * * @throws Exception thrown if something goes awry */ @org.junit.Test public void testLoadFromStream() throws Exception { RocksimLoader loader = new RocksimLoader(); //Stupid single stage rocket OpenRocketDocument doc = loadRocksimRocket(loader); InputStream stream; Assert.assertNotNull(doc); Rocket rocket = doc.getRocket(); Assert.assertNotNull(rocket); Assert.assertEquals("FooBar Test", doc.getRocket().getName()); Assert.assertTrue(loader.getWarnings().isEmpty()); stream = this.getClass().getResourceAsStream("rocksimTestRocket2.rkt"); Assert.assertNotNull("Could not open rocksimTestRocket2.rkt", stream); doc = OpenRocketDocumentFactory.createEmptyRocket(); DocumentLoadingContext context = new DocumentLoadingContext(); context.setOpenRocketDocument(doc); context.setMotorFinder(new DatabaseMotorFinder()); loader.loadFromStream(context, new BufferedInputStream(stream)); Assert.assertNotNull(doc); rocket = doc.getRocket(); Assert.assertNotNull(rocket); //Do some simple asserts; the important thing here is just validating that the mass and cg were //not overridden for each stage. Assert.assertEquals("Three Stage Everything Included Rocket", doc.getRocket().getName()); Assert.assertEquals(0, loader.getWarnings().size()); Assert.assertEquals(3, rocket.getStageCount()); Stage stage1 = (Stage) rocket.getChild(0); Assert.assertFalse(stage1.isMassOverridden()); Assert.assertFalse(stage1.isCGOverridden()); Stage stage2 = (Stage) rocket.getChild(1); Assert.assertFalse(stage2.isMassOverridden()); Assert.assertFalse(stage2.isCGOverridden()); Stage stage3 = (Stage) rocket.getChild(2); Assert.assertFalse(stage3.isMassOverridden()); Assert.assertFalse(stage3.isCGOverridden()); stream = this.getClass().getResourceAsStream("rocksimTestRocket3.rkt"); Assert.assertNotNull("Could not open rocksimTestRocket3.rkt", stream); doc = OpenRocketDocumentFactory.createEmptyRocket(); context = new DocumentLoadingContext(); context.setOpenRocketDocument(doc); context.setMotorFinder(new DatabaseMotorFinder()); loader.loadFromStream(context, new BufferedInputStream(stream)); Assert.assertNotNull(doc); rocket = doc.getRocket(); Assert.assertNotNull(rocket); Assert.assertEquals("Three Stage Everything Included Rocket - Override Total Mass/CG", doc.getRocket().getName()); Assert.assertEquals(3, rocket.getStageCount()); stage1 = (Stage) rocket.getChild(0); stage2 = (Stage) rocket.getChild(1); stage3 = (Stage) rocket.getChild(2); //Do some 1st level and simple asserts; the idea here is to not do a deep validation as that //should have been covered elsewhere. Assert that the stage overrides are correct. Assert.assertEquals(2, stage1.getChildCount()); Assert.assertEquals("Nose cone", stage1.getChild(0).getName()); Assert.assertEquals("Body tube", stage1.getChild(1).getName()); Assert.assertTrue(stage1.isMassOverridden()); Assert.assertEquals(0.185d, stage1.getOverrideMass(), 0.001); Assert.assertTrue(stage1.isCGOverridden()); Assert.assertEquals(0.3d, stage1.getOverrideCG().x, 0.001); Assert.assertEquals(3, loader.getWarnings().size()); Assert.assertEquals(1, stage2.getChildCount()); Assert.assertEquals("2nd Stage Tube", stage2.getChild(0).getName()); Assert.assertTrue(stage2.isMassOverridden()); Assert.assertEquals(0.21d, stage2.getOverrideMass(), 0.001); Assert.assertTrue(stage2.isCGOverridden()); Assert.assertEquals(0.4d, stage2.getOverrideCG().x, 0.001); BodyTube bt = (BodyTube) stage2.getChild(0); LaunchLug ll = (LaunchLug) bt.getChild(6); Assert.assertEquals(1.22d, ll.getRadialDirection(), 0.001); Assert.assertEquals(2, stage3.getChildCount()); Assert.assertEquals("Transition", stage3.getChild(0).getName()); Assert.assertEquals("Body tube", stage3.getChild(1).getName()); Assert.assertTrue(stage2.isMassOverridden()); Assert.assertEquals(0.33d, stage3.getOverrideMass(), 0.001); Assert.assertTrue(stage2.isCGOverridden()); Assert.assertEquals(0.5d, stage3.getOverrideCG().x, 0.001); } @org.junit.Test public void testSubAssemblyRocket() throws IOException, RocketLoadException { RocksimLoader loader = new RocksimLoader(); //Stupid single stage rocket OpenRocketDocument doc = loadRocksimSubassemblyRocket(loader); InputStream stream; Assert.assertNotNull(doc); Rocket rocket = doc.getRocket(); Assert.assertNotNull(rocket); Assert.assertEquals("SubAssembly Element Test", doc.getRocket().getName()); Assert.assertTrue(loader.getWarnings().isEmpty()); stream = this.getClass().getResourceAsStream("SubAssemblyTest.rkt"); Assert.assertNotNull("Could not open SubAssemblyTest.rkt", stream); doc = OpenRocketDocumentFactory.createEmptyRocket(); DocumentLoadingContext context = new DocumentLoadingContext(); context.setOpenRocketDocument(doc); context.setMotorFinder(new DatabaseMotorFinder()); loader.loadFromStream(context, new BufferedInputStream(stream)); Assert.assertNotNull(doc); rocket = doc.getRocket(); Assert.assertNotNull(rocket); Assert.assertEquals(1, rocket.getStageCount()); Stage stage1 = (Stage) rocket.getChild(0); Assert.assertEquals("Nose cone", stage1.getChild(0).getName()); Assert.assertEquals("Forward Body tube", stage1.getChild(1).getName()); Assert.assertEquals("Aft Body tube", stage1.getChild(2).getName()); BodyTube subassemblyBodyTube = (BodyTube)stage1.getChild(2); Assert.assertEquals(8, subassemblyBodyTube.getChildCount()); Assert.assertEquals("Engine block", subassemblyBodyTube.getChild(0).getName()); Assert.assertEquals("Fin set-1", subassemblyBodyTube.getChild(1).getName()); Assert.assertEquals("Fin set", subassemblyBodyTube.getChild(2).getName()); Assert.assertEquals("Fin set-2", subassemblyBodyTube.getChild(3).getName()); Assert.assertEquals("Fin set-3", subassemblyBodyTube.getChild(4).getName()); Assert.assertEquals("Fin set-4", subassemblyBodyTube.getChild(5).getName()); Assert.assertEquals("Centering ring", subassemblyBodyTube.getChild(6).getName()); Assert.assertEquals("Centering ring", subassemblyBodyTube.getChild(7).getName()); } public static OpenRocketDocument loadRocksimRocket(RocksimLoader theLoader) throws IOException, RocketLoadException { InputStream stream = RocksimLoaderTest.class.getResourceAsStream("rocksimTestRocket1.rkt"); try { Assert.assertNotNull("Could not open rocksimTestRocket1.rkt", stream); OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket(); DocumentLoadingContext context = new DocumentLoadingContext(); context.setOpenRocketDocument(doc); context.setMotorFinder(new DatabaseMotorFinder()); theLoader.loadFromStream(context, new BufferedInputStream(stream)); return doc; } finally { stream.close(); } } public static OpenRocketDocument loadRocksimRocket3(RocksimLoader theLoader) throws IOException, RocketLoadException { InputStream stream = RocksimLoaderTest.class.getResourceAsStream("rocksimTestRocket3.rkt"); try { Assert.assertNotNull("Could not open rocksimTestRocket3.rkt", stream); OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket(); DocumentLoadingContext context = new DocumentLoadingContext(); context.setOpenRocketDocument(doc); context.setMotorFinder(new DatabaseMotorFinder()); theLoader.loadFromStream(context, new BufferedInputStream(stream)); return doc; } finally { stream.close(); } } public static OpenRocketDocument loadRocksimSubassemblyRocket(RocksimLoader theLoader) throws IOException, RocketLoadException { InputStream stream = RocksimLoaderTest.class.getResourceAsStream("SubAssemblyTest.rkt"); try { Assert.assertNotNull("Could not open SubAssemblyTest.rkt", stream); OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket(); DocumentLoadingContext context = new DocumentLoadingContext(); context.setOpenRocketDocument(doc); context.setMotorFinder(new DatabaseMotorFinder()); theLoader.loadFromStream(context, new BufferedInputStream(stream)); return doc; } finally { stream.close(); } } }