import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; public final class ChangeCalculatorTest { /* * See https://github.com/junit-team/junit4/wiki/Rules for information on JUnit Rules in general and * ExpectedExceptions in particular. */ @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void testChangeThatCanBeGivenInASingleCoin() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(1, 5, 10, 25, 100)); assertEquals( singletonList(25), changeCalculator.computeMostEfficientChange(25)); } @Ignore("Remove to run test") @Test public void testChangeThatMustBeGivenInMultipleCoins() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(1, 5, 10, 25, 100)); assertEquals( asList(5, 10), changeCalculator.computeMostEfficientChange(15)); } @Ignore("Remove to run test") @Test // https://en.wikipedia.org/wiki/Change-making_problem#Greedy_method public void testLilliputianCurrencyForWhichGreedyAlgorithmFails() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(1, 4, 15, 20, 50)); assertEquals( asList(4, 4, 15), changeCalculator.computeMostEfficientChange(23)); } @Ignore("Remove to run test") @Test // https://en.wikipedia.org/wiki/Change-making_problem#Greedy_method public void testLowerElbonianCurrencyForWhichGreedyAlgorithmFails() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(1, 5, 10, 21, 25)); assertEquals( asList(21, 21, 21), changeCalculator.computeMostEfficientChange(63)); } @Ignore("Remove to run test") @Test public void testLargeAmountOfChange() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(1, 2, 5, 10, 20, 50, 100)); assertEquals( asList(2, 2, 5, 20, 20, 50, 100, 100, 100, 100, 100, 100, 100, 100, 100), changeCalculator.computeMostEfficientChange(999)); } @Ignore("Remove to run test") @Test public void testZeroChange() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(1, 5, 10, 21, 25)); assertEquals( emptyList(), changeCalculator.computeMostEfficientChange(0)); } @Ignore("Remove to run test") @Test public void testChangeLessThanSmallestCoinInCurrencyCannotBeRepresented() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(5, 10)); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("The total 3 cannot be represented in the given currency."); changeCalculator.computeMostEfficientChange(3); } @Ignore("Remove to run test") @Test public void testChangeLargerThanAllCoinsInCurrencyThatCannotBeRepresented() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(5, 10)); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("The total 94 cannot be represented in the given currency."); changeCalculator.computeMostEfficientChange(94); } @Ignore("Remove to run test") @Test public void testNegativeChangeIsRejected() { ChangeCalculator changeCalculator = new ChangeCalculator(asList(1, 2, 5)); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Negative totals are not allowed."); changeCalculator.computeMostEfficientChange(-5); } }