Skip to content

Commit

Permalink
8328242: Add a log area to the PassFailJFrame
Browse files Browse the repository at this point in the history
Backport-of: 9bc1b065db238b7c9d0562f9bd55d2f338c6ff3d
  • Loading branch information
toshiogata authored and Paul Hohensee committed Oct 23, 2024
1 parent 826184c commit 01e9dbd
Showing 1 changed file with 103 additions and 5 deletions.
108 changes: 103 additions & 5 deletions test/jdk/java/awt/regtesthelpers/PassFailJFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import java.util.concurrent.atomic.AtomicInteger;

import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
Expand Down Expand Up @@ -157,6 +158,7 @@
* <li>the title of the instruction UI,</li>
* <li>the timeout of the test,</li>
* <li>the size of the instruction UI via rows and columns, and</li>
* <li>to add a log area</li>,
* <li>to enable screenshots.</li>
* </ul>
*/
Expand Down Expand Up @@ -206,6 +208,8 @@ public final class PassFailJFrame {

private static Robot robot;

private static JTextArea logArea;

public enum Position {HORIZONTAL, VERTICAL, TOP_LEFT_CORNER}

public PassFailJFrame(String instructions) throws InterruptedException,
Expand Down Expand Up @@ -375,6 +379,20 @@ private static void invokeOnEDT(Runnable doRun)
}
}

/**
* Does the same as {@link #invokeOnEDT(Runnable)}, but does not throw
* any checked exceptions.
*
* @param doRun an operation to run on EDT
*/
private static void invokeOnEDTUncheckedException(Runnable doRun) {
try {
invokeOnEDT(doRun);
} catch (InterruptedException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}

private static void createUI(String title, String instructions,
long testTimeOut, int rows, int columns,
boolean enableScreenCapture) {
Expand All @@ -386,7 +404,8 @@ private static void createUI(String title, String instructions,
frame.add(createInstructionUIPanel(instructions,
testTimeOut,
rows, columns,
enableScreenCapture),
enableScreenCapture,
false, 0),
BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
Expand All @@ -403,8 +422,9 @@ private static void createUI(Builder builder) {
createInstructionUIPanel(builder.instructions,
builder.testTimeOut,
builder.rows, builder.columns,
builder.screenCapture);

builder.screenCapture,
builder.addLogArea,
builder.logAreaRows);
if (builder.splitUI) {
JSplitPane splitPane = new JSplitPane(
builder.splitUIOrientation,
Expand All @@ -423,7 +443,9 @@ private static void createUI(Builder builder) {
private static JComponent createInstructionUIPanel(String instructions,
long testTimeOut,
int rows, int columns,
boolean enableScreenCapture) {
boolean enableScreenCapture,
boolean addLogArea,
int logAreaRows) {
JPanel main = new JPanel(new BorderLayout());
timeoutHandlerPanel = new TimeoutHandlerPanel(testTimeOut);
main.add(timeoutHandlerPanel, BorderLayout.NORTH);
Expand Down Expand Up @@ -455,7 +477,20 @@ private static JComponent createInstructionUIPanel(String instructions,
buttonsPanel.add(createCapturePanel());
}

main.add(buttonsPanel, BorderLayout.SOUTH);
if (addLogArea) {
logArea = new JTextArea(logAreaRows, columns);
logArea.setEditable(false);

Box buttonsLogPanel = Box.createVerticalBox();

buttonsLogPanel.add(buttonsPanel);
buttonsLogPanel.add(new JScrollPane(logArea));

main.add(buttonsLogPanel, BorderLayout.SOUTH);
} else {
main.add(buttonsPanel, BorderLayout.SOUTH);
}

main.setMinimumSize(main.getPreferredSize());

return main;
Expand Down Expand Up @@ -1074,13 +1109,45 @@ public static void forceFail(String reason) {
latch.countDown();
}

/**
* Adds a {@code message} to the log area, if enabled by
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
*
* @param message to log
*/
public static void log(String message) {
System.out.println("PassFailJFrame: " + message);
invokeOnEDTUncheckedException(() -> logArea.append(message + "\n"));
}

/**
* Clears the log area, if enabled by
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
*/
public static void logClear() {
System.out.println("\nPassFailJFrame: log cleared\n");
invokeOnEDTUncheckedException(() -> logArea.setText(""));
}

/**
* Replaces the log area content with provided {@code text}, if enabled by
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
* @param text new text for the log area
*/
public static void logSet(String text) {
System.out.println("\nPassFailJFrame: log set to:\n" + text + "\n");
invokeOnEDTUncheckedException(() -> logArea.setText(text));
}

public static final class Builder {
private String title;
private String instructions;
private long testTimeOut;
private int rows;
private int columns;
private boolean screenCapture;
private boolean addLogArea;
private int logAreaRows = 10;

private List<? extends Window> testWindows;
private WindowListCreator windowListCreator;
Expand Down Expand Up @@ -1122,6 +1189,37 @@ public Builder screenCapture() {
return this;
}

/**
* Adds a log area below the "Pass", "Fail" buttons.
* <p>
* The log area can be controlled by {@link #log(String)},
* {@link #logClear()} and {@link #logSet(String)}.
*
* @return this builder
*/
public Builder logArea() {
this.addLogArea = true;
return this;
}

/**
* Adds a log area below the "Pass", "Fail" buttons.
* <p>
* The log area can be controlled by {@link #log(String)},
* {@link #logClear()} and {@link #logSet(String)}.
* <p>
* The number of columns is taken from the number of
* columns in the instructional JTextArea.
*
* @param rows of the log area
* @return this builder
*/
public Builder logArea(int rows) {
this.addLogArea = true;
this.logAreaRows = rows;
return this;
}

/**
* Adds a {@code WindowCreator} which the framework will use
* to create the test UI window.
Expand Down

1 comment on commit 01e9dbd

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.