cleaned up FlightEventsTest by

(1) creating a CompareEvents() method called by both testSingleStage() and testMultiStage() to get rid of duplicate code; also made creation of expected events in testSingleStage() cleaner

(2) tied required time accuracy of events that depend on one of the simulationsteppers to the simulation timestep. This also let us go back to testing time on all events.
This commit is contained in:
JoePfeiffer 2023-09-24 16:37:43 -06:00
parent 1b29a6b767
commit 65b36af180

View File

@ -43,44 +43,24 @@ public class FlightEventsTest extends BaseTestCase {
final int branchCount = sim.getSimulatedData().getBranchCount();
assertEquals(" Single stage simulation invalid branch count ", 1, branchCount);
final FlightEvent.Type[] expectedEventTypes = {FlightEvent.Type.LAUNCH, FlightEvent.Type.IGNITION, FlightEvent.Type.LIFTOFF,
FlightEvent.Type.LAUNCHROD, FlightEvent.Type.BURNOUT, FlightEvent.Type.EJECTION_CHARGE, FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT,
FlightEvent.Type.APOGEE, FlightEvent.Type.GROUND_HIT, FlightEvent.Type.SIMULATION_END};
final double[] expectedEventTimes = {0.0, 0.0, 0.1275, 0.13, 2.0, 2.0, 2.001, 2.48338}; // Ground hit time is too variable, so don't include it
final AxialStage stage = rocket.getStage(0);
final InnerTube motorMountTube = (InnerTube) stage.getChild(1).getChild(2);
final Parachute parachute = (Parachute) stage.getChild(1).getChild(3);
final RocketComponent[] expectedSources = {rocket, motorMountTube, null, null, motorMountTube,
stage, parachute, rocket, null, null};
FlightEvent[] expectedEvents = new FlightEvent[] {
new FlightEvent(FlightEvent.Type.LAUNCH, 0.0, rocket),
new FlightEvent(FlightEvent.Type.IGNITION, 0.0, motorMountTube),
new FlightEvent(FlightEvent.Type.LIFTOFF, 0.1275, null),
new FlightEvent(FlightEvent.Type.LAUNCHROD, 0.13, null),
new FlightEvent(FlightEvent.Type.BURNOUT, 2.0, motorMountTube),
new FlightEvent(FlightEvent.Type.EJECTION_CHARGE, 2.0, stage),
new FlightEvent(FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT, 2.001, parachute),
new FlightEvent(FlightEvent.Type.APOGEE, 2.48338, rocket),
new FlightEvent(FlightEvent.Type.GROUND_HIT, 43.1, null),
new FlightEvent(FlightEvent.Type.SIMULATION_END, 43.1, null)
};
// Test event count
FlightDataBranch branch = sim.getSimulatedData().getBranch(0);
List<FlightEvent> eventList = branch.getEvents();
List<FlightEvent.Type> eventTypes = eventList.stream().map(FlightEvent::getType).collect(Collectors.toList());
assertEquals(" Single stage simulation invalid number of events ", expectedEventTypes.length, eventTypes.size());
// Test that all expected events are present, and in the right order
for (int i = 0; i < expectedEventTypes.length; i++) {
assertSame(" Flight type " + expectedEventTypes[i] + " not found in single stage simulation ",
expectedEventTypes[i], eventTypes.get(i));
}
// Test that the event times are correct
for (int i = 0; i < expectedEventTimes.length; i++) {
FlightEvent actual = eventList.get(i);
double epsilon = ((actual.getType() == FlightEvent.Type.TUMBLE) ||
(actual.getType() == FlightEvent.Type.APOGEE)) ? sim.getOptions().getTimeStep() : EPSILON;
assertEquals(" Flight type " + expectedEventTypes[i] + " has wrong time ",
expectedEventTimes[i], actual.getTime(), epsilon);
}
// Test that the event sources are correct
for (int i = 0; i < expectedSources.length; i++) {
assertEquals(" Flight type " + expectedEventTypes[i] + " has wrong source ",
expectedSources[i], eventList.get(i).getSource());
}
compareEvents(sim.getSimulatedData().getBranch(0), expectedEvents, sim.getOptions().getTimeStep());
}
/**
@ -109,7 +89,6 @@ public class FlightEventsTest extends BaseTestCase {
final InnerTube boosterMotorTubes = (InnerTube) boosterStage.getChild(1).getChild(0);
final BodyTube coreBody = (BodyTube) coreStage.getChild(0);
// events whose time is too variable to check are given a time of 1200
for (int b = 0; b < 3; b++) {
FlightEvent[] expectedEvents;
switch (b) {
@ -129,8 +108,8 @@ public class FlightEventsTest extends BaseTestCase {
new FlightEvent(FlightEvent.Type.EJECTION_CHARGE, 2.0, coreStage),
new FlightEvent(FlightEvent.Type.STAGE_SEPARATION, 2.0, coreStage),
new FlightEvent(FlightEvent.Type.TUMBLE, 2.4127, null),
new FlightEvent(FlightEvent.Type.GROUND_HIT, 1200, null),
new FlightEvent(FlightEvent.Type.SIMULATION_END, 1200, null)
new FlightEvent(FlightEvent.Type.GROUND_HIT, 13.2, null),
new FlightEvent(FlightEvent.Type.SIMULATION_END, 13.2, null)
};
break;
// Core stage
@ -140,8 +119,8 @@ public class FlightEventsTest extends BaseTestCase {
new FlightEvent(FlightEvent.Type.BURNOUT, 2.0, coreBody),
new FlightEvent(FlightEvent.Type.EJECTION_CHARGE, 2.0, coreStage),
new FlightEvent(FlightEvent.Type.STAGE_SEPARATION, 2.0, coreStage),
new FlightEvent(FlightEvent.Type.GROUND_HIT, 1200, null),
new FlightEvent(FlightEvent.Type.SIMULATION_END, 1200, null)
new FlightEvent(FlightEvent.Type.GROUND_HIT, 5.9, null),
new FlightEvent(FlightEvent.Type.SIMULATION_END, 5.9, null)
};
break;
// Booster stage
@ -152,39 +131,47 @@ public class FlightEventsTest extends BaseTestCase {
new FlightEvent(FlightEvent.Type.EJECTION_CHARGE, 2.0, boosterStage),
new FlightEvent(FlightEvent.Type.STAGE_SEPARATION, 2.0, boosterStage),
new FlightEvent(FlightEvent.Type.TUMBLE, 3.428, null),
new FlightEvent(FlightEvent.Type.GROUND_HIT, 1200, null),
new FlightEvent(FlightEvent.Type.SIMULATION_END, 1200, null)
new FlightEvent(FlightEvent.Type.GROUND_HIT, 10.32, null),
new FlightEvent(FlightEvent.Type.SIMULATION_END, 10.32, null)
};
break;
default:
throw new IllegalStateException("Invalid branch number " + b);
}
// Test event count
final FlightDataBranch branch = sim.getSimulatedData().getBranch(b);
final FlightEvent[] events = branch.getEvents().toArray(new FlightEvent[0]);
assertEquals(" Multi-stage simulation, branch " + b + " invalid number of events ", expectedEvents.length, events.length);
// Test that all expected events are present, in the right order, at the right time, from the right sources
for (int i = 0; i < events.length; i++) {
final FlightEvent expected = expectedEvents[i];
final FlightEvent actual = events[i];
assertSame("Branch " + b + " FlightEvent " + i + " type " + expected.getType() + " not found; FlightEvent " + actual.getType() + " found instead",
expected.getType(), actual.getType());
if (1200 != expected.getTime()) {
// Events whose timing depends on the results of the steppers can't be expected to be more accurate than
// the length of a time step
double epsilon = ((actual.getType() == FlightEvent.Type.TUMBLE) ||
(actual.getType() == FlightEvent.Type.APOGEE)) ? sim.getOptions().getTimeStep() : EPSILON;
assertEquals("Branch " + b + " FlightEvent " + i + " type " + expected.getType() + " has wrong time ",
expected.getTime(), actual.getTime(), epsilon);
}
// Test that the event sources are correct
assertEquals("Branch " + b + " FlightEvent " + i + " type " + expected.getType() + " has wrong source ",
expected.getSource(), actual.getSource());
}
compareEvents(sim.getSimulatedData().getBranch(b), expectedEvents, sim.getOptions().getTimeStep());
}
}
// compare expected vs. actual event types, times, and sources
// Note: if an event's time is too variable to test reliably, set expected time to 1200 to ignore
private void compareEvents(FlightDataBranch b, FlightEvent[] expectedEvents, double timeStep) {
FlightEvent[] actualEvents = b.getEvents().toArray(new FlightEvent[0]);
// test event count
assertEquals("Number of flight events in branch " + b, expectedEvents.length, actualEvents.length);
// Test that all expected events are present, in the right order, at the right time, from the right sources
for (int i = 0; i < actualEvents.length; i++) {
final FlightEvent expected = expectedEvents[i];
final FlightEvent actual = actualEvents[i];
System.out.println("event " + actual);
assertSame("Branch " + b + " FlightEvent " + i + " type " + expected.getType() + " not found; FlightEvent " + actual.getType() + " found instead",
expected.getType(), actual.getType());
if (1200 != expected.getTime()) {
// Events whose timing depends on the results of the steppers can't be expected to be more accurate than
// the length of a time step
double epsilon = ((actual.getType() == FlightEvent.Type.TUMBLE) ||
(actual.getType() == FlightEvent.Type.APOGEE) ||
(actual.getType() == FlightEvent.Type.GROUND_HIT) ||
(actual.getType() == FlightEvent.Type.SIMULATION_END)) ? timeStep : EPSILON;
assertEquals("Branch " + b + " FlightEvent " + i + " type " + expected.getType() + " has wrong time ",
expected.getTime(), actual.getTime(), epsilon);
}
assertEquals("FlightEvent from unexpected source", expected.getSource(), actual.getSource());
}
}
}