diff --git a/tests/framework/testProcessSequence.cpp b/tests/framework/testProcessSequence.cpp index 641d3eecb8e4d4d9abb548eb2e05209fbc67f719..7d207965e57c98c304a1cf0aacca5c1bcdfbc318 100644 --- a/tests/framework/testProcessSequence.cpp +++ b/tests/framework/testProcessSequence.cpp @@ -1065,3 +1065,112 @@ TEST_CASE("ProcessSequence Indexing", "ProcessSequence") { << std::endl; } } + +TEST_CASE("SwitchProcessSequence Indexing", "ProcessSequence") { + // see issue https://gitlab.iap.kit.edu/AirShowerPhysics/corsika/-/issues/573 + // and issue https://gitlab.iap.kit.edu/AirShowerPhysics/corsika/-/issues/586 + + logging::set_level(logging::level::info); + + CoordinateSystemPtr rootCS = get_root_CoordinateSystem(); + + struct SwitchSelect { + bool operator()(DummyData const& p) const { return (p.data_[0] > 0); } + }; + SwitchSelect select1; + + auto cp1 = ContinuousProcess1(0, 0_m); + auto cp2 = ContinuousProcess1(0, 0_m); + auto cp3 = ContinuousProcess1(0, 0_m); + auto cp4 = ContinuousProcess1(0, 0_m); + + auto sequence = make_sequence(make_select(select1, cp1, cp2), cp3, cp4); + + DummyData particle; + DummyTrajectory track; + DummyView view(particle); + Step step(particle, track); + + // cp1 selected + cp1.setStep(1_m); + cp2.setStep(100_m); + cp3.setStep(100_m); + cp4.setStep(100_m); + particle.data_[0] = 1; // positive so that cp1 is selected + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + ContinuousProcessStepLength continuousMaxStep = + sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + cp4.resetFlag(); + + // cp2 selected + cp1.setStep(100_m); + cp2.setStep(1_m); + cp3.setStep(100_m); + cp4.setStep(100_m); + particle.data_[0] = -1; // negative so that cp2 is selected + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + continuousMaxStep = sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK_FALSE(cp1.getFlag()); + CHECK(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + cp4.resetFlag(); + + // cp3 selected + cp1.setStep(100_m); + cp2.setStep(100_m); + cp3.setStep(1_m); + cp4.setStep(100_m); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + continuousMaxStep = sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + cp4.resetFlag(); + + // cp4 selected + cp1.setStep(100_m); + cp2.setStep(100_m); + cp3.setStep(100_m); + cp4.setStep(1_m); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + continuousMaxStep = sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK(cp4.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + cp4.resetFlag(); +}