création de tests pour les redirections I/O + amélioration du code

This commit is contained in:
Louay DARDOURI 2025-03-14 23:25:57 +01:00
parent 6478a042ee
commit 31e32c825c
4 changed files with 133 additions and 7 deletions
src/fr/monlouyan/bakefile
tests/test-31-redirection

@ -205,6 +205,7 @@ public class BakefileParser {
public List<Rule> parse() { public List<Rule> parse() {
List<Rule> rules = new ArrayList<>(); List<Rule> rules = new ArrayList<>();
Set<String> phonyTargets = new HashSet<>(); Set<String> phonyTargets = new HashSet<>();
List<String> allTargetNames = new ArrayList<>(); // Pour suivre l'ordre des cibles
if (!Files.exists(Paths.get(filename))) { if (!Files.exists(Paths.get(filename))) {
System.out.println("*** No targets specified and no bakefile found. Stop."); System.out.println("*** No targets specified and no bakefile found. Stop.");
@ -217,6 +218,18 @@ public class BakefileParser {
List<String> dependencies = new ArrayList<>(); List<String> dependencies = new ArrayList<>();
List<String> commands = new ArrayList<>(); List<String> commands = new ArrayList<>();
// Première passe : collecter toutes les cibles PHONY
for (String line : lines) {
if (line.trim().isEmpty()) continue;
Matcher phonyMatcher = PHONY_PATTERN.matcher(line);
if (phonyMatcher.matches()) {
String[] phonies = phonyMatcher.group(1).trim().split("\\s+");
Collections.addAll(phonyTargets, phonies);
}
}
// Deuxième passe : analyser les règles en tenant compte des PHONY
for (int i = 0; i < lines.size(); i++) { for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i); String line = lines.get(i);
@ -247,8 +260,7 @@ public class BakefileParser {
Matcher phonyMatcher = PHONY_PATTERN.matcher(line); Matcher phonyMatcher = PHONY_PATTERN.matcher(line);
if (phonyMatcher.matches()) { if (phonyMatcher.matches()) {
String[] phonies = phonyMatcher.group(1).trim().split("\\s+"); // Déjà traité dans la première passe
Collections.addAll(phonyTargets, phonies);
continue; continue;
} }
@ -271,9 +283,8 @@ public class BakefileParser {
phonyTargets.contains(resolvedTarget) phonyTargets.contains(resolvedTarget)
)); ));
if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) { // Enregistrer le nom de la cible pour suivre l'ordre
firstTarget = resolvedTarget; allTargetNames.add(resolvedTarget);
}
} }
} }
@ -298,15 +309,32 @@ public class BakefileParser {
phonyTargets.contains(resolvedTarget) phonyTargets.contains(resolvedTarget)
)); ));
if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) { // Enregistrer le nom de la cible pour suivre l'ordre
firstTarget = resolvedTarget; allTargetNames.add(resolvedTarget);
}
}
// Définir la première cible (similaire à Make)
// Make prend la première cible non-PHONY, ou la première cible si toutes sont PHONY
if (!allTargetNames.isEmpty()) {
// Chercher d'abord une cible non-PHONY dans l'ordre d'apparition
for (String targetName : allTargetNames) {
if (!phonyTargets.contains(targetName)) {
firstTarget = targetName;
break;
} }
} }
// Si toutes les cibles sont PHONY, prendre simplement la première
if (firstTarget == null) {
firstTarget = allTargetNames.get(0);
}
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return rules; return rules;
} }

@ -0,0 +1,2 @@
En gros, ici on vérifie si ça marche les redirections
jors j'envoie mon echo dans un fichier

@ -0,0 +1,48 @@
# Bakefile pour tester les redirections I/O
.PHONY: all test-output test-append test-input test-multiple test-pipe test-cleanup
all: test-output test-append test-input test-multiple test-pipe
@echo "Tous les tests de redirection I/O sont terminés"
# Test de redirection de sortie standard (>)
test-output:
@echo "Test de redirection de sortie >"
echo "Contenu écrit avec redirection >" > output.txt
@cat output.txt
@echo "-----------------------------"
# Test de redirection avec ajout (>>)
test-append:
@echo "Test de redirection avec ajout >>"
echo "Première ligne" > append.txt
echo "Deuxième ligne ajoutée" >> append.txt
@cat append.txt
@echo "-----------------------------"
# Test de redirection d'entrée (<)
test-input:
@echo "Test de redirection d'entrée <"
echo "Contenu à lire" > input.txt
cat < input.txt
@echo "-----------------------------"
# Test de redirections multiples
test-multiple:
@echo "Test de redirections multiples"
echo "Ligne 1" > multi.txt
echo "Ligne 2" >> multi.txt
cat < multi.txt > multi-output.txt
@cat multi-output.txt
@echo "-----------------------------"
# Test de pipe |
test-pipe:
@echo "Test de pipe |"
echo "LIGNE UN\nLIGNE DEUX\nLIGNE TROIS" | grep LIGNE | wc -l
@echo "-----------------------------"
# Nettoyage des fichiers créés
test-cleanup:
@echo "Nettoyage des fichiers de test"
rm -f output.txt append.txt input.txt multi.txt multi-output.txt

@ -0,0 +1,48 @@
# Bakefile pour tester les redirections I/O
.PHONY: all test-output test-append test-input test-multiple test-pipe test-cleanup
all: test-output test-append test-input test-multiple test-pipe
@echo "Tous les tests de redirection I/O sont terminés"
# Test de redirection de sortie standard (>)
test-output:
@echo "Test de redirection de sortie >"
echo "Contenu écrit avec redirection >" > output.txt
@cat output.txt
@echo "-----------------------------"
# Test de redirection avec ajout (>>)
test-append:
@echo "Test de redirection avec ajout >>"
echo "Première ligne" > append.txt
echo "Deuxième ligne ajoutée" >> append.txt
@cat append.txt
@echo "-----------------------------"
# Test de redirection d'entrée (<)
test-input:
@echo "Test de redirection d'entrée <"
echo "Contenu à lire" > input.txt
cat < input.txt
@echo "-----------------------------"
# Test de redirections multiples
test-multiple:
@echo "Test de redirections multiples"
echo "Ligne 1" > multi.txt
echo "Ligne 2" >> multi.txt
cat < multi.txt > multi-output.txt
@cat multi-output.txt
@echo "-----------------------------"
# Test de pipe |
test-pipe:
@echo "Test de pipe |"
echo "LIGNE UN\nLIGNE DEUX\nLIGNE TROIS" | grep LIGNE | wc -l
@echo "-----------------------------"
# Nettoyage des fichiers créés
test-cleanup:
@echo "Nettoyage des fichiers de test"
rm -f output.txt append.txt input.txt multi.txt multi-output.txt