package com.bookshop.solid.isp;

import static org.junit.jupiter.api.Assertions.assertEquals;

import com.bookshop.domain.Book;
import com.bookshop.domain.Customer;
import java.math.BigDecimal;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("ISP -- role-sized interfaces mean nobody stubs methods they don't have")
class StaffRolesIspTest {

    private final Book book = new Book("978-0132350884", "Clean Code", "Robert C. Martin",
            new BigDecimal("32.50"));
    private final Customer alice = new Customer("c-1", "Alice", "alice@example.com", 2);

    @Test
    @DisplayName("the till depends on Bookseller only -- any seller works, temp or manager")
    void tillNeedsOnlyTheBooksellerRole() {
        Bookseller saturdayTill = new WeekendTemp();
        Bookseller weekdayTill = new ShopManager();

        assertEquals("sold Clean Code to Alice", saturdayTill.sell(book, alice));
        assertEquals("sold Clean Code to Alice", weekdayTill.sell(book, alice));
    }

    @Test
    @DisplayName("a class implementing several roles provides all of them honestly")
    void multiRoleClassImplementsAllItsRoles() {
        ShopManager manager = new ShopManager();

        manager.sell(book, alice);
        manager.restock(book, 5);

        assertEquals(new BigDecimal("32.50"), manager.dailyTakings());
    }
}
