Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
1 result

Target

Select target project
  • z22024794/prog-av-exercices-fadl-zemzem
  • n23017542/progavexercices
  • l23024794/saratp-1
  • d24029849/progavexercices
  • gnaves/progavexercices
5 results
Select Git revision
  • master
1 result
Show changes
Commits on Source (3)
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 {
}
package fr.univamu.progav.td9;
public class BookNotFoundException extends BookException {
//TODO
}
package fr.univamu.progav.td9;
public enum BookStatus { AVAILABLE, BORROWED; }
package fr.univamu.progav.td9;
public class BookUnavailableException extends BookException {
// TODO
}
package fr.univamu.progav.td9;
import java.util.ArrayList;
import java.util.List;
public record BulkCheckoutResult(
List<Book> successfulCheckouts,
List<BookException> failedCheckouts
) {
public BulkCheckoutResult() {
this(new ArrayList<>(), new ArrayList<>());
}
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<String, Book> collection = new HashMap<>();
private final Map<Book, BookStatus> bookStatuses = new HashMap<>();
public void addBook(Book book) {
collection.put(book.isbn(), book);
bookStatuses.put(book, BookStatus.AVAILABLE);
}
public Book findBook(String isbn) {
// TODO
return null;
}
public BookStatus getBookStatus(String isbn) {
// TODO
return null;
}
public Book checkoutBook(String isbn) {
// TODO
return null;
}
public BulkCheckoutResult checkoutBooks(List<String> isbns) {
// 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 livres ```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 les 2 extensions ```BookNotFoundException``` (possédant un code
ISBN) et ```BookUnavailable``` (possédant un livre) de la
classe```BookException```. Assurez-vous que la méthode ```getMessage``` de
chacune délivre un message adapté et mentionnant soit le code ISBN, soit le
livre concerné.
Exercice 2
==========
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 3
==========
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 4
==========
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 5
==========
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 6
==========
Compléter la méthode ```checkoutBooks``` de la classe ```Library```.
Vérifier votre travail à l'aide des tests fournis.
\ No newline at end of file
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("123");
assertEquals(BookStatus.BORROWED, library.getBookStatus("123"));
}
@Test
void testBulkCheckoutPartialSuccess() throws BookException {
library.checkoutBook("123");
Book nonExistentBook = new Book("999", "Nonexistent");
List<String> booksToCheckout = List.of("123", "456", "999");
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(
"Livre 1 (123): book unavailable",
result.failedCheckouts().get(0).getMessage()
);
assertEquals(
"Nonexistent (999): book not found",
result.failedCheckouts().get(1).getMessage()
);
}
@Test
void testBulkCheckoutAllSuccess() {
List<String> booksToCheckout = List.of("123", "456");
BulkCheckoutResult result = library.checkoutBooks(booksToCheckout);
assertTrue(result.isCompletelySuccessful());
assertEquals(2, result.successfulCheckouts().size());
assertTrue(result.failedCheckouts().isEmpty());
}
}