Cleanup on isle 6
This commit is contained in:
@@ -14,30 +14,6 @@ import static inventory.ProductFactory.BOOK_TYPE;
|
|||||||
*/
|
*/
|
||||||
public class DiscountCalculator {
|
public class DiscountCalculator {
|
||||||
|
|
||||||
/**
|
|
||||||
* Inner class to hold discount calculation results.
|
|
||||||
*/
|
|
||||||
public static class DiscountResult {
|
|
||||||
private final double discountAmount;
|
|
||||||
private final String description;
|
|
||||||
|
|
||||||
public DiscountResult(double discountAmount, String description) {
|
|
||||||
if (discountAmount < 0) {
|
|
||||||
throw new IllegalArgumentException("Discount amount must be greater than 0");
|
|
||||||
}
|
|
||||||
this.discountAmount = discountAmount;
|
|
||||||
this.description = Objects.requireNonNullElse(description, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getDiscountAmount() {
|
|
||||||
return discountAmount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDescription() {
|
|
||||||
return description;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param product - the product being purchased
|
* @param product - the product being purchased
|
||||||
* @param quantity - quantity being purchased
|
* @param quantity - quantity being purchased
|
||||||
@@ -90,4 +66,14 @@ public class DiscountCalculator {
|
|||||||
private static boolean isEligibleForBulkDiscount(int quantity) {
|
private static boolean isEligibleForBulkDiscount(int quantity) {
|
||||||
return quantity >= 5;
|
return quantity >= 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record DiscountResult(double discountAmount, String description) {
|
||||||
|
public DiscountResult(double discountAmount, String description) {
|
||||||
|
if (discountAmount < 0) {
|
||||||
|
throw new IllegalArgumentException("Discount amount must be greater than 0");
|
||||||
|
}
|
||||||
|
this.discountAmount = discountAmount;
|
||||||
|
this.description = Objects.requireNonNullElse(description, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -17,11 +17,7 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class InventoryManager {
|
public class InventoryManager {
|
||||||
|
|
||||||
private final Map<String, Product> products;
|
private final Map<String, Product> products = new HashMap<>();
|
||||||
|
|
||||||
public InventoryManager() {
|
|
||||||
products = new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add product to inventory using Factory pattern
|
* Add product to inventory using Factory pattern
|
||||||
@@ -69,7 +65,7 @@ public class InventoryManager {
|
|||||||
|
|
||||||
// Calculate total and apply discount
|
// Calculate total and apply discount
|
||||||
double totalPrice = product.getPrice() * quantity;
|
double totalPrice = product.getPrice() * quantity;
|
||||||
double finalPrice = totalPrice - discount.getDiscountAmount();
|
double finalPrice = totalPrice - discount.discountAmount();
|
||||||
|
|
||||||
// Update inventory
|
// Update inventory
|
||||||
product.sell(quantity);
|
product.sell(quantity);
|
||||||
@@ -159,7 +155,7 @@ public class InventoryManager {
|
|||||||
System.out.printf("Product: %s%n", product.getName());
|
System.out.printf("Product: %s%n", product.getName());
|
||||||
System.out.printf("Quantity: %d%n", quantity);
|
System.out.printf("Quantity: %d%n", quantity);
|
||||||
System.out.printf("Original Price: $%.2f%n", originalPrice);
|
System.out.printf("Original Price: $%.2f%n", originalPrice);
|
||||||
System.out.printf("Discount: $%.2f (%s)%n", discountInfo.getDiscountAmount(), discountInfo.getDescription());
|
System.out.printf("Discount: $%.2f (%s)%n", discountInfo.discountAmount(), discountInfo.description());
|
||||||
System.out.printf("Final Price: $%.2f%n", finalPrice);
|
System.out.printf("Final Price: $%.2f%n", finalPrice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -34,8 +34,8 @@ class DiscountCalculatorTest {
|
|||||||
void testStudentDiscountOnBooks() {
|
void testStudentDiscountOnBooks() {
|
||||||
DiscountResult discount = DiscountCalculator.calculateDiscount(book, 1, "STUDENT");
|
DiscountResult discount = DiscountCalculator.calculateDiscount(book, 1, "STUDENT");
|
||||||
assertNotNull(discount);
|
assertNotNull(discount);
|
||||||
assertEquals(1 * book.getPrice() * 0.10, discount.getDiscountAmount());
|
assertEquals(1 * book.getPrice() * 0.10, discount.discountAmount());
|
||||||
assertEquals("Student discount: 10% off books", discount.getDescription());
|
assertEquals("Student discount: 10% off books", discount.description());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -45,8 +45,8 @@ class DiscountCalculatorTest {
|
|||||||
void testStudentDiscountOnElectronics() {
|
void testStudentDiscountOnElectronics() {
|
||||||
DiscountResult discount = DiscountCalculator.calculateDiscount(electronics, 1, "STUDENT");
|
DiscountResult discount = DiscountCalculator.calculateDiscount(electronics, 1, "STUDENT");
|
||||||
assertNotNull(discount);
|
assertNotNull(discount);
|
||||||
assertEquals(0, discount.getDiscountAmount());
|
assertEquals(0, discount.discountAmount());
|
||||||
assertEquals("Student discount only applies to books", discount.getDescription());
|
assertEquals("Student discount only applies to books", discount.description());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,13 +57,13 @@ class DiscountCalculatorTest {
|
|||||||
void testBulkDiscountValid(int quantity) {
|
void testBulkDiscountValid(int quantity) {
|
||||||
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, quantity, "BULK");
|
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, quantity, "BULK");
|
||||||
assertNotNull(discountBook);
|
assertNotNull(discountBook);
|
||||||
assertEquals(quantity * book.getPrice() * 0.15, discountBook.getDiscountAmount());
|
assertEquals(quantity * book.getPrice() * 0.15, discountBook.discountAmount());
|
||||||
assertEquals("Bulk discount: 15% off for 5+ items", discountBook.getDescription());
|
assertEquals("Bulk discount: 15% off for 5+ items", discountBook.description());
|
||||||
|
|
||||||
DiscountResult discountElectronics = DiscountCalculator.calculateDiscount(electronics, quantity, "BULK");
|
DiscountResult discountElectronics = DiscountCalculator.calculateDiscount(electronics, quantity, "BULK");
|
||||||
assertNotNull(discountElectronics);
|
assertNotNull(discountElectronics);
|
||||||
assertEquals(quantity * electronics.getPrice() * 0.15, discountElectronics.getDiscountAmount());
|
assertEquals(quantity * electronics.getPrice() * 0.15, discountElectronics.discountAmount());
|
||||||
assertEquals("Bulk discount: 15% off for 5+ items", discountElectronics.getDescription());
|
assertEquals("Bulk discount: 15% off for 5+ items", discountElectronics.description());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -73,8 +73,8 @@ class DiscountCalculatorTest {
|
|||||||
void testBulkDiscountInvalid() {
|
void testBulkDiscountInvalid() {
|
||||||
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 2, "BULK");
|
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 2, "BULK");
|
||||||
assertNotNull(discountBook);
|
assertNotNull(discountBook);
|
||||||
assertEquals(0, discountBook.getDiscountAmount());
|
assertEquals(0, discountBook.discountAmount());
|
||||||
assertEquals("Bulk discount requires 5+ items", discountBook.getDescription());
|
assertEquals("Bulk discount requires 5+ items", discountBook.description());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,8 +84,8 @@ class DiscountCalculatorTest {
|
|||||||
void testNoDiscount() {
|
void testNoDiscount() {
|
||||||
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 1, "NONE");
|
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 1, "NONE");
|
||||||
assertNotNull(discountBook);
|
assertNotNull(discountBook);
|
||||||
assertEquals(0, discountBook.getDiscountAmount());
|
assertEquals(0, discountBook.discountAmount());
|
||||||
assertEquals("No discount applied", discountBook.getDescription());
|
assertEquals("No discount applied", discountBook.description());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -96,7 +96,7 @@ class DiscountCalculatorTest {
|
|||||||
void testBoundaryConditions(int quantity, double discountPercentage) {
|
void testBoundaryConditions(int quantity, double discountPercentage) {
|
||||||
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, quantity, "BULK");
|
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, quantity, "BULK");
|
||||||
assertNotNull(discountBook);
|
assertNotNull(discountBook);
|
||||||
assertEquals(book.getPrice() * quantity * discountPercentage, discountBook.getDiscountAmount());
|
assertEquals(book.getPrice() * quantity * discountPercentage, discountBook.discountAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -106,11 +106,11 @@ class DiscountCalculatorTest {
|
|||||||
void testDiscountCalculationAccuracy() {
|
void testDiscountCalculationAccuracy() {
|
||||||
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 2, "STUDENT");
|
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 2, "STUDENT");
|
||||||
assertNotNull(discountBook);
|
assertNotNull(discountBook);
|
||||||
assertEquals(4, discountBook.getDiscountAmount());
|
assertEquals(4, discountBook.discountAmount());
|
||||||
|
|
||||||
DiscountResult discountElectronics = DiscountCalculator.calculateDiscount(electronics, 5, "BULK");
|
DiscountResult discountElectronics = DiscountCalculator.calculateDiscount(electronics, 5, "BULK");
|
||||||
assertNotNull(discountElectronics);
|
assertNotNull(discountElectronics);
|
||||||
assertEquals(75, discountElectronics.getDiscountAmount());
|
assertEquals(75, discountElectronics.discountAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest(name = "type = {0}")
|
@ParameterizedTest(name = "type = {0}")
|
||||||
@@ -118,7 +118,7 @@ class DiscountCalculatorTest {
|
|||||||
void testCaseSensitivityOfDiscountTypes(String type) {
|
void testCaseSensitivityOfDiscountTypes(String type) {
|
||||||
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 1, type);
|
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 1, type);
|
||||||
assertNotNull(discountBook);
|
assertNotNull(discountBook);
|
||||||
assertEquals(2, discountBook.getDiscountAmount());
|
assertEquals(2, discountBook.discountAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest(name = "type = {0}")
|
@ParameterizedTest(name = "type = {0}")
|
||||||
@@ -126,17 +126,17 @@ class DiscountCalculatorTest {
|
|||||||
void testInvalidDiscountTypes(String type) {
|
void testInvalidDiscountTypes(String type) {
|
||||||
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 1, type);
|
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 1, type);
|
||||||
assertNotNull(discountBook);
|
assertNotNull(discountBook);
|
||||||
assertEquals(0, discountBook.getDiscountAmount());
|
assertEquals(0, discountBook.discountAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testDiscountZeroQuantity() {
|
void testDiscountZeroQuantity() {
|
||||||
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 0, "STUDENT");
|
DiscountResult discountBook = DiscountCalculator.calculateDiscount(book, 0, "STUDENT");
|
||||||
assertNotNull(discountBook);
|
assertNotNull(discountBook);
|
||||||
assertEquals(0, discountBook.getDiscountAmount());
|
assertEquals(0, discountBook.discountAmount());
|
||||||
|
|
||||||
DiscountResult discountElectronics = DiscountCalculator.calculateDiscount(electronics, 0, "BULK");
|
DiscountResult discountElectronics = DiscountCalculator.calculateDiscount(electronics, 0, "BULK");
|
||||||
assertNotNull(discountElectronics);
|
assertNotNull(discountElectronics);
|
||||||
assertEquals(0, discountElectronics.getDiscountAmount());
|
assertEquals(0, discountElectronics.discountAmount());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user