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.UnitGroup;
9 import net.sf.openrocket.unit.Value;
10 import net.sf.openrocket.util.Pair;
12 import org.jmock.Expectations;
13 import org.jmock.Mockery;
14 import org.jmock.auto.Mock;
15 import org.jmock.integration.junit4.JMock;
16 import org.jmock.integration.junit4.JUnit4Mockery;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
22 public class TestRocketOptimizationFunction {
23 Mockery context = new JUnit4Mockery();
26 OptimizableParameter parameter;
28 OptimizationGoal goal;
30 SimulationDomain domain;
32 SimulationModifier modifier1;
34 SimulationModifier modifier2;
36 RocketOptimizationListener listener;
39 public void testNormalEvaluation() throws InterruptedException, OptimizationException {
40 final Rocket rocket = new Rocket();
41 final Simulation simulation = new Simulation(rocket);
43 final double p1 = 0.4;
44 final double p2 = 0.7;
45 final double ddist = -0.43;
46 final double dref = 0.33;
47 final double pvalue = 9.81;
48 final double gvalue = 8.81;
49 final Point point = new Point(p1, p2);
52 context.checking(new Expectations() {{
53 oneOf(modifier1).modify(simulation, p1);
54 oneOf(modifier2).modify(simulation, p2);
55 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Double>(ddist, dref)));
56 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
57 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(gvalue));
58 oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2));
59 oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
60 oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3));
61 oneOf(modifier2).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
62 oneOf(listener).evaluated(point, new Value[] {
63 new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()),
64 new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit())
65 }, dref, pvalue, gvalue);
69 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
70 parameter, goal, domain, modifier1, modifier2) {
72 Simulation newSimulationInstance(Simulation sim) {
76 function.addRocketOptimizationListener(listener);
78 double value = function.evaluate(point);
79 assertEquals(gvalue, value, 0);
83 public void testNaNValue() throws InterruptedException, OptimizationException {
84 final Rocket rocket = new Rocket();
85 final Simulation simulation = new Simulation(rocket);
87 final double p1 = 0.4;
88 final double p2 = 0.7;
89 final double ddist = -0.43;
90 final double dref = 0.33;
91 final double pvalue = 9.81;
94 context.checking(new Expectations() {{
95 oneOf(modifier1).modify(simulation, p1);
96 oneOf(modifier2).modify(simulation, p2);
97 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Double>(ddist, dref)));
98 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
99 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(Double.NaN));
104 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
105 parameter, goal, domain, modifier1, modifier2) {
107 Simulation newSimulationInstance(Simulation sim) {
113 double value = function.evaluate(new Point(p1, p2));
114 assertEquals(Double.MAX_VALUE, value, 0);
119 public void testOutsideDomain() throws InterruptedException, OptimizationException {
120 final Rocket rocket = new Rocket();
121 final Simulation simulation = new Simulation(rocket);
123 final double p1 = 0.4;
124 final double p2 = 0.7;
125 final double ddist = 0.98;
126 final double dref = 0.33;
127 final Point point = new Point(p1, p2);
130 context.checking(new Expectations() {{
131 oneOf(modifier1).modify(simulation, p1);
132 oneOf(modifier2).modify(simulation, p2);
133 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Double>(ddist, dref)));
134 oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2));
135 oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
136 oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3));
137 oneOf(modifier2).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
138 oneOf(listener).evaluated(point, new Value[] {
139 new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()),
140 new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit())
141 }, dref, Double.NaN, 1.98E200);
146 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
147 parameter, goal, domain, modifier1, modifier2) {
149 Simulation newSimulationInstance(Simulation sim) {
153 function.addRocketOptimizationListener(listener);
155 double value = function.evaluate(new Point(p1, p2));
156 assertTrue(value > 1e100);
160 public void testOutsideDomain2() throws InterruptedException, OptimizationException {
161 final Rocket rocket = new Rocket();
162 final Simulation simulation = new Simulation(rocket);
164 final double p1 = 0.4;
165 final double p2 = 0.7;
166 final double ddist = Double.NaN;
167 final double dref = 0.33;
170 context.checking(new Expectations() {{
171 oneOf(modifier1).modify(simulation, p1);
172 oneOf(modifier2).modify(simulation, p2);
173 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Double>(ddist, dref)));
178 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
179 parameter, goal, domain, modifier1, modifier2) {
181 Simulation newSimulationInstance(Simulation sim) {
186 double value = function.evaluate(new Point(p1, p2));
187 assertEquals(Double.MAX_VALUE, value, 0);
192 public void testNewSimulationInstance() {
193 final Rocket rocket = new Rocket();
194 rocket.setName("Foobar");
195 final Simulation simulation = new Simulation(rocket);
196 simulation.setName("MySim");
198 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
199 parameter, goal, domain, modifier1, modifier2);
201 Simulation sim = function.newSimulationInstance(simulation);
202 assertFalse(simulation == sim);
203 assertEquals("MySim", sim.getName());
204 assertFalse(rocket == sim.getRocket());
205 assertEquals("Foobar", sim.getRocket().getName());