Cleanup on isle 6

This commit is contained in:
2025-11-13 14:41:25 +01:00
parent 6a8173f184
commit a0f8a9187d
3 changed files with 32 additions and 50 deletions

View File

@@ -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, "");
}
}
} }

View File

@@ -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);
} }
} }

View File

@@ -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());
} }
} }