Amélioration du programme de test

This commit is contained in:
Moncef STITI 2025-03-02 16:18:59 +01:00
parent 8f79794ddc
commit d000eef590

@ -5,8 +5,6 @@ import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.DefaultCaret;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
@ -55,76 +53,158 @@ public class BakeTestRunner extends JFrame {
createLogsDirectory();
}
private void setupUI() {
mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
// Top panel with controls
JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
runSelectedButton = new JButton("Run Selected Tests");
runAllButton = new JButton("Run All Tests");
compareSelectedButton = new JButton("Compare Selected Test");
languageComboBox = new JComboBox<>(new String[]{"All", "C", "Java"});
openLogsButton = new JButton("Open Logs Directory");
controlPanel.add(runSelectedButton);
controlPanel.add(runAllButton);
controlPanel.add(compareSelectedButton);
controlPanel.add(new JLabel("Language:"));
controlPanel.add(languageComboBox);
controlPanel.add(openLogsButton);
// Table for test list
String[] columnNames = {"#", "Language", "Test Name", "Status", "Last Run"};
tableModel = new DefaultTableModel(columnNames, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
testTable = new JTable(tableModel);
testTable.getColumnModel().getColumn(0).setPreferredWidth(30);
testTable.getColumnModel().getColumn(1).setPreferredWidth(70);
testTable.getColumnModel().getColumn(2).setPreferredWidth(300);
testTable.getColumnModel().getColumn(3).setPreferredWidth(80);
testTable.getColumnModel().getColumn(4).setPreferredWidth(150);
testTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
testTable.setRowHeight(25);
// Log area
logArea = new JTextArea();
logArea.setEditable(false);
logArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
DefaultCaret caret = (DefaultCaret) logArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
// Progress bar
progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
progressBar.setString("Ready");
// Layout
JSplitPane splitPane = new JSplitPane(
JSplitPane.VERTICAL_SPLIT,
new JScrollPane(testTable),
new JScrollPane(logArea)
);
splitPane.setDividerLocation(300);
mainPanel.add(controlPanel, BorderLayout.NORTH);
mainPanel.add(splitPane, BorderLayout.CENTER);
mainPanel.add(progressBar, BorderLayout.SOUTH);
setContentPane(mainPanel);
// Add action listeners
runSelectedButton.addActionListener(e -> runSelectedTests());
runAllButton.addActionListener(e -> runAllTests());
compareSelectedButton.addActionListener(e -> compareSelectedTest());
openLogsButton.addActionListener(e -> openLogsDirectory());
languageComboBox.addActionListener(e -> filterTestsByLanguage());
}
private void setupUI() {
mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
// Panel du haut avec contrôles modernisés
JPanel controlPanel = new JPanel();
controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS));
// Première ligne de contrôles
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
runSelectedButton = new JButton("Run Selected Tests");
runAllButton = new JButton("Run All Tests");
compareSelectedButton = new JButton("Compare Selected Test");
// Styliser les boutons
runSelectedButton.setBackground(new Color(70, 130, 180)); // Steel Blue
runSelectedButton.setForeground(Color.WHITE);
runSelectedButton.setFont(new Font("Dialog", Font.BOLD, 12));
runAllButton.setBackground(new Color(60, 179, 113)); // Medium Sea Green
runAllButton.setForeground(Color.WHITE);
runAllButton.setFont(new Font("Dialog", Font.BOLD, 12));
compareSelectedButton.setBackground(new Color(30, 144, 255)); // Dodger Blue
compareSelectedButton.setForeground(Color.WHITE);
compareSelectedButton.setFont(new Font("Dialog", Font.BOLD, 12));
buttonPanel.add(runSelectedButton);
buttonPanel.add(runAllButton);
buttonPanel.add(compareSelectedButton);
// Deuxième ligne de contrôles
JPanel filterPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
filterPanel.add(new JLabel("Language:"));
languageComboBox = new JComboBox<>(new String[]{"All", "C", "Java"});
languageComboBox.setPreferredSize(new Dimension(100, 25));
openLogsButton = new JButton("Open Logs Directory");
openLogsButton.setBackground(new Color(211, 211, 211)); // Light Gray
openLogsButton.setFont(new Font("Dialog", Font.PLAIN, 12));
filterPanel.add(languageComboBox);
filterPanel.add(Box.createHorizontalStrut(10));
filterPanel.add(openLogsButton);
controlPanel.add(buttonPanel);
controlPanel.add(Box.createVerticalStrut(5));
controlPanel.add(filterPanel);
// Tableau stylisé pour la liste des tests
String[] columnNames = {"#", "Language", "Test Name", "Status", "Last Run"};
tableModel = new DefaultTableModel(columnNames, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
@Override
public Class<?> getColumnClass(int column) {
if (column == 0) return Integer.class;
return String.class;
}
};
testTable = new JTable(tableModel) {
@Override
public Component prepareRenderer(javax.swing.table.TableCellRenderer renderer, int row, int column) {
Component comp = super.prepareRenderer(renderer, row, column);
// Alterner les couleurs des lignes
if (!comp.getBackground().equals(getSelectionBackground())) {
String status = (String) getValueAt(row, 3);
if ("PASSED".equals(status)) {
comp.setBackground(PASSED_COLOR);
} else if ("FAILED".equals(status)) {
comp.setBackground(FAILED_COLOR);
} else if ("RUNNING".equals(status)) {
comp.setBackground(RUNNING_COLOR);
} else {
comp.setBackground(row % 2 == 0 ? new Color(240, 240, 250) : Color.WHITE);
}
}
return comp;
}
};
testTable.getColumnModel().getColumn(0).setPreferredWidth(30);
testTable.getColumnModel().getColumn(0).setMaxWidth(50);
testTable.getColumnModel().getColumn(1).setPreferredWidth(70);
testTable.getColumnModel().getColumn(1).setMaxWidth(100);
testTable.getColumnModel().getColumn(2).setPreferredWidth(300);
testTable.getColumnModel().getColumn(3).setPreferredWidth(80);
testTable.getColumnModel().getColumn(3).setMaxWidth(120);
testTable.getColumnModel().getColumn(4).setPreferredWidth(150);
testTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
testTable.setRowHeight(28);
testTable.setShowGrid(false);
testTable.setIntercellSpacing(new Dimension(0, 0));
testTable.getTableHeader().setFont(new Font("Dialog", Font.BOLD, 12));
testTable.getTableHeader().setOpaque(false);
testTable.getTableHeader().setBackground(new Color(240, 240, 240));
testTable.setFont(new Font("Dialog", Font.PLAIN, 12));
// Zone de logs améliorée
logArea = new JTextArea();
logArea.setEditable(false);
logArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
logArea.setBackground(new Color(250, 250, 250));
logArea.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
DefaultCaret caret = (DefaultCaret) logArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
JPanel logPanel = new JPanel(new BorderLayout());
logPanel.add(new JLabel(" Test Output:"), BorderLayout.NORTH);
logPanel.add(new JScrollPane(logArea), BorderLayout.CENTER);
// Barre de progression stylisée
progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
progressBar.setString("Ready");
progressBar.setFont(new Font("Dialog", Font.BOLD, 11));
progressBar.setForeground(new Color(46, 139, 87)); // Sea Green
// Layout
JSplitPane splitPane = new JSplitPane(
JSplitPane.VERTICAL_SPLIT,
new JScrollPane(testTable),
logPanel
);
splitPane.setDividerLocation(300);
splitPane.setContinuousLayout(true);
splitPane.setDividerSize(5);
mainPanel.add(controlPanel, BorderLayout.NORTH);
mainPanel.add(splitPane, BorderLayout.CENTER);
JPanel statusPanel = new JPanel(new BorderLayout());
statusPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
statusPanel.add(progressBar, BorderLayout.CENTER);
mainPanel.add(statusPanel, BorderLayout.SOUTH);
setContentPane(mainPanel);
// Add action listeners
runSelectedButton.addActionListener(e -> runSelectedTests());
runAllButton.addActionListener(e -> runAllTests());
compareSelectedButton.addActionListener(e -> compareSelectedTest());
openLogsButton.addActionListener(e -> openLogsDirectory());
languageComboBox.addActionListener(e -> filterTestsByLanguage());
}
private void createLogsDirectory() {
try {
Files.createDirectories(Paths.get(logsDir));
@ -169,74 +249,130 @@ public class BakeTestRunner extends JFrame {
showComparisonDialog(logFile, language, testName);
}
private void showComparisonDialog(File logFile, String language, String testName) {
JDialog dialog = new JDialog(this, "Comparison: " + language + " - " + testName, true);
dialog.setLayout(new BorderLayout(10, 10));
dialog.setSize(1000, 600);
dialog.setLocationRelativeTo(this);
try {
List<String> lines = Files.readAllLines(logFile.toPath());
String content = String.join("\n", lines);
// Split content to make and bake sections if possible
String makeOutput = "";
String bakeOutput = "";
// Basic parsing - can be enhanced for better splitting
int makeIndex = content.indexOf("=== Make Output ===");
int bakeIndex = content.indexOf("=== Bake Output ===");
int comparisonIndex = content.indexOf("=== Comparison Results ===");
if (makeIndex != -1 && bakeIndex != -1) {
makeOutput = content.substring(makeIndex, bakeIndex).trim();
if (comparisonIndex != -1) {
bakeOutput = content.substring(bakeIndex, comparisonIndex).trim();
} else {
bakeOutput = content.substring(bakeIndex).trim();
}
}
JTextArea makeArea = new JTextArea(makeOutput);
JTextArea bakeArea = new JTextArea(bakeOutput);
JTextArea comparisonArea = new JTextArea();
if (comparisonIndex != -1) {
comparisonArea.setText(content.substring(comparisonIndex).trim());
} else {
comparisonArea.setText("No comparison results available.");
}
makeArea.setEditable(false);
bakeArea.setEditable(false);
comparisonArea.setEditable(false);
makeArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
bakeArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
comparisonArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab("Make Output", new JScrollPane(makeArea));
tabbedPane.addTab("Bake Output", new JScrollPane(bakeArea));
tabbedPane.addTab("Comparison", new JScrollPane(comparisonArea));
dialog.add(tabbedPane, BorderLayout.CENTER);
JButton closeButton = new JButton("Close");
closeButton.addActionListener(e -> dialog.dispose());
JPanel buttonPanel = new JPanel();
buttonPanel.add(closeButton);
dialog.add(buttonPanel, BorderLayout.SOUTH);
dialog.setVisible(true);
} catch (IOException e) {
JOptionPane.showMessageDialog(dialog,
"Error reading log file: " + e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
private void showComparisonDialog(File logFile, String language, String testName) {
JDialog dialog = new JDialog(this, "Comparison: " + language + " - " + testName, true);
dialog.setLayout(new BorderLayout(10, 10));
dialog.setSize(1000, 600);
dialog.setLocationRelativeTo(this);
try {
List<String> lines = Files.readAllLines(logFile.toPath());
String content = String.join("\n", lines);
// Split content to make and bake sections if possible
String makeOutput = "";
String bakeOutput = "";
String comparisonResults = "";
// Better parsing - enhanced for clearer splitting
int makeIndex = content.indexOf("=== Make Output ===");
int bakeIndex = content.indexOf("=== Bake Output ===");
int comparisonIndex = content.indexOf("=== Comparison Results ===");
if (makeIndex != -1 && bakeIndex != -1) {
makeOutput = content.substring(makeIndex, bakeIndex).trim();
if (comparisonIndex != -1) {
bakeOutput = content.substring(bakeIndex, comparisonIndex).trim();
comparisonResults = content.substring(comparisonIndex).trim();
} else {
bakeOutput = content.substring(bakeIndex).trim();
}
}
JTextPane makeArea = createStyledTextPane(makeOutput);
JTextPane bakeArea = createStyledTextPane(bakeOutput);
JTextPane comparisonArea = createStyledTextPane(
comparisonIndex != -1 ? comparisonResults : "No comparison results available."
);
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab("Make Output", new JScrollPane(makeArea));
tabbedPane.addTab("Bake Output", new JScrollPane(bakeArea));
tabbedPane.addTab("Comparison", new JScrollPane(comparisonArea));
tabbedPane.setFont(new Font("Dialog", Font.PLAIN, 12));
// Détection et mise en évidence des différences
highlightDifferences(makeArea, bakeArea);
dialog.add(tabbedPane, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JButton closeButton = new JButton("Close");
closeButton.setFont(new Font("Dialog", Font.BOLD, 12));
closeButton.addActionListener(e -> dialog.dispose());
buttonPanel.add(closeButton);
dialog.add(buttonPanel, BorderLayout.SOUTH);
dialog.setVisible(true);
} catch (IOException e) {
JOptionPane.showMessageDialog(dialog,
"Error reading log file: " + e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
// Méthode pour créer un JTextPane stylisé
private JTextPane createStyledTextPane(String content) {
JTextPane textPane = new JTextPane();
textPane.setEditable(false);
textPane.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
textPane.setText(content);
textPane.setMargin(new Insets(10, 10, 10, 10));
textPane.setBackground(new Color(252, 252, 252));
// Appliquer une coloration syntaxique basique
highlightKeywords(textPane);
return textPane;
}
// Méthode pour mettre en évidence les mots clés
private void highlightKeywords(JTextPane textPane) {
// Obtenez le document et le kit de style
javax.swing.text.StyledDocument doc = textPane.getStyledDocument();
javax.swing.text.Style defaultStyle = javax.swing.text.StyleContext.getDefaultStyleContext()
.getStyle(javax.swing.text.StyleContext.DEFAULT_STYLE);
// Créez différents styles pour différents types de texte
javax.swing.text.Style errorStyle = doc.addStyle("errorStyle", defaultStyle);
javax.swing.text.StyleConstants.setForeground(errorStyle, new Color(220, 0, 0));
javax.swing.text.StyleConstants.setBold(errorStyle, true);
javax.swing.text.Style successStyle = doc.addStyle("successStyle", defaultStyle);
javax.swing.text.StyleConstants.setForeground(successStyle, new Color(0, 128, 0));
javax.swing.text.StyleConstants.setBold(successStyle, true);
// Appliquez les styles aux mots-clés
String text = textPane.getText();
applyStyle(doc, text, "Error", errorStyle);
applyStyle(doc, text, "error", errorStyle);
applyStyle(doc, text, "ERROR", errorStyle);
applyStyle(doc, text, "failed", errorStyle);
applyStyle(doc, text, "FAILED", errorStyle);
applyStyle(doc, text, "PASSED", successStyle);
applyStyle(doc, text, "passed", successStyle);
applyStyle(doc, text, "successful", successStyle);
}
// Méthode auxiliaire pour appliquer un style à un mot-clé spécifique
private void applyStyle(javax.swing.text.StyledDocument doc, String text, String pattern, javax.swing.text.Style style) {
int pos = 0;
while ((pos = text.indexOf(pattern, pos)) >= 0) {
doc.setCharacterAttributes(pos, pattern.length(), style, true);
pos += pattern.length();
}
}
// Méthode pour mettre en évidence les différences entre les sorties make et bake
private void highlightDifferences(JTextPane makeArea, JTextPane bakeArea) {
// Cette méthode devrait idéalement comparer les lignes et mettre en évidence les différences
// Pour une première implémentation simple, nous allons juste colorer les lignes contenant des erreurs
highlightKeywords(makeArea);
highlightKeywords(bakeArea);
}
private void loadTests() {
tableModel.setRowCount(0);