Skip to content

Commit f2b2630

Browse files
authored
Issue #361: Adds a test that checks if a student can only belong in a single grade. (#362)
1 parent 45ed571 commit f2b2630

File tree

2 files changed

+45
-33
lines changed

2 files changed

+45
-33
lines changed
Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,35 @@
1-
export default class GradeSchool {
2-
private roster = new Map<number, Set<string>>()
1+
type Student = string
2+
type Grade = number
3+
type StudentRooster = Map<string, Student[]>
4+
type StudentGrades = Map<Student, Grade>
35

4-
public addStudent(name: string, grade: number): void {
5-
const students = this.roster.get(grade) || new Set<string>()
6-
students.add(name)
7-
this.roster.set(grade, students)
6+
class GradeSchool {
7+
private studentGrades: StudentGrades
8+
constructor() { this.studentGrades = new Map() }
9+
private studentGradeEntries(): [Student, Grade][] {
10+
return Array.from(this.studentGrades.entries());
811
}
12+
public studentRoster(): StudentRooster {
13+
const grades: Grade[] =
14+
Array.from(new Set(this.studentGrades.values()).values())
15+
.sort()
916

10-
public studentsInGrade(grade: number): string[] {
11-
const toReturn = this.roster.get(grade) || new Set<string>()
12-
return Array.from(toReturn).sort()
13-
}
14-
15-
public studentRoster(): Map<string, string[]> {
16-
const temp = new Map<string, string[]>()
17-
const keys: number[] = []
18-
19-
for (const key of this.roster.keys()) {
20-
keys.push(key)
21-
}
22-
keys.sort()
17+
const emptyStudentsRooster: StudentRooster = new Map()
2318

24-
for (const each of keys) {
25-
const values = this.roster.get(each) || new Set<string>()
26-
temp.set(each.toString(10), Array.from(values).sort())
27-
}
19+
const gradesReducer =
20+
(rooster: StudentRooster, grade: Grade): StudentRooster =>
21+
rooster.set(grade.toString(), this.studentsInGrade(grade))
2822

29-
return temp
23+
return grades.reduce(gradesReducer, emptyStudentsRooster)
24+
}
25+
addStudent(s: Student, g: Grade): void {
26+
this.studentGrades.set(s, g)
27+
}
28+
studentsInGrade(g: Grade): Student[] {
29+
return this.studentGradeEntries()
30+
.filter(([_, sg]) => sg == g)
31+
.map(([s, _]) => s).sort()
3032
}
3133
}
34+
35+
export default GradeSchool

exercises/grade-school/grade-school.test.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,18 @@ describe('School', () => {
1111
expect(gradeSchool.studentRoster().size === 0).toEqual(true)
1212
})
1313

14+
xit("A student can't be in two different grades", () => {
15+
gradeSchool.addStudent('Aimee', 2)
16+
gradeSchool.addStudent('Aimee', 1)
17+
18+
const emptyGrade = gradeSchool.studentsInGrade(2)
19+
expect(emptyGrade).toEqual([])
20+
})
21+
1422
xit('adding a student adds them to the roster for the given grade', () => {
1523
gradeSchool.addStudent('Aimee', 2)
1624

17-
const expectedDb = new Map(Object.entries({ 2 : [ 'Aimee' ] }))
25+
const expectedDb = new Map(Object.entries({ 2: ['Aimee'] }))
1826
expect(gradeSchool.studentRoster()).toEqual(expectedDb)
1927
})
2028

@@ -23,15 +31,15 @@ describe('School', () => {
2331
gradeSchool.addStudent('James', 2)
2432
gradeSchool.addStudent('Paul', 2)
2533

26-
const expectedDb = new Map(Object.entries({ 2 : [ 'Blair', 'James', 'Paul' ] }))
34+
const expectedDb = new Map(Object.entries({ 2: ['Blair', 'James', 'Paul'] }))
2735
expect(gradeSchool.studentRoster()).toEqual(expectedDb)
2836
})
2937

3038
xit('adding students to different grades adds them to the roster', () => {
3139
gradeSchool.addStudent('Chelsea', 3)
3240
gradeSchool.addStudent('Logan', 7)
3341

34-
const expectedDb = new Map(Object.entries({ 3 : [ 'Chelsea' ], 7 : [ 'Logan'] }))
42+
const expectedDb = new Map(Object.entries({ 3: ['Chelsea'], 7: ['Logan'] }))
3543
expect(gradeSchool.studentRoster()).toEqual(expectedDb)
3644
})
3745

@@ -40,7 +48,7 @@ describe('School', () => {
4048
gradeSchool.addStudent('Bradley', 5)
4149
gradeSchool.addStudent('Jeff', 1)
4250

43-
const expectedStudents = [ 'Bradley', 'Franklin' ]
51+
const expectedStudents = ['Bradley', 'Franklin']
4452
expect(gradeSchool.studentsInGrade(5)).toEqual(expectedStudents)
4553
})
4654

@@ -55,9 +63,9 @@ describe('School', () => {
5563
gradeSchool.addStudent('Kyle', 3)
5664

5765
const expectedSortedStudents = new Map(Object.entries({
58-
3 : ['Kyle'],
59-
4 : ['Christopher', 'Jennifer'],
60-
6 : ['Kareem']
66+
3: ['Kyle'],
67+
4: ['Christopher', 'Jennifer'],
68+
6: ['Kareem']
6169
}))
6270
expect(gradeSchool.studentRoster()).toEqual(expectedSortedStudents)
6371
})
@@ -67,14 +75,14 @@ describe('School', () => {
6775
const roster = gradeSchool.studentRoster()
6876
const result = roster.get('2') || []
6977
result.push('Oops.')
70-
const expectedDb = new Map(Object.entries({ 2 : [ 'Aimee' ] }))
78+
const expectedDb = new Map(Object.entries({ 2: ['Aimee'] }))
7179
expect(gradeSchool.studentRoster()).toEqual(expectedDb)
7280
})
7381

7482
xit('roster cannot be modified outside of module using studentsInGrade()', () => {
7583
gradeSchool.addStudent('Aimee', 2)
7684
gradeSchool.studentsInGrade(2).push('Oops.')
77-
const expectedDb = new Map(Object.entries({ 2 : [ 'Aimee' ] }))
85+
const expectedDb = new Map(Object.entries({ 2: ['Aimee'] }))
7886
expect(gradeSchool.studentRoster()).toEqual(expectedDb)
7987
})
8088

0 commit comments

Comments
 (0)