Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

I209: Display team stderr to judges #907

Merged
merged 5 commits into from
Jan 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/edu/csus/ecs/pc2/core/execute/Executable.java
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,11 @@ public class Executable extends Plugin implements IExecutable, IExecutableNotify
*/
private ArrayList<String> teamsOutputFilenames = new ArrayList<String>();

/**
* List of Team's output filenames, created by execute method.
*/
private ArrayList<String> teamsStderrFilenames = new ArrayList<String>();

/**
* List of Validator output filenames, created by execute method.
*/
Expand Down Expand Up @@ -359,6 +364,7 @@ public IFileViewer execute() {
public IFileViewer execute(boolean clearDirFirst) {

teamsOutputFilenames = new ArrayList<String>();
teamsStderrFilenames = new ArrayList<String>();

if (usingGUI) {
fileViewer = new MultipleFileViewer(log);
Expand Down Expand Up @@ -1393,10 +1399,24 @@ private String getClicsValidatorOptionString() {
return optStr;
}

/**
* Returns a filename specific to data set number to store team's stdout
*
* @param dataSetNumber
*/
private String getTeamOutputFilename(int dataSetNumber) {
return prefixExecuteDirname("teamoutput." + dataSetNumber + ".txt");
}

/**
* Returns a filename specific to data set number to store team's stderr
*
* @param dataSetNumber
*/
private String getTeamStderrFilename(int dataSetNumber) {
return prefixExecuteDirname("teamstderr." + dataSetNumber + ".txt");
}

/**
* Set results of validation using the PC2Validator into executionData.
*
Expand Down Expand Up @@ -2245,12 +2265,17 @@ public void run() {

// teams output file - single file name
SerializedFile userOutputFile = executionData.getExecuteProgramOutput();
SerializedFile userStderrFile = executionData.getExecuteStderr();
createFile(userOutputFile, prefixExecuteDirname(userOutputFile.getName()));
createFile(userStderrFile, prefixExecuteDirname(userStderrFile.getName()));

String teamsOutputFilename = getTeamOutputFilename(dataSetNumber);
String teamsStderrFilename = getTeamStderrFilename(dataSetNumber);

createFile(userOutputFile, teamsOutputFilename); // Create a per test case Team's output file
createFile(userStderrFile, teamsStderrFilename); // Create a per test case Team's stderr file
teamsOutputFilenames.add(teamsOutputFilename); // add to list
teamsStderrFilenames.add(teamsStderrFilename); // add to list
if (executionData.getExecuteExitValue() != 0) {
long returnValue = ((long) executionData.getExecuteExitValue() << 0x20) >>> 0x20;

Expand Down Expand Up @@ -3454,6 +3479,15 @@ public List<String> getTeamsOutputFilenames() {
return teamsOutputFilenames;
}

/**
* Get filenames for each team's stderr for each test case.
*
* @return the list of team stderr file names.
*/
public List<String> getTeamsStderrFilenames() {
return teamsStderrFilenames;
}

/**
* Get filenames for each validator output for each test case.
*
Expand Down
48 changes: 48 additions & 0 deletions src/edu/csus/ecs/pc2/ui/SelectJudgementPaneNew.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,11 @@ public class SelectJudgementPaneNew extends JPanePlugin {
*/
private List<String> savedTeamOutputFileNames = null;

/**
* Saved team stderr names.
*/
private List<String> savedTeamStderrFileNames = null;

/**
* saved validator output names
*/
Expand Down Expand Up @@ -907,9 +912,11 @@ protected void executeRun() {
}

savedTeamOutputFileNames = executable.getTeamsOutputFilenames();
savedTeamStderrFileNames = executable.getTeamsStderrFilenames();
savedValidatorOutputFileNames = executable.getValidatorOutputFilenames();
savedValidatorErrFileNames = executable.getValidatorErrFilenames();
sendTeamOutputFileNames();
sendTeamStderrFileNames();
sendValidatorOutputFileNames();
sendValidatorStderrFileNames();
// only if do not show output is not checked
Expand Down Expand Up @@ -1024,6 +1031,46 @@ private void sendTeamOutputFileNames() {
}
}

/**
* Send execution stderr filenames to Test Results Viewer.
*
* Copies the names from the List of exectution stderr file names (which was saved by the execute() method)
* into an array, then passes the array to the Test Results frame.
*/
private void sendTeamStderrFileNames() {

if (getTestResultsFrame() != null) {

String[] teamStderrNames = null;

// add entries from actual team test stderr
if (savedTeamStderrFileNames != null) {
int size = getProblemDataFiles().getJudgesDataFiles().length;
if (size < savedTeamStderrFileNames.size()) {
size = savedTeamStderrFileNames.size();
}
if (size < 1) {
size = 1;
}
teamStderrNames = new String[size];

// null out list
for (int i = 0; i < size; i++) {
teamStderrNames[i] = null;
}

for (int i = 0; i < savedTeamStderrFileNames.size(); i++) {
teamStderrNames[i] = savedTeamStderrFileNames.get(i);
if (new File(teamStderrNames[i]).length() == 0) {
teamStderrNames[i] = null;
}
}
}

getTestResultsFrame().setTeamStderrFileNames(teamStderrNames);
}
}

/**
* Send validator output names to Test Results Viewer.
*
Expand Down Expand Up @@ -1454,6 +1501,7 @@ private void createAndViewFiles(IFileViewer fileViewer, SerializedFile file, Str
protected void viewOutputsAndData() {

sendTeamOutputFileNames();
sendTeamStderrFileNames();
sendValidatorOutputFileNames();
sendValidatorStderrFileNames();
if (getTestResultsFrame().isVisible()) {
Expand Down
10 changes: 8 additions & 2 deletions src/edu/csus/ecs/pc2/ui/TestCaseResultsTableModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ public TestCaseResultsTableModel(IInternalContest contest, RunTestCase[] testCas
// link for viewing team output (which must exist - even if empty - since the test case was executed)
JLabel teamOutputViewLabel = new JLabel("View");

// link for viewing team stderr (which must exist - even if empty - since the test case was executed)
JLabel teamStderrViewLabel = new JLabel("View");

// links for comparing team output with corresponding judge's output (but only if the problem has judge's data)
JLabel teamOutputCompareLabel = new JLabel("");
JLabel judgesOutputViewLabel = new JLabel("");
Expand Down Expand Up @@ -139,7 +142,7 @@ public TestCaseResultsTableModel(IInternalContest contest, RunTestCase[] testCas

// build the row object and add it to the model
Object[] rowData = new Object[] { selected, testCaseNum, resultLabel, time,
teamOutputViewLabel, teamOutputCompareLabel, judgesOutputViewLabel,
teamOutputViewLabel, teamOutputCompareLabel, teamStderrViewLabel, judgesOutputViewLabel,
judgesDataViewLabel, validatorOutputViewLabel, validatorStderrViewLabel };

super.addRow(rowData);
Expand Down Expand Up @@ -247,6 +250,9 @@ public void addRow(Boolean selected, String testCaseNum, TestResultsRowData data

//link for comparing team output with corresponding judge's output
JLabel teamOutputCompareJLabel = new JLabel(data.getTeamsOutputCompareLabel());

//link for viewing team stderr
JLabel teamStderrViewJLabel = new JLabel(data.getTeamStderrViewLabel());

//link for viewing judge's output
JLabel judgesOutputViewJLabel = new JLabel(data.getJudgesOutputViewLabel());
Expand All @@ -261,7 +267,7 @@ public void addRow(Boolean selected, String testCaseNum, TestResultsRowData data

//build the row object and add it to the model
Object [] rowData = new Object [] {selected, testCaseNum, resultLabel, data.getTime(),
teamOutputViewJLabel, teamOutputCompareJLabel, judgesOutputViewJLabel,
teamOutputViewJLabel, teamOutputCompareJLabel, teamStderrViewJLabel, judgesOutputViewJLabel,
judgesDataViewJLabel, validatorOutputViewJLabel, validatorStderrViewJLabel };

super.addRow(rowData);
Expand Down
4 changes: 4 additions & 0 deletions src/edu/csus/ecs/pc2/ui/TestResultsFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ public void setTeamOutputFileNames(String [] filenames){
getMultiTestSetOutputViewerPane().setTeamOutputFileNames(filenames);
}

public void setTeamStderrFileNames(String [] filenames){
getMultiTestSetOutputViewerPane().setTeamStderrFileNames(filenames);
}

public void setValidatorStderrFileNames(String[] filenames) {
getMultiTestSetOutputViewerPane().setValidatorStderrFileNames(filenames);
}
Expand Down
35 changes: 28 additions & 7 deletions src/edu/csus/ecs/pc2/ui/TestResultsPane.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,13 +105,13 @@ public class TestResultsPane extends JPanePlugin implements TableModelListener {
* list of columns
*/
protected enum COLUMN {
SELECT_CHKBOX, DATASET_NUM, RESULT, TIME, TEAM_OUTPUT_VIEW, TEAM_OUTPUT_COMPARE,
SELECT_CHKBOX, DATASET_NUM, RESULT, TIME, TEAM_OUTPUT_VIEW, TEAM_OUTPUT_COMPARE, TEAM_ERR,
JUDGE_OUTPUT, JUDGE_DATA, VALIDATOR_OUTPUT, VALIDATOR_ERR
};

// define the column headers for the table of results
private String[] columnNames = { "Select", "Data Set #", "Result", "Time (ms)",
"Team Output", "Compare Outputs",
"Team Output", "Compare Outputs", "Team StdErr",
"Judge's Output", "Judge's Data", "Validator StdOut",
"Validator StdErr" };

Expand Down Expand Up @@ -145,6 +145,8 @@ protected enum COLUMN {

private String [] currentTeamOutputFileNames ;

private String [] currentTeamStderrFileNames;

private JLabel lblLanguage;

private JLabel lblNumFailedTestCases;
Expand Down Expand Up @@ -1688,6 +1690,7 @@ public void valueChanged(ListSelectionEvent e) {
// set a LinkRenderer on those cells containing links
localResultsTable.getColumn(columnNames[COLUMN.TEAM_OUTPUT_VIEW.ordinal()]).setCellRenderer(new LinkCellRenderer());
localResultsTable.getColumn(columnNames[COLUMN.TEAM_OUTPUT_COMPARE.ordinal()]).setCellRenderer(new LinkCellRenderer());
localResultsTable.getColumn(columnNames[COLUMN.TEAM_ERR.ordinal()]).setCellRenderer(new LinkCellRenderer());
localResultsTable.getColumn(columnNames[COLUMN.JUDGE_OUTPUT.ordinal()]).setCellRenderer(new LinkCellRenderer());
localResultsTable.getColumn(columnNames[COLUMN.JUDGE_DATA.ordinal()]).setCellRenderer(new LinkCellRenderer());
localResultsTable.getColumn(columnNames[COLUMN.VALIDATOR_OUTPUT.ordinal()]).setCellRenderer(new LinkCellRenderer());
Expand Down Expand Up @@ -1877,11 +1880,12 @@ private void addAnyUnexecutedTestCasesToResultsTable(JTable aResultsTable) {
// "-- ", //execution time (of which there is none since the test case wasn't executed)
// "", //link to team output (none since it wasn't executed)
// "", //link to team compare-with-judge label (disabled since there's no team output)
// "", //link to team stderr (none since it wasn't executed)
// viewJudgeAnswerFile, //link to judge's output (answer file) if any
// viewJudgeDataFile, //link to judge's data if any
// "", //link to validator stdout (none)
// "" //link to validator stderr (none)
TestResultsRowData rowData = new TestResultsRowData("Not Executed", "-- ","", "",viewJudgeAnswerFile,viewJudgeDataFile, "", "");
TestResultsRowData rowData = new TestResultsRowData("Not Executed", "-- ", "", "", "",viewJudgeAnswerFile,viewJudgeDataFile, "", "");
tableModel.addRow(
new Boolean(false), //selection checkbox
new String(Integer.toString(testCaseNum)), //test case number
Expand Down Expand Up @@ -1913,15 +1917,16 @@ public void resetResultsTable() {
}

// Add exactly one row as a place holder to tell the user judging is taking place
// "Awaiting Result", //result string
// "Judging", //result string
// "-- ", //execution time (of which there is none since the test case wasn't executed)
// "", //link to team output (none since it wasn't executed)
// "", //link to team compare-with-judge label (disabled since there's no team output)
// "", //link to team stderr (none since it wasn't executed)
// "", //link to judge's output (answer file) if any
// "", //link to judge's data if any
// "", //link to validator stdout (none)
// "" //link to validator stderr (none)
TestResultsRowData rowData = new TestResultsRowData("Judging", "-- ","", "","", "", "", "");
TestResultsRowData rowData = new TestResultsRowData("Judging", "-- ", "", "", "", "", "", "", "");
// add new row
tableModel.addRow(
new Boolean(false), //selection checkbox
Expand Down Expand Up @@ -2007,7 +2012,7 @@ public void showMessage(final String message) {
*/
protected void viewFile(int row, int col) {
//make sure the column points to one of the "file links" in the table
if (col != COLUMN.TEAM_OUTPUT_VIEW.ordinal() && col != COLUMN.JUDGE_OUTPUT.ordinal() && col != COLUMN.JUDGE_DATA.ordinal() && col != COLUMN.VALIDATOR_OUTPUT.ordinal()
if (col != COLUMN.TEAM_OUTPUT_VIEW.ordinal() && col != COLUMN.TEAM_ERR.ordinal() && col != COLUMN.JUDGE_OUTPUT.ordinal() && col != COLUMN.JUDGE_DATA.ordinal() && col != COLUMN.VALIDATOR_OUTPUT.ordinal()
&& col != COLUMN.VALIDATOR_ERR.ordinal()) {
if (log != null) {
log.log(Log.WARNING, "TestResultsPane.viewFile(): invalid column number for file viewing request: " + col);
Expand Down Expand Up @@ -2044,6 +2049,8 @@ protected void viewFile(int row, int col) {
String title = "<unknown>";
if (col == COLUMN.TEAM_OUTPUT_VIEW.ordinal()) {
title = "Team Output";
} else if (col == COLUMN.TEAM_ERR.ordinal()) {
title = "Team STDERR";
} else if (col == COLUMN.JUDGE_OUTPUT.ordinal()) {
title = "Judge's Output";
} else if (col == COLUMN.JUDGE_DATA.ordinal()) {
Expand Down Expand Up @@ -2189,14 +2196,24 @@ private String getFileForTableCell(int row, int col) {

if (col == COLUMN.TEAM_OUTPUT_VIEW.ordinal() || col == COLUMN.TEAM_OUTPUT_COMPARE.ordinal()) {
//get team output file corresponding to test case "row"
if (currentTeamOutputFileNames != null || currentTeamOutputFileNames.length >= row) {
if (currentTeamOutputFileNames != null && currentTeamOutputFileNames.length >= row) {
// get the team output file name, which should be provided by the client as a full path
if (currentTeamOutputFileNames[row] == null) {
returnFile = null;
} else {
returnFile = currentTeamOutputFileNames[row];
}
}
} else if (col == COLUMN.TEAM_ERR.ordinal()) {
//get team output file corresponding to test case "row"
if (currentTeamStderrFileNames != null && currentTeamStderrFileNames.length >= row) {
// get the team output file name, which should be provided by the client as a full path
if (currentTeamStderrFileNames[row] == null) {
returnFile = null;
} else {
returnFile = currentTeamStderrFileNames[row];
}
}
} else if (col == COLUMN.JUDGE_OUTPUT.ordinal()) {
//get judge's output corresponding to test case "row"
String[] answerFiles = problemDataFiles.getFullJudgesAnswerFilenames(getContest(), executableDir);
Expand Down Expand Up @@ -2326,6 +2343,10 @@ public void setTeamOutputFileNames(String [] filenames){
this.currentTeamOutputFileNames = filenames ;
}

public void setTeamStderrFileNames(String [] filenames){
this.currentTeamStderrFileNames = filenames;
}

public void setValidatorOutputFileNames(String[] filenames) {
this.currentValidatorOutputFileNames = filenames ;
}
Expand Down
13 changes: 11 additions & 2 deletions src/edu/csus/ecs/pc2/ui/TestResultsRowData.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public class TestResultsRowData {
private String resultString;
private String time;
private String teamOutputViewLabel;
private String teamOutputCompareLabel;
private String teamOutputCompareLabel;
private String teamStderrViewLabel;
private String judgesOutputViewLabel;
private String judgesDataViewLabel;
private String validatorOutputViewLabel;
Expand All @@ -22,18 +23,20 @@ public class TestResultsRowData {
* @param time
* @param teamOutputViewLabel
* @param teamOutputCompareLabel
* @param teamStderrViewLabel
* @param judgesOutputViewLabel
* @param judgesDataViewLabel
* @param validatorOutputViewLabel
* @param validatorStderrViewLabel
*/
public TestResultsRowData(String resultString, String time, String teamOutputViewLabel, String teamOutputCompareLabel, String judgesOutputViewLabel, String judgesDataViewLabel,
public TestResultsRowData(String resultString, String time, String teamOutputViewLabel, String teamOutputCompareLabel, String teamStderrViewLabel, String judgesOutputViewLabel, String judgesDataViewLabel,
String validatorOutputViewLabel, String validatorStderrViewLabel) {
super();
this.resultString = resultString;
this.time = time;
this.teamOutputViewLabel = teamOutputViewLabel;
this.teamOutputCompareLabel = teamOutputCompareLabel;
this.teamStderrViewLabel = teamStderrViewLabel;
this.judgesOutputViewLabel = judgesOutputViewLabel;
this.judgesDataViewLabel = judgesDataViewLabel;
this.validatorOutputViewLabel = validatorOutputViewLabel;
Expand Down Expand Up @@ -76,6 +79,12 @@ public String getTeamOutputViewLabel() {
public String getTeamsOutputCompareLabel() {
return teamOutputCompareLabel;
}
/**
* @return the teamOutputViewLabel
*/
public String getTeamStderrViewLabel() {
return teamStderrViewLabel;
}
/**
* @return the judgesDataViewLabel
*/
Expand Down