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());
}
}