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;
9 import org.jmock.Expectations;
10 import org.jmock.Mockery;
11 import org.jmock.auto.Mock;
12 import org.jmock.integration.junit4.JMock;
13 import org.jmock.integration.junit4.JUnit4Mockery;
14 import org.junit.Test;
15 import org.junit.runner.RunWith;
19 public class TestRocketOptimizationFunction {
20 Mockery context = new JUnit4Mockery();
23 OptimizableParameter parameter;
25 OptimizationGoal goal;
27 SimulationDomain domain;
29 SimulationModifier modifier1;
31 SimulationModifier modifier2;
35 public void testNormalEvaluation() throws InterruptedException, OptimizationException {
36 final Rocket rocket = new Rocket();
37 final Simulation simulation = new Simulation(rocket);
39 final double p1 = 0.4;
40 final double p2 = 0.7;
41 final double ddist = -0.43;
42 final double pvalue = 9.81;
43 final double gvalue = 8.81;
46 context.checking(new Expectations() {{
47 oneOf(modifier1).modify(simulation, p1);
48 oneOf(modifier2).modify(simulation, p2);
49 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(ddist));
50 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
51 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(gvalue));
56 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
57 parameter, goal, domain, modifier1, modifier2) {
59 Simulation newSimulationInstance(Simulation sim) {
65 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
67 double value = function.evaluate(new Point(p1, p2));
68 assertEquals(gvalue, value, 0);
70 assertEquals(pvalue, function.getComputedParameterValue(new Point(p1, p2)), 0);
72 // Re-evaluate the point to verify parameter is not recomputed
73 value = function.evaluate(new Point(p1, p2));
74 assertEquals(gvalue, value, 0);
79 public void testNaNValue() throws InterruptedException, OptimizationException {
80 final Rocket rocket = new Rocket();
81 final Simulation simulation = new Simulation(rocket);
83 final double p1 = 0.4;
84 final double p2 = 0.7;
85 final double ddist = -0.43;
86 final double pvalue = 9.81;
89 context.checking(new Expectations() {{
90 oneOf(modifier1).modify(simulation, p1);
91 oneOf(modifier2).modify(simulation, p2);
92 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(ddist));
93 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
94 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(Double.NaN));
99 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
100 parameter, goal, domain, modifier1, modifier2) {
102 Simulation newSimulationInstance(Simulation sim) {
108 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
110 double value = function.evaluate(new Point(p1, p2));
111 assertEquals(Double.MAX_VALUE, value, 0);
113 assertEquals(pvalue, function.getComputedParameterValue(new Point(p1, p2)), 0);
115 value = function.evaluate(new Point(p1, p2));
116 assertEquals(Double.MAX_VALUE, value, 0);
121 public void testOutsideDomain() throws InterruptedException, OptimizationException {
122 final Rocket rocket = new Rocket();
123 final Simulation simulation = new Simulation(rocket);
125 final double p1 = 0.4;
126 final double p2 = 0.7;
127 final double ddist = 0.98;
130 context.checking(new Expectations() {{
131 oneOf(modifier1).modify(simulation, p1);
132 oneOf(modifier2).modify(simulation, p2);
133 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(ddist));
138 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
139 parameter, goal, domain, modifier1, modifier2) {
141 Simulation newSimulationInstance(Simulation sim) {
147 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
149 double value = function.evaluate(new Point(p1, p2));
150 assertTrue(value > 1e100);
152 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
154 value = function.evaluate(new Point(p1, p2));
155 assertTrue(value > 1e100);
159 public void testOutsideDomain2() throws InterruptedException, OptimizationException {
160 final Rocket rocket = new Rocket();
161 final Simulation simulation = new Simulation(rocket);
163 final double p1 = 0.4;
164 final double p2 = 0.7;
165 final double ddist = Double.NaN;
168 context.checking(new Expectations() {{
169 oneOf(modifier1).modify(simulation, p1);
170 oneOf(modifier2).modify(simulation, p2);
171 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(ddist));
176 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
177 parameter, goal, domain, modifier1, modifier2) {
179 Simulation newSimulationInstance(Simulation sim) {
185 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
187 double value = function.evaluate(new Point(p1, p2));
188 assertEquals(Double.MAX_VALUE, value, 0);
190 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
192 value = function.evaluate(new Point(p1, p2));
193 assertEquals(Double.MAX_VALUE, value, 0);
198 public void testNewSimulationInstance() {
199 final Rocket rocket = new Rocket();
200 rocket.setName("Foobar");
201 final Simulation simulation = new Simulation(rocket);
202 simulation.setName("MySim");
204 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
205 parameter, goal, domain, modifier1, modifier2);
207 Simulation sim = function.newSimulationInstance(simulation);
208 assertFalse(simulation == sim);
209 assertEquals("MySim", sim.getName());
210 assertFalse(rocket == sim.getRocket());
211 assertEquals("Foobar", sim.getRocket().getName());