diff --git a/VideoStore/Test/CustomerTest.java b/VideoStore/Test/CustomerTest.java new file mode 100644 index 0000000..203b8c5 --- /dev/null +++ b/VideoStore/Test/CustomerTest.java @@ -0,0 +1,143 @@ +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class CustomerTest { + + Customer customer; + + @Before + public void setUp() throws Exception { + customer = new Customer("customer A"); + } + + @Test + public void test_statement_no_rentals() { + String expected_text = "Rental Record for customer A\n" + + "Amount owed is 0.0\n" + + "You earned 0 frequent renter points"; + String invoice_text = customer.statement(); + assertEquals(expected_text, invoice_text); + + System.out.println("test_statement_no_rentals"); + System.out.println(invoice_text); + + } + + @Test + public void test_statement_one_regular_two_days() { + String expected_text = "Rental Record for customer A\n" + + "\tregular_movie\t days rented: 2 = 2.0\n" + + "Amount owed is 2.0\n" + + "You earned 1 frequent renter points"; + Movie regular_movie = new Movie ("regular_movie", Movie.REGULAR ); + Rental rental = new Rental(regular_movie, 2); + customer.addRental(rental); + + String invoice_text = customer.statement(); + assertEquals(expected_text, invoice_text); + + System.out.println("test_statement_no_rentals"); + System.out.println(invoice_text); + + } + + @Test + public void test_statement_one_regular_three_days() { + String expected_text = "Rental Record for customer A\n" + + "\tregular_movie\t days rented: 3 = 3.5\n" + + "Amount owed is 3.5\n" + + "You earned 1 frequent renter points"; + Movie regular_movie = new Movie ("regular_movie", Movie.REGULAR ); + Rental rental = new Rental(regular_movie, 3); + customer.addRental(rental); + + String invoice_text = customer.statement(); + assertEquals(expected_text, invoice_text); + + System.out.println("test_statement_no_rentals"); + System.out.println(invoice_text); + + } + + @Test + public void test_statement_one_childrens_two_days() { + String expected_text = "Rental Record for customer A\n" + + "\tchildrens_movie\t days rented: 2 = 1.5\n" + + "Amount owed is 1.5\n" + + "You earned 1 frequent renter points"; + Movie childrens_movie = new Movie ("childrens_movie", Movie.CHILDRENS ); + Rental rental = new Rental(childrens_movie, 2); + customer.addRental(rental); + + String invoice_text = customer.statement(); + assertEquals(expected_text, invoice_text); + + System.out.println("test_statement_no_rentals"); + System.out.println(invoice_text); + + } + + @Test + public void test_statement_one_new_release_two_days() { + String expected_text = "Rental Record for customer A\n" + + "\tnew_release_movie\t days rented: 2 = 6.0\n" + + "Amount owed is 6.0\n" + + "You earned 2 frequent renter points"; + Movie new_release_movie = new Movie ("new_release_movie", Movie.NEW_RELEASE ); + Rental rental = new Rental(new_release_movie, 2); + customer.addRental(rental); + + String invoice_text = customer.statement(); + assertEquals(expected_text, invoice_text); + + System.out.println("test_statement_no_rentals"); + System.out.println(invoice_text); + + } + + @Test + public void test_statement_with_all_kinds_of_movies_one_and_four_days() { + String expected_text = "Rental Record for customer A\n" + + "\tregular_movie_1\t days rented: 1 = 2.0\n" + + "\tregular_movie_2\t days rented: 4 = 5.0\n" + + "\tchildrens_movie_1\t days rented: 1 = 1.5\n" + + "\tchildrens_movie_2\t days rented: 4 = 3.0\n" + + "\tnew_release_movie_1\t days rented: 1 = 3.0\n" + + "\tnew_release_movie_2\t days rented: 4 = 12.0\n" + + "Amount owed is 26.5\n" + + "You earned 7 frequent renter points"; + + Movie regular_movie_1 = new Movie ("regular_movie_1", Movie.REGULAR ); + Rental rental_1 = new Rental(regular_movie_1, 1); + customer.addRental(rental_1); + + Movie regular_movie_2 = new Movie ("regular_movie_2", Movie.REGULAR ); + Rental rental_2 = new Rental(regular_movie_2, 4); + customer.addRental(rental_2); + + Movie childrens_movie_1 = new Movie ("childrens_movie_1", Movie.CHILDRENS ); + Rental rental_3 = new Rental(childrens_movie_1, 1); + customer.addRental(rental_3); + + Movie childrens_movie_2 = new Movie ("childrens_movie_2", Movie.CHILDRENS ); + Rental rental_4 = new Rental(childrens_movie_2, 4); + customer.addRental(rental_4); + + Movie new_release_movie_1 = new Movie ("new_release_movie_1", Movie.NEW_RELEASE ); + Rental rental_5 = new Rental(new_release_movie_1, 1); + customer.addRental(rental_5); + + Movie new_release_movie_2 = new Movie ("new_release_movie_2", Movie.NEW_RELEASE ); + Rental rental_6 = new Rental(new_release_movie_2, 4); + customer.addRental(rental_6); + + String invoice_text = customer.statement(); + assertEquals(expected_text, invoice_text); + + System.out.println("test_statement_no_rentals"); + System.out.println(invoice_text); + + } +} \ No newline at end of file diff --git a/VideoStore/src/Customer.java b/VideoStore/src/Customer.java index 8fbbd5c..d783cdb 100644 --- a/VideoStore/src/Customer.java +++ b/VideoStore/src/Customer.java @@ -18,45 +18,65 @@ public class Customer { } public String statement() { - double totalAmount = 0; - int frequentRenterPoints = 0; + // add header + StringBuilder result = new StringBuilder(); + result.append("Rental Record for ").append(getName()).append("\n"); - String result = "Rental Record for " + getName() + "\n"; + // add line for each rental for( Rental curRental : rentals ) { - double thisAmount = 0; - - // determine amounts for each line - switch( curRental.getMovie().getPriceCode() ) { - case Movie.REGULAR: - thisAmount += 2; - if( curRental.getDaysRented() > 2 ) - thisAmount += ( curRental.getDaysRented() - 2 ) * 1.5; - break; - case Movie.NEW_RELEASE: - thisAmount += curRental.getDaysRented() * 3; - break; - case Movie.CHILDRENS: - thisAmount += 1.5; - if( curRental.getDaysRented() > 3 ) - thisAmount += ( curRental.getDaysRented() - 3 ) * 1.5; - break; - - } - totalAmount += thisAmount; - - // add frequent renter points - frequentRenterPoints++; - // add bonus for a two day new release rental - if( ( curRental.getMovie().getPriceCode() == Movie.NEW_RELEASE ) && curRental.getDaysRented() > 1 ) - frequentRenterPoints++; - // show figures for this rental - result += "\t" + curRental.getMovie().getTitle() + "\t days rented: " + curRental.getDaysRented() + " = " + String.valueOf( thisAmount ) + "\n"; - + result.append("\t").append(curRental.getMovie().getTitle()).append("\t days rented: ").append(curRental.getDaysRented()).append(" = ").append(String.valueOf( calculateAmountFor(curRental) )).append("\n"); } // add footer lines - result += "Amount owed is " + String.valueOf( totalAmount ) + "\n"; - result += "You earned " + String.valueOf( frequentRenterPoints ) + " frequent renter points"; - return result; + result.append("Amount owed is ").append(String.valueOf( getTotalAmount() )).append("\n"); + result.append("You earned ").append(String.valueOf( getFrequentRenterPoints() )).append(" frequent renter points"); + return result.toString(); } + public double calculateAmountFor (Rental curRental) { + double thisAmount = 0; + // determine amounts for each line + switch( curRental.getMovie().getPriceCode() ) { + case Movie.REGULAR: + thisAmount += 2; + if( curRental.getDaysRented() > 2 ) + thisAmount += ( curRental.getDaysRented() - 2 ) * 1.5; + break; + case Movie.NEW_RELEASE: + thisAmount += curRental.getDaysRented() * 3; + break; + case Movie.CHILDRENS: + thisAmount += 1.5; + if( curRental.getDaysRented() > 3 ) + thisAmount += ( curRental.getDaysRented() - 3 ) * 1.5; + break; + + } + return thisAmount; + } + public int calculateFrequentRenterPointsFor (Rental curRental){ + int frequentRenterPoints = 1; + // add bonus for a two day new release rental + if( ( curRental.getMovie().getPriceCode() == Movie.NEW_RELEASE ) && curRental.getDaysRented() > 1 ) + frequentRenterPoints++; + return frequentRenterPoints; + } + + private int getFrequentRenterPoints() { + int frequentRenterPoints = 0; + for( Rental curRental : rentals ) { + // add frequent renter points + frequentRenterPoints += calculateFrequentRenterPointsFor(curRental); + } + return frequentRenterPoints; + } + + private double getTotalAmount() { + double totalAmount = 0; + for( Rental curRental : rentals ) { + double thisAmount = calculateAmountFor(curRental); + totalAmount += thisAmount; + } + return totalAmount; + } + } \ No newline at end of file