diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml index 1129f00..c4deb56 100644 --- a/.idea/codeStyleSettings.xml +++ b/.idea/codeStyleSettings.xml @@ -2,8 +2,13 @@ + diff --git a/rentalStore.iml b/rentalStore.iml index c7fac17..93a882e 100644 --- a/rentalStore.iml +++ b/rentalStore.iml @@ -3,10 +3,9 @@ - - + diff --git a/src/main/java/org/kranonit/rentalStore/ChildrensPrice.java b/src/main/java/org/kranonit/rentalStore/ChildrensPrice.java new file mode 100644 index 0000000..bc6e8d7 --- /dev/null +++ b/src/main/java/org/kranonit/rentalStore/ChildrensPrice.java @@ -0,0 +1,16 @@ +package org.kranonit.rentalStore; + +class ChildrensPrice extends Price { + @Override + int getPriceCode(){ + return Movie.CHILDRENS; + } + + @Override + double getCharge(int daysRented){ + double result = 1.5; + if (daysRented > 3) + result += (daysRented - 3) * 1.5; + return result; + } +} diff --git a/src/main/java/org/kranonit/rentalStore/Customer.java b/src/main/java/org/kranonit/rentalStore/Customer.java index c901a9a..537b5f4 100644 --- a/src/main/java/org/kranonit/rentalStore/Customer.java +++ b/src/main/java/org/kranonit/rentalStore/Customer.java @@ -20,28 +20,54 @@ public String getName() { } public String statement() { - double totalAmount = 0; int frequentRenterPoints = 0; Enumeration rentals = _rentals.elements(); String result = "Rental Record for " + getName() + "\n"; while (rentals.hasMoreElements()) { Rental each = (Rental) rentals.nextElement(); - double thisAmount = each.getCharge(); - // add frequent renter points - frequentRenterPoints++; - // add bonus for a two day new release rental - if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) - && each.getDaysRented() > 1) - frequentRenterPoints++; // show figures for this rental result += "\t" + each.getMovie().getTitle() + "\t" - + String.valueOf(thisAmount) + "\n"; - totalAmount += thisAmount; + + String.valueOf(each.getCharge()) + "\n"; } // add footer lines - result += "Amount owed is " + String.valueOf(totalAmount) + "\n"; - result += "You earned " + String.valueOf(frequentRenterPoints) + result += "Amount owed is " + String.valueOf(getTotalCharge()) + "\n"; + result += "You earned " + String.valueOf(getTotalFrequentRenterPoints()) + " frequent renter points"; return result; } + public String htmlStatement() { + Enumeration rentals = _rentals.elements(); + String result = "

Rental Record for " + getName() + "

\n"; + while (rentals.hasMoreElements()) { + Rental each = (Rental) rentals.nextElement(); + // show figures for this rental + result += each.getMovie().getTitle() + ": " + String.valueOf(each.getCharge()) + "
\n"; + } + // add footer lines + result += "

Amount owed is " + String.valueOf(getTotalCharge()) + "

\n"; + result += "You earned " + String.valueOf(getTotalFrequentRenterPoints()) + + " frequent renter points

"; + return result; + } + + private double getTotalCharge() { + double result = 0; + Enumeration rentals = _rentals.elements(); + while (rentals.hasMoreElements()) { + Rental each = (Rental) rentals.nextElement(); + result += each.getCharge(); + } + return result; + } + + private int getTotalFrequentRenterPoints() { + int result = 0; + Enumeration rentals = _rentals.elements(); + while (rentals.hasMoreElements()) { + Rental each = (Rental) rentals.nextElement(); + result += each.getFrequentRenterPoints(); + } + return result; + + } } \ No newline at end of file diff --git a/src/main/java/org/kranonit/rentalStore/Movie.java b/src/main/java/org/kranonit/rentalStore/Movie.java index f866a27..02b792a 100644 --- a/src/main/java/org/kranonit/rentalStore/Movie.java +++ b/src/main/java/org/kranonit/rentalStore/Movie.java @@ -1,26 +1,48 @@ package org.kranonit.rentalStore; public class Movie { + public static final int CHILDRENS = 2; public static final int REGULAR = 0; public static final int NEW_RELEASE = 1; + private String _title; - private int _priceCode; + private Price _price; public Movie(String title, int priceCode) { _title = title; - _priceCode = priceCode; + setPriceCode(priceCode); } public int getPriceCode() { - return _priceCode; + return _price.getPriceCode(); } public void setPriceCode(int arg) { - _priceCode = arg; + switch (arg) { + case REGULAR: + _price = new RegularPrice(); + break; + case CHILDRENS: + _price = new ChildrensPrice(); + break; + case NEW_RELEASE: + _price = new NewReleasePrice(); + break; + default: + throw new IllegalArgumentException("Incorrect Price Code"); + } } public String getTitle() { return _title; } + + double getCharge(int daysRented) { + return _price.getCharge(daysRented); + } + + int getFrequentRenterPoints(int daysRented) { + return _price.getFrequentRenterPoints(daysRented); + } } \ No newline at end of file diff --git a/src/main/java/org/kranonit/rentalStore/NewReleasePrice.java b/src/main/java/org/kranonit/rentalStore/NewReleasePrice.java new file mode 100644 index 0000000..00f65a9 --- /dev/null +++ b/src/main/java/org/kranonit/rentalStore/NewReleasePrice.java @@ -0,0 +1,18 @@ +package org.kranonit.rentalStore; + +public class NewReleasePrice extends Price { + @Override + int getPriceCode() { + return Movie.NEW_RELEASE; + } + + @Override + double getCharge(int daysRented){ + return daysRented * 3; + } + + @Override + int getFrequentRenterPoints(int daysRented) { + return (daysRented > 1) ? 2: 1; + } +} diff --git a/src/main/java/org/kranonit/rentalStore/Price.java b/src/main/java/org/kranonit/rentalStore/Price.java new file mode 100644 index 0000000..49a81e4 --- /dev/null +++ b/src/main/java/org/kranonit/rentalStore/Price.java @@ -0,0 +1,10 @@ +package org.kranonit.rentalStore; + +abstract class Price { + abstract int getPriceCode(); + abstract double getCharge(int daysRented); + + int getFrequentRenterPoints(int daysRented) { + return 1; + } +} diff --git a/src/main/java/org/kranonit/rentalStore/RegularPrice.java b/src/main/java/org/kranonit/rentalStore/RegularPrice.java new file mode 100644 index 0000000..cf411ae --- /dev/null +++ b/src/main/java/org/kranonit/rentalStore/RegularPrice.java @@ -0,0 +1,16 @@ +package org.kranonit.rentalStore; + +public class RegularPrice extends Price { + @Override + int getPriceCode() { + return Movie.REGULAR; + } + + @Override + double getCharge(int daysRented){ + double result = 2; + if (daysRented > 2) + result += (daysRented - 2) * 1.5; + return result; + } +} diff --git a/src/main/java/org/kranonit/rentalStore/Rental.java b/src/main/java/org/kranonit/rentalStore/Rental.java index 0769fe7..5cee7c4 100644 --- a/src/main/java/org/kranonit/rentalStore/Rental.java +++ b/src/main/java/org/kranonit/rentalStore/Rental.java @@ -3,7 +3,6 @@ class Rental { private Movie _movie; - private int _daysRented; public Rental(Movie movie, int daysRented) { @@ -11,27 +10,6 @@ public Rental(Movie movie, int daysRented) { _daysRented = daysRented; } - public double getCharge() { - double thisAmount = 0; - // determine amounts for each line - switch (getMovie().getPriceCode()) { - case Movie.REGULAR: - thisAmount += 2; - if (getDaysRented() > 2) - thisAmount += (getDaysRented() - 2) * 1.5; - break; - case Movie.NEW_RELEASE: - thisAmount += getDaysRented() * 3; - break; - case Movie.CHILDRENS: - thisAmount += 1.5; - if (getDaysRented() > 3) - thisAmount += (getDaysRented() - 3) * 1.5; - break; - } - return thisAmount; - } - public int getDaysRented() { return _daysRented; } @@ -39,4 +17,12 @@ public int getDaysRented() { public Movie getMovie() { return _movie; } + + double getCharge() { + return _movie.getCharge(_daysRented); + } + + int getFrequentRenterPoints() { + return _movie.getFrequentRenterPoints(_daysRented); + } } \ No newline at end of file diff --git a/src/test/java/org/kranonit/rentalStore/CustomerTest.java b/src/test/java/org/kranonit/rentalStore/CustomerTest.java index 3d7175b..b424b49 100644 --- a/src/test/java/org/kranonit/rentalStore/CustomerTest.java +++ b/src/test/java/org/kranonit/rentalStore/CustomerTest.java @@ -31,4 +31,27 @@ public void testStatement() throws Exception { "Amount owed is 38.0\n" + "You earned 6 frequent renter points", statementResult); } + + @Test + public void testHtmlStatement() throws Exception { + Movie m1 = new Movie("За двумя зайцами", Movie.REGULAR); + Movie m2 = new Movie("Всё просто", Movie.NEW_RELEASE); + Movie m3 = new Movie("Хоббит", Movie.CHILDRENS); + Movie m4 = new Movie("Альф", Movie.NEW_RELEASE); + + Customer c = new Customer("stokito"); + c.addRental(new Rental(m1, 3)); + c.addRental(new Rental(m2, 4)); + c.addRental(new Rental(m3, 5)); + c.addRental(new Rental(m4, 6)); + String statementResult = c.htmlStatement(); + System.out.print(statementResult); + Assert.assertEquals("

Rental Record for stokito

\n" + + "За двумя зайцами: 3.5
\n" + + "Всё просто: 12.0
\n" + + "Хоббит: 4.5
\n" + + "Альф: 18.0
\n" + + "

Amount owed is 38.0

\n" + + "You earned 6 frequent renter points

", statementResult); + } } diff --git a/src/test/java/org/kranonit/rentalStore/MovieTest.java b/src/test/java/org/kranonit/rentalStore/MovieTest.java new file mode 100644 index 0000000..56b9ee0 --- /dev/null +++ b/src/test/java/org/kranonit/rentalStore/MovieTest.java @@ -0,0 +1,25 @@ +package org.kranonit.rentalStore; + +import junit.framework.Assert; +import org.junit.Test; + +public class MovieTest { + + @Test + public void testGetPriceCode() throws Exception { + Movie aMovie = new Movie("Die Hard", 2); + Assert.assertEquals(Movie.CHILDRENS, aMovie.getPriceCode()); + } + + @Test + public void testGetCharge() throws Exception { + Movie aMovie = new Movie("Die Hard", Movie.NEW_RELEASE); + Assert.assertEquals(15d, aMovie.getCharge(5)); + } + + @Test + public void testGetFrequentRenterPoints() throws Exception { + Movie aMovie = new Movie("Die Hard", Movie.REGULAR); + Assert.assertEquals(1, aMovie.getFrequentRenterPoints(6)); + } +} diff --git a/src/test/java/org/kranonit/rentalStore/RentalTest.java b/src/test/java/org/kranonit/rentalStore/RentalTest.java new file mode 100644 index 0000000..f215378 --- /dev/null +++ b/src/test/java/org/kranonit/rentalStore/RentalTest.java @@ -0,0 +1,28 @@ +package org.kranonit.rentalStore; + +import junit.framework.Assert; +import org.junit.Test; + +public class RentalTest { + + @Test + public void testGetDaysRented() throws Exception { + Movie aMovie = new Movie("Die Hard", Movie.REGULAR); + Rental aRental = new Rental(aMovie, 4); + Assert.assertEquals(4, aRental.getDaysRented()); + } + + @Test + public void testGetCharge() throws Exception { + Movie aMovie = new Movie("Life of Pi", Movie.NEW_RELEASE); + Rental aRental = new Rental(aMovie, 2); + Assert.assertEquals(6d, aRental.getCharge()); + } + + @Test + public void testFrequentRenterPoints() throws Exception { + Movie aMovie = new Movie("Panda Kung-Fu", Movie.CHILDRENS); + Rental aRental = new Rental(aMovie, 3); + Assert.assertEquals(1, aRental.getFrequentRenterPoints()); + } +}