View Javadoc
1   /*
2    * Licensed to the Hipparchus project under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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          // GIVEN
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          // WHEN & THEN
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 }