From: David Roden Date: Mon, 27 Jan 2025 21:03:05 +0000 (+0100) Subject: 🚸 Add “list windows” command, remove old “info window” command X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=1ccf893a2ba491285b045382d222e42edba58adb;p=msta.git 🚸 Add “list windows” command, remove old “info window” command --- diff --git a/server/src/main/java/de/qsheltier/msta/Server.java b/server/src/main/java/de/qsheltier/msta/Server.java index cb12dbb..e04c3b1 100644 --- a/server/src/main/java/de/qsheltier/msta/Server.java +++ b/server/src/main/java/de/qsheltier/msta/Server.java @@ -189,10 +189,15 @@ public class Server implements Closeable { shutdownHook.run(); break; } - if (words.getFirst().equalsIgnoreCase("info") && (words.size() == 3) && words.get(1).equalsIgnoreCase("window")) { - var windowName = words.get(2); - stream(Window.getWindows()).filter(window -> window.getName().equals(windowName)) - .forEach(window -> writeLine.accept(createMessage(getComponentObject(window).put("info", "window")))); + if (words.getFirst().equalsIgnoreCase("list") && (words.size() > 1)) { + if (words.get(1).equalsIgnoreCase("windows")) { + var listEvent = objectMapper.createObjectNode().put("list", "windows"); + var windowNode = listEvent.putArray("windows"); + windows.values().stream() + .map(this::getComponentObject) + .forEach(windowNode::add); + writeLine.accept(createMessage(listEvent)); + } } } } finally { diff --git a/server/src/test/java/de/qsheltier/msta/ServerTest.java b/server/src/test/java/de/qsheltier/msta/ServerTest.java index 8e3e016..7b2d8e8 100644 --- a/server/src/test/java/de/qsheltier/msta/ServerTest.java +++ b/server/src/test/java/de/qsheltier/msta/ServerTest.java @@ -205,6 +205,39 @@ public class ServerTest { })); } + @Test + @Timeout(value = 5, unit = TimeUnit.SECONDS, threadMode = SEPARATE_THREAD) + public void serverSendsInformationAboutAllWindows() throws Exception { + SwingUtilities.invokeAndWait(() -> { + var window = new Window(null); + var mainPanel = new JPanel(new BorderLayout()); + mainPanel.add(new JLabel("Label"), BorderLayout.NORTH); + mainPanel.add(new JButton("Button"), BorderLayout.SOUTH); + window.add(mainPanel); + window.pack(); + window.setVisible(true); + var frame = new Frame("Test Frame"); + frame.setVisible(true); + }); + try (var server = new Server()) { + server.start(); + server.waitForNextScan(); + createConnection(server, verifyConnectedEvent((reader, ready, writer) -> { + writer.accept("list windows"); + var reply = objectMapper.readTree(reader.get()); + assertThat(reply, jsonObject().where("list", jsonText("windows")) + .where("windows", jsonArray(containsInAnyOrder( + jsonObject().where("id", jsonInt(anything())).where("type", jsonText("java.awt.Frame")).where("title", jsonText("Test Frame")), + jsonObject().where("id", jsonInt(anything())) + .where("children", jsonArray(contains(jsonObject().where("type", jsonText("javax.swing.JPanel")) + .where("children", jsonArray(containsInAnyOrder( + jsonObject().where("type", jsonText("javax.swing.JLabel")), + jsonObject().where("type", jsonText("javax.swing.JButton"))))))))))) + ); + })); + } + } + @BeforeEach @AfterEach public void removeAllWindows() throws Exception {