Skip to content
Snippets Groups Projects
Commit c5c7887f authored by Guyslain's avatar Guyslain
Browse files

TD 9 exceptions

parent 09523990
No related branches found
No related tags found
No related merge requests found
package fr.univamu.progav.td9;
public record Book(String isbn, String title) {
@Override
public String toString() {
return title + " (" + isbn + ")";
}
}
package fr.univamu.progav.td9;
public class BookException extends Exception {
public Book book() {
// TODO
return null;
}
}
package fr.univamu.progav.td9;
public class BookNotFoundException extends BookException {
}
package fr.univamu.progav.td9;
public enum BookStatus { AVAILABLE, BORROWED; }
package fr.univamu.progav.td9;
public class BookUnavailableException extends BookException {
}
package fr.univamu.progav.td9;
import java.util.List;
public record BulkCheckoutResult(
List<Book> successfulCheckouts,
List<BookException> failedCheckouts
) {
public boolean isCompletelySuccessful() {
// TODO
return false;
}
}
package fr.univamu.progav.td9;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Library {
private final Map<Book, BookStatus> bookStatuses = new HashMap<>();
public void addBook(Book book) {
bookStatuses.put(book, BookStatus.AVAILABLE);
}
public Book findBook(String isbn) {
// TODO
return null;
}
public void checkoutBook(Book book) throws BookException {
// TODO
}
public BulkCheckoutResult checkoutBooks(List<Book> books) {
// TODO
return null;
}
public BookStatus getBookStatus(Book book) {
// TODO
return null;
}
}
Ces exercices portent sur la gestion des exceptions. Le contexte est la
gestion des livres d'une bibliothèque, qui n'est pas un exemple très
pertinent pour l'utilisation d'exceptions, mais qui a l'avantage d'être
relativement simple pour apprendre les bases de la manipulation des exceptions.
La bibliothèque ```Library``` possède une collection de livre ```Book```, et
les clients peuvent venir emprunter un ou plusieurs livres (méthodes
```checkoutBook``` et ```checkoutBooks```). Un livre peut donc être
disponible ou indisponible (classe ```BookStatus```), ou bien ne pas faire
partie de la bibliothèque.
Si un client veut emprunter un livre déjà prêté, l'exception
```BookUnavailableException``` sera levée. Si le livre n'est pas possédé par la
bibliothèque, l'exception ```BookNotFoundException``` sera levée.
Exercice 1
==========
Compléter la classe d'exception ```BookException```, en y ajoutant une
propriété ```Book```, et une méthode ```toString``` affichant le livre.
Compléter aussi la méthode ```book```.
Exercice 2
==========
Compléter les 2 extensions ```BookNotFoundException``` et
```BookUnavailable``` de ```BookException```. Assurez-vous que le
```toString``` de chacune affiche un message adapté et mentionnant le livre
concerné.
Exercice 3
==========
Compléter la méthode ```findBook``` de la classe ```Library```. Elle doit
retourner le livre dont le code ISBN est fourni. S'il n'existe pas un tel
livre, il faut émettre l'exception ```BookNotFoundException```. Ajouter la
déclaration d'exception à la méthode.
Exercice 4
==========
Compléter la méthode ```checkBookStatus``` de la classe ```Library```,
retournant le status d'un livre précisé par son code ISBN. Si le livre
n'existe pas, l'exception ```BookNotFound``` sera émise. Ajouter la
déclaration d'exception à la méthode.
Exercice 5
==========
Compléter la méthode ```checkoutBook``` de la classe ```Library```.
La méthode vérifie l'existence et la disponibilité du livre (donné par son
code ISBN), et modifie alors son status à ```BORROWED```. Si les conditions
ne sont pas respectées, la méthode émet l'exception appropriée. Ajouter la
déclaration d'exception à la méthode.
Exercice 6
==========
Compléter la méthode ```isCompletelySuccessful``` de la classe
```BulkCheckoutResult```. Cette classe contiendra les résultats de la
réservation d'une liste de livres, comprenant :
- la liste des livres empruntés;
- la liste des échecs des tentatives d'emprunt.
Exercice 7
==========
Compléter la méthode ```checkoutBooks``` de la classe ```Library```.
package fr.univamu.progav.td9;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
public class LibraryTest {
private Library library;
private Book book1;
private Book book2;
private Book book3;
@BeforeEach
void setUp() {
library = new Library();
book1 = new Book("123", "Livre 1");
book2 = new Book("456", "Livre 2");
book3 = new Book("789", "Livre 3");
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
}
@Test
void testFindBookThrowsException() {
assertThrows(BookNotFoundException.class, () -> {
library.findBook("999");
});
}
@Test
void testSingleCheckoutSuccess() throws BookException {
library.checkoutBook(book1);
assertEquals(BookStatus.BORROWED, library.getBookStatus(book1));
}
@Test
void testBulkCheckoutPartialSuccess() throws BookException {
library.checkoutBook(book1);
Book nonExistentBook = new Book("999", "Nonexistent");
List<Book> booksToCheckout = List.of(book1, book2, nonExistentBook);
BulkCheckoutResult result = library.checkoutBooks(booksToCheckout);
assertFalse(result.isCompletelySuccessful());
assertEquals(1, result.successfulCheckouts().size());
assertEquals(2, result.failedCheckouts().size());
assertInstanceOf(BookUnavailableException.class, result.failedCheckouts().get(0));
assertInstanceOf(BookNotFoundException.class, result.failedCheckouts().get(1));
assertEquals(book1,result.failedCheckouts().get(0).book());
assertEquals(nonExistentBook,result.failedCheckouts().get(1).book());
}
@Test
void testBulkCheckoutAllSuccess() {
List<Book> booksToCheckout = List.of(book1, book2);
BulkCheckoutResult result = library.checkoutBooks(booksToCheckout);
assertTrue(result.isCompletelySuccessful());
assertEquals(2, result.successfulCheckouts().size());
assertTrue(result.failedCheckouts().isEmpty());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment