# Test 4 : Compilation où le résultat existe déjà OU est modifier

## 📌 Description  
Ce test vérifie que si l’exécutable `Main.class` est déjà présent et que `Main.java`  
n'a pas été modifié, alors `bake` ne doit **pas recompiler** inutilement.  

Cela permet d’optimiser la compilation en évitant de perdre du temps et des ressources  
à recompiler des fichiers inchangés, comme `make` en C.

---

## 📂 **Fichiers utilisés**  
- **`Main.java`** : Fichier source contenant le programme principal.  
- **`Bakefile`** : Contient les règles de compilation.  
- **`Main.class`** : Fichier compilé qui doit exister avant le test.  

---

## ✅ **Résultat attendu**  
1️⃣ **Première exécution de `bake`**  
   - Si `Main.class` **n’existe pas**, `bake` doit **compiler** `Main.java`.  
   - **Commande exécutée :**  
     ```sh
     javac Main.java
     ```
   - `Main.class` est généré.

2️⃣ **Seconde exécution de `bake` sans modification**  
   - Si `Main.class` est **déjà à jour**, `bake` **ne doit rien faire**.  
   - **Aucune commande `javac` ne doit être exécutée**.  

3️⃣ **Modification de `Main.java` et recompilation**  
   - Si `Main.java` est **modifié**, `bake` doit **détecter le changement** et  
     recompiler uniquement `Main.java`.  
   - **Commande exécutée :**  
     ```sh
     javac Main.java
     ```

---

## 🔬 **Procédure de test**  
### **1️⃣ Étape 1 : Compilation initiale**  
1. Supprimer `Main.class` s’il existe déjà :  
   ```sh
   rm -f Main.class
   ```
2. Exécuter `bake` :  
   ```sh
   java -cp bakefile.jar fr.monlouyan.bakefile.Main
javac Main.java
   ```
3. **Attendu** :  
   - `bake` doit exécuter `javac Main.java` et créer `Main.class`.  

### **2️⃣ Étape 2 : Vérification sans modification**  
1. Exécuter `bake` une seconde fois :  
   ```sh
   java -cp bakefile.jar fr.monlouyan.bakefile.Main
javac Main.java
   ```
2. **Attendu** :  
   - **Aucune recompilation** ne doit avoir lieu.  
   - `bake` **ne doit afficher aucun message de compilation**.  

### **3️⃣ Étape 3 : Modifier `Main.java`**  
1. Modifier `Main.java`, par exemple en ajoutant une ligne :  
   ```java
   System.out.println("Nouvelle ligne ajoutée !");
   ```
2. Exécuter `bake` :  
   ```sh
   java -cp bakefile.jar fr.monlouyan.bakefile.Main
javac Main.java
   ```
3. **Attendu** :  
   - `bake` détecte la modification et exécute `javac Main.java`.  
   - `Main.class` est mis à jour.

---

## 🛠 **Fichier `Bakefile` utilisé**
```make
# Bakefile

Main.class: Main.java
	javac Main.java

all: Main.class
```
➡ Ce `Bakefile` garantit que `bake` **ne recompile `Main.java` que si nécessaire**.  

---

## 🎯 **Validation du test**
| Situation | Comportement attendu |
|-----------|----------------------|
| **Première compilation (`bake`)** | `javac Main.java` est exécuté ✅ |
| **Seconde exécution sans modification (`bake`)** | **Aucune recompilation** ✅ |
| **Modification de `Main.java`** | `javac Main.java` est exécuté à nouveau ✅ |

---

## 📌 **Conclusion**
- Si `bake` **ne recompile pas sans raison** et ne recompile `Main.java` **que si modifié**, alors **le test est réussi !** ✅  
- Cela assure une **optimisation de la compilation** et empêche le gaspillage de ressources.  

🚀 **Lance le test et vérifie que `bake` fonctionne correctement !**