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