diff --git a/src/main/java/yourssu/order/domain/Order.java b/src/main/java/yourssu/order/domain/Order.java index 2846d14..e9ec2b1 100644 --- a/src/main/java/yourssu/order/domain/Order.java +++ b/src/main/java/yourssu/order/domain/Order.java @@ -1,11 +1,21 @@ package yourssu.order.domain; +import java.util.ArrayList; import java.util.List; public class Order { private final List items; - public Order(List items) { - this.items = items; + public List getItems() { + return items; + } + + public Order() { + items = new ArrayList<>(); + } + + + public void addItem(OrderItem item) { + items.add(item); } } diff --git a/src/main/java/yourssu/order/domain/OrderItem.java b/src/main/java/yourssu/order/domain/OrderItem.java index e2bd709..d0f157d 100644 --- a/src/main/java/yourssu/order/domain/OrderItem.java +++ b/src/main/java/yourssu/order/domain/OrderItem.java @@ -10,4 +10,12 @@ public OrderItem(String name, int price, int count) { this.price = price; this.count = count; } + + public int calculateTotalPrice() { + return price * count; + } + + public int getCount() { + return count; + } } diff --git a/src/main/java/yourssu/order/service/OrderAnalyticsService.java b/src/main/java/yourssu/order/service/OrderAnalyticsService.java index 9566f39..736aab9 100644 --- a/src/main/java/yourssu/order/service/OrderAnalyticsService.java +++ b/src/main/java/yourssu/order/service/OrderAnalyticsService.java @@ -1,4 +1,21 @@ package yourssu.order.service; +import yourssu.order.domain.Order; +import yourssu.order.domain.OrderItem; + +import java.util.List; + public class OrderAnalyticsService { + + public double calculateAverageCost(List orders) { + int totalPrice = orders.stream().flatMap(order -> order.getItems().stream()) + .mapToInt(OrderItem::calculateTotalPrice) + .sum(); + + int count = orders.stream().flatMap(order -> order.getItems().stream()) + .mapToInt(OrderItem::getCount) + .sum(); + + return totalPrice / (double) count; + } } diff --git a/src/main/java/yourssu/user/domain/OrderUser.java b/src/main/java/yourssu/user/domain/OrderUser.java new file mode 100644 index 0000000..9aa49a2 --- /dev/null +++ b/src/main/java/yourssu/user/domain/OrderUser.java @@ -0,0 +1,22 @@ +package yourssu.user.domain; + +import yourssu.order.domain.Order; + +import java.util.ArrayList; +import java.util.List; + +public class OrderUser { + private final List orders; + + public OrderUser() { + orders = new ArrayList<>(); + } + + public List getOrders() { + return orders; + } + + public void addOrder(Order order) { + orders.add(order); + } +} diff --git a/src/test/java/yourssu/Problem1Test.java b/src/test/java/yourssu/Problem1Test.java new file mode 100644 index 0000000..5a52d33 --- /dev/null +++ b/src/test/java/yourssu/Problem1Test.java @@ -0,0 +1,37 @@ +package yourssu; + +import org.junit.jupiter.api.Test; +import yourssu.order.domain.Order; +import yourssu.order.domain.OrderItem; +import yourssu.order.service.OrderAnalyticsService; +import yourssu.user.domain.OrderUser; + + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.byLessThan; + +public class Problem1Test { + + @Test + void calculationAverage() { + // given + Order order1 = new Order(); + order1.addItem(new OrderItem("A", 1000, 3)); + order1.addItem(new OrderItem("B", 2000, 6)); + + Order order2 = new Order(); + order2.addItem(new OrderItem("A", 1000, 3)); + order2.addItem(new OrderItem("B", 2000, 6)); + + OrderUser user = new OrderUser(); + user.addOrder(order1); + user.addOrder(order2); + + OrderAnalyticsService service = new OrderAnalyticsService(); + // when + double averageCost = service.calculateAverageCost(user.getOrders()); + + // then + assertThat(averageCost).isCloseTo(15000 / 9F, byLessThan(0.0001)); + } +}