1 package net.sf.openrocket.optimization.rocketoptimization;
3 import static org.junit.Assert.*;
4 import net.sf.openrocket.document.OpenRocketDocument;
5 import net.sf.openrocket.document.Simulation;
6 import net.sf.openrocket.optimization.general.OptimizationException;
7 import net.sf.openrocket.optimization.general.Point;
8 import net.sf.openrocket.rocketcomponent.Rocket;
9 import net.sf.openrocket.unit.Unit;
10 import net.sf.openrocket.unit.UnitGroup;
11 import net.sf.openrocket.unit.Value;
12 import net.sf.openrocket.util.Pair;
14 import org.jmock.Expectations;
15 import org.jmock.Mockery;
16 import org.jmock.auto.Mock;
17 import org.jmock.integration.junit4.JMock;
18 import org.jmock.integration.junit4.JUnit4Mockery;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
24 public class TestRocketOptimizationFunction {
25 Mockery context = new JUnit4Mockery();
28 OptimizableParameter parameter;
30 OptimizationGoal goal;
32 SimulationDomain domain;
34 SimulationModifier modifier1;
36 SimulationModifier modifier2;
38 RocketOptimizationListener listener;
41 public void testNormalEvaluation() throws InterruptedException, OptimizationException {
42 final Rocket rocket = new Rocket();
43 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
45 final double p1 = 0.4;
46 final double p2 = 0.7;
47 final double ddist = -0.43;
48 final Value dref = new Value(ddist, Unit.NOUNIT2);
49 final double pvalue = 9.81;
50 final Value pvalueValue = new Value(9.81, Unit.NOUNIT2);
51 final double gvalue = 8.81;
52 final Point point = new Point(p1, p2);
55 context.checking(new Expectations() {{
56 oneOf(modifier1).modify(simulation, p1);
57 oneOf(modifier2).modify(simulation, p2);
58 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
59 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
60 oneOf(parameter).getUnitGroup(); will(returnValue(UnitGroup.UNITS_NONE));
61 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(gvalue));
62 oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2));
63 oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
64 oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3));
65 oneOf(modifier2).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
66 oneOf(listener).evaluated(point, new Value[] {
67 new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()),
68 new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit())
69 }, dref, pvalueValue, gvalue);
73 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
74 parameter, goal, domain, modifier1, modifier2) {
76 Simulation newSimulationInstance(Simulation sim) {
80 function.addRocketOptimizationListener(listener);
82 double value = function.evaluate(point);
83 assertEquals(gvalue, value, 0);
87 public void testNaNValue() throws InterruptedException, OptimizationException {
88 final Rocket rocket = new Rocket();
89 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
91 final double p1 = 0.4;
92 final double p2 = 0.7;
93 final double ddist = -0.43;
94 final Value dref = new Value(0.33, Unit.NOUNIT2);
95 final double pvalue = 9.81;
98 context.checking(new Expectations() {{
99 oneOf(modifier1).modify(simulation, p1);
100 oneOf(modifier2).modify(simulation, p2);
101 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
102 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
103 oneOf(parameter).getUnitGroup(); will(returnValue(UnitGroup.UNITS_NONE));
104 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(Double.NaN));
109 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
110 parameter, goal, domain, modifier1, modifier2) {
112 Simulation newSimulationInstance(Simulation sim) {
118 double value = function.evaluate(new Point(p1, p2));
119 assertEquals(Double.MAX_VALUE, value, 0);
124 public void testOutsideDomain() throws InterruptedException, OptimizationException {
125 final Rocket rocket = new Rocket();
126 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
128 final double p1 = 0.4;
129 final double p2 = 0.7;
130 final double ddist = 0.98;
131 final Value dref = new Value(ddist, Unit.NOUNIT2);
132 final Point point = new Point(p1, p2);
135 context.checking(new Expectations() {{
136 oneOf(modifier1).modify(simulation, p1);
137 oneOf(modifier2).modify(simulation, p2);
138 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
139 oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2));
140 oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
141 oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3));
142 oneOf(modifier2).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
143 oneOf(listener).evaluated(point, new Value[] {
144 new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()),
145 new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit())
146 }, dref, null, 1.98E200);
151 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
152 parameter, goal, domain, modifier1, modifier2) {
154 Simulation newSimulationInstance(Simulation sim) {
158 function.addRocketOptimizationListener(listener);
160 double value = function.evaluate(new Point(p1, p2));
161 assertTrue(value > 1e100);
165 public void testOutsideDomain2() throws InterruptedException, OptimizationException {
166 final Rocket rocket = new Rocket();
167 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
169 final double p1 = 0.4;
170 final double p2 = 0.7;
171 final double ddist = Double.NaN;
172 final Value dref = new Value(0.33, Unit.NOUNIT2);
175 context.checking(new Expectations() {{
176 oneOf(modifier1).modify(simulation, p1);
177 oneOf(modifier2).modify(simulation, p2);
178 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
183 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
184 parameter, goal, domain, modifier1, modifier2) {
186 Simulation newSimulationInstance(Simulation sim) {
191 double value = function.evaluate(new Point(p1, p2));
192 assertEquals(Double.MAX_VALUE, value, 0);
197 public void testNewSimulationInstance() {
198 final Rocket rocket = new Rocket();
199 rocket.setName("Foobar");
200 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
201 simulation.setName("MySim");
203 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
204 parameter, goal, domain, modifier1, modifier2);
206 Simulation sim = function.newSimulationInstance(simulation);
207 assertFalse(simulation == sim);
208 assertEquals("MySim", sim.getName());
209 assertFalse(rocket == sim.getRocket());
210 assertEquals("Foobar", sim.getRocket().getName());