diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/Home.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/Home.java new file mode 100644 index 000000000..ffaceffc5 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/Home.java @@ -0,0 +1,97 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ + +package com.codedifferently.lesson16.danielcustomobject; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author vscode + */ +public class Home { + + private final HomeType homeType; + private List rooms; + + private Integer squareFootage; + private String neighborhood; + private Map roomCount = new HashMap<>(); + + public Home(HomeType homeType, List rooms, Integer squareFootage, String neighborhood) + throws InvalidHomeException { + this.homeType = homeType; + this.rooms = rooms; + this.squareFootage = squareFootage; + this.neighborhood = neighborhood; + initRoomCount(); + if (!isHabitable()) { + throw new InvalidHomeException("Home is not habitable"); + } + } + + public HomeType getHomeType() { + return homeType; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public List getRooms() { + return rooms; + } + + public Integer getSquareFootage() { + return squareFootage; + } + + public void setSquareFootage(Integer price) { + this.squareFootage = price; + } + + public String getNeighborhood() { + return neighborhood; + } + + public void setNeighborhood(String neighborhood) { + this.neighborhood = neighborhood; + } + + private void initRoomCount() { + + for (RoomType room : rooms) { + + // get the current value of rooms if the value is not there set it to zero + Integer value = roomCount.getOrDefault(room, 0); + // increase the value and create a frequency map + roomCount.put(room, ++value); + } + } + + // checks to see if a home has at least 1 bathroom bedroom and kitchen + private boolean isHabitable() { + return roomCount.containsKey(RoomType.BEDROOM) + && roomCount.containsKey(RoomType.BATHROOM) + && roomCount.containsKey(RoomType.KITCHEN); + } + + public Integer getNumberOfSpeceficRoom(RoomType room) { + + if (!roomCount.containsKey(room)) { + throw new RoomNotFoundException("This house doesn't have a " + room); + } + + return roomCount.get(room); + } + + public String getHomeDetails() { + + return String.format( + "%d Bed %d Bath %d Sq Ft", + roomCount.get(RoomType.BATHROOM), roomCount.get(RoomType.BEDROOM), this.squareFootage); + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/HomeType.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/HomeType.java new file mode 100644 index 000000000..f92a5b853 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/HomeType.java @@ -0,0 +1,17 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ + +package com.codedifferently.lesson16.danielcustomobject; + +/** + * @author vscode + */ +public enum HomeType { + SINGLE_FAMILY_HOME, + DUPLEX, + APARTMENT, + LUXURY, + TOWNHOUSE +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/InvalidHomeException.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/InvalidHomeException.java new file mode 100644 index 000000000..89974d9c5 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/InvalidHomeException.java @@ -0,0 +1,24 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Exception.java to edit this template + */ + +package com.codedifferently.lesson16.danielcustomobject; + +/** + * @author vscode + */ +public class InvalidHomeException extends IllegalArgumentException { + + /** Creates a new instance of InvalidHomeException without detail message. */ + public InvalidHomeException() {} + + /** + * Constructs an instance of InvalidHomeException with the specified detail message. + * + * @param msg the detail message. + */ + public InvalidHomeException(String msg) { + super(msg); + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/RoomNotFoundException.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/RoomNotFoundException.java new file mode 100644 index 000000000..1b1b855ab --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/RoomNotFoundException.java @@ -0,0 +1,24 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Exception.java to edit this template + */ + +package com.codedifferently.lesson16.danielcustomobject; + +/** + * @author vscode + */ +public class RoomNotFoundException extends RuntimeException { + + /** Creates a new instance of RoomNotFoundException without detail message. */ + public RoomNotFoundException() {} + + /** + * Constructs an instance of RoomNotFoundException with the specified detail message. + * + * @param msg the detail message. + */ + public RoomNotFoundException(String msg) { + super(msg); + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/RoomType.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/RoomType.java new file mode 100644 index 000000000..349045340 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/danielcustomobject/RoomType.java @@ -0,0 +1,11 @@ +package com.codedifferently.lesson16.danielcustomobject; + +public enum RoomType { + LIVING_ROOM, + KITCHEN, + BEDROOM, + BATHROOM, + DINING_ROOM, + OFFICE, + GARAGE +} diff --git a/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/danielcustomobject/HomeTest.java b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/danielcustomobject/HomeTest.java new file mode 100644 index 000000000..f22945a6a --- /dev/null +++ b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/danielcustomobject/HomeTest.java @@ -0,0 +1,107 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ + +package com.codedifferently.lesson16.danielcustomobject; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * @author vscode + */ +public class HomeTest { + + private Home home; + + @BeforeEach + public void setUp() { + home = + new Home( + HomeType.DUPLEX, + List.of(RoomType.LIVING_ROOM, RoomType.KITCHEN, RoomType.BEDROOM, RoomType.BATHROOM), + 250000, + "Downtown"); + } + + @Test + public void getterAndSetterTest() { + // Test HomeType getter and setter + assertTrue(home.getHomeType() == HomeType.DUPLEX); + + // Test rooms getter and setter + assertTrue( + home.getRooms() + .equals( + List.of( + RoomType.LIVING_ROOM, RoomType.KITCHEN, RoomType.BEDROOM, RoomType.BATHROOM))); + home.setRooms( + List.of(RoomType.LIVING_ROOM, RoomType.KITCHEN, RoomType.BEDROOM, RoomType.BEDROOM)); + assertTrue( + home.getRooms() + .equals( + List.of( + RoomType.LIVING_ROOM, RoomType.KITCHEN, RoomType.BEDROOM, RoomType.BEDROOM))); + + // Test price getter and setter + assertTrue(home.getSquareFootage() == 250000); + home.setSquareFootage(300000); + assertTrue(home.getSquareFootage() == 300000); + + // Test neighborhood getter + assertTrue(home.getNeighborhood().equals("Downtown")); + } + + @Test + public void getNumberOfSpeceficRoomTest() { + + // Given + + // When + Integer numberOfBedRooms = home.getNumberOfSpeceficRoom(RoomType.BEDROOM); + Integer numberOfLivingRooms = home.getNumberOfSpeceficRoom(RoomType.LIVING_ROOM); + Integer numberOfBathrooms = home.getNumberOfSpeceficRoom(RoomType.BATHROOM); + Integer numberOfKitchens = home.getNumberOfSpeceficRoom(RoomType.KITCHEN); + + // Then + assertEquals(numberOfBedRooms, 1); + assertEquals(numberOfLivingRooms, 1); + assertEquals(numberOfKitchens, 1); + assertEquals(numberOfBathrooms, 1); + } + + @Test + public void getNumberOfSpeceficRoom_RoomNotFound() { + + assertThatThrownBy(() -> home.getNumberOfSpeceficRoom(RoomType.OFFICE)) + .isInstanceOf(RoomNotFoundException.class) + .hasMessage("This house doesn't have a " + RoomType.OFFICE); + } + + @Test + public void getHomeDetailsTest() { + // Given + + // When + String expected = "1 Bed 1 Bath 250000 Sq Ft"; + String actual = home.getHomeDetails(); + assertEquals(expected, actual); + // Then + } + + @Test + public void inValidHomeTest() { + // Given + + assertThatThrownBy( + () -> new Home(HomeType.DUPLEX, List.of(RoomType.LIVING_ROOM), 250000, "Downtown")) + .isInstanceOf(InvalidHomeException.class) + .hasMessage("Home is not habitable"); + } +}