2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.mielecloud.internal.webservice.api;
15 import static org.junit.jupiter.api.Assertions.*;
16 import static org.mockito.ArgumentMatchers.any;
17 import static org.mockito.Mockito.*;
19 import java.util.Optional;
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.junit.jupiter.api.Test;
23 import org.openhab.binding.mielecloud.internal.webservice.api.json.StateType;
26 * @author Björn Lange - Initial contribution
29 public class TransitionStateTest {
30 private final DeviceState historic = mock(DeviceState.class);
31 private final DeviceState previous = mock(DeviceState.class);
32 private final DeviceState next = mock(DeviceState.class);
35 public void testHasFinishedChangedReturnsTrueWhenPreviousStateIsNull() {
37 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
39 TransitionState transitionState = new TransitionState(null, next);
42 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
45 assertTrue(hasFinishedChanged);
49 public void testHasFinishedChangedReturnsTrueWhenPreviousStateIsUnknown() {
51 when(previous.getStateType()).thenReturn(Optional.empty());
52 when(previous.isInState(any())).thenCallRealMethod();
53 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
54 when(next.isInState(any())).thenCallRealMethod();
56 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
59 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
62 assertTrue(hasFinishedChanged);
66 public void testHasFinishedChangedReturnsFalseWhenNoStateTransitionOccurred() {
68 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
69 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
71 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
74 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
77 assertFalse(hasFinishedChanged);
81 public void testHasFinishedChangedReturnsTrueWhenStateChangedFromRunningToEndProgrammed() {
83 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
84 when(previous.isInState(any())).thenCallRealMethod();
85 when(next.getStateType()).thenReturn(Optional.of(StateType.END_PROGRAMMED));
86 when(next.isInState(any())).thenCallRealMethod();
88 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
91 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
94 assertTrue(hasFinishedChanged);
98 public void testHasFinishedChangedReturnsTrueWhenStateChangedFromRunningToProgrammed() {
100 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
101 when(previous.isInState(any())).thenCallRealMethod();
102 when(next.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED));
103 when(next.isInState(any())).thenCallRealMethod();
105 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
108 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
111 assertTrue(hasFinishedChanged);
115 public void testHasFinishedChangedReturnsFalseWhenStateChangedFromRunningToPause() {
117 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
118 when(next.getStateType()).thenReturn(Optional.of(StateType.PAUSE));
120 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
123 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
126 assertFalse(hasFinishedChanged);
130 public void testHasFinishedChangedReturnsTrueWhenStateChangedFromProgrammedWaitingToStartToRunning() {
132 when(previous.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
133 when(previous.isInState(any())).thenCallRealMethod();
134 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
135 when(next.isInState(any())).thenCallRealMethod();
137 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
140 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
143 assertTrue(hasFinishedChanged);
147 public void testHasFinishedChangedReturnsFalseWhenStateRemainsProgrammedWaitingToStart() {
149 when(previous.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
150 when(next.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
152 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
155 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
158 assertFalse(hasFinishedChanged);
162 public void testHasFinishedChangedReturnsFalseWhenStateChangedFromPauseToRunning() {
164 when(previous.getStateType()).thenReturn(Optional.of(StateType.PAUSE));
165 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
167 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
170 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
173 assertFalse(hasFinishedChanged);
177 public void testHasFinishedChangedReturnsTrueWhenStateChangedFromEndProgrammedToOff() {
179 when(previous.getStateType()).thenReturn(Optional.of(StateType.END_PROGRAMMED));
180 when(previous.isInState(any())).thenCallRealMethod();
181 when(next.getStateType()).thenReturn(Optional.of(StateType.OFF));
182 when(next.isInState(any())).thenCallRealMethod();
184 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
187 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
190 assertTrue(hasFinishedChanged);
194 public void testHasFinishedChangedReturnsFalseWhenStateChangedFromRunningToFailure() {
196 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
197 when(next.getStateType()).thenReturn(Optional.of(StateType.FAILURE));
199 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
202 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
205 assertFalse(hasFinishedChanged);
209 public void testHasFinishedChangedReturnsFalseWhenStateChangedFromPauseToFailure() {
211 when(previous.getStateType()).thenReturn(Optional.of(StateType.PAUSE));
212 when(next.getStateType()).thenReturn(Optional.of(StateType.FAILURE));
214 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
217 boolean hasFinishedChanged = transitionState.hasFinishedChanged();
220 assertFalse(hasFinishedChanged);
224 public void testIsFinishedReturnsTrueWhenStateChangedFromRunningToEndProgrammed() {
226 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
227 when(next.getStateType()).thenReturn(Optional.of(StateType.END_PROGRAMMED));
229 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
232 Boolean isFinished = transitionState.isFinished().get();
235 assertTrue(isFinished);
239 public void testIsFinishedReturnsTrueWhenStateChangedFromRunningToProgrammed() {
241 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
242 when(next.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED));
244 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
247 Boolean isFinished = transitionState.isFinished().get();
250 assertTrue(isFinished);
254 public void testIsFinishedReturnsFalseWhenStateChangedFromProgrammedWaitingToStartToRunning() {
256 when(previous.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
257 when(previous.isInState(any())).thenCallRealMethod();
258 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
259 when(next.isInState(any())).thenCallRealMethod();
261 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
264 Boolean isFinished = transitionState.isFinished().get();
267 assertFalse(isFinished);
271 public void testIsFinishedReturnsFalseWhenStateChangedFromRunningToFailure() {
273 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
274 when(previous.isInState(any())).thenCallRealMethod();
275 when(next.getStateType()).thenReturn(Optional.of(StateType.FAILURE));
276 when(next.isInState(any())).thenCallRealMethod();
278 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
281 Boolean isFinished = transitionState.isFinished().get();
284 assertFalse(isFinished);
288 public void testIsFinishedReturnsFalseWhenStateChangedFromPauseToFailure() {
290 when(previous.getStateType()).thenReturn(Optional.of(StateType.PAUSE));
291 when(previous.isInState(any())).thenCallRealMethod();
292 when(next.getStateType()).thenReturn(Optional.of(StateType.FAILURE));
293 when(next.isInState(any())).thenCallRealMethod();
295 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
298 Boolean isFinished = transitionState.isFinished().get();
301 assertFalse(isFinished);
305 public void testIsFinishedReturnsTrueWhenStateChangedFromEndProgrammedToOff() {
307 when(previous.getStateType()).thenReturn(Optional.of(StateType.END_PROGRAMMED));
308 when(previous.isInState(any())).thenCallRealMethod();
309 when(next.getStateType()).thenReturn(Optional.of(StateType.OFF));
310 when(next.isInState(any())).thenCallRealMethod();
312 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
315 Boolean isFinished = transitionState.isFinished().get();
318 assertFalse(isFinished);
322 public void testIsFinishedReturnsNullWhenPreviousStateIsNull() {
324 when(next.getStateType()).thenReturn(Optional.of(StateType.IDLE));
326 TransitionState transitionState = new TransitionState(null, next);
329 Optional<Boolean> isFinished = transitionState.isFinished();
332 assertFalse(isFinished.isPresent());
336 public void testIsFinishedReturnsNullWhenPreviousStateIsUnknown() {
338 when(previous.getStateType()).thenReturn(Optional.empty());
339 when(next.getStateType()).thenReturn(Optional.of(StateType.IDLE));
341 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
344 Optional<Boolean> isFinished = transitionState.isFinished();
347 assertFalse(isFinished.isPresent());
351 public void testProgramStartedWithZeroRemainingTimeShowsNoRemainingTimeAndProgress() {
353 when(previous.isInState(any())).thenCallRealMethod();
354 when(previous.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
356 when(next.isInState(any())).thenCallRealMethod();
357 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
358 when(next.getRemainingTime()).thenReturn(Optional.of(0));
359 when(next.getProgress()).thenReturn(Optional.of(100));
361 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
364 Optional<Integer> remainingTime = transitionState.getRemainingTime();
365 Optional<Integer> progress = transitionState.getProgress();
368 assertFalse(remainingTime.isPresent());
369 assertFalse(progress.isPresent());
373 public void testProgramStartetdWithRemainingTimeShowsRemainingTimeAndProgress() {
375 when(previous.isInState(any())).thenCallRealMethod();
376 when(previous.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
378 when(next.isInState(any())).thenCallRealMethod();
379 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
380 when(next.getRemainingTime()).thenReturn(Optional.of(2));
381 when(next.getProgress()).thenReturn(Optional.of(50));
383 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
386 int remainingTime = transitionState.getRemainingTime().get();
387 int progress = transitionState.getProgress().get();
390 assertEquals(2, remainingTime);
391 assertEquals(50, progress);
395 public void testProgramCountingDownRemainingTimeToZeroShowsRemainingTimeAndProgress() {
397 when(previous.isInState(any())).thenCallRealMethod();
398 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
399 when(previous.getRemainingTime()).thenReturn(Optional.of(1));
401 when(next.isInState(any())).thenCallRealMethod();
402 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
403 when(next.getRemainingTime()).thenReturn(Optional.of(0));
404 when(next.getProgress()).thenReturn(Optional.of(100));
406 TransitionState transitionState = new TransitionState(new TransitionState(null, previous), next);
409 int remainingTime = transitionState.getRemainingTime().get();
410 int progress = transitionState.getProgress().get();
413 assertEquals(0, remainingTime);
414 assertEquals(100, progress);
418 public void testDevicePairedWhileRunningWithZeroRemainingTimeShowsNoRemainingTimeAndProgress() {
420 when(next.isInState(any())).thenCallRealMethod();
421 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
422 when(next.getRemainingTime()).thenReturn(Optional.of(0));
423 when(next.getProgress()).thenReturn(Optional.of(100));
425 TransitionState transitionState = new TransitionState(null, next);
428 Optional<Integer> remainingTime = transitionState.getRemainingTime();
429 Optional<Integer> progress = transitionState.getProgress();
432 assertFalse(remainingTime.isPresent());
433 assertFalse(progress.isPresent());
437 public void testDevicePairedWhileRunningWithRemainingTimeShowsRemainingTimeAndProgress() {
439 when(next.isInState(any())).thenCallRealMethod();
440 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
441 when(next.getRemainingTime()).thenReturn(Optional.of(3));
442 when(next.getProgress()).thenReturn(Optional.of(80));
444 TransitionState transitionState = new TransitionState(null, next);
447 int remainingTime = transitionState.getRemainingTime().get();
448 int progress = transitionState.getProgress().get();
451 assertEquals(3, remainingTime);
452 assertEquals(80, progress);
456 public void testWhenNoRemainingTimeIsSetWhileProgramIsRunningThenNoRemainingTimeAndProgressIsShown() {
458 when(historic.isInState(any())).thenCallRealMethod();
459 when(historic.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
461 when(previous.isInState(any())).thenCallRealMethod();
462 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
463 when(previous.getRemainingTime()).thenReturn(Optional.of(0));
465 when(next.isInState(any())).thenCallRealMethod();
466 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
467 when(next.getRemainingTime()).thenReturn(Optional.of(0));
468 when(next.getProgress()).thenReturn(Optional.of(100));
470 TransitionState transitionState = new TransitionState(
471 new TransitionState(new TransitionState(null, historic), previous), next);
474 Optional<Integer> remainingTime = transitionState.getRemainingTime();
475 Optional<Integer> progress = transitionState.getProgress();
478 assertFalse(remainingTime.isPresent());
479 assertFalse(progress.isPresent());
483 public void testRemainingTimeIsSetWhileRunningShowsRemainingTimeAndProgress() {
485 when(historic.isInState(any())).thenCallRealMethod();
486 when(historic.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
488 when(previous.isInState(any())).thenCallRealMethod();
489 when(previous.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
490 when(previous.getRemainingTime()).thenReturn(Optional.of(0));
492 when(next.isInState(any())).thenCallRealMethod();
493 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
494 when(next.getRemainingTime()).thenReturn(Optional.of(100));
495 when(next.getProgress()).thenReturn(Optional.of(10));
497 TransitionState transitionState = new TransitionState(
498 new TransitionState(new TransitionState(null, historic), previous), next);
501 int remainingTime = transitionState.getRemainingTime().get();
502 int progress = transitionState.getProgress().get();
505 assertEquals(100, remainingTime);
506 assertEquals(10, progress);
510 public void testPreviousProgramDoesNotAffectHandlingOfRemainingTimeAndProgressForNextProgramCase1() {
512 DeviceState beforeHistoric = mock(DeviceState.class);
513 when(beforeHistoric.isInState(any())).thenCallRealMethod();
514 when(beforeHistoric.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
515 when(beforeHistoric.getRemainingTime()).thenReturn(Optional.of(1));
517 when(historic.isInState(any())).thenCallRealMethod();
518 when(historic.getStateType()).thenReturn(Optional.of(StateType.END_PROGRAMMED));
519 when(historic.getRemainingTime()).thenReturn(Optional.of(0));
521 when(previous.isInState(any())).thenCallRealMethod();
522 when(previous.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
523 when(previous.getRemainingTime()).thenReturn(Optional.of(0));
525 when(next.isInState(any())).thenCallRealMethod();
526 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
527 when(next.getRemainingTime()).thenReturn(Optional.of(0));
528 when(next.getProgress()).thenReturn(Optional.of(100));
530 TransitionState transitionState = new TransitionState(
531 new TransitionState(new TransitionState(new TransitionState(null, beforeHistoric), historic), previous),
535 Optional<Integer> remainingTime = transitionState.getRemainingTime();
536 Optional<Integer> progress = transitionState.getProgress();
539 assertFalse(remainingTime.isPresent());
540 assertFalse(progress.isPresent());
544 public void testPreviousProgramDoesNotAffectHandlingOfRemainingTimeAndProgressForNextProgramCase2() {
546 DeviceState beforeHistoric = mock(DeviceState.class);
547 when(beforeHistoric.isInState(any())).thenCallRealMethod();
548 when(beforeHistoric.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
549 when(beforeHistoric.getRemainingTime()).thenReturn(Optional.of(1));
551 when(historic.isInState(any())).thenCallRealMethod();
552 when(historic.getStateType()).thenReturn(Optional.of(StateType.END_PROGRAMMED));
553 when(historic.getRemainingTime()).thenReturn(Optional.of(0));
555 when(previous.isInState(any())).thenCallRealMethod();
556 when(previous.getStateType()).thenReturn(Optional.of(StateType.PROGRAMMED_WAITING_TO_START));
557 when(previous.getRemainingTime()).thenReturn(Optional.of(0));
559 when(next.isInState(any())).thenCallRealMethod();
560 when(next.getStateType()).thenReturn(Optional.of(StateType.RUNNING));
561 when(next.getRemainingTime()).thenReturn(Optional.of(10));
562 when(next.getProgress()).thenReturn(Optional.of(60));
564 TransitionState transitionState = new TransitionState(
565 new TransitionState(new TransitionState(new TransitionState(null, beforeHistoric), historic), previous),
569 int remainingTime = transitionState.getRemainingTime().get();
570 int progress = transitionState.getProgress().get();
573 assertEquals(10, remainingTime);
574 assertEquals(60, progress);