Menu
Coddy logo textTech

Pruebas e integración

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 83 de 87.

challenge icon

Desafío

Fácil

¡Felicitaciones por construir tu Sistema de Gestión de Biblioteca! Es hora de unir todo y verificar que todos los componentes funcionen correctamente como un sistema integrado. Crearás un escenario de prueba exhaustivo que ponga a prueba todas las características que has desarrollado a lo largo de este proyecto.

Trabajarás con los siete archivos de tu sistema completado:

  • Book.java: Tu clase Book con isbn, title, author, isAvailable, borrowedBy y todos los métodos asociados, incluyendo getDetails().
  • User.java: Tu clase User con id, name, la lista borrowedBooks y métodos para tomar prestados/devolver libros.
  • LibraryException.java: Tu clase base de excepción personalizada.
  • BookNotAvailableException.java: Tu excepción para libros no disponibles.
  • LibraryAdmin.java: Tu interfaz de administrador y la implementación de AdminService.
  • Library.java: Tu clase Library completa con todos los métodos: agregar/eliminar libros, registrar usuarios, préstamo/devolución, búsqueda y manejo de excepciones.
  • Main.java: Tu prueba de integración que demostrará todo el sistema funcionando en conjunto.

En tu clase Main, procesarás una serie de comandos que prueban cada característica principal de tu sistema de biblioteca. Los comandos vienen como una única cadena separada por comas con estos formatos:

  • ADD_BOOK:isbn:title:author - Agregar un libro a través de AdminService
  • REGISTER_USER:id:name - Registrar un usuario a través de AdminService
  • BORROW:userId:isbn - Tomar prestado un libro (con manejo de excepciones)
  • RETURN:userId:isbn - Devolver un libro
  • SEARCH_TITLE:keyword - Buscar libros por título
  • SEARCH_AUTHOR:keyword - Buscar libros por autor
  • REMOVE_BOOK:isbn - Eliminar un libro a través de AdminService

Procesa cada comando e imprime la salida correspondiente:

  • ADD_BOOK: Added: [title]
  • REGISTER_USER: Registered: [name]
  • BORROW: Imprime el mensaje de éxito o Error: [exception message]
  • RETURN: [userName] returned [bookTitle]
  • SEARCH_TITLE: Imprime Search '[keyword]': seguido de los detalles de cada libro coincidente, o No results
  • SEARCH_AUTHOR: Mismo formato que la búsqueda por título
  • REMOVE_BOOK: Removed: [isbn] o Cannot remove: [isbn]

Después de todos los comandos, imprime un resumen final:

  • --- Final Status ---
  • Books: [count]
  • Users: [count]
  • Para cada usuario, imprime [name]: [borrowedCount] book(s)

Recibirás una entrada: la cadena de comandos separada por comas.

Por ejemplo, con la entrada ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Effective Java:Joshua Bloch,REGISTER_USER:U001:Alice,REGISTER_USER:U002:Bob,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001,SEARCH_TITLE:java,RETURN:U001:ISBN-001,REMOVE_BOOK:ISBN-001, tu salida sería:

Added: Clean Code
Added: Effective Java
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Search 'java':
[ISBN-002] Effective Java by Joshua Bloch
Alice returned Clean Code
Removed: ISBN-001
--- Final Status ---
Books: 1
Users: 2
Alice: 0 book(s)
Bob: 0 book(s)

Este desafío final valida que todos tus componentes (clases, interfaces, excepciones y la lógica de la biblioteca) funcionen juntos a la perfección. ¡Has construido un Sistema de Gestión de Biblioteca completo y robusto!

Pruébalo tú mismo

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lee los comandos separados por comas
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Crea Library y AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Procesa cada comando
        for (String command : commands) {
            String[] parts = command.split(":");
            String operation = parts[0];
            
            if (operation.equals("ADD_BOOK")) {
                String isbn = parts[1];
                String title = parts[2];
                String author = parts[3];
                if (adminService.addBook(isbn, title, author)) {
                    System.out.println("Added: " + title);
                }
            } else if (operation.equals("REMOVE_BOOK")) {
                String isbn = parts[1];
                if (adminService.removeBook(isbn)) {
                    System.out.println("Removed: " + isbn);
                } else {
                    System.out.println("Cannot remove: " + isbn);
                }
            } else if (operation.equals("REGISTER_USER")) {
                String id = parts[1];
                String name = parts[2];
                if (adminService.registerUser(id, name)) {
                    System.out.println("Registered: " + name);
                }
            } else if (operation.equals("BORROW")) {
                String userId = parts[1];
                String isbn = parts[2];
                try {
                    String result = library.borrowBook(userId, isbn);
                    System.out.println(result);
                } catch (LibraryException e) {
                    System.out.println("Error: " + e.getMessage());
                }
            }
            // TODO: Add handling for RETURN command
            // TODO: Add handling for SEARCH_TITLE command
            // TODO: Add handling for SEARCH_AUTHOR command
        }
        
        // TODO: Print final status
        // --- Estado Final ---
        // Libros: [count]
        // Usuarios: [count]
        // Para cada usuario: [name]: [borrowedCount] libro(s)
        System.out.println("Operations completed");
    }
}

Todas las lecciones de Programación Orientada a Objetos