fe2084f0041a009342638d84e7c4bedf5352f8b3
[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.OpenRocketDocument;
5 import net.sf.openrocket.document.Simulation;
6 import net.sf.openrocket.optimization.general.OptimizationException;
7 import net.sf.openrocket.optimization.general.Point;
8 import net.sf.openrocket.rocketcomponent.Rocket;
9 import net.sf.openrocket.unit.Unit;
10 import net.sf.openrocket.unit.UnitGroup;
11 import net.sf.openrocket.unit.Value;
12 import net.sf.openrocket.util.Pair;
13
14 import org.jmock.Expectations;
15 import org.jmock.Mockery;
16 import org.jmock.auto.Mock;
17 import org.jmock.integration.junit4.JMock;
18 import org.jmock.integration.junit4.JUnit4Mockery;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21
22
23 @RunWith(JMock.class)
24 public class TestRocketOptimizationFunction {
25         Mockery context = new JUnit4Mockery();
26         
27         @Mock
28         OptimizableParameter parameter;
29         @Mock
30         OptimizationGoal goal;
31         @Mock
32         SimulationDomain domain;
33         @Mock
34         SimulationModifier modifier1;
35         @Mock
36         SimulationModifier modifier2;
37         @Mock
38         RocketOptimizationListener listener;
39         
40         @Test
41         public void testNormalEvaluation() throws InterruptedException, OptimizationException {
42                 final Rocket rocket = new Rocket();
43                 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
44                 
45                 final double p1 = 0.4;
46                 final double p2 = 0.7;
47                 final double ddist = -0.43;
48                 final Value dref = new Value(ddist, Unit.NOUNIT2);
49                 final double pvalue = 9.81;
50                 final Value pvalueValue = new Value(9.81, Unit.NOUNIT2);
51                 final double gvalue = 8.81;
52                 final Point point = new Point(p1, p2);
53                 
54                 // @formatter:off
55                 context.checking(new Expectations() {{
56                                 oneOf(modifier1).modify(simulation, p1);
57                                 oneOf(modifier2).modify(simulation, p2);
58                                 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
59                                 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
60                                 oneOf(parameter).getUnitGroup(); will(returnValue(UnitGroup.UNITS_NONE));
61                                 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(gvalue));
62                                 oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2));
63                                 oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
64                                 oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3));
65                                 oneOf(modifier2).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
66                                 oneOf(listener).evaluated(point, new Value[] {
67                                                 new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()),
68                                                 new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit())
69                                 }, dref, pvalueValue, gvalue);
70                 }});
71                 // @formatter:on
72                 
73                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
74                                 parameter, goal, domain, modifier1, modifier2) {
75                         @Override
76                         Simulation newSimulationInstance(Simulation sim) {
77                                 return sim;
78                         }
79                 };
80                 function.addRocketOptimizationListener(listener);
81                 
82                 double value = function.evaluate(point);
83                 assertEquals(gvalue, value, 0);
84         }
85         
86         @Test
87         public void testNaNValue() throws InterruptedException, OptimizationException {
88                 final Rocket rocket = new Rocket();
89                 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
90                 
91                 final double p1 = 0.4;
92                 final double p2 = 0.7;
93                 final double ddist = -0.43;
94                 final Value dref = new Value(0.33, Unit.NOUNIT2);
95                 final double pvalue = 9.81;
96                 
97                 // @formatter:off
98                 context.checking(new Expectations() {{
99                                 oneOf(modifier1).modify(simulation, p1);
100                                 oneOf(modifier2).modify(simulation, p2);
101                                 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
102                                 oneOf(parameter).computeValue(simulation); will(returnValue(pvalue));
103                                 oneOf(parameter).getUnitGroup(); will(returnValue(UnitGroup.UNITS_NONE));
104                                 oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(Double.NaN));
105                 }});
106                 // @formatter:on
107                 
108
109                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
110                                 parameter, goal, domain, modifier1, modifier2) {
111                         @Override
112                         Simulation newSimulationInstance(Simulation sim) {
113                                 return sim;
114                         }
115                 };
116                 
117
118                 double value = function.evaluate(new Point(p1, p2));
119                 assertEquals(Double.MAX_VALUE, value, 0);
120         }
121         
122         
123         @Test
124         public void testOutsideDomain() throws InterruptedException, OptimizationException {
125                 final Rocket rocket = new Rocket();
126                 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
127                 
128                 final double p1 = 0.4;
129                 final double p2 = 0.7;
130                 final double ddist = 0.98;
131                 final Value dref = new Value(ddist, Unit.NOUNIT2);
132                 final Point point = new Point(p1, p2);
133                 
134                 // @formatter:off
135                 context.checking(new Expectations() {{
136                                 oneOf(modifier1).modify(simulation, p1);
137                                 oneOf(modifier2).modify(simulation, p2);
138                                 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
139                                 oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2));
140                                 oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
141                                 oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3));
142                                 oneOf(modifier2).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH));
143                                 oneOf(listener).evaluated(point, new Value[] {
144                                                 new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()),
145                                                 new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit())
146                                 }, dref, null, 1.98E200);
147                 }});
148                 // @formatter:on
149                 
150
151                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
152                                 parameter, goal, domain, modifier1, modifier2) {
153                         @Override
154                         Simulation newSimulationInstance(Simulation sim) {
155                                 return sim;
156                         }
157                 };
158                 function.addRocketOptimizationListener(listener);
159                 
160                 double value = function.evaluate(new Point(p1, p2));
161                 assertTrue(value > 1e100);
162         }
163         
164         @Test
165         public void testOutsideDomain2() throws InterruptedException, OptimizationException {
166                 final Rocket rocket = new Rocket();
167                 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
168                 
169                 final double p1 = 0.4;
170                 final double p2 = 0.7;
171                 final double ddist = Double.NaN;
172                 final Value dref = new Value(0.33, Unit.NOUNIT2);
173                 
174                 // @formatter:off
175                 context.checking(new Expectations() {{
176                                 oneOf(modifier1).modify(simulation, p1);
177                                 oneOf(modifier2).modify(simulation, p2);
178                                 oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair<Double,Value>(ddist, dref)));
179                 }});
180                 // @formatter:on
181                 
182
183                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
184                                 parameter, goal, domain, modifier1, modifier2) {
185                         @Override
186                         Simulation newSimulationInstance(Simulation sim) {
187                                 return sim;
188                         }
189                 };
190                 
191                 double value = function.evaluate(new Point(p1, p2));
192                 assertEquals(Double.MAX_VALUE, value, 0);
193         }
194         
195         
196         @Test
197         public void testNewSimulationInstance() {
198                 final Rocket rocket = new Rocket();
199                 rocket.setName("Foobar");
200                 final Simulation simulation = new Simulation(new OpenRocketDocument(rocket), rocket);
201                 simulation.setName("MySim");
202                 
203                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
204                                 parameter, goal, domain, modifier1, modifier2);
205                 
206                 Simulation sim = function.newSimulationInstance(simulation);
207                 assertFalse(simulation == sim);
208                 assertEquals("MySim", sim.getName());
209                 assertFalse(rocket == sim.getRocket());
210                 assertEquals("Foobar", sim.getRocket().getName());
211         }
212         
213 }