Skip to content
7 changes: 6 additions & 1 deletion .idea/codeStyleSettings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions rentalStore.iml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/org/kranonit/rentalStore/ChildrensPrice.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
50 changes: 38 additions & 12 deletions src/main/java/org/kranonit/rentalStore/Customer.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,54 @@ public String getName() {
}

public String statement() {
double totalAmount = 0; int frequentRenterPoints = 0;
Enumeration<Rental> 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<Rental> rentals = _rentals.elements();
String result = "<H1>Rental Record for <EM>" + getName() + "</EM></H1><P>\n";
while (rentals.hasMoreElements()) {
Rental each = (Rental) rentals.nextElement();
// show figures for this rental
result += each.getMovie().getTitle() + ": " + String.valueOf(each.getCharge()) + "<BR>\n";
}
// add footer lines
result += "<P>Amount owed is <EM>" + String.valueOf(getTotalCharge()) + "</EM><P>\n";
result += "You earned <EM>" + String.valueOf(getTotalFrequentRenterPoints())
+ "</EM> frequent renter points<P>";
return result;
}

private double getTotalCharge() {
double result = 0;
Enumeration<Rental> rentals = _rentals.elements();
while (rentals.hasMoreElements()) {
Rental each = (Rental) rentals.nextElement();
result += each.getCharge();
}
return result;
}

private int getTotalFrequentRenterPoints() {
int result = 0;
Enumeration<Rental> rentals = _rentals.elements();
while (rentals.hasMoreElements()) {
Rental each = (Rental) rentals.nextElement();
result += each.getFrequentRenterPoints();
}
return result;

}
}
30 changes: 26 additions & 4 deletions src/main/java/org/kranonit/rentalStore/Movie.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
18 changes: 18 additions & 0 deletions src/main/java/org/kranonit/rentalStore/NewReleasePrice.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
10 changes: 10 additions & 0 deletions src/main/java/org/kranonit/rentalStore/Price.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
16 changes: 16 additions & 0 deletions src/main/java/org/kranonit/rentalStore/RegularPrice.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
30 changes: 8 additions & 22 deletions src/main/java/org/kranonit/rentalStore/Rental.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,26 @@
class Rental {

private Movie _movie;

private int _daysRented;

public Rental(Movie movie, int daysRented) {
_movie = movie;
_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;
}

public Movie getMovie() {
return _movie;
}

double getCharge() {
return _movie.getCharge(_daysRented);
}

int getFrequentRenterPoints() {
return _movie.getFrequentRenterPoints(_daysRented);
}
}
23 changes: 23 additions & 0 deletions src/test/java/org/kranonit/rentalStore/CustomerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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("<H1>Rental Record for <EM>stokito</EM></H1><P>\n" +
"За двумя зайцами: 3.5<BR>\n" +
"Всё просто: 12.0<BR>\n" +
"Хоббит: 4.5<BR>\n" +
"Альф: 18.0<BR>\n" +
"<P>Amount owed is <EM>38.0</EM><P>\n" +
"You earned <EM>6</EM> frequent renter points<P>", statementResult);
}
}
25 changes: 25 additions & 0 deletions src/test/java/org/kranonit/rentalStore/MovieTest.java
Original file line number Diff line number Diff line change
@@ -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));
}
}
28 changes: 28 additions & 0 deletions src/test/java/org/kranonit/rentalStore/RentalTest.java
Original file line number Diff line number Diff line change
@@ -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());
}
}