diff --git a/build.gradle b/build.gradle index 8172fb73..27a46c65 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ repositories { } dependencies { + implementation 'org.jetbrains:annotations:20.1.0' testImplementation "org.junit.jupiter:junit-jupiter:5.7.2" testImplementation "org.assertj:assertj-core:3.19.0" } diff --git a/src/main/java/rentcompany/Avante.java b/src/main/java/rentcompany/Avante.java new file mode 100644 index 00000000..99eb59b2 --- /dev/null +++ b/src/main/java/rentcompany/Avante.java @@ -0,0 +1,41 @@ +package rentcompany; + +import java.util.Objects; + +public class Avante extends Car { + + private static final double fuelEfficiency = 15; + private final double distance; + + public Avante(final double distance) { + this.distance = distance; + } + + @Override + double getDistancePerLiter() { + return fuelEfficiency; + } + + @Override + double getTripDistance() { + return distance; + } + + @Override + String getName() { + return "Avante"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Avante avante = (Avante) o; + return Double.compare(avante.distance, distance) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(distance); + } +} diff --git a/src/main/java/rentcompany/Car.java b/src/main/java/rentcompany/Car.java new file mode 100644 index 00000000..debe3229 --- /dev/null +++ b/src/main/java/rentcompany/Car.java @@ -0,0 +1,31 @@ +package rentcompany; + +public abstract class Car implements Vehicle{ + + /** + * 리터당 이동 거리. 즉, 연비 + */ + abstract double getDistancePerLiter(); + + /** + * 여행하려는 거리 + */ + abstract double getTripDistance(); + + /** + * 차종의 이름 + */ + abstract String getName(); + + /** + * 주입해야할 연료량을 구한다. + */ + double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } + + @Override + public String report() { + return getName() + " : " + (int)getChargeQuantity() + "리터"; + } +} diff --git a/src/main/java/rentcompany/K5.java b/src/main/java/rentcompany/K5.java new file mode 100644 index 00000000..c38eefe8 --- /dev/null +++ b/src/main/java/rentcompany/K5.java @@ -0,0 +1,27 @@ +package rentcompany; + +public class K5 extends Car { + + private static final double fuelEfficiency = 13; + private final double distance; + + public K5(final double distance) { + this.distance = distance; + + } + + @Override + double getDistancePerLiter() { + return fuelEfficiency; + } + + @Override + double getTripDistance() { + return distance; + } + + @Override + String getName() { + return "K5"; + } +} diff --git a/src/main/java/rentcompany/RentCompany.java b/src/main/java/rentcompany/RentCompany.java new file mode 100644 index 00000000..2ce16d60 --- /dev/null +++ b/src/main/java/rentcompany/RentCompany.java @@ -0,0 +1,25 @@ +package rentcompany; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class RentCompany { + + private static final String NEWLINE = System.getProperty("line.separator"); + private final List vehicleList = new ArrayList<>(); + + public static RentCompany create() { + return new RentCompany(); + } + + public void addCar(final Vehicle vehicle) { + vehicleList.add(vehicle); + } + + public String generateReport() { + return vehicleList.stream() + .map(Vehicle::report) + .collect(Collectors.joining(NEWLINE)) + NEWLINE; + } +} diff --git a/src/main/java/rentcompany/Sonata.java b/src/main/java/rentcompany/Sonata.java new file mode 100644 index 00000000..42641b3e --- /dev/null +++ b/src/main/java/rentcompany/Sonata.java @@ -0,0 +1,27 @@ +package rentcompany; + +public class Sonata extends Car { + + private static final double fuelEfficiency = 10; + private final double distance; + + public Sonata(final double distance) { + this.distance = distance; + + } + + @Override + double getDistancePerLiter() { + return fuelEfficiency; + } + + @Override + double getTripDistance() { + return distance; + } + + @Override + String getName() { + return "Sonata"; + } +} diff --git a/src/main/java/rentcompany/Vehicle.java b/src/main/java/rentcompany/Vehicle.java new file mode 100644 index 00000000..ac699d48 --- /dev/null +++ b/src/main/java/rentcompany/Vehicle.java @@ -0,0 +1,5 @@ +package rentcompany; + +public interface Vehicle { + String report(); +} diff --git a/src/test/java/rentcompany/RentCompanyTest.java b/src/test/java/rentcompany/RentCompanyTest.java new file mode 100644 index 00000000..cc0556af --- /dev/null +++ b/src/test/java/rentcompany/RentCompanyTest.java @@ -0,0 +1,28 @@ +package rentcompany; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class RentCompanyTest { + private static final String NEWLINE = System.getProperty("line.separator"); + + @Test + public void report() throws Exception { + RentCompany company = RentCompany.create(); + company.addCar(new Sonata(150)); + company.addCar(new K5(260)); + company.addCar(new Sonata(120)); + company.addCar(new Avante(300)); + company.addCar(new K5(390)); + + String report = company.generateReport(); + assertThat(report).isEqualTo( + "Sonata : 15리터" + NEWLINE + + "K5 : 20리터" + NEWLINE + + "Sonata : 12리터" + NEWLINE + + "Avante : 20리터" + NEWLINE + + "K5 : 30리터" + NEWLINE + ); + } +}