package com.industriallogic.example;import java.util.Iterator;
import java.util.NoSuchElementException;import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;public class TroubledLoanIteratorTest {
private static final int NO_THRESHOLD = -1;
private static boolean suppressToDoErrors = true; @Test
public void thresholdUsingLoanArray() {
Loan loan1 = new Loan("loan 1", 2000);
Loan loan2 = new Loan("loan 2", 1000);
Loan loan3 = new Loan("loan 3", 1200);
Loan[] loans = { loan1, loan2, loan3 };
int THRESHOLD_CAPITAL = 1100;
TroubledLoanIterator iter = new TroubledLoanIterator(loans,
THRESHOLD_CAPITAL); assertEquals(loan1, iter.next(), "loan1");
assertEquals(loan3, iter.next(), "loan3");
assertTrue(!iter.hasNext(), "no more loans");
} @Test
public void combinationsOfLoanArraysObeyThreshhold() {
assertTrue(suppressToDoErrors);
} @Test
public void thresholdUsingPortfolio() {
int THRESHOLD_CAPITAL = 1100;
Portfolio childPortfolio = new Portfolio("child portfolio");
Loan childPortfolioLoan1 = new Loan("child loan 1", 1000);
Loan childPortfolioLoan2 = new Loan("child loan 2", 2000);
childPortfolio.add(childPortfolioLoan1);
childPortfolio.add(childPortfolioLoan2); Portfolio parentPortfolio = new Portfolio("parent portfolio");
Loan parentPortfolioLoan = new Loan("parent loan", 1200);
parentPortfolio.add(parentPortfolioLoan);
parentPortfolio.add(childPortfolio); TroubledLoanIterator iter = new TroubledLoanIterator(parentPortfolio,
THRESHOLD_CAPITAL);
assertEquals(parentPortfolioLoan, iter.next() ,"First Troubled Loan is parentPortfolioLoan");
assertEquals(childPortfolioLoan2, iter.next(), "Second Troubled Loan is childPortfolioLoan2");
assertNoMoreTroubledLoans(iter);
} @Test
public void whenCapitalEqualsThreshold() {
Loan loan1 = new Loan("loan 1", 1000);
Loan[] loans = { loan1 };
int THRESHOLD_CAPITAL = 1000;
TroubledLoanIterator iter = new TroubledLoanIterator(loans,
THRESHOLD_CAPITAL);
assertNoMoreTroubledLoans(iter);
} @Test
public void hasNextBehavesWhenCalledRepeatedly() {
Loan loan1 = new Loan("loan 1", 1000);
Loan loan2 = new Loan("loan 2", 2000);
Loan[] loans = { loan1, loan2 }; TroubledLoanIterator iter = new TroubledLoanIterator(loans, NO_THRESHOLD);
iter.hasNext();
iter.hasNext();
assertEquals(loan1, iter.next(), "First Troubled Loan is loan1"); iter.hasNext();
iter.hasNext();
assertEquals(loan2, iter.next(), "Second Troubled Loan is loan2");
assertNoMoreTroubledLoans(iter);
} @Test
public void noLoansFromEmptyLoanArray() {
assertTrue(emptyTroubledLoanIteratorFromArray().hasNext() == false,
"empty loan array should have no loans");
} @Test
public void noTroubledLoansConstructedFromEmptyArray() {
assertNoMoreTroubledLoans(emptyTroubledLoanIteratorFromArray());
} @Test
public void noTroubledLoansConstructedFromEmptyPortfolio() {
assertNoMoreTroubledLoans(emptyTroubledLoanIteratorFromPortfolio());
} private static TroubledLoanIterator emptyTroubledLoanIteratorFromArray() {
Loan[] loans = {};
return new TroubledLoanIterator(loans, NO_THRESHOLD);
} private static TroubledLoanIterator emptyTroubledLoanIteratorFromPortfolio() {
Portfolio emptyPortfolio = new Portfolio("empty");
return new TroubledLoanIterator(emptyPortfolio, NO_THRESHOLD);
} private void assertNoMoreTroubledLoans(Iterator<Loan> iter) {
assertTrue(iter.hasNext() == false, "Should be no troubled loans");
try {
iter.next();
fail("should throw NoSuchElementException calling next() when exhausted");
} catch (NoSuchElementException expected) {
}
}
}