diff --git a/exercises/practice/grade-school/.meta/config.json b/exercises/practice/grade-school/.meta/config.json index 4379b6447..b225be0ee 100644 --- a/exercises/practice/grade-school/.meta/config.json +++ b/exercises/practice/grade-school/.meta/config.json @@ -19,6 +19,7 @@ "msomji", "muzimuzhi", "NewtonCesarRoncari", + "sanderploegsma", "sjwarner-bp", "SleeplessByte", "Smarticles101", diff --git a/exercises/practice/grade-school/.meta/src/reference/java/School.java b/exercises/practice/grade-school/.meta/src/reference/java/School.java index ddd4a868a..7fcf12e57 100644 --- a/exercises/practice/grade-school/.meta/src/reference/java/School.java +++ b/exercises/practice/grade-school/.meta/src/reference/java/School.java @@ -2,39 +2,28 @@ class School { - private final Map> database = new HashMap<>(); + private final SortedMap> database = new TreeMap<>(); - void add(String student, int grade) { - List students = fetchGradeFromDatabase(grade); - students.add(student); + boolean add(String student, int grade) { + if (database.values().stream().anyMatch(students -> students.contains(student))) { + return false; + } + + database.putIfAbsent(grade, new TreeSet<>()); + database.get(grade).add(student); + return true; } List roster() { - List result = new ArrayList(); - for (List studentsInGrade : studentsByGradeAlphabetical().values()) { - result.addAll(studentsInGrade); + List result = new ArrayList<>(); + for (SortedSet students : database.values()) { + result.addAll(students); } return result; } List grade(int grade) { - return new ArrayList<>(fetchGradeFromDatabase(grade)); - } - - private List fetchGradeFromDatabase(int grade) { - if (!database.containsKey(grade)) { - database.put(grade, new LinkedList<>()); - } - Collections.sort(database.get(grade)); - return database.get(grade); - } - - private Map> studentsByGradeAlphabetical() { - Map> sortedStudents = new HashMap<>(); - for (Integer grade : database.keySet()) { - List studentsInGrade = fetchGradeFromDatabase(grade); - sortedStudents.put(grade, studentsInGrade); - } - return sortedStudents; + SortedSet students = database.getOrDefault(grade, new TreeSet<>()); + return new ArrayList<>(students); } } diff --git a/exercises/practice/grade-school/.meta/tests.toml b/exercises/practice/grade-school/.meta/tests.toml index eada129dd..56a3a6718 100644 --- a/exercises/practice/grade-school/.meta/tests.toml +++ b/exercises/practice/grade-school/.meta/tests.toml @@ -1,24 +1,87 @@ -# This is an auto-generated file. Regular comments will be removed when this -# file is regenerated. Regenerating will not touch any manually added keys, -# so comments can be added in a "comment" key. +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[a3f0fb58-f240-4723-8ddc-e644666b85cc] +description = "Roster is empty when no student is added" + +[9337267f-7793-4b90-9b4a-8e3978408824] +description = "Add a student" [6d0a30e4-1b4e-472e-8e20-c41702125667] -description = "Adding a student adds them to the sorted roster" +description = "Student is added to the roster" + +[73c3ca75-0c16-40d7-82f5-ed8fe17a8e4a] +description = "Adding multiple students in the same grade in the roster" [233be705-dd58-4968-889d-fb3c7954c9cc] -description = "Adding more student adds them to the sorted roster" +description = "Multiple students in the same grade are added to the roster" + +[87c871c1-6bde-4413-9c44-73d59a259d83] +description = "Cannot add student to same grade in the roster more than once" + +[c125dab7-2a53-492f-a99a-56ad511940d8] +description = "A student can't be in two different grades" +include = false + +[a0c7b9b8-0e89-47f8-8b4a-c50f885e79d1] +description = "A student can only be added to the same grade in the roster once" +include = false +reimplements = "c125dab7-2a53-492f-a99a-56ad511940d8" + +[d7982c4f-1602-49f6-a651-620f2614243a] +description = "Student not added to same grade in the roster more than once" +reimplements = "a0c7b9b8-0e89-47f8-8b4a-c50f885e79d1" + +[e70d5d8f-43a9-41fd-94a4-1ea0fa338056] +description = "Adding students in multiple grades" [75a51579-d1d7-407c-a2f8-2166e984e8ab] -description = "Adding students to different grades adds them to the same sorted roster" +description = "Students in multiple grades are added to the roster" -[a3f0fb58-f240-4723-8ddc-e644666b85cc] -description = "Roster returns an empty list if there are no students enrolled" +[7df542f1-57ce-433c-b249-ff77028ec479] +description = "Cannot add same student to multiple grades in the roster" -[180a8ff9-5b94-43fc-9db1-d46b4a8c93b6] -description = "Student names with grades are displayed in the same sorted roster" +[6a03b61e-1211-4783-a3cc-fc7f773fba3f] +description = "A student cannot be added to more than one grade in the sorted roster" +include = false +reimplements = "c125dab7-2a53-492f-a99a-56ad511940d8" -[1bfbcef1-e4a3-49e8-8d22-f6f9f386187e] -description = "Grade returns the students in that grade in alphabetical order" +[c7ec1c5e-9ab7-4d3b-be5c-29f2f7a237c5] +description = "Student not added to multiple grades in the roster" +reimplements = "6a03b61e-1211-4783-a3cc-fc7f773fba3f" + +[d9af4f19-1ba1-48e7-94d0-dabda4e5aba6] +description = "Students are sorted by grades in the roster" + +[d9fb5bea-f5aa-4524-9d61-c158d8906807] +description = "Students are sorted by name in the roster" + +[180a8ff9-5b94-43fc-9db1-d46b4a8c93b6] +description = "Students are sorted by grades and then by name in the roster" [5e67aa3c-a3c6-4407-a183-d8fe59cd1630] -description = "Grade returns an empty list if there are no students in that grade" +description = "Grade is empty if no students in the roster" + +[1e0cf06b-26e0-4526-af2d-a2e2df6a51d6] +description = "Grade is empty if no students in that grade" + +[2bfc697c-adf2-4b65-8d0f-c46e085f796e] +description = "Student not added to same grade more than once" + +[66c8e141-68ab-4a04-a15a-c28bc07fe6b9] +description = "Student not added to multiple grades" + +[c9c1fc2f-42e0-4d2c-b361-99271f03eda7] +description = "Student not added to other grade for multiple grades" +comment = "Test case is combined with 66c8e141-68ab-4a04-a15a-c28bc07fe6b9 for clarity." + +[1bfbcef1-e4a3-49e8-8d22-f6f9f386187e] +description = "Students are sorted by name in a grade" diff --git a/exercises/practice/grade-school/.meta/version b/exercises/practice/grade-school/.meta/version deleted file mode 100644 index 7f207341d..000000000 --- a/exercises/practice/grade-school/.meta/version +++ /dev/null @@ -1 +0,0 @@ -1.0.1 \ No newline at end of file diff --git a/exercises/practice/grade-school/src/main/java/School.java b/exercises/practice/grade-school/src/main/java/School.java index 599b475d8..925695afa 100644 --- a/exercises/practice/grade-school/src/main/java/School.java +++ b/exercises/practice/grade-school/src/main/java/School.java @@ -2,7 +2,7 @@ class School { - void add(String student, int grade) { + boolean add(String student, int grade) { throw new UnsupportedOperationException("Delete this statement and write your own implementation."); } diff --git a/exercises/practice/grade-school/src/test/java/SchoolTest.java b/exercises/practice/grade-school/src/test/java/SchoolTest.java index f569e1495..891d95656 100644 --- a/exercises/practice/grade-school/src/test/java/SchoolTest.java +++ b/exercises/practice/grade-school/src/test/java/SchoolTest.java @@ -1,13 +1,9 @@ -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Arrays; -import java.util.List; - - import org.junit.Before; import org.junit.Ignore; import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; + public class SchoolTest { private School school; @@ -16,48 +12,122 @@ public void setUp() { school = new School(); } + @Test + public void rosterReturnsAnEmptyListIfThereAreNoStudentsEnrolled() { + assertThat(school.roster()).isEmpty(); + } + + @Ignore("Remove to run test") + @Test + public void addAStudent() { + assertThat(school.add("Aimee", 2)).isTrue(); + } + + @Ignore("Remove to run test") @Test public void addingAStudentAddsThemToTheSortedRoster() { - school = new School(); school.add("Aimee", 2); - List expected = Arrays.asList("Aimee"); - assertThat(school.roster()).isEqualTo(expected); + + assertThat(school.roster()).containsExactly("Aimee"); + } + + @Ignore("Remove to run test") + @Test + public void addingMultipleStudentsInTheSameGrade() { + assertThat(school.add("Blair", 2)).isTrue(); + assertThat(school.add("James", 2)).isTrue(); + assertThat(school.add("Paul", 2)).isTrue(); } @Ignore("Remove to run test") @Test public void addingMoreStudentsAddsThemToTheSameSortedRoster() { - school = new School(); - int grade = 2; - school.add("Blair", grade); - school.add("James", grade); - school.add("Paul", grade); - List expected = Arrays.asList("Blair", "James", "Paul"); - assertThat(school.roster()).isEqualTo(expected); + school.add("Blair", 2); + school.add("James", 2); + school.add("Paul", 2); + + assertThat(school.roster()).containsExactly("Blair", "James", "Paul"); + } + + @Ignore("Remove to run test") + @Test + public void cannotAddStudentsToSameGradeInTheRosterMoreThanOnce() { + assertThat(school.add("Blair", 2)).isTrue(); + assertThat(school.add("James", 2)).isTrue(); + assertThat(school.add("James", 2)).isFalse(); + assertThat(school.add("Paul", 2)).isTrue(); + } + + @Ignore("Remove to run test") + @Test + public void studentNotAddedToSameGradeInTheRosterMoreThanOnce() { + school.add("Blair", 2); + school.add("James", 2); + school.add("James", 2); + school.add("Paul", 2); + + assertThat(school.roster()).containsExactly("Blair", "James", "Paul"); + } + + @Ignore("Remove to run test") + @Test + public void addingStudentsInMultipleGrades() { + assertThat(school.add("Chelsea", 3)).isTrue(); + assertThat(school.add("Logan", 7)).isTrue(); } @Ignore("Remove to run test") @Test public void addingStudentsToDifferentGradesAddsThemToTheSameSortedRoster() { - school = new School(); school.add("Chelsea", 3); school.add("Logan", 7); - List expected = Arrays.asList("Chelsea", "Logan"); - assertThat(school.roster()).isEqualTo(expected); + + assertThat(school.roster()).containsExactly("Chelsea", "Logan"); } @Ignore("Remove to run test") @Test - public void rosterReturnsAnEmptyListIfThereAreNoStudentsEnrolled() { - school = new School(); - List expected = Arrays.asList(); - assertThat(school.roster()).isEqualTo(expected); + public void cannotAddSameStudentToMultipleGradesInTheRoster() { + assertThat(school.add("Blair", 2)).isTrue(); + assertThat(school.add("James", 2)).isTrue(); + assertThat(school.add("James", 3)).isFalse(); + assertThat(school.add("Paul", 3)).isTrue(); } @Ignore("Remove to run test") @Test - public void studentNamesWithGradesAreDisplayedInTheSameSortedRoster() { - school = new School(); + public void studentNotAddedToMultipleGradesInTheRoster() { + school.add("Blair", 2); + school.add("James", 2); + school.add("James", 3); + school.add("Paul", 3); + + assertThat(school.roster()).containsExactly("Blair", "James", "Paul"); + } + + @Ignore("Remove to run test") + @Test + public void studentsAreSortedByGradeInTheRoster() { + school.add("Jim", 3); + school.add("Peter", 2); + school.add("Anna", 1); + + assertThat(school.roster()).containsExactly("Anna", "Peter", "Jim"); + } + + @Ignore("Remove to run test") + @Test + public void studentsAreSortedByNameInTheRoster() { + school.add("Peter", 2); + school.add("Zoe", 2); + school.add("Alex", 2); + + assertThat(school.roster()).containsExactly("Alex", "Peter", "Zoe"); + } + + @Ignore("Remove to run test") + @Test + public void studentsAreSortedByGradeAndThenByNameInTheRoster() { school.add("Peter", 2); school.add("Anna", 1); school.add("Barb", 1); @@ -65,26 +135,57 @@ public void studentNamesWithGradesAreDisplayedInTheSameSortedRoster() { school.add("Alex", 2); school.add("Jim", 3); school.add("Charlie", 1); - List expected = Arrays.asList("Anna", "Barb", "Charlie", "Alex", "Peter", "Zoe", "Jim"); - assertThat(school.roster()).isEqualTo(expected); + + assertThat(school.roster()).containsExactly("Anna", "Barb", "Charlie", "Alex", "Peter", "Zoe", "Jim"); } @Ignore("Remove to run test") @Test - public void gradeReturnsTheStudentsInThatGradeInAlphabeticalOrder() { - school = new School(); - school.add("Franklin", 5); - school.add("Bradley", 5); - school.add("Jeff", 1); - List expected = Arrays.asList("Bradley", "Franklin"); - assertThat(school.grade(5)).isEqualTo(expected); + public void gradeIsEmptyIfNoStudentsInTheRoster() { + assertThat(school.grade(1)).isEmpty(); } @Ignore("Remove to run test") @Test - public void gradeReturnsAnEmptyListIfThereAreNoStudentsInThatGrade() { - school = new School(); - List expected = Arrays.asList(); - assertThat(school.grade(1)).isEqualTo(expected); + public void gradeIsEmptyIfNoStudentsInThatGrade() { + school.add("Peter", 2); + school.add("Zoe", 2); + school.add("Alex", 2); + school.add("Jim", 3); + + assertThat(school.grade(1)).isEmpty(); + } + + @Ignore("Remove to run test") + @Test + public void studentNotAddedToTheSameGradeMoreThanOnce() { + school.add("Blair", 2); + school.add("James", 2); + school.add("James", 2); + school.add("Paul", 2); + + assertThat(school.grade(2)).containsExactly("Blair", "James", "Paul"); + } + + @Ignore("Remove to run test") + @Test + public void studentNotAddedToMultipleGrades() { + school.add("Blair", 2); + school.add("James", 2); + school.add("James", 3); + school.add("Paul", 3); + + assertThat(school.grade(2)).containsExactly("Blair", "James"); + assertThat(school.grade(3)).containsExactly("Paul"); + } + + @Ignore("Remove to run test") + @Test + public void studentsAreSortedByNameInAGrade() { + school.add("Franklin", 5); + school.add("Bradley", 5); + school.add("Jeff", 1); + + assertThat(school.grade(5)).containsExactly("Bradley", "Franklin"); } }