1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.hipparchus.ode.events;
18
19 import org.hipparchus.analysis.solvers.BracketedRealFieldUnivariateSolver;
20 import org.hipparchus.analysis.solvers.FieldBracketingNthOrderBrentSolver;
21 import org.hipparchus.complex.Complex;
22 import org.hipparchus.complex.ComplexField;
23 import org.hipparchus.ode.FieldODEStateAndDerivative;
24 import org.hipparchus.ode.sampling.FieldODEStateInterpolator;
25 import org.hipparchus.util.MathArrays;
26 import org.junit.jupiter.api.Assertions;
27 import org.junit.jupiter.params.ParameterizedTest;
28 import org.junit.jupiter.params.provider.ValueSource;
29 import org.mockito.Mockito;
30
31 class FieldDetectorBasedEventStateTest {
32
33 @ParameterizedTest
34 @ValueSource(booleans = {true, false})
35 void testNextCheck(final boolean isForward) {
36
37 final TestFieldDetector detector = new TestFieldDetector(isForward);
38 final FieldDetectorBasedEventState<Complex> eventState = new FieldDetectorBasedEventState<>(detector);
39 final FieldODEStateInterpolator<Complex> mockedInterpolator = Mockito.mock(FieldODEStateInterpolator.class);
40 final FieldODEStateAndDerivative<Complex> stateAndDerivative1 = getStateAndDerivative(1);
41 final FieldODEStateAndDerivative<Complex> stateAndDerivative2 = getStateAndDerivative(-1);
42 if (isForward) {
43 Mockito.when(mockedInterpolator.getCurrentState()).thenReturn(stateAndDerivative1);
44 Mockito.when(mockedInterpolator.getPreviousState()).thenReturn(stateAndDerivative2);
45 } else {
46 Mockito.when(mockedInterpolator.getCurrentState()).thenReturn(stateAndDerivative2);
47 Mockito.when(mockedInterpolator.getPreviousState()).thenReturn(stateAndDerivative1);
48 }
49 Mockito.when(mockedInterpolator.isForward()).thenReturn(isForward);
50 Mockito.when(mockedInterpolator.getInterpolatedState(new Complex(0.))).thenReturn(getStateAndDerivative(0.));
51 eventState.init(mockedInterpolator.getPreviousState(), mockedInterpolator.getPreviousState().getTime());
52 eventState.reinitializeBegin(mockedInterpolator);
53
54 final AssertionError error = Assertions.assertThrows(AssertionError.class, () ->
55 eventState.evaluateStep(mockedInterpolator));
56 Assertions.assertEquals(isForward ? "forward" : "backward", error.getMessage());
57 }
58
59 private static FieldODEStateAndDerivative<Complex> getStateAndDerivative(final double time) {
60 final Complex[] state = MathArrays.buildArray(ComplexField.getInstance(), 1);
61 state[0] = new Complex(time);
62 final Complex[] derivative = MathArrays.buildArray(ComplexField.getInstance(), 1);
63 derivative[0] = Complex.ONE;
64 return new FieldODEStateAndDerivative<>(state[0], state, derivative);
65 }
66
67 private static class TestFieldDetector implements FieldODEEventDetector<Complex> {
68
69 private final boolean failOnForward;
70
71 TestFieldDetector(final boolean failOnForward) {
72 this.failOnForward = failOnForward;
73 }
74
75 @Override
76 public FieldAdaptableInterval<Complex> getMaxCheckInterval() {
77 return (state, isForward) -> {
78 if (isForward && failOnForward) {
79 throw new AssertionError("forward");
80 } else if (!isForward && !failOnForward) {
81 throw new AssertionError("backward");
82 }
83 return 1.;
84 };
85 }
86
87 @Override
88 public int getMaxIterationCount() {
89 return 10;
90 }
91
92 @Override
93 public BracketedRealFieldUnivariateSolver<Complex> getSolver() {
94 return new FieldBracketingNthOrderBrentSolver<>(Complex.ONE, Complex.ONE, Complex.ONE, 2);
95 }
96
97 @Override
98 public FieldODEEventHandler<Complex> getHandler() {
99 return (s, e, d) -> Action.CONTINUE;
100 }
101
102 @Override
103 public Complex g(FieldODEStateAndDerivative<Complex> state) {
104 return state.getTime();
105 }
106 }
107
108 }