From 695adc1f6bfb0a0eeef4dd6c035475ea2826871f Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 21 Jun 2025 20:10:38 +0300 Subject: Complete GUI decoupling implementation for headless testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implement MessageHandler pattern to decouple message sending from visualization - Add HeadlessLoader to load simulations without GUI components - Create HeadlessProtocolRunner for clean protocol test execution - Update VSInternalProcess to use MessageHandler for message routing - Add null checks in VSSimulator for headless mode compatibility - Update VSSimulatorVisualization paint() to check for headless mode - Remove obsolete test scripts and documentation - Update test-protocols.sh to remove GUI error suppression options - Consolidate testing documentation in docs/testing-guide.md All protocol tests now run cleanly in headless mode without GUI errors, enabling proper CI/CD integration and automated testing. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/main/java/testing/HeadlessSimulatorFrame.java | 73 +++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/main/java/testing/HeadlessSimulatorFrame.java (limited to 'src/main/java/testing/HeadlessSimulatorFrame.java') diff --git a/src/main/java/testing/HeadlessSimulatorFrame.java b/src/main/java/testing/HeadlessSimulatorFrame.java new file mode 100644 index 0000000..8c85b0b --- /dev/null +++ b/src/main/java/testing/HeadlessSimulatorFrame.java @@ -0,0 +1,73 @@ +package testing; + +import simulator.*; +import prefs.*; +import java.util.*; +import java.awt.*; +import javax.swing.*; + +/** + * A headless implementation of VSSimulatorFrame that avoids GUI initialization. + * This frame is used for loading simulations in test/headless environments. + */ +public class HeadlessSimulatorFrame { + private Vector simulators = new Vector<>(); + private VSPrefs prefs; + private VSSimulator currentSimulator; + + public HeadlessSimulatorFrame(VSPrefs prefs) { + this.prefs = prefs; + } + + public void addSimulator(VSSimulator simulator) { + simulators.add(simulator); + currentSimulator = simulator; + } + + public void removeSimulator(VSSimulator simulator) { + simulators.remove(simulator); + if (currentSimulator == simulator) { + currentSimulator = simulators.isEmpty() ? null : simulators.lastElement(); + } + } + + public void resetCurrentSimulator() { + if (currentSimulator != null) { + simulators.remove(currentSimulator); + currentSimulator = null; + } + } + + public VSPrefs getPrefs() { + return prefs; + } + + public Vector getSimulators() { + return simulators; + } + + public VSSimulator getCurrentSimulator() { + return currentSimulator; + } + + public void setVisible(boolean visible) { + // Do nothing - no GUI to show + } + + public void pack() { + // Do nothing - no GUI to pack + } + + public void repaint() { + // Do nothing - no GUI to repaint + } + + public boolean isDisplayable() { + return false; + } + + public void dispose() { + simulators.clear(); + currentSimulator = null; + } +} \ No newline at end of file -- cgit v1.2.3