.filter(window -> !lastOpenWindows.contains(window))
.toList();
openWindows.stream()
- .map(window -> createEvent("new-window"))
+ .map(window -> createEvent("new-window", new Pair("id", window.getName())))
.forEach(writeLine);
var openFrames = allWindows.stream()
.filter(frame -> !lastOpenFrames.contains(frame))
.toList();
openFrames.stream()
- .map(frame -> createEvent("new-frame"))
+ .map(frame -> createEvent("new-frame", new Pair("id", frame.getName())))
.forEach(writeLine);
lastOpenWindows.addAll(openWindows);
}).start();
String line;
while ((line = inputReader.readLine()) != null) {
- if (line.equalsIgnoreCase("shutdown")) {
+ var words = stream(line.split(" ")).toList();
+ if (words.getFirst().equalsIgnoreCase("shutdown")) {
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(new Pair("info", "window"), new Pair("id", window.getName()))));
+ }
}
} finally {
finished.set(true);
}
}
- private String createEvent(String name) {
+ private String createEvent(String name, Pair... parameters) {
+ return createMessage(new Pair("event", name), parameters);
+ }
+
+ private String createMessage(Pair messageName, Pair... parameters) {
Map<String, Object> reply = new HashMap<>();
- reply.put("event", name);
+ reply.put(messageName.first, messageName.second);
+ stream(parameters).forEach(pair -> reply.put(pair.first, pair.second));
try {
return objectMapper.writeValueAsString(reply);
} catch (JsonProcessingException e) {
private final Runnable shutdownHook;
private final AtomicBoolean closed = new AtomicBoolean(false);
+ private static class Pair {
+
+ public Pair(String first, String second) {
+ this.first = first;
+ this.second = second;
+ }
+
+ private final String first;
+ private final String second;
+
+ }
+
}
package de.qsheltier.msta;
+import com.fasterxml.jackson.databind.ObjectMapper;
import java.awt.Frame;
import java.awt.Window;
import java.io.BufferedReader;
import org.junit.jupiter.api.Timeout;
import static com.spotify.hamcrest.jackson.JsonMatchers.isJsonStringMatching;
+import static com.spotify.hamcrest.jackson.JsonMatchers.jsonMissing;
import static com.spotify.hamcrest.jackson.JsonMatchers.jsonObject;
import static com.spotify.hamcrest.jackson.JsonMatchers.jsonText;
import static java.nio.charset.StandardCharsets.UTF_8;
}
}
+ @Test
+ @Timeout(value = 5, unit = TimeUnit.SECONDS, threadMode = SEPARATE_THREAD)
+ public void windowInfoContainsButtonInfo() throws Throwable {
+ var window = new Window(null);
+ window.setVisible(true);
+ try {
+ connectToServer(verifyConnectedEvent((reader, writer) -> {
+ var reply = objectMapper.readTree(reader.get());
+ assertThat(reply, jsonObject().where("event", jsonText("new-window")).where("id", not(jsonMissing())));
+ var windowName = reply.get("id").asText();
+ writer.accept("info window " + windowName);
+ reply = objectMapper.readTree(reader.get());
+ assertThat(reply, jsonObject()
+ .where("info", jsonText("window"))
+ .where("id", jsonText(windowName))
+ );
+ }));
+ } finally {
+ window.setVisible(false);
+ }
+ }
+
private static ThrowingBiConsumer<Supplier<String>, Consumer<String>> verifyConnectedEvent(ThrowingBiConsumer<Supplier<String>, Consumer<String>> connectionConsumer) {
return (reader, writer) -> {
assertThat(reader.get(), isJsonStringMatching(jsonObject().where("event", jsonText("connected"))));
}
}
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
private interface ThrowingBiConsumer<A, B> {
void accept(A a, B b) throws Exception;
}