import static org.junit.Assert.assertEquals; import java.util.Random; import org.junit.Test; public class CheckoutTests { @Test public void basicPrices() { Money priceOfA = randomPrice(); MultibuyDiscount discount = new MultibuyDiscount("A", Money.fromPence(20), 2); Checkout checkout = new Checkout(discount); Money priceOfB = randomPrice(); checkout.scan("A", priceOfA).scan("B", priceOfB); assertEquals(priceOfA.add(priceOfB), checkout.currentBalance()); } @Test public void discountForTwoAs() { Money priceOfA = randomPrice(); Money priceOfB = randomPrice(); MultibuyDiscount discount = new MultibuyDiscount("A", Money.fromPence(20), 2); Checkout checkout = new Checkout(discount); checkout.scan("A", priceOfA).scan("B", priceOfB) .scan("A", priceOfA); Money expectedTotal = priceOfA.add(priceOfA).add(priceOfB) .subtract(Money.fromPence(20)); assertEquals(expectedTotal, checkout.currentBalance()); } @Test public void independentCheckouts() { Money priceOfA = randomPrice(); MultibuyDiscount discount = new MultibuyDiscount("A", Money.fromPence(20), 2); Checkout checkout1 = new Checkout(discount); Checkout checkout2 = new Checkout(discount); checkout1.scan("A", priceOfA); checkout2.scan("A", priceOfA); assertEquals(priceOfA, checkout1.currentBalance()); assertEquals(priceOfA, checkout2.currentBalance()); } private Money randomPrice() { int pence = new Random().nextInt(1000); return Money.fromPence(pence); } }