export CLASSPATH=".:/usr/share/java/junit.jar:/usr/share/java/hamcrest-core.jar:$CLASSPATH" assertThows assertTrue assertFalse assertEquals assertNotEquals Voici une réponse détaillée pour chaque question et une explication de ce qu'il faut compléter : 1) [3 points en tout] a) Quel patron de conception est à l'œuvre ici ? Réponse : Le patron de conception utilisé est l'adaptateur (Adapter Pattern). Cette classe agit comme une enveloppe autour d'une implémentation existante de Deque (comme celle dans java.util) pour qu'elle corresponde à l'interface MinimalDeque demandée. b) Comment fonctionne cette classe ? Réponse : La classe SimpleDequeThatsNotCricket délègue toutes ses opérations directement à une instance interne de Deque fournie par java.util. Elle ne réimplémente pas les fonctionnalités mais agit comme une passerelle pour adapter une implémentation existante à une interface spécifique. 2) [-6 à 4 points en tout] a) a1) Il est possible de décider si un programme Java va s’arrêter quelle que soit son entrée. Réponse : F (C'est le problème de l'arrêt, qui est indécidable). a2) Il est possible de décider si un programme C va s’arrêter quelle que soit son entrée. Réponse : F (Même raison que pour Java). a3) Il est possible de décider si un programme Python ne va pas s’arrêter pour certaines entrées. Réponse : F (Le problème de l'arrêt est indécidable pour tous les langages Turing-complets). b) b1) Il est possible de décrire les propriétés souhaitées d'un programme en utilisant des langages de spécifications inspirés de la logique du premier ordre. Réponse : V b2) Il existe des logiciels qui, étant donné une spécification et un programme, peuvent décider à coup sûr que le programme satisfait la spécification ou pas. Réponse : F (C'est une généralisation trop forte, en raison des limitations de la vérification formelle). b3) Il existe des logiciels qui, étant donné une spécification et un programme, peuvent décider si le programme satisfait la spécification ou pas en demandant à un logiciel d'IA générative (comme ChatGPT) pour générer une preuve. Réponse : F (Bien que l'IA puisse assister, elle ne garantit pas une vérification formelle). 3) [1 point en tout] a) Commande pour lancer les tests si junit.jar et hamcrest-core.jar sont dans le même répertoire : bash Copier le code javac -cp .:junit.jar:hamcrest-core.jar TestSimpleDeque.java java -cp .:junit.jar:hamcrest-core.jar org.junit.runner.JUnitCore TestSimpleDeque b) Commande pour lancer les tests si les archives sont dans le CLASSPATH : bash Copier le code javac TestSimpleDeque.java java org.junit.runner.JUnitCore TestSimpleDeque 4) [12 points en tout] Complétez le fichier TestSimpleDeque.java en fonction des descriptions des tests. Test addFirstNull: Ajoutez une assertion pour vérifier qu'une exception est levée. Exemple : java Copier le code @Test(expected = NullPointerException.class) public void addFirstNull() { MinimalDeque d = new SimpleDeque<>(); d.addFirst(null); } Test addLastNull: Pareil que pour addFirstNull. Test addNoneIsEmpty: Vérifiez qu'un Deque vide est effectivement vide. Exemple : java Copier le code @Test public void addNoneIsEmpty() { MinimalDeque d = new SimpleDeque<>(); assertTrue(d.isEmpty()); } Test addOneIsNotEmpty: Vérifiez qu'un Deque avec un élément n'est pas vide. Test pasDeResquilleur: Ajoutez des éléments devant, enlevez-les derrière, et vérifiez l'ordre. Test pasDeResquilleurQuantique: Ajoutez des éléments derrière, enlevez-les devant, et vérifiez l'ordre. Test removeFirstFromEmpty: Vérifiez qu'une exception est levée lorsqu'on essaie de retirer un élément d'un Deque vide. Test removeLastFromEmpty: Même logique que removeFirstFromEmpty. Test mangerLaBananeParLesDeuxBouts: Ajoutez un élément, enlevez-le des deux côtés, et vérifiez. Test invariantTaille: Implémentez le test aléatoire avec ajout/suppression jusqu'à ce que le Deque soit vide. Chain of Responsibility But : Permet à plusieurs objets de traiter une requête, chaque objet ayant la possibilité de la traiter ou de la transmettre. Exemple : Système de support technique avec plusieurs niveaux d'escalade. Command But : Encapsule une requête en un objet pour paramétrer des actions, les annuler ou les enregistrer. Exemple : Boutons Annuler/Refaire dans un éditeur de texte. Interpreter But : Fournit une représentation grammaticale d'un langage et un interprète pour traiter ses instructions. Exemple : Interprétation de scripts dans un moteur de jeu. Iterator But : Fournit un moyen d'accéder séquentiellement aux éléments d'une collection sans exposer sa représentation. Exemple : Parcours des éléments d'une liste. Mediator But : Définit un objet pour centraliser la communication entre plusieurs objets. Exemple : Gestionnaire de chat dans une application de messagerie. Memento But : Capture l'état interne d'un objet pour pouvoir le restaurer ultérieurement. Exemple : Sauvegarde dans un jeu vidéo. Observer But : Définit une relation 1-n où les objets sont notifiés automatiquement lorsqu'un autre objet change d'état. Exemple : Notifications pour les abonnés dans un système de messagerie. State But : Permet à un objet de changer son comportement lorsqu'il change d'état. Exemple : Système de verrouillage/déverrouillage dans une application. Strategy But : Définit une famille d'algorithmes, les encapsule, et permet de les interchanger dynamiquement. Exemple : Algorithmes de tri dans une application. Template Method But : Définit la structure d'un algorithme tout en laissant certaines étapes spécifiques aux sous-classes. Exemple : Méthode de rendu dans un moteur de jeu. Visitor But : Sépare un algorithme de la structure des objets sur lesquels il opère. Exemple : Calcul de taxes dans un système de commerce électronique. java org.junit.runner.JUnitCore TestSimpleDeque javac -cp .:junit.jar:hamcrest-core.jar TestSimpleDeque.java java -cp .:junit.jar:hamcrest-core.jar org.junit.runner.JUnitCore TestSimpleDeque javac TestSimpleDeque.java java org.junit.runner.JUnitCore TestSimpleDeque