1 package net.sf.openrocket.optimization.rocketoptimization;
3 import static org.junit.Assert.*;
4 import net.sf.openrocket.document.Simulation;
5 import net.sf.openrocket.optimization.general.OptimizationException;
6 import net.sf.openrocket.optimization.general.Point;
7 import net.sf.openrocket.rocketcomponent.Rocket;
8 import net.sf.openrocket.unit.Unit;
9 import net.sf.openrocket.unit.UnitGroup;
10 import net.sf.openrocket.unit.Value;
11 import net.sf.openrocket.util.Pair;
13 import org.jmock.Expectations;
14 import org.jmock.Mockery;
15 import org.jmock.auto.Mock;
16 import org.jmock.integration.junit4.JMock;
17 import org.jmock.integration.junit4.JUnit4Mockery;
18 import org.junit.Test;
19 import org.junit.runner.RunWith;
23 public class TestRocketOptimizationFunction {
24 Mockery context = new JUnit4Mockery();
27 OptimizableParameter parameter;
29 OptimizationGoal goal;
31 SimulationDomain domain;
33 SimulationModifier modifier1;
35 SimulationModifier modifier2;
37 RocketOptimizationListener listener;
40 public void testNormalEvaluation() throws InterruptedException, OptimizationException {
41 final Rocket rocket = new Rocket();
42 final Simulation simulation = new Simulation(rocket);
44 final double p1 = 0.4;
45 final double p2 = 0.7;
46 final double ddist = -0.43;
47 final Value dref = new Value(ddist, Unit.NOUNIT2);
48 final double pvalue = 9.81;
49 final Value pvalueValue = new Value(9.81, Unit.NOUNIT2);
50 final double gvalue = 8.81;
51 final Point point = new Point(p1, p2);
54 context.checking(new Expectations() {{
55 oneOf(modifier1).modify(simulation, p1);
56 oneOf(modifier2).modify(simulation, p2);
57 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
58 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
59 oneOf(parameter).getUnitGroup(); will(returnValue(UnitGroup.UNITS_NONE));
60 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(gvalue));
61 oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2));
62 oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
63 oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3));
64 oneOf(modifier2).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
65 oneOf(listener).evaluated(point, new Value[] {
66 new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()),
67 new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit())
68 }, dref, pvalueValue, gvalue);
72 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
73 parameter, goal, domain, modifier1, modifier2) {
75 Simulation newSimulationInstance(Simulation sim) {
79 function.addRocketOptimizationListener(listener);
81 double value = function.evaluate(point);
82 assertEquals(gvalue, value, 0);
86 public void testNaNValue() throws InterruptedException, OptimizationException {
87 final Rocket rocket = new Rocket();
88 final Simulation simulation = new Simulation(rocket);
90 final double p1 = 0.4;
91 final double p2 = 0.7;
92 final double ddist = -0.43;
93 final Value dref = new Value(0.33, Unit.NOUNIT2);
94 final double pvalue = 9.81;
97 context.checking(new Expectations() {{
98 oneOf(modifier1).modify(simulation, p1);
99 oneOf(modifier2).modify(simulation, p2);
100 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
101 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
102 oneOf(parameter).getUnitGroup(); will(returnValue(UnitGroup.UNITS_NONE));
103 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(Double.NaN));
108 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
109 parameter, goal, domain, modifier1, modifier2) {
111 Simulation newSimulationInstance(Simulation sim) {
117 double value = function.evaluate(new Point(p1, p2));
118 assertEquals(Double.MAX_VALUE, value, 0);
123 public void testOutsideDomain() throws InterruptedException, OptimizationException {
124 final Rocket rocket = new Rocket();
125 final Simulation simulation = new Simulation(rocket);
127 final double p1 = 0.4;
128 final double p2 = 0.7;
129 final double ddist = 0.98;
130 final Value dref = new Value(ddist, Unit.NOUNIT2);
131 final Point point = new Point(p1, p2);
134 context.checking(new Expectations() {{
135 oneOf(modifier1).modify(simulation, p1);
136 oneOf(modifier2).modify(simulation, p2);
137 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
138 oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2));
139 oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
140 oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3));
141 oneOf(modifier2).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
142 oneOf(listener).evaluated(point, new Value[] {
143 new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()),
144 new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit())
145 }, dref, null, 1.98E200);
150 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
151 parameter, goal, domain, modifier1, modifier2) {
153 Simulation newSimulationInstance(Simulation sim) {
157 function.addRocketOptimizationListener(listener);
159 double value = function.evaluate(new Point(p1, p2));
160 assertTrue(value > 1e100);
164 public void testOutsideDomain2() throws InterruptedException, OptimizationException {
165 final Rocket rocket = new Rocket();
166 final Simulation simulation = new Simulation(rocket);
168 final double p1 = 0.4;
169 final double p2 = 0.7;
170 final double ddist = Double.NaN;
171 final Value dref = new Value(0.33, Unit.NOUNIT2);
174 context.checking(new Expectations() {{
175 oneOf(modifier1).modify(simulation, p1);
176 oneOf(modifier2).modify(simulation, p2);
177 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
182 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
183 parameter, goal, domain, modifier1, modifier2) {
185 Simulation newSimulationInstance(Simulation sim) {
190 double value = function.evaluate(new Point(p1, p2));
191 assertEquals(Double.MAX_VALUE, value, 0);
196 public void testNewSimulationInstance() {
197 final Rocket rocket = new Rocket();
198 rocket.setName("Foobar");
199 final Simulation simulation = new Simulation(rocket);
200 simulation.setName("MySim");
202 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
203 parameter, goal, domain, modifier1, modifier2);
205 Simulation sim = function.newSimulationInstance(simulation);
206 assertFalse(simulation == sim);
207 assertEquals("MySim", sim.getName());
208 assertFalse(rocket == sim.getRocket());
209 assertEquals("Foobar", sim.getRocket().getName());