Skip to content

Commit

Permalink
8328242: Add a log area to the PassFailJFrame
Browse files Browse the repository at this point in the history
Reviewed-by: prr, aivanov, honkar
  • Loading branch information
Alexander Zvegintsev committed Mar 15, 2024
1 parent 65a84c2 commit 9bc1b06
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 @@ -54,6 +54,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 @@ -156,6 +157,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 @@ -205,6 +207,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 @@ -374,6 +378,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 @@ -385,7 +403,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 @@ -402,8 +421,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 @@ -422,7 +442,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());

JLabel testTimeoutLabel = new JLabel("", JLabel.CENTER);
Expand Down Expand Up @@ -456,7 +478,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 @@ -1041,13 +1076,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 @@ -1097,6 +1164,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 9bc1b06

@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.