Skip to content

Commit 3bdc813

Browse files
feat: completes Talia's Lesson16 Assignment (#580)
* feat: implement anime collection system with OOP principles * test: implements test for setTitle method. * test: implements test for setEpisodes method. * feat: adds constructor to Anime.java and implements tests for Genre and Studio * fix: corrects String expected for ToString Test * feat: adds spotlessApply to Anime.java and implements tests for Equals and HashCode * refactor: remove AnimeCollection and related test files * feat: fixes taliacrocketttest folder to taliacrockett, updates import packages in test files
1 parent 4180b6d commit 3bdc813

File tree

5 files changed

+380
-0
lines changed

5 files changed

+380
-0
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package com.codedifferently.lesson16.taliacrockett;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* Represents an anime with various properties and behaviors. This class meets the assignment
8+
* requirements for a custom data type.
9+
*/
10+
public class Anime {
11+
private String title;
12+
private int episodes;
13+
private double rating;
14+
private boolean isCompleted;
15+
private List<String> characters;
16+
private AnimeGenre genre;
17+
private String studio;
18+
19+
// Constructor
20+
public Anime(String title, int episodes, double rating, AnimeGenre genre, String studio) {
21+
this.title = title;
22+
this.episodes = episodes;
23+
this.rating = rating;
24+
this.genre = genre;
25+
this.studio = studio;
26+
this.isCompleted = false;
27+
this.characters = new ArrayList<>();
28+
}
29+
30+
// Member functions (3+ functions required)
31+
32+
public Anime(String title, AnimeGenre genre, double rating) {
33+
this.title = title;
34+
this.episodes = 0; // Default value
35+
this.rating = rating;
36+
this.genre = genre;
37+
this.studio = ""; // Default value
38+
this.isCompleted = false;
39+
this.characters = new ArrayList<>();
40+
}
41+
42+
/**
43+
* Function 1: Uses conditional expression Determines if the anime is worth watching based on
44+
* rating
45+
*/
46+
public String getRecommendation() {
47+
return rating >= 8.0
48+
? "Highly Recommended!"
49+
: rating >= 6.0 ? "Worth Watching" : "Skip This One";
50+
}
51+
52+
/** Function 2: Uses collection member variable Adds a character to the anime's character list */
53+
public void addCharacter(String characterName) {
54+
if (characterName != null && !characterName.trim().isEmpty()) {
55+
characters.add(characterName);
56+
}
57+
}
58+
59+
/** Function 3: Uses a loop Searches for a character in the character list */
60+
public boolean hasCharacter(String characterName) {
61+
for (String character : characters) {
62+
if (character.equalsIgnoreCase(characterName)) {
63+
return true;
64+
}
65+
}
66+
return false;
67+
}
68+
69+
/**
70+
* Additional function: Uses collection and conditional Gets character count with status message
71+
*/
72+
public String getCharacterSummary() {
73+
return "Characters: " + String.join(", ", characters);
74+
}
75+
76+
// Getters and Setters
77+
public String getTitle() {
78+
return title;
79+
}
80+
81+
public void setTitle(String title) {
82+
this.title = title;
83+
}
84+
85+
public int getEpisodes() {
86+
return episodes;
87+
}
88+
89+
public void setEpisodes(int episodes) {
90+
this.episodes = episodes;
91+
}
92+
93+
public double getRating() {
94+
return rating;
95+
}
96+
97+
public void setRating(double rating) {
98+
this.rating = rating;
99+
}
100+
101+
public boolean isCompleted() {
102+
return isCompleted;
103+
}
104+
105+
public void setCompleted(boolean completed) {
106+
isCompleted = completed;
107+
}
108+
109+
public List<String> getCharacters() {
110+
return new ArrayList<>(characters); // Return defensive copy
111+
}
112+
113+
public AnimeGenre getGenre() {
114+
return genre;
115+
}
116+
117+
public void setGenre(AnimeGenre genre) {
118+
this.genre = genre;
119+
}
120+
121+
public String getStudio() {
122+
return studio;
123+
}
124+
125+
public void setStudio(String studio) {
126+
this.studio = studio;
127+
}
128+
129+
@Override
130+
public String toString() {
131+
return String.format(
132+
"Anime{title='%s', episodes=%d, rating=%.1f, genre=%s, studio='%s', completed=%s}",
133+
title, episodes, rating, genre, studio, isCompleted);
134+
}
135+
136+
@Override
137+
public boolean equals(Object obj) {
138+
if (this == obj) return true;
139+
if (obj == null || getClass() != obj.getClass()) return false;
140+
Anime anime = (Anime) obj;
141+
return title != null ? title.equals(anime.title) : anime.title == null;
142+
}
143+
144+
@Override
145+
public int hashCode() {
146+
return title != null ? title.hashCode() : 0;
147+
}
148+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.codedifferently.lesson16.taliacrockett;
2+
3+
public enum AnimeGenre {
4+
SHONEN("Shonen"),
5+
SHOUJO("Shoujo"),
6+
SEINEN("Seinen"),
7+
JOSEI("Josei"),
8+
ISEKAI("Isekai"),
9+
MECHA("Mecha"),
10+
SLICE_OF_LIFE("Slice of Life"),
11+
ROMANCE("Romance"),
12+
ACTION("Action"),
13+
COMEDY("Comedy"),
14+
DRAMA("Drama"),
15+
FANTASY("Fantasy"),
16+
SUPERNATURAL("Supernatural"),
17+
THRILLER("Thriller"),
18+
HORROR("Horror");
19+
20+
public String displayName;
21+
22+
AnimeGenre(String displayName) {
23+
this.displayName = displayName;
24+
}
25+
26+
public String getDisplayName() {
27+
if (displayName == null) {
28+
return "Unknown Genre";
29+
}
30+
return displayName;
31+
}
32+
33+
@Override
34+
public String toString() {
35+
return displayName;
36+
}
37+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.codedifferently.lesson16.taliacrockett;
2+
3+
/** Custom exception thrown when an anime is not found in the collection. */
4+
public class AnimeNotFoundException extends Exception {
5+
public AnimeNotFoundException(String message) {
6+
super(message);
7+
}
8+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.codedifferently.lesson16.taliacrockett;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
public class AnimeGenreTest {
8+
@Test
9+
public void testDisplayName() {
10+
AnimeGenre genre = AnimeGenre.SHONEN;
11+
assertEquals("Shonen", genre.getDisplayName());
12+
}
13+
14+
@Test
15+
public void testToString() {
16+
AnimeGenre genre = AnimeGenre.FANTASY;
17+
assertEquals("Fantasy", genre.toString());
18+
}
19+
}
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
package com.codedifferently.lesson16.taliacrockett;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
public class AnimeTest {
8+
// Test methods for Anime class
9+
@Test
10+
public void testGetRecommendation() {
11+
Anime anime1 = new Anime("Test Anime 1", 12, 8.5, AnimeGenre.SHONEN, "Studio A");
12+
assertEquals("Highly Recommended!", anime1.getRecommendation());
13+
14+
Anime anime2 = new Anime("Test Anime 2", 24, 7.0, AnimeGenre.SHOUJO, "Studio B");
15+
assertEquals("Worth Watching", anime2.getRecommendation());
16+
17+
Anime anime3 = new Anime("Test Anime 3", 10, 5.5, AnimeGenre.ACTION, "Studio C");
18+
assertEquals("Skip This One", anime3.getRecommendation());
19+
}
20+
21+
@Test
22+
public void testAddCharacter() {
23+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
24+
anime.addCharacter("Character A");
25+
anime.addCharacter("Character B");
26+
27+
assertTrue(anime.hasCharacter("Character A"));
28+
assertTrue(anime.hasCharacter("Character B"));
29+
assertFalse(anime.hasCharacter("Character C"));
30+
}
31+
32+
@Test
33+
public void testHasCharacter() {
34+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
35+
anime.addCharacter("Character A");
36+
assertTrue(anime.hasCharacter("Character A"));
37+
assertFalse(anime.hasCharacter("Character B"));
38+
}
39+
40+
@Test
41+
public void testGetCharacterSummary() {
42+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
43+
anime.addCharacter("Character A");
44+
anime.addCharacter("Character B");
45+
String summary = anime.getCharacterSummary();
46+
assertEquals("Characters: Character A, Character B", summary);
47+
}
48+
49+
@Test
50+
public void testGetTitle() {
51+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
52+
assertEquals("Test Anime", anime.getTitle());
53+
}
54+
55+
@Test
56+
public void testSetTitle() {
57+
Anime anime = new Anime("Old Title", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
58+
anime.setTitle("New Title");
59+
assertEquals("New Title", anime.getTitle());
60+
}
61+
62+
@Test
63+
public void testGetEpisodes() {
64+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
65+
assertEquals(12, anime.getEpisodes());
66+
}
67+
68+
@Test
69+
public void testSetEpisodes() {
70+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
71+
anime.setEpisodes(24);
72+
assertEquals(24, anime.getEpisodes());
73+
}
74+
75+
@Test
76+
public void testGetRating() {
77+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
78+
assertEquals(8.0, anime.getRating());
79+
}
80+
81+
@Test
82+
public void testSetRating() {
83+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
84+
anime.setRating(9.5);
85+
assertEquals(9.5, anime.getRating());
86+
}
87+
88+
@Test
89+
public void testIsCompleted() {
90+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
91+
assertFalse(anime.isCompleted());
92+
anime.setCompleted(true);
93+
assertTrue(anime.isCompleted());
94+
}
95+
96+
@Test
97+
public void testSetCompleted() {
98+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
99+
anime.setCompleted(true);
100+
assertTrue(anime.isCompleted());
101+
anime.setCompleted(false);
102+
assertFalse(anime.isCompleted());
103+
}
104+
105+
@Test
106+
public void testGetCharacters() {
107+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
108+
anime.addCharacter("Character A");
109+
anime.addCharacter("Character B");
110+
assertEquals(2, anime.getCharacters().size());
111+
assertTrue(anime.getCharacters().contains("Character A"));
112+
assertTrue(anime.getCharacters().contains("Character B"));
113+
}
114+
115+
@Test
116+
public void testGetGenre() {
117+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
118+
assertEquals(AnimeGenre.FANTASY, anime.getGenre());
119+
}
120+
121+
@Test
122+
public void testSetGenre() {
123+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
124+
anime.setGenre(AnimeGenre.HORROR);
125+
assertEquals(AnimeGenre.HORROR, anime.getGenre());
126+
}
127+
128+
@Test
129+
public void testGetStudio() {
130+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
131+
assertEquals("Studio D", anime.getStudio());
132+
}
133+
134+
@Test
135+
public void testSetStudio() {
136+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
137+
anime.setStudio("Studio E");
138+
assertEquals("Studio E", anime.getStudio());
139+
}
140+
141+
@Test
142+
public void testToString() {
143+
Anime anime = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
144+
String expected =
145+
"Anime{title='Test Anime', episodes=12, rating=8.0, genre=Fantasy, studio='Studio D', completed=false}";
146+
assertEquals(expected, anime.toString());
147+
}
148+
149+
@Test
150+
public void testEquals() {
151+
Anime anime1 = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
152+
Anime anime2 = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
153+
Anime anime3 = new Anime("Different Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
154+
assertEquals(anime1, anime2);
155+
assertNotEquals(anime1, anime3);
156+
assertNotEquals(anime1, null);
157+
assertNotEquals(anime1, "Some String");
158+
}
159+
160+
@Test
161+
public void testHashCode() {
162+
Anime anime1 = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
163+
Anime anime2 = new Anime("Test Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
164+
assertEquals(anime1.hashCode(), anime2.hashCode());
165+
Anime anime3 = new Anime("Different Anime", 12, 8.0, AnimeGenre.FANTASY, "Studio D");
166+
assertNotEquals(anime1.hashCode(), anime3.hashCode());
167+
}
168+
}

0 commit comments

Comments
 (0)