53ee37dedde71d1b8cb767f8434d7c1614bb17f8
[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
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;
16
17
18 @RunWith(JMock.class)
19 public class TestRocketOptimizationFunction {
20         Mockery context = new JUnit4Mockery();
21         
22         @Mock
23         OptimizableParameter parameter;
24         @Mock
25         OptimizationGoal goal;
26         @Mock
27         SimulationDomain domain;
28         @Mock
29         SimulationModifier modifier1;
30         @Mock
31         SimulationModifier modifier2;
32         
33         
34         @Test
35         public void testNormalEvaluation() throws InterruptedException, OptimizationException {
36                 final Rocket rocket = new Rocket();
37                 final Simulation simulation = new Simulation(rocket);
38                 
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;
44                 
45                 // @formatter:off
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));
52                 }});
53                 // @formatter:on
54                 
55
56                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
57                                 parameter, goal, domain, modifier1, modifier2) {
58                         @Override
59                         Simulation newSimulationInstance(Simulation sim) {
60                                 return sim;
61                         }
62                 };
63                 
64
65                 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
66                 
67                 double value = function.evaluate(new Point(p1, p2));
68                 assertEquals(gvalue, value, 0);
69                 
70                 assertEquals(pvalue, function.getComputedParameterValue(new Point(p1, p2)), 0);
71                 
72                 // Re-evaluate the point to verify parameter is not recomputed
73                 value = function.evaluate(new Point(p1, p2));
74                 assertEquals(gvalue, value, 0);
75         }
76         
77         
78         @Test
79         public void testNaNValue() throws InterruptedException, OptimizationException {
80                 final Rocket rocket = new Rocket();
81                 final Simulation simulation = new Simulation(rocket);
82                 
83                 final double p1 = 0.4;
84                 final double p2 = 0.7;
85                 final double ddist = -0.43;
86                 final double pvalue = 9.81;
87                 
88                 // @formatter:off
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));
95                 }});
96                 // @formatter:on
97                 
98
99                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
100                                 parameter, goal, domain, modifier1, modifier2) {
101                         @Override
102                         Simulation newSimulationInstance(Simulation sim) {
103                                 return sim;
104                         }
105                 };
106                 
107
108                 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
109                 
110                 double value = function.evaluate(new Point(p1, p2));
111                 assertEquals(Double.MAX_VALUE, value, 0);
112                 
113                 assertEquals(pvalue, function.getComputedParameterValue(new Point(p1, p2)), 0);
114                 
115                 value = function.evaluate(new Point(p1, p2));
116                 assertEquals(Double.MAX_VALUE, value, 0);
117         }
118         
119         
120         @Test
121         public void testOutsideDomain() throws InterruptedException, OptimizationException {
122                 final Rocket rocket = new Rocket();
123                 final Simulation simulation = new Simulation(rocket);
124                 
125                 final double p1 = 0.4;
126                 final double p2 = 0.7;
127                 final double ddist = 0.98;
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(ddist));
134                 }});
135                 // @formatter:on
136                 
137
138                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
139                                 parameter, goal, domain, modifier1, modifier2) {
140                         @Override
141                         Simulation newSimulationInstance(Simulation sim) {
142                                 return sim;
143                         }
144                 };
145                 
146
147                 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
148                 
149                 double value = function.evaluate(new Point(p1, p2));
150                 assertTrue(value > 1e100);
151                 
152                 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
153                 
154                 value = function.evaluate(new Point(p1, p2));
155                 assertTrue(value > 1e100);
156         }
157         
158         @Test
159         public void testOutsideDomain2() throws InterruptedException, OptimizationException {
160                 final Rocket rocket = new Rocket();
161                 final Simulation simulation = new Simulation(rocket);
162                 
163                 final double p1 = 0.4;
164                 final double p2 = 0.7;
165                 final double ddist = Double.NaN;
166                 
167                 // @formatter:off
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));
172                 }});
173                 // @formatter:on
174                 
175
176                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
177                                 parameter, goal, domain, modifier1, modifier2) {
178                         @Override
179                         Simulation newSimulationInstance(Simulation sim) {
180                                 return sim;
181                         }
182                 };
183                 
184
185                 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
186                 
187                 double value = function.evaluate(new Point(p1, p2));
188                 assertEquals(Double.MAX_VALUE, value, 0);
189                 
190                 assertEquals(Double.NaN, function.getComputedParameterValue(new Point(p1, p2)), 0);
191                 
192                 value = function.evaluate(new Point(p1, p2));
193                 assertEquals(Double.MAX_VALUE, value, 0);
194         }
195         
196         
197         @Test
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");
203                 
204                 RocketOptimizationFunction function = new RocketOptimizationFunction(simulation,
205                                 parameter, goal, domain, modifier1, modifier2);
206                 
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());
212         }
213         
214 }