création de tests pour les redirections I/O + amélioration du code
This commit is contained in:
parent
6478a042ee
commit
31e32c825c
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
tests/test-31-redirection/README.md
Normal file
2
tests/test-31-redirection/README.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
En gros, ici on vérifie si ça marche les redirections
|
||||||
|
jors j'envoie mon echo dans un fichier
|
48
tests/test-31-redirection/bake/Bakefile
Normal file
48
tests/test-31-redirection/bake/Bakefile
Normal file
@ -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
|
48
tests/test-31-redirection/make/Makefile
Normal file
48
tests/test-31-redirection/make/Makefile
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user