diff --git a/docs/gui-bedienanleitung.md b/docs/gui-bedienanleitung.md index 97ac6b8..6298d8c 100644 --- a/docs/gui-bedienanleitung.md +++ b/docs/gui-bedienanleitung.md @@ -114,14 +114,19 @@ Per Rechtsklick steht zusätzlich ein Kontextmenü zur Verfügung: #### Meldungen leeren -Unterhalb des Meldungsbereichs befindet sich der Button **„Meldungen leeren"**. +Unterhalb des Meldungsbereichs befindet sich links der Button **„Meldungen leeren"**. Ein Klick darauf entfernt alle aktuell angezeigten Meldungen sofort und vollständig. -Beim Laden einer neuen oder bestehenden Konfiguration über **„Neu"** oder -**„Öffnen"** wird der Meldungsbereich automatisch geleert, sodass keine -Meldungen aus einer früheren Sitzung oder einer vorher geladenen Datei sichtbar -bleiben. +Darüber hinaus wird der Meldungsbereich in folgenden Situationen automatisch +geleert, sodass keine Meldungen aus einem früheren Vorgang sichtbar bleiben: + +| Aktion | Verhalten | +|--------|-----------| +| **Neu** | Meldungsbereich wird vor der neuen Konfiguration geleert | +| **Öffnen** | Meldungsbereich wird vor der geladenen Konfiguration geleert | +| **Validieren** | Meldungsbereich wird geleert; danach erscheinen ausschließlich die Befunde des aktuellen Durchlaufs | +| **Technische Tests ausführen** | Meldungsbereich wird geleert; danach erscheinen ausschließlich die Befunde des aktuellen Durchlaufs | --- diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java index 64bd509..470df4e 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java @@ -1501,6 +1501,7 @@ public final class GuiConfigurationEditorWorkspace { */ private void runTechnicalTestsAction() { LOG.info("Aktion Technische Tests ausführen gestartet."); + pendingMessages.clear(); technicalTestsButton.setDisable(true); technicalTestCoordinator.triggerTechnicalTests(); } @@ -1569,7 +1570,7 @@ public final class GuiConfigurationEditorWorkspace { clearMessagesButton.setOnAction(e -> clearMessages()); HBox clearButtonRow = new HBox(clearMessagesButton); - clearButtonRow.setAlignment(Pos.CENTER_RIGHT); + clearButtonRow.setAlignment(Pos.CENTER_LEFT); card.getChildren().add(clearButtonRow); // Populate immediately so the area is not blank before the first validation run. @@ -1739,6 +1740,7 @@ public final class GuiConfigurationEditorWorkspace { */ private void runValidationAction() { LOG.info("Aktion Validieren ausgeführt."); + pendingMessages.clear(); EditorValidationInput input = buildValidationInput(); EditorValidationReport report = editorValidator.validate(input); diff --git a/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiMessageAreaSmokeTest.java b/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiMessageAreaSmokeTest.java index 933376b..6a06eb2 100644 --- a/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiMessageAreaSmokeTest.java +++ b/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiMessageAreaSmokeTest.java @@ -680,6 +680,75 @@ class GuiMessageAreaSmokeTest { }); } + // ========================================================================= + // Scenario: "Validieren" clears previous messages before showing results + // ========================================================================= + + /** + * Smoke test: invoking {@code runValidationAction()} via the validate button removes + * pre-existing messages so that results from a previous action do not accumulate. + */ + @Test + void validationAction_clearsPreviousMessages() throws Exception { + runOnFx(() -> { + GuiConfigurationEditorWorkspace ws = new GuiConfigurationEditorWorkspace(Optional.empty()); + ws.requestNewConfiguration(); + + // Seed a stale message that must not survive the validation action. + ws.pendingMessages.add( + GuiMessageEntry.of(GuiMessageSeverity.ERROR, "Alter Befund", "Test")); + assertFalse(ws.pendingMessages.isEmpty(), + "Pre-condition: pending messages must not be empty before Validieren"); + + ws.validateButton.fire(); + + assertFalse( + ws.pendingMessages.stream() + .anyMatch(m -> "Alter Befund".equals(m.text())), + "The stale message must have been removed after Validieren"); + }); + } + + // ========================================================================= + // Scenario: "Technische Tests ausführen" clears previous messages before starting + // ========================================================================= + + /** + * Smoke test: invoking the technical-tests action removes pre-existing messages so that + * results from a previous action do not accumulate. + *
+ * The clear happens synchronously on the FX thread before the background worker starts. + * The thread factory is replaced with a no-op so no background thread is actually + * started, which prevents native dialog calls that are not supported under Monocle. + */ + @Test + void technicalTestsAction_clearsPreviousMessages() throws Exception { + runOnFx(() -> { + GuiConfigurationEditorWorkspace ws = new GuiConfigurationEditorWorkspace(Optional.empty()); + ws.requestNewConfiguration(); + + // Replace thread factory with a no-op so no background work runs in Monocle. + ws.technicalTestCoordinator.testThreadFactory = task -> new Thread(() -> { }) { + @Override + public void start() { + // Do not start — we only verify the synchronous clear, not the test result. + } + }; + + ws.pendingMessages.add( + GuiMessageEntry.of(GuiMessageSeverity.WARNING, "Alte Warnung", "Test")); + assertFalse(ws.pendingMessages.isEmpty(), + "Pre-condition: pending messages must not be empty before technical tests"); + + ws.technicalTestsButton.fire(); + + assertFalse( + ws.pendingMessages.stream() + .anyMatch(m -> "Alte Warnung".equals(m.text())), + "The stale message must have been removed after Technische Tests ausführen"); + }); + } + // ========================================================================= // Scenario: ai.provider.active field-error label is registered and shown // ========================================================================= diff --git a/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiValidateActionSmokeTest.java b/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiValidateActionSmokeTest.java index b91f9b4..9c79cb6 100644 --- a/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiValidateActionSmokeTest.java +++ b/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiValidateActionSmokeTest.java @@ -244,13 +244,13 @@ class GuiValidateActionSmokeTest { } // ========================================================================= - // Scenario: clicking twice → message appears exactly once (replace semantics) + // Scenario: clicking twice → exactly one message present (replace semantics) // ========================================================================= /** - * Smoke test: clicking "Validieren" twice must leave two action-confirmation - * INFO messages in the message list (accumulation semantics — each click appends - * a fresh snapshot of findings). + * Smoke test: clicking "Validieren" twice must leave exactly one action-confirmation + * INFO message in the message list. Each click clears the previous messages before + * adding the new result, so messages from an earlier click do not accumulate. * * @throws Exception if the FX thread task fails or times out */ @@ -267,8 +267,9 @@ class GuiValidateActionSmokeTest { && ACTION_SOURCE.equals(m.source().get())) .filter(m -> m.text().startsWith("Aktion Validieren wurde ausgeführt.")) .count(); - assertEquals(2, confirmationCount, - "After two clicks two action-confirmation INFO messages must be present"); + assertEquals(1, confirmationCount, + "After two clicks exactly one action-confirmation INFO message must be present" + + " (second click replaces messages from the first click)"); }); }