maj
This commit is contained in:
214
DEV3.4/ControleMachine/test/Questions.md
Normal file
214
DEV3.4/ControleMachine/test/Questions.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# Questions.
|
||||
ce fichier sert à indiquer les réponses après chaque question, indiquez aussi svp vos nom et prénom.
|
||||
il faut rédiger au format markdown svp.
|
||||
En particulier, le code est à mettre entre deux triple quotes.
|
||||
|
||||
Les sources sont disponibles en ligne sur le site des TPs.
|
||||
|
||||
Vous devez rendre sur devoir une archive tar.gz contenant un répertoire test/ contenant les fichiers java (pas les .class) et ce fichier Questions.md.
|
||||
|
||||
```bash
|
||||
tar -czvf test.tar.gz test/
|
||||
```
|
||||
|
||||
Nom : Pourchot
|
||||
Prénom : Adrian
|
||||
|
||||
|
||||
## Programmation défensive.
|
||||
|
||||
1. [2 points] Préparez la javadoc pour les 4 méthodes suivantes de ShuntingYard
|
||||
shuntFromInput()
|
||||
shuntFromStack()
|
||||
pushToStack()
|
||||
crushParenthesis()
|
||||
|
||||
Il faut prévoir un comportement adapté en cas de problème.
|
||||
Par exemple shuntFromInput ne devrait transférer que des TokenConstant et des TokenVariable
|
||||
et pushToStack ne devrait transférer que des TokenOperator ou des parenthèse gauche.
|
||||
|
||||
Indiquez la javadoc dans ce fichier juste après cette ligne, en recopiant la première ligne de déclaration de chaque méthode.
|
||||
|
||||
---
|
||||
```java
|
||||
/**
|
||||
* Envoie la premiere constante ou variables de la file d'entrée vers la file de sortie.
|
||||
* Si le Token récupéré n'est pas TokenConstant ou un TokenVariable, il y a 2 cas possible:
|
||||
* Soit il s'agit d'un TokenOperator ou d'un TokenSeparator de gauche, dans ce cas on replace l'élément extrait au départ de la file d'entrée
|
||||
* puis on fait appel à la méthode shuntFromStack() plutôt que celle-ci.
|
||||
* Soit il s'agit d'un TokenSeparator de droite, dans ce cas on la replace au départ de ola file d'entrée et on fait appel à la méthode crushParenthesis()
|
||||
* pour la supprimer.
|
||||
*/
|
||||
public void shuntFromInput() {
|
||||
|
||||
/**
|
||||
* Envoie le dernier élément de la pile stack vers la file de sortie.
|
||||
*/
|
||||
public void shuntFromStack() {
|
||||
|
||||
/**
|
||||
* Envoie le premier opérateur ou parenthèse gauche de la file d'entrée vers la pile stack.
|
||||
* Si le Token récupéré n'est pas un TokenOperator ou un TokenSeparator de gauche, il y a 2 cas possible:
|
||||
* Soit le Token est un TokenConstant ou un TokenVariable, dans ce cas on replace le Token extrait au départ de la file d'entrée
|
||||
* puis on fait appel à la méthode shuntFromInput() plutôt que celle-ci.
|
||||
* Soit il s'agit d'un TokenSeparator de droite, dans ce cas on la replace au départ de ola file d'entrée et on fait appel à la méthode crushParenthesis()
|
||||
* pour la supprimer.
|
||||
*/
|
||||
public void pushToStack(){
|
||||
|
||||
/**
|
||||
* Supprime le premier élément de la file d'entrée et le dernier de la pile stack.
|
||||
* @exception IllegalStateException Renvoyer si il y s'agit d'un cas particulier.
|
||||
*/
|
||||
public void crushParenthesis(){
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
2. [2 points] Proposez le changement adapté au code de shuntFromInput et de pushToStack
|
||||
|
||||
donnez le code ci-dessous.
|
||||
|
||||
---
|
||||
|
||||
public void shuntFromInput() {
|
||||
x=this.input.getFirst();
|
||||
if(x instanceof(TokenConstant)||x instanceof(TokenVariable))
|
||||
this.output.addLast(x);
|
||||
else if(x instanceof(TokenOperator)){
|
||||
this.input.addFirst(x);
|
||||
shuntFromStack();
|
||||
}
|
||||
else if(x.getSeparator().equals(Separator.LB)){
|
||||
this.input.addFirst(x);
|
||||
shuntFromStack();
|
||||
}
|
||||
else{
|
||||
this.input.addFirst(x);
|
||||
crushParenthesis();
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
## Invariant
|
||||
3. [2 points] Quels sont les invariants des méthodes suivantes?
|
||||
shuntFromInput()
|
||||
shuntFromStack()
|
||||
pushToStack()
|
||||
---
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Debug
|
||||
4. [1 point] Faite tourner les tests avec le fichier JUnit fourni (TestShuntingYard1.java)
|
||||
Quels tests sont passés avec succès?
|
||||
Quels tests ne sont pas passés avec succès?
|
||||
---
|
||||
|
||||
Test réussi:
|
||||
|
||||
1) pushStack(TestShuntingYard1)
|
||||
|
||||
|
||||
Test échoué:
|
||||
|
||||
1) shuntingTest1(TestShuntingYard1)
|
||||
2) shuntInput(TestShuntingYard1)
|
||||
3) shuntStack(TestShuntingYard1)
|
||||
4) CandyCrush(TestShuntingYard1)
|
||||
|
||||
---
|
||||
|
||||
5. [7 points] Pour chaque test non passé, indiquez le bug que vous observez en français.
|
||||
Puis pour chaque test non passé, proposez un changement de code.
|
||||
|
||||
Il faut indiquer le numéro de la ligne dans le fichier initial (vous pouvez le renommer en ajoutant OLD au bout avant de changer le fichier dans une copie).
|
||||
recopier la ligne, puis indiquez en dessous la nouvelle ligne.
|
||||
Il faut expliquer en français dans un commentaire ci-dessous en quoi ce changement consiste.
|
||||
Dans le fichier changé, il faut ajouter en commentaire à la fin //BUGFIX 0 où le numéro correspond à la notation ci-dessous.
|
||||
En dessous je vous donne une exemple en cadeau.
|
||||
|
||||
---
|
||||
|
||||
### Test concerné :
|
||||
aucun, ceci est un BUGFIX gratuit pour indiquer le format attendu
|
||||
Le test d'arrêt de ShuntingYard est incorrect, car il faut lever l'exception seulement quand l'input et la pile sont vide, pas l'un ou l'autre.
|
||||
|
||||
ShuntingYard.java line 73 (avant):
|
||||
|
||||
```java
|
||||
return (this.input.isEmpty() || this.stack.isEmpty());
|
||||
```
|
||||
|
||||
devient
|
||||
ShuntingYard.java line 73 (après):
|
||||
|
||||
```java
|
||||
return (this.input.isEmpty() && this.stack.isEmpty()); //BUG FIX 0
|
||||
```
|
||||
|
||||
### Test concerné :
|
||||
???
|
||||
|
||||
```java
|
||||
// BUGFIX 1
|
||||
```
|
||||
|
||||
```java
|
||||
// BUGFIX 2
|
||||
```
|
||||
|
||||
---
|
||||
1) shuntingTest1(TestShuntingYard1): On observe que le shunting c'est arrêter car la file d'entrée et la pile stack étaient vide ce qui ne devrait pas être le cas.
|
||||
|
||||
2) shuntInput(TestShuntingYard1): On observe que l'AbstractToken n'est pas trouvé dans la file alors qu'il devrait.
|
||||
|
||||
3) shuntStack(TestShuntingYard1): Même chose que pour shuntInput, un AbstractToken n'est pas trouvé dans la pile alors qu'il devrait.
|
||||
|
||||
4) CandyCrush(TestShuntingYard1): On observe qu'une parenthèse droite est trouvé alors qu'il devrait s'agir d'une parenthèse gauche.
|
||||
|
||||
|
||||
---
|
||||
|
||||
6. [6 points] Complétez le fichier de test TestShuntingYard2.java
|
||||
|
||||
a) [1 point] Proposez un test JUnit pour attraper un NullPointerException lorsqu'on appelle shuntFromInput() sur un input vide.
|
||||
|
||||
indiquez le nom de ce test ici :
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
b) [1 point] Proposez un test JUnit pour attraper l'exception adaptée lorsqu'on appelle shuntFromInput() sur un input dont le prochain token n'est pas un TokenVariable ou un TokenConstant.
|
||||
|
||||
indiquez le nom de ce test ici :
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
c) [2 points] Pour l'exemple ExempleSY2.java, proposez la liste des instructions primitives correspondant à l'algo de Dijkstra.
|
||||
(i.e. les primitives que shunting devrait appeller si code convenablement).
|
||||
|
||||
---
|
||||
|
||||
|
||||
```java
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
d) [3 points]
|
||||
Proposez un test JUnit correspondant à l'exemple ExempleSY2.java
|
||||
Expliquez bien votre démarche.
|
||||
|
||||
indiquez le nom de ce test ici, puis expliquez votre démarche :
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user