ruby - grade-school
This commit is contained in:
parent
d83ab1df67
commit
ddd70fe61b
65
ruby/grade-school/README.md
Normal file
65
ruby/grade-school/README.md
Normal file
@ -0,0 +1,65 @@
|
||||
# Grade School
|
||||
|
||||
Given students' names along with the grade that they are in, create a roster
|
||||
for the school.
|
||||
|
||||
In the end, you should be able to:
|
||||
|
||||
- Add a student's name to the roster for a grade
|
||||
- "Add Jim to grade 2."
|
||||
- "OK."
|
||||
- Get a list of all students enrolled in a grade
|
||||
- "Which students are in grade 2?"
|
||||
- "We've only got Jim just now."
|
||||
- Get a sorted list of all students in all grades. Grades should sort
|
||||
as 1, 2, 3, etc., and students within a grade should be sorted
|
||||
alphabetically by name.
|
||||
- "Who all is enrolled in school right now?"
|
||||
- "Grade 1: Anna, Barb, and Charlie. Grade 2: Alex, Peter, and Zoe.
|
||||
Grade 3…"
|
||||
|
||||
Note that all our students only have one name. (It's a small town, what
|
||||
do you want?)
|
||||
|
||||
## For bonus points
|
||||
|
||||
Did you get the tests passing and the code clean? If you want to, these
|
||||
are some additional things you could try:
|
||||
|
||||
- If you're working in a language with mutable data structures and your
|
||||
implementation allows outside code to mutate the school's internal DB
|
||||
directly, see if you can prevent this. Feel free to introduce additional
|
||||
tests.
|
||||
|
||||
Then please share your thoughts in a comment on the submission. Did this
|
||||
experiment make the code better? Worse? Did you learn anything from it?
|
||||
|
||||
* * * *
|
||||
|
||||
For installation and learning resources, refer to the
|
||||
[exercism help page](http://exercism.io/languages/ruby).
|
||||
|
||||
For running the tests provided, you will need the Minitest gem. Open a
|
||||
terminal window and run the following command to install minitest:
|
||||
|
||||
gem install minitest
|
||||
|
||||
If you would like color output, you can `require 'minitest/pride'` in
|
||||
the test file, or note the alternative instruction, below, for running
|
||||
the test file.
|
||||
|
||||
Run the tests from the exercise directory using the following command:
|
||||
|
||||
ruby grade_school_test.rb
|
||||
|
||||
To include color from the command line:
|
||||
|
||||
ruby -r minitest/pride grade_school_test.rb
|
||||
|
||||
|
||||
## Source
|
||||
|
||||
A pairing session with Phil Battos at gSchool [http://gschool.it](http://gschool.it)
|
||||
|
||||
## Submitting Incomplete Solutions
|
||||
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
20
ruby/grade-school/grade_school.rb
Normal file
20
ruby/grade-school/grade_school.rb
Normal file
@ -0,0 +1,20 @@
|
||||
class School
|
||||
def initialize
|
||||
@roster = {}
|
||||
end
|
||||
|
||||
def students(grade)
|
||||
@roster[grade] || []
|
||||
end
|
||||
|
||||
def add(name, grade)
|
||||
if @roster[grade].nil?
|
||||
@roster[grade] = []
|
||||
end
|
||||
@roster[grade].push(name).sort!
|
||||
end
|
||||
|
||||
def students_by_grade
|
||||
@roster.sort.map {|key, value| {grade: key, students: value}}
|
||||
end
|
||||
end
|
89
ruby/grade-school/grade_school_test.rb
Normal file
89
ruby/grade-school/grade_school_test.rb
Normal file
@ -0,0 +1,89 @@
|
||||
require 'minitest/autorun'
|
||||
require_relative 'grade_school'
|
||||
|
||||
class SchoolTest < Minitest::Test
|
||||
def test_empty_grade
|
||||
school = School.new
|
||||
expected = []
|
||||
assert_equal expected, school.students(1)
|
||||
end
|
||||
|
||||
def test_add_student
|
||||
# skip
|
||||
school = School.new
|
||||
assert school.add('Aimee', 2)
|
||||
expected = ['Aimee']
|
||||
assert_equal expected, school.students(2)
|
||||
end
|
||||
|
||||
def test_add_students_to_different_grades
|
||||
# skip
|
||||
school = School.new
|
||||
school.add('Aimee', 3)
|
||||
school.add('Beemee', 7)
|
||||
assert_equal ['Aimee'], school.students(3)
|
||||
assert_equal ['Beemee'], school.students(7)
|
||||
end
|
||||
|
||||
def test_grade_with_multiple_students
|
||||
# skip
|
||||
school = School.new
|
||||
grade = 6
|
||||
students = %w(Aimee Beemee Ceemee)
|
||||
students.each { |student| school.add(student, grade) }
|
||||
assert_equal students, school.students(grade)
|
||||
end
|
||||
|
||||
def test_grade_with_multiple_students_sorts_correctly
|
||||
# skip
|
||||
school = School.new
|
||||
grade = 6
|
||||
students = %w(Beemee Aimee Ceemee)
|
||||
students.each { |student| school.add(student, grade) }
|
||||
expected = students.sort
|
||||
assert_equal expected, school.students(grade)
|
||||
end
|
||||
|
||||
def test_empty_students_by_grade
|
||||
# skip
|
||||
school = School.new
|
||||
expected = []
|
||||
assert_equal expected, school.students_by_grade
|
||||
end
|
||||
|
||||
def test_students_by_grade
|
||||
# skip
|
||||
school = School.new
|
||||
grade = 6
|
||||
students = %w(Beemee Aimee Ceemee)
|
||||
students.each { |student| school.add(student, grade) }
|
||||
expected = [{ grade: grade, students: students.sort }]
|
||||
assert_equal expected, school.students_by_grade
|
||||
end
|
||||
|
||||
def test_students_by_grade_sorted
|
||||
# skip
|
||||
school = School.new
|
||||
everyone.each do |grade|
|
||||
grade[:students].each { |student| school.add(student, grade[:grade]) }
|
||||
end
|
||||
expected = everyone_sorted
|
||||
assert_equal expected, school.students_by_grade
|
||||
end
|
||||
|
||||
def everyone
|
||||
[
|
||||
{ grade: 3, students: %w(Deemee Eeemee) },
|
||||
{ grade: 1, students: %w(Effmee Geemee) },
|
||||
{ grade: 2, students: %w(Aimee Beemee Ceemee) }
|
||||
]
|
||||
end
|
||||
|
||||
def everyone_sorted
|
||||
[
|
||||
{ grade: 1, students: %w(Effmee Geemee) },
|
||||
{ grade: 2, students: %w(Aimee Beemee Ceemee) },
|
||||
{ grade: 3, students: %w(Deemee Eeemee) }
|
||||
]
|
||||
end
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user