bug fixes and rocket optimization
[debian/openrocket] / test / net / sf / openrocket / optimization / rocketoptimization / TestRocketOptimizationFunction.java
1 package net.sf.openrocket.optimization.rocketoptimization;
2
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;
11
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;
19
20
21 @RunWith(JMock.class)
22 public class TestRocketOptimizationFunction {
23         Mockery context = new JUnit4Mockery();
24         
25         @Mock
26         OptimizableParameter parameter;
27         @Mock
28         OptimizationGoal goal;
29         @Mock
30         SimulationDomain domain;
31         @Mock
32         SimulationModifier modifier1;
33         @Mock
34         SimulationModifier modifier2;
35         @Mock
36         RocketOptimizationListener listener;
37         
38         @Test
39         public void testNormalEvaluation() throws InterruptedException, OptimizationException {
40                 final Rocket rocket = new Rocket();
41                 final Simulation simulation = new Simulation(rocket);
42                 
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);
50                 
51                 // @formatter:off
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);
66                 }});
67                 // @formatter:on
68                 
69                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
70                                 parameter, goal, domain, modifier1, modifier2) {
71                         @Override
72                         Simulation newSimulationInstance(Simulation sim) {
73                                 return sim;
74                         }
75                 };
76                 function.addRocketOptimizationListener(listener);
77                 
78                 double value = function.evaluate(point);
79                 assertEquals(gvalue, value, 0);
80         }
81         
82         @Test
83         public void testNaNValue() throws InterruptedException, OptimizationException {
84                 final Rocket rocket = new Rocket();
85                 final Simulation simulation = new Simulation(rocket);
86                 
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;
92                 
93                 // @formatter:off
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));
100                 }});
101                 // @formatter:on
102                 
103
104                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
105                                 parameter, goal, domain, modifier1, modifier2) {
106                         @Override
107                         Simulation newSimulationInstance(Simulation sim) {
108                                 return sim;
109                         }
110                 };
111                 
112
113                 double value = function.evaluate(new Point(p1, p2));
114                 assertEquals(Double.MAX_VALUE, value, 0);
115         }
116         
117         
118         @Test
119         public void testOutsideDomain() throws InterruptedException, OptimizationException {
120                 final Rocket rocket = new Rocket();
121                 final Simulation simulation = new Simulation(rocket);
122                 
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);
128                 
129                 // @formatter:off
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);
142                 }});
143                 // @formatter:on
144                 
145
146                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
147                                 parameter, goal, domain, modifier1, modifier2) {
148                         @Override
149                         Simulation newSimulationInstance(Simulation sim) {
150                                 return sim;
151                         }
152                 };
153                 function.addRocketOptimizationListener(listener);
154                 
155                 double value = function.evaluate(new Point(p1, p2));
156                 assertTrue(value > 1e100);
157         }
158         
159         @Test
160         public void testOutsideDomain2() throws InterruptedException, OptimizationException {
161                 final Rocket rocket = new Rocket();
162                 final Simulation simulation = new Simulation(rocket);
163                 
164                 final double p1 = 0.4;
165                 final double p2 = 0.7;
166                 final double ddist = Double.NaN;
167                 final double dref = 0.33;
168                 
169                 // @formatter:off
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)));
174                 }});
175                 // @formatter:on
176                 
177
178                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
179                                 parameter, goal, domain, modifier1, modifier2) {
180                         @Override
181                         Simulation newSimulationInstance(Simulation sim) {
182                                 return sim;
183                         }
184                 };
185                 
186                 double value = function.evaluate(new Point(p1, p2));
187                 assertEquals(Double.MAX_VALUE, value, 0);
188         }
189         
190         
191         @Test
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");
197                 
198                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
199                                 parameter, goal, domain, modifier1, modifier2);
200                 
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());
206         }
207         
208 }