diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4cde7c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.rspec \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index f74d46d..2eb7fe0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,6 +10,8 @@ GEM diff-lcs (1.1.3) gherkin (2.10.0) json (>= 1.4.6) + gherkin (2.10.0-x86-mingw32) + json (>= 1.4.6) json (1.7.3) rack (1.4.1) rspec (2.10.0) @@ -23,6 +25,7 @@ GEM PLATFORMS ruby + x86-mingw32 DEPENDENCIES cucumber diff --git a/features/step_definitions/teacher_average_grade_steps.rb b/features/step_definitions/teacher_average_grade_steps.rb new file mode 100644 index 0000000..aab1052 --- /dev/null +++ b/features/step_definitions/teacher_average_grade_steps.rb @@ -0,0 +1,22 @@ +Given /^I have multiple students$/ do + @teacher = Teacher.new + @student1 = Student.new + @student2 = Student.new + @student3 = Student.new +end + +Given /^each one has submitted an assignment$/ do + @teacher.submit_assignment(@student1, Assignment.new) + @teacher.submit_assignment(@student2, Assignment.new) + @teacher.submit_assignment(@student3, Assignment.new) +end + +When /^I give the assignments a grade$/ do + @teacher.record_grade(@student1, 95) + @teacher.record_grade(@student2, 50) + @teacher.record_grade(@student3, 80) +end + +Then /^I can view the average grade for my class$/ do + @teacher.average_grade(@teacher.assignments).should eq(75) +end \ No newline at end of file diff --git a/features/step_definitions/teacher_grade_assignment.rb b/features/step_definitions/teacher_grade_assignment_steps.rb similarity index 100% rename from features/step_definitions/teacher_grade_assignment.rb rename to features/step_definitions/teacher_grade_assignment_steps.rb diff --git a/features/teacher_can_view_average_grade.feature b/features/teacher_can_view_average_grade.feature new file mode 100644 index 0000000..cdc351d --- /dev/null +++ b/features/teacher_can_view_average_grade.feature @@ -0,0 +1,11 @@ +Feature: Teacher can view average grade for the class + + As a Teacher + I can view the average grade for my class + So I can establish a grading curve + + Scenario: Teacher can view average grade for the class + Given I have multiple students + And each one has submitted an assignment + When I give the assignments a grade + Then I can view the average grade for my class diff --git a/lib/teacher.rb b/lib/teacher.rb index d68ffe9..6799788 100644 --- a/lib/teacher.rb +++ b/lib/teacher.rb @@ -1,4 +1,6 @@ class Teacher + attr_reader :assignments + def initialize @assignments = {} end @@ -9,6 +11,12 @@ def record_grade(student, grade) @assignments[student] = assignment end + def average_grade(assignments) + class_grades = assignments.map { |student, assignment| assignment.grade } + sum_of_class_grades = class_grades.inject(:+) + sum_of_class_grades / assignments.size + end + def submit_assignment(student, assignment) @assignments[student] = assignment end diff --git a/spec/teacher_spec.rb b/spec/teacher_spec.rb index 66894cc..ab693c8 100644 --- a/spec/teacher_spec.rb +++ b/spec/teacher_spec.rb @@ -3,8 +3,8 @@ describe Teacher do it "should store assignments" do - student = stub - assignment = stub + student = double + assignment = double subject.submit_assignment(student, assignment) subject.assignment_for_student(student).should eq(assignment) end @@ -12,11 +12,22 @@ describe "should record a grade" do it "should record the grade" do - student = stub - assignment = mock + student = double + assignment = double assignment.should_receive(:grade=).with(95) subject.submit_assignment(student, assignment) subject.record_grade(student, 95) end end + + describe "should provide an average grade for the class" do + it "should provide an average grade" do + assignment_doubles = { + student1: double("Assignment", grade: 95), + student2: double("Assignment", grade: 50), + student3: double("Assignment", grade: 80) + } + subject.average_grade(assignment_doubles).should eq(75) + end + end end