create changelog entry
[debian/openrocket] / core / 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.Unit;
9 import net.sf.openrocket.unit.UnitGroup;
10 import net.sf.openrocket.unit.Value;
11 import net.sf.openrocket.util.Pair;
12
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;
20
21
22 @RunWith(JMock.class)
23 public class TestRocketOptimizationFunction {
24         Mockery context = new JUnit4Mockery();
25         
26         @Mock
27         OptimizableParameter parameter;
28         @Mock
29         OptimizationGoal goal;
30         @Mock
31         SimulationDomain domain;
32         @Mock
33         SimulationModifier modifier1;
34         @Mock
35         SimulationModifier modifier2;
36         @Mock
37         RocketOptimizationListener listener;
38         
39         @Test
40         public void testNormalEvaluation() throws InterruptedException, OptimizationException {
41                 final Rocket rocket = new Rocket();
42                 final Simulation simulation = new Simulation(rocket);
43                 
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);
52                 
53                 // @formatter:off
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);
69                 }});
70                 // @formatter:on
71                 
72                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
73                                 parameter, goal, domain, modifier1, modifier2) {
74                         @Override
75                         Simulation newSimulationInstance(Simulation sim) {
76                                 return sim;
77                         }
78                 };
79                 function.addRocketOptimizationListener(listener);
80                 
81                 double value = function.evaluate(point);
82                 assertEquals(gvalue, value, 0);
83         }
84         
85         @Test
86         public void testNaNValue() throws InterruptedException, OptimizationException {
87                 final Rocket rocket = new Rocket();
88                 final Simulation simulation = new Simulation(rocket);
89                 
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;
95                 
96                 // @formatter:off
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));
104                 }});
105                 // @formatter:on
106                 
107
108                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
109                                 parameter, goal, domain, modifier1, modifier2) {
110                         @Override
111                         Simulation newSimulationInstance(Simulation sim) {
112                                 return sim;
113                         }
114                 };
115                 
116
117                 double value = function.evaluate(new Point(p1, p2));
118                 assertEquals(Double.MAX_VALUE, value, 0);
119         }
120         
121         
122         @Test
123         public void testOutsideDomain() throws InterruptedException, OptimizationException {
124                 final Rocket rocket = new Rocket();
125                 final Simulation simulation = new Simulation(rocket);
126                 
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);
132                 
133                 // @formatter:off
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);
146                 }});
147                 // @formatter:on
148                 
149
150                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
151                                 parameter, goal, domain, modifier1, modifier2) {
152                         @Override
153                         Simulation newSimulationInstance(Simulation sim) {
154                                 return sim;
155                         }
156                 };
157                 function.addRocketOptimizationListener(listener);
158                 
159                 double value = function.evaluate(new Point(p1, p2));
160                 assertTrue(value > 1e100);
161         }
162         
163         @Test
164         public void testOutsideDomain2() throws InterruptedException, OptimizationException {
165                 final Rocket rocket = new Rocket();
166                 final Simulation simulation = new Simulation(rocket);
167                 
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);
172                 
173                 // @formatter:off
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)));
178                 }});
179                 // @formatter:on
180                 
181
182                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
183                                 parameter, goal, domain, modifier1, modifier2) {
184                         @Override
185                         Simulation newSimulationInstance(Simulation sim) {
186                                 return sim;
187                         }
188                 };
189                 
190                 double value = function.evaluate(new Point(p1, p2));
191                 assertEquals(Double.MAX_VALUE, value, 0);
192         }
193         
194         
195         @Test
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");
201                 
202                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
203                                 parameter, goal, domain, modifier1, modifier2);
204                 
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());
210         }
211         
212 }