diff --git a/ruby/grade-school/README.md b/ruby/grade-school/README.md new file mode 100644 index 0000000..fd3875e --- /dev/null +++ b/ruby/grade-school/README.md @@ -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. diff --git a/ruby/grade-school/grade_school.rb b/ruby/grade-school/grade_school.rb new file mode 100644 index 0000000..3fa46b6 --- /dev/null +++ b/ruby/grade-school/grade_school.rb @@ -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 diff --git a/ruby/grade-school/grade_school_test.rb b/ruby/grade-school/grade_school_test.rb new file mode 100644 index 0000000..9597bfe --- /dev/null +++ b/ruby/grade-school/grade_school_test.rb @@ -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