diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Formula1Car.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Formula1Car.java new file mode 100644 index 000000000..860a411ba --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Formula1Car.java @@ -0,0 +1,108 @@ +package com.codedifferently.lesson16.evanphilakhong; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Formula1Car { + private Track track; + private Team team; + private String[] sponsors; + private String driverName; + private int driverNum; + private int position; + private TyreCompound currTyre; + private boolean drs; + + /** + * Default Constructor for a Formula1Car with no team, empty sponsors array, empty driver name, + * driver number 0, no tyre compound, and DRS is disabled by default + */ + public Formula1Car() { + this.team = null; + this.sponsors = new String[0]; + this.driverName = ""; + this.driverNum = 0; + this.currTyre = null; + this.drs = false; + } + + /** + * @param team the tean that this Formula1Car belongs + * @param sponsors array of sponsor names accosicated with this Formula1Car + * @param driverName the name of the driver of this Formula1Car + * @param driverNum the drivers number for the Formula1Car + * @param position drivers current racing position on the grid + * @param currTyre current TyreCompound fitted on this Formula1Car + * @see Team + * @see TyreCompound + */ + public Formula1Car( + Team team, + String[] sponsors, + String driverName, + int driverNum, + int position, + TyreCompound currTyre) { + this.team = team; + this.sponsors = sponsors; + this.driverName = driverName; + this.driverNum = driverNum; + this.position = position; + this.currTyre = currTyre; + this.drs = false; + } + + /** + * Displays a header line then, Prints a list of sponsors to the console. + * + * @throws NoSponsorsException if there are no sponsors associated with this Formula1Car + * @see NoSponsorsException + */ + public void printSponsors() throws NoSponsorsException { + if (sponsors.length == 0) { + throw new NoSponsorsException(team + " has no Sponsors"); + } else { + System.out.println("Here's a list of our Sponsors:"); + for (String sponsor : sponsors) { + System.out.println(sponsor); + } + } + } + + /** + * Checks if DRS (Drag Reduction System) is availible to use This method determines DRS + * availibility based on weather or not your Formula1Car is in the current track's designated DRS + * zone. + * + * @return {@code true} if DRS is availible (track has a DRS zone), {@code false} otherwise + * @see Track#isDrsZone() + */ + public boolean isDrsAvailible() { + if (track.isDrsZone()) { + this.drs = true; + return true; + } + return false; + } + + /** + * Checks if we need to switch race strategy to account for the rainy weather if the weather is + * LIGHT_RAIN we change the TyreCompound to INTERMEDIATE if the weather is HEAVY_RAIN we change + * the TyreCompound to WET + * + * @return {@code true} if track.getWeather is LIGHT_RAIN || HEAVY_RAIN {@code false} otherwise + * @see Track#getWeather() + */ + public boolean rainStrategy() { + if (track.getWeather() == Weather.LIGHT_RAIN) { + this.currTyre = TyreCompound.INTERMEDIATE; + return true; + } else if (track.getWeather() == Weather.HEAVY_RAIN) { + this.currTyre = TyreCompound.WET; + return true; + } + return false; + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/NoSponsorsException.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/NoSponsorsException.java new file mode 100644 index 000000000..fd3f52610 --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/NoSponsorsException.java @@ -0,0 +1,7 @@ +package com.codedifferently.lesson16.evanphilakhong; + +public class NoSponsorsException extends Exception { + public NoSponsorsException(String message) { + super(message); + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Team.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Team.java new file mode 100644 index 000000000..9c1efcd4d --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Team.java @@ -0,0 +1,14 @@ +package com.codedifferently.lesson16.evanphilakhong; + +public enum Team { + ALPINE, + ASTON_MARTIN, + FERRARI, + HASS, + MCLAREN, + MERCEDES, + VCARB, + RED_BULL, + SAUBER, + WILLIAMS +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Track.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Track.java new file mode 100644 index 000000000..17f12687d --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Track.java @@ -0,0 +1,40 @@ +package com.codedifferently.lesson16.evanphilakhong; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Track { + private String trackName; + private String trackLocation; + private int numLaps; + private double trackLengthInKm; + private boolean drsZone; + private Weather weather; + + // constructors + public Track() { + this.trackName = "Suzuka Circuit"; + this.trackLocation = "Suzuka, Japan"; + this.numLaps = 53; + this.trackLengthInKm = 5.807; + this.drsZone = false; + this.weather = Weather.CLEAR; + } + + public Track( + String trackName, + String trackLocation, + int numLaps, + double trackLengthInKm, + boolean drsZone, + Weather weather) { + this.trackName = trackName; + this.trackLocation = trackLocation; + this.numLaps = numLaps; + this.trackLengthInKm = trackLengthInKm; + this.drsZone = drsZone; + this.weather = weather; + } +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/TyreCompound.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/TyreCompound.java new file mode 100644 index 000000000..c25c2b4bb --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/TyreCompound.java @@ -0,0 +1,9 @@ +package com.codedifferently.lesson16.evanphilakhong; + +enum TyreCompound { + SOFT, + MEDIUM, + HARD, + INTERMEDIATE, + WET +} diff --git a/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Weather.java b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Weather.java new file mode 100644 index 000000000..e8c6687fb --- /dev/null +++ b/lesson_16/objects/objects_app/src/main/java/com/codedifferently/lesson16/evanphilakhong/Weather.java @@ -0,0 +1,7 @@ +package com.codedifferently.lesson16.evanphilakhong; + +public enum Weather { + CLEAR, + LIGHT_RAIN, + HEAVY_RAIN +} diff --git a/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/evanphilakhong/Formula1CarTest.java b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/evanphilakhong/Formula1CarTest.java new file mode 100644 index 000000000..8b6c040fe --- /dev/null +++ b/lesson_16/objects/objects_app/src/test/java/com/codedifferently/lesson16/evanphilakhong/Formula1CarTest.java @@ -0,0 +1,109 @@ +package com.codedifferently.lesson16.evanphilakhong; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +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.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class Formula1CarTest { + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + Track track; + Formula1Car f1Car1; + Formula1Car f1Car2; + + @BeforeEach + void setUp() { + track = new Track(); + + String[] f1Car1Sponsors = {"Hp", "Shell", "UniCredit", "IBM", "Puma", "VGW Play"}; + f1Car1 = + new Formula1Car(Team.FERRARI, f1Car1Sponsors, "Lewis Hamilton", 44, 8, TyreCompound.MEDIUM); + f1Car1.setTrack(track); + + String[] f1Car2Sponsors = {}; + f1Car2 = + new Formula1Car(Team.MCLAREN, f1Car2Sponsors, "Lando Norris", 4, 2, TyreCompound.MEDIUM); + f1Car2.setTrack(track); + + System.setOut(new PrintStream(outContent)); + } + + @AfterEach + void restoreStreams() { + System.setOut(System.out); + } + + @Test + void testIsDrsAvailibe_returnsTrue() { + track.setDrsZone(true); + + assertTrue(f1Car1.isDrsAvailible()); + } + + @Test + void testIsDrsAvailibe_returnsFalse() { + track.setDrsZone(false); + + assertFalse(f1Car1.isDrsAvailible()); + } + + @Test + void testRainStrategy_returnsTrue() { + // checks if tyres change depending on weather conditions + track.setWeather(Weather.LIGHT_RAIN); + assertTrue(f1Car1.rainStrategy()); + assertEquals(f1Car1.getCurrTyre(), TyreCompound.INTERMEDIATE); + + track.setWeather(Weather.HEAVY_RAIN); + assertTrue(f1Car1.rainStrategy()); + assertEquals(f1Car1.getCurrTyre(), TyreCompound.WET); + } + + @Test + void testRainStrategy_returnsFalse() { + // checks the default condition no rain + assertFalse(f1Car1.rainStrategy()); + } + + @Test + void testPrintSponsors_withSponsors() throws NoSponsorsException { + if (f1Car1.getSponsors().length == 0) { + throw new NoSponsorsException(f1Car1.getTeam() + " has no Sponsors"); + } else { + String expected = + "Here's a list of our Sponsors:" + + System.lineSeparator() + + "Hp" + + System.lineSeparator() + + "Shell" + + System.lineSeparator() + + "UniCredit" + + System.lineSeparator() + + "IBM" + + System.lineSeparator() + + "Puma" + + System.lineSeparator() + + "VGW Play" + + System.lineSeparator(); + + f1Car1.printSponsors(); + + assertEquals(expected, outContent.toString()); + } + } + + @Test + void testPrintSponsors_noSponsors() { + NoSponsorsException exception = + assertThrows(NoSponsorsException.class, () -> f1Car2.printSponsors()); + + assertEquals(f1Car2.getTeam() + " has no Sponsors", exception.getMessage()); + } +}