/** Testet das Auswählen, Anhören und Löschen eines Klingeltons. */
  @Test
  public final void testSoundSelection() {
    controller.setDialogStage(mockedDialogStage);

    // Alarm vorgeben
    final Alarm alarm =
        new Alarm(DateTimeUtil.getLocalDateTimeForString("01.01.1970 00:00:00"), "Bla");
    controller.setAlarm(alarm);
    FXTestUtils.awaitEvents();

    // Sound setzen
    controller.setRingtone("Sound");
    FXTestUtils.awaitEvents();

    assertFalse(alarmNoSoundButton.isDisabled());
    assertFalse(alarmPlaySoundButton.isDisabled());

    // Sound-Abspielen-Schaltfläche betätigen
    final AudioPlayer player = mock(AudioPlayer.class);
    controller.getGuiHelper().setAudioPlayer(player);
    click(alarmPlaySoundButton);
    waitForThreads();
    verify(player)
        .playInThread(
            isA(ThreadHelper.class), eq("Sound"), isA(Thread.UncaughtExceptionHandler.class));

    // Sound-Löschen-Schaltfläche betätigen
    click(alarmNoSoundButton);
    waitForThreads();

    // sicherstellen, dass nicht Dialog geschlossen worden wäre
    verify(mockedDialogStage, never()).close();

    assertEquals("kein Klingelton gewählt", alarmSelectSoundButton.getText());
  }
  /** Testet das Verwerfen der Änderungen. */
  @Test
  public final void testCancel() {
    controller.setDialogStage(mockedDialogStage);

    // Alarm vorgeben
    final LocalDateTime now = LocalDateTime.now();
    final Alarm alarm = new Alarm(now, "bla");
    controller.setAlarm(alarm);
    FXTestUtils.awaitEvents();

    // deaktivieren
    click(alarmEnabledCheckbox);
    waitForThreads();

    Platform.runLater(
        new Runnable() {
          public void run() {
            // Datum setzen
            alarmDatePicker.setValue(DateTimeUtil.getLocalDateForString("24.12.2014"));

            // Zeit setzen
            alarmTimePicker.setValue(DateTimeUtil.getLocalTimeForString("12:00:00"));

            // Beschreibung setzen
            alarmDescriptionTextField.setText("Test");
          }
        });
    FXTestUtils.awaitEvents();

    // Sound setzen
    controller.setRingtone("Sound");
    FXTestUtils.awaitEvents();

    // Abbrechen-Schaltfläche betätigen
    final Button alarmCancelButton = (Button) scene.lookup("#alarmCancelButton");
    click(alarmCancelButton);
    waitForThreads();

    // sicherstellen, dass Dialog geschlossen worden wäre
    verify(mockedDialogStage, timeout(WAIT_FOR_EVENT)).close();

    // sicherstellen, dass Alarm ursprüngliche Werte hat
    assertTrue(alarm.isEnabled());
    assertEquals(now, alarm.getDateTime());
    assertEquals("bla", alarm.getDescription());
    assertEquals(null, alarm.getSound());
  }
  /** Testet das Speichern der Änderungen. */
  @Test
  public final void testApplyChanges() {
    controller.setDialogStage(mockedDialogStage);

    // Alarm vorgeben
    final Alarm alarm =
        new Alarm(DateTimeUtil.getLocalDateTimeForString("01.01.1970 00:00:00"), "Bla");
    controller.setAlarm(alarm);
    FXTestUtils.awaitEvents();

    // deaktivieren
    click(alarmEnabledCheckbox);
    waitForThreads();

    Platform.runLater(
        new Runnable() {
          public void run() {
            // Datum setzen
            alarmDatePicker.setValue(DateTimeUtil.getLocalDateForString("24.12.2014"));

            // Zeit setzen
            alarmTimePicker.setValue(DateTimeUtil.getLocalTimeForString("12:00:00"));

            // Beschreibung setzen
            alarmDescriptionTextField.setText("Test");
          }
        });
    FXTestUtils.awaitEvents();

    // Sound setzen
    controller.setRingtone("Sound");
    FXTestUtils.awaitEvents();

    // Speichern-Schaltfläche betätigen
    click(alarmSaveButton);
    waitForThreads();

    // sicherstellen, dass Dialog geschlossen worden wäre
    verify(mockedDialogStage, timeout(WAIT_FOR_EVENT)).close();

    // sicherstellen, dass Alarm neue Werte hat
    assertFalse(alarm.isEnabled());
    assertEquals(
        DateTimeUtil.getLocalDateTimeForString("24.12.2014 12:00:00"), alarm.getDateTime());
    assertEquals("Test", alarm.getDescription());
    assertEquals("Sound", alarm.getSound());
  }