diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/Camera.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/Camera.java new file mode 100644 index 000000000..f0e79f9e0 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/Camera.java @@ -0,0 +1,59 @@ +package com.codedifferently.lesson16.rmillcamera; + +import java.util.ArrayList; + +public class Camera { + private String brand; + private int megapixels; + private double price; + private ArrayList supportedFormats; + private CameraMode mode; + + public Camera(String brand, int megapixels, double price, CameraMode mode) { + this.brand = brand; + this.megapixels = megapixels; + this.price = price; + this.mode = mode; + this.supportedFormats = new ArrayList<>(); + } + + public void addFormat(String format) throws CameraException { + if (format == null || format.isEmpty()) { + throw new CameraException("Format cannot be empty."); + } + supportedFormats.add(format); + System.out.println("Added format: " + format); + } + + public void showFormats() { + if (supportedFormats.isEmpty()) { + System.out.println("No formats supported yet."); + } else { + System.out.println("Supported formats:"); + for (String format : supportedFormats) { + System.out.println("- " + format); + } + } + } + + public void isAffordable(double budget) { + String result = + (price <= budget) ? "This camera is within your budget." : "This camera is too expensive."; + System.out.println(result); + } + + public static void main(String[] args) { + try { + Camera myCamera = new Camera("Sony", 24, 899.99, CameraMode.PORTRAIT); + + myCamera.addFormat("JPEG"); + myCamera.addFormat("RAW"); + + myCamera.showFormats(); + myCamera.isAffordable(1000); + + } catch (CameraException e) { + System.out.println("Error: " + e.getMessage()); + } + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/CameraException.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/CameraException.java new file mode 100644 index 000000000..ae07b6808 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/CameraException.java @@ -0,0 +1,7 @@ +package com.codedifferently.lesson16.rmillcamera; + +public class CameraException extends Exception { + public CameraException(String message) { + super(message); + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/CameraMode.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/CameraMode.java new file mode 100644 index 000000000..73307f46e --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/rmillcamera/CameraMode.java @@ -0,0 +1,8 @@ +package com.codedifferently.lesson16.rmillcamera; + +public enum CameraMode { + AUTO, + MANUAL, + PORTRAIT, + NIGHT +} diff --git a/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraExceptionTest.java b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraExceptionTest.java new file mode 100644 index 000000000..262e79fb7 --- /dev/null +++ b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraExceptionTest.java @@ -0,0 +1,14 @@ +package com.codedifferently.lesson16.rmillcamera; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class CameraExceptionTest { + + @Test + public void testExceptionMessage() { + CameraException ex = new CameraException("Test error message"); + assertEquals("Test error message", ex.getMessage()); + } +} diff --git a/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraModeTest.java b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraModeTest.java new file mode 100644 index 000000000..ea20e3e72 --- /dev/null +++ b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraModeTest.java @@ -0,0 +1,18 @@ +package com.codedifferently.lesson16.rmillcamera; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import org.junit.jupiter.api.Test; + +public class CameraModeTest { + + @Test + public void testCameraModeValues() { + CameraMode[] modes = CameraMode.values(); + assertArrayEquals( + new CameraMode[] { + CameraMode.AUTO, CameraMode.MANUAL, CameraMode.PORTRAIT, CameraMode.NIGHT + }, + modes); + } +} diff --git a/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraTest.java b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraTest.java new file mode 100644 index 000000000..3ebad499f --- /dev/null +++ b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/rmillcamera/CameraTest.java @@ -0,0 +1,106 @@ +package com.codedifferently.lesson16.rmillcamera; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class CameraTest { + + private Camera camera; + + @BeforeEach + public void setUp() { + camera = new Camera("Canon", 20, 750.00, CameraMode.AUTO); + } + + @Test + public void testAddValidFormat() throws CameraException { + camera.addFormat("PNG"); + } + + @Test + public void testAddEmptyFormatThrowsException() { + Exception exception = assertThrows(CameraException.class, () -> camera.addFormat("")); + assertEquals("Format cannot be empty.", exception.getMessage()); + } + + @Test + public void testAddNullFormatThrowsException() { + Exception exception = assertThrows(CameraException.class, () -> camera.addFormat(null)); + assertEquals("Format cannot be empty.", exception.getMessage()); + } + + @Test + public void testIsAffordableWithinBudget() { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + + camera.isAffordable(800); + String result = out.toString().trim(); + assertTrue(result.contains("within your budget")); + } + + @Test + public void testIsAffordableOverBudget() { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + + camera.isAffordable(500); + String result = out.toString().trim(); + assertTrue(result.contains("too expensive")); + } + + @Test + public void testIsAffordableAtExactBudget() { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + + camera.isAffordable(750.00); + String result = out.toString().trim(); + assertTrue(result.contains("within your budget")); + } + + @Test + public void testShowFormatsWhenEmpty() { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + + camera.showFormats(); + String result = out.toString().trim(); + assertTrue(result.contains("No formats supported yet.")); + } + + @Test + public void testShowFormatsWithValues() throws CameraException { + camera.addFormat("JPEG"); + camera.addFormat("RAW"); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + + camera.showFormats(); + String result = out.toString(); + assertTrue(result.contains("Supported formats")); + assertTrue(result.contains("JPEG")); + assertTrue(result.contains("RAW")); + } + + @Test + public void testConstructorSetsValuesCorrectly() throws Exception { + Camera cam = new Camera("Nikon", 24, 900.0, CameraMode.MANUAL); + + var brandField = cam.getClass().getDeclaredField("brand"); + var priceField = cam.getClass().getDeclaredField("price"); + + brandField.setAccessible(true); + priceField.setAccessible(true); + + assertEquals("Nikon", brandField.get(cam)); + assertEquals(900.0, priceField.get(cam)); + } +}