package net.sf.openrocket.gui.configdialog; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.CenteringRing; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.BaseTestCase.BaseTestCase; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class FinSetConfigTest extends BaseTestCase { static Method method; @BeforeClass public static void classSetup() throws Exception { method = FinSetConfig.class.getDeclaredMethod("computeFinTabLength", List.class, Double.class, Double.class, DoubleModel.class, RocketComponent.class); Assert.assertNotNull(method); method.setAccessible(true); } /** * Test no centering rings. * * @throws Exception */ @Test public void testComputeFinTabLength() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); RocketComponent parent = new BodyTube(); Double result = (Double)method.invoke(null, rings, 10d, 11d, dm, parent); Assert.assertEquals(0.0001, 11d, result.doubleValue()); result = (Double)method.invoke(null, null, 10d, 11d, dm, parent); Assert.assertEquals(11d, result.doubleValue(), 0.0001); } /** * Test 2 rings both ahead of the fin. */ @Test public void testCompute2LeadingRings() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); RocketComponent parent = new BodyTube(); CenteringRing ring1 = new CenteringRing(); ring1.setLength(0.004); ring1.setRelativePosition(RocketComponent.Position.TOP); ring1.setPositionValue(0.43); CenteringRing ring2 = new CenteringRing(); ring2.setLength(0.004); ring2.setRelativePosition(RocketComponent.Position.TOP); ring2.setPositionValue(0.45); rings.add(ring1); rings.add(ring2); parent.addChild(ring1); parent.addChild(ring2); Double result = (Double)method.invoke(null, rings, 0.47d, 0.01, dm, parent); Assert.assertEquals(0.01, result.doubleValue(), 0.0001); } /** * Test one ring, ahead of the fin. */ @Test public void testCompute1Ring() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); ring1.setLength(0.004); ring1.setRelativePosition(RocketComponent.Position.TOP); ring1.setPositionValue(0.43); rings.add(ring1); RocketComponent parent = new BodyTube(); parent.addChild(ring1); Double result = (Double)method.invoke(null, rings, 0.47d, 0.01, dm, parent); Assert.assertEquals(0.01, result.doubleValue(), 0.0001); } /** * Test one ring ahead of the fin, one ring within the root chord. */ @Test public void testComputeOneLeadingOneRingWithinRoot() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); ring1.setRelativePosition(RocketComponent.Position.TOP); ring1.setLength(0.004); ring1.setPositionValue(0.43); CenteringRing ring2 = new CenteringRing(); ring2.setRelativePosition(RocketComponent.Position.TOP); ring2.setLength(0.004); ring2.setPositionValue(0.45); rings.add(ring1); rings.add(ring2); RocketComponent parent = new BodyTube(1d, 0.01); parent.addChild(ring1); parent.addChild(ring2); Double result = (Double)method.invoke(null, rings, 0.45d, 0.01, dm, parent); Assert.assertEquals(0.01 - 0.004, result.doubleValue(), 0.0001); } /** * Test one ring ahead of the fin, one ring beyond the root chord. */ @Test public void testComputeOneLeadingOneTrailingRing() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); ring1.setRelativePosition(RocketComponent.Position.TOP); ring1.setLength(0.004); ring1.setPositionValue(0.43); CenteringRing ring2 = new CenteringRing(); ring2.setRelativePosition(RocketComponent.Position.TOP); ring2.setLength(0.004); ring2.setPositionValue(0.48); rings.add(ring1); rings.add(ring2); @SuppressWarnings("unused") RocketComponent parent = new BodyTube(); Double result = (Double)method.invoke(null, rings, 0.47d, 0.01, dm, ring1); Assert.assertEquals(0.01, result.doubleValue(), 0.0001); } /** * Test one ring within the root chord, another ring beyond the root chord. */ @Test public void testComputeOneWithinRootOneTrailingRing() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); ring1.setRelativePosition(RocketComponent.Position.TOP); ring1.setLength(0.004); ring1.setPositionValue(0.4701); CenteringRing ring2 = new CenteringRing(); ring2.setLength(0.004); ring2.setRelativePosition(RocketComponent.Position.TOP); ring2.setPositionValue(0.48); rings.add(ring1); rings.add(ring2); RocketComponent parent = new BodyTube(1.0d, 0.1d); parent.addChild(ring1); parent.addChild(ring2); Double result = (Double)method.invoke(null, rings, 0.47d, 0.01, dm, parent); Assert.assertEquals(0.0059, result.doubleValue(), 0.0001); } /** * Test both rings within the root chord. */ @Test public void testBothRingsWithinRootChord() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); RocketComponent parent = new BodyTube(1.0000d, 0.1d); CenteringRing ring1 = new CenteringRing(); ring1.setRelativePosition(RocketComponent.Position.TOP); ring1.setLength(0.004); ring1.setPositionValue(0.4701); parent.addChild(ring1); CenteringRing ring2 = new CenteringRing(); ring2.setLength(0.004); ring2.setRelativePosition(RocketComponent.Position.TOP); ring2.setPositionValue(0.4750); parent.addChild(ring2); rings.add(ring1); rings.add(ring2); Double result = (Double)method.invoke(null, rings, 0.47d, 0.01, dm, parent); Assert.assertEquals(0.0009, result.doubleValue(), 0.0002); } /** * Test both rings beyond the root chord. */ @Test public void testBothRingsBeyondRootChord() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); ring1.setRelativePosition(RocketComponent.Position.TOP); ring1.setLength(0.004); ring1.setPositionValue(0.48); CenteringRing ring2 = new CenteringRing(); ring2.setRelativePosition(RocketComponent.Position.TOP); ring2.setLength(0.004); ring2.setPositionValue(0.49); rings.add(ring1); rings.add(ring2); RocketComponent parent = new BodyTube(1.0d, 0.1d); parent.addChild(ring1); parent.addChild(ring2); Double result = (Double)method.invoke(null, rings, 0.47d, 0.01, dm, parent); Assert.assertEquals(0.0, result.doubleValue(), 0.0001); } /** * Test both rings within the root chord - the top ring has an adjacent ring (so 3 rings total). */ @Test public void test3RingsWithinRootChord() throws Exception { DoubleModel dm = new DoubleModel(1d); List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); ring1.setRelativePosition(RocketComponent.Position.ABSOLUTE); ring1.setLength(0.004); ring1.setPositionValue(0.47); CenteringRing ring2 = new CenteringRing(); ring2.setRelativePosition(RocketComponent.Position.ABSOLUTE); ring2.setLength(0.004); ring2.setPositionValue(0.4702); CenteringRing ring3 = new CenteringRing(); ring3.setRelativePosition(RocketComponent.Position.ABSOLUTE); ring3.setLength(0.004); ring3.setPositionValue(0.4770); rings.add(ring1); rings.add(ring2); rings.add(ring3); BodyTube parent = new BodyTube(1.0d, 0.1d); parent.setPositionValue(0); parent.addChild(ring1); parent.addChild(ring2); parent.addChild(ring3); Double result = (Double)method.invoke(null, rings, 0.47d, 0.01, dm, parent); Assert.assertEquals(0.0028, result.doubleValue(), 0.0001); } }