defmodule SchoolTest do use ExUnit.Case def make_school_with_students(students) do {results, school} = Enum.reduce(students, {[], School.new()}, fn {student, grade}, {results, school} -> {result, school} = School.add(school, student, grade) {[result | results], school} end) {Enum.reverse(results), school} end test "Roster is empty when no student is added" do assert School.roster(School.new()) == [] end test "Add a student" do {result, school} = School.add(School.new(), "Aimee", 2) assert result == :ok assert School.roster(school) == ["Aimee"] end test "Adding multiple students in the same grade in the roster" do students = [{"Blair", 2}, {"James", 2}, {"Paul", 2}] {results, school} = make_school_with_students(students) assert results == [:ok, :ok, :ok] assert School.roster(school) == ["Blair", "James", "Paul"] end test "Cannot add student to same grade in the roster more than once" do students = [{"Blair", 2}, {"James", 2}, {"James", 2}, {"Paul", 2}] {results, school} = make_school_with_students(students) assert results == [:ok, :ok, :error, :ok] assert School.roster(school) == ["Blair", "James", "Paul"] end test "Adding students in multiple grades" do students = [{"Chelsea", 3}, {"Logan", 7}] {results, school} = make_school_with_students(students) assert results == [:ok, :ok] assert School.roster(school) == ["Chelsea", "Logan"] end test "Cannot add same student to multiple grades in the roster" do students = [{"Blair", 2}, {"James", 2}, {"James", 3}, {"Paul", 3}] {results, school} = make_school_with_students(students) assert results == [:ok, :ok, :error, :ok] assert School.roster(school) == ["Blair", "James", "Paul"] end test "Students are sorted by grades in the roster" do students = [{"Jim", 3}, {"Peter", 2}, {"Anna", 1}] {_results, school} = make_school_with_students(students) assert School.roster(school) == ["Anna", "Peter", "Jim"] end test "Students are sorted by name in the roster" do students = [{"Peter", 2}, {"Zoe", 2}, {"Alex", 2}] {_results, school} = make_school_with_students(students) assert School.roster(school) == ["Alex", "Peter", "Zoe"] end test "Students are sorted by grades and then by name in the roster" do students = [ {"Peter", 2}, {"Anna", 1}, {"Barb", 1}, {"Zoe", 2}, {"Alex", 2}, {"Jim", 3}, {"Charlie", 1} ] {_results, school} = make_school_with_students(students) assert School.roster(school) == ["Anna", "Barb", "Charlie", "Alex", "Peter", "Zoe", "Jim"] end test "Grade is empty if no students in the roster" do assert School.grade(School.new(), 1) == [] end test "Grade is empty if no students in that grade" do students = [{"Peter", 2}, {"Zoe", 2}, {"Alex", 2}, {"Jim", 3}] {_results, school} = make_school_with_students(students) assert School.grade(school, 1) == [] end test "Student not added to same grade more than once" do students = [{"Blair", 2}, {"James", 2}, {"James", 2}, {"Paul", 2}] {_results, school} = make_school_with_students(students) assert School.roster(school) == ["Blair", "James", "Paul"] end test "Student not added to multiple grades" do students = [{"Blair", 2}, {"James", 2}, {"James", 3}, {"Paul", 3}] {_results, school} = make_school_with_students(students) assert School.grade(school, 2) == ["Blair", "James"] assert School.grade(school, 3) == ["Paul"] end test "Students are sorted by name in a grade" do students = [{"Franklin", 5}, {"Bradley", 5}, {"Jeff", 1}] {_results, school} = make_school_with_students(students) assert School.grade(school, 5) == ["Bradley", "Franklin"] end end