sambal-cle 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/Gemfile +7 -0
  2. data/Gemfile.lock +44 -0
  3. data/lib/sambal-cle/data_objects/announcement.rb +7 -7
  4. data/lib/sambal-cle/data_objects/assessment.rb +26 -77
  5. data/lib/sambal-cle/data_objects/assessment_submission.rb +26 -0
  6. data/lib/sambal-cle/data_objects/assignment.rb +40 -40
  7. data/lib/sambal-cle/data_objects/assignment_permissions.rb +4 -4
  8. data/lib/sambal-cle/data_objects/assignment_submission.rb +4 -4
  9. data/lib/sambal-cle/data_objects/blog.rb +2 -2
  10. data/lib/sambal-cle/data_objects/blogger.rb +3 -3
  11. data/lib/sambal-cle/data_objects/chat_room.rb +2 -2
  12. data/lib/sambal-cle/data_objects/{site.rb → course.rb} +24 -20
  13. data/lib/sambal-cle/data_objects/event.rb +4 -4
  14. data/lib/sambal-cle/data_objects/forum.rb +21 -22
  15. data/lib/sambal-cle/data_objects/glossary_term.rb +71 -0
  16. data/lib/sambal-cle/data_objects/lesson.rb +10 -9
  17. data/lib/sambal-cle/data_objects/matrix.rb +142 -0
  18. data/lib/sambal-cle/data_objects/message.rb +2 -2
  19. data/lib/sambal-cle/data_objects/poll.rb +2 -2
  20. data/lib/sambal-cle/data_objects/portfolio.rb +120 -0
  21. data/lib/sambal-cle/data_objects/questions.rb +690 -0
  22. data/lib/sambal-cle/data_objects/resource.rb +12 -12
  23. data/lib/sambal-cle/data_objects/syllabus.rb +7 -7
  24. data/lib/sambal-cle/data_objects/web_content_tool.rb +2 -2
  25. data/lib/sambal-cle/data_objects/wiki.rb +6 -6
  26. data/lib/sambal-cle/page_objects/assessments.rb +165 -157
  27. data/lib/sambal-cle/page_objects/assignments.rb +17 -17
  28. data/lib/sambal-cle/page_objects/glossary.rb +14 -64
  29. data/lib/sambal-cle/page_objects/matrix.rb +77 -113
  30. data/lib/sambal-cle/page_objects/portfolios.rb +0 -2
  31. data/lib/sambal-cle/page_objects/resources.rb +4 -4
  32. data/lib/sambal-cle/page_objects/site_setup.rb +31 -23
  33. data/lib/sambal-cle/page_objects/sites.rb +2 -12
  34. data/lib/sambal-cle/utilities.rb +0 -6
  35. data/lib/sambal-cle/workflows.rb +77 -76
  36. data/lib/sambal-cle.rb +2 -2
  37. data/sambal-cle.gemspec +2 -2
  38. data/test/add_assignment_to_calendar_spec.rb +4 -4
  39. data/test/assessment_create_spec.rb +1 -1
  40. data/test/assessment_feedback_spec.rb +78 -0
  41. data/test/assessment_publish_spec.rb +102 -0
  42. data/test/assignment_announcements_spec.rb +4 -4
  43. data/test/assignment_duplicate_spec.rb +4 -4
  44. data/test/assignment_gradebook_spec.rb +4 -4
  45. data/test/assignment_permissions_spec.rb +5 -5
  46. data/test/assignments_grading_spec.rb +4 -4
  47. data/test/assignments_submission_spec.rb +4 -4
  48. data/test/duplicate_site_spec.rb +2 -2
  49. data/test/glossary_term_create_spec.rb +71 -0
  50. data/test/import_site_content_spec.rb +3 -3
  51. data/test/test_spec.rb +51 -0
  52. metadata +16 -5
@@ -19,8 +19,8 @@ class FileObject
19
19
  end
20
20
 
21
21
  def create
22
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
23
- resources unless @browser.title=~/Resources$/
22
+ open_my_site_by_name @site
23
+ resources
24
24
  on Resources do |file|
25
25
  file.upload_file_to_folder @target_folder
26
26
  end
@@ -55,8 +55,8 @@ class FolderObject
55
55
  end
56
56
 
57
57
  def create
58
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
59
- resources unless @browser.title=~/Resources$/
58
+ open_my_site_by_name @site
59
+ resources
60
60
  on_page Resources do |page|
61
61
  page.create_subfolders_in @parent_folder
62
62
  end
@@ -117,8 +117,8 @@ class HTMLPageObject
117
117
  alias :content :html
118
118
 
119
119
  def create
120
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
121
- resources unless @browser.title=~/Resources$/
120
+ open_my_site_by_name @site
121
+ resources
122
122
  on_page Resources do |page|
123
123
  page.create_html_page_in @folder
124
124
  end
@@ -138,8 +138,8 @@ class HTMLPageObject
138
138
  end
139
139
 
140
140
  def edit_content(html_source)
141
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
142
- resources unless @browser.title=~/Resources$/
141
+ open_my_site_by_name @site
142
+ resources
143
143
  on Resources do |fileslist|
144
144
  fileslist.open_folder @folder unless fileslist.item(@name).present? || @folder==nil
145
145
  fileslist.edit_content @name
@@ -170,8 +170,8 @@ class TextDocumentObject
170
170
  end
171
171
 
172
172
  def create
173
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
174
- resources unless @browser.title=~/Resources$/
173
+ open_my_site_by_name @site
174
+ resources
175
175
  end
176
176
 
177
177
  end
@@ -193,8 +193,8 @@ class CitationListObject
193
193
  end
194
194
 
195
195
  def create
196
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
197
- resources unless @browser.title=~/Resources$/
196
+ open_my_site_by_name @site
197
+ resources
198
198
  end
199
199
 
200
200
  end
@@ -22,8 +22,8 @@ class SyllabusObject
22
22
  alias :name :title
23
23
 
24
24
  def create
25
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
26
- syllabus unless @browser.title=~/Syllabus$/
25
+ open_my_site_by_name @site
26
+ syllabus
27
27
  on Syllabus do |add|
28
28
  add.create_edit
29
29
  add.add
@@ -36,8 +36,8 @@ class SyllabusObject
36
36
  end
37
37
 
38
38
  def edit opts={}
39
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
40
- syllabus unless @browser.title=~/Syllabus$/
39
+ open_my_site_by_name @site
40
+ syllabus
41
41
  on Syllabus do |syllabus|
42
42
  reset
43
43
  syllabus.create_edit
@@ -46,15 +46,15 @@ class SyllabusObject
46
46
  edit.open_item @title
47
47
  end
48
48
  on AddEditSyllabusItem do |item|
49
- item.title.set opts[:title] unless opts[:title]==nil
49
+ item.title.fit opts[:title]
50
50
  item.enter_source_text(item.editor, opts[:content]) unless opts[:content]==nil
51
51
  end
52
52
  set_options(opts)
53
53
  end
54
54
 
55
55
  def get_properties
56
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
57
- syllabus unless @browser.title=~/Syllabus$/
56
+ open_my_site_by_name @site
57
+ syllabus
58
58
  on Syllabus do |syllabus|
59
59
  reset
60
60
  syllabus.create_edit
@@ -21,8 +21,8 @@ class WebContentObject
21
21
  end
22
22
 
23
23
  def create
24
- my_workspace unless @browser.title=~/My Workspace/
25
- site_setup unless @browser.title=~/Site Setup$/
24
+ my_workspace
25
+ site_setup
26
26
  on_page SiteSetup do |page|
27
27
  page.edit @site
28
28
  end
@@ -23,8 +23,8 @@ class WikiObject
23
23
  alias :name :title
24
24
 
25
25
  def create
26
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
27
- wiki unless @browser.title=~/Wiki$/
26
+ open_my_site_by_name @site
27
+ wiki
28
28
  on Rwiki do |home|
29
29
  home.edit
30
30
  @current_content = home.content.value
@@ -40,8 +40,8 @@ class WikiObject
40
40
  end
41
41
 
42
42
  def edit opts={}
43
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
44
- wiki unless @browser.title=~/Wiki$/
43
+ open_my_site_by_name @site
44
+ wiki
45
45
  on Rwiki do |edit|
46
46
  edit.open_wiki @title
47
47
  edit.edit
@@ -51,8 +51,8 @@ class WikiObject
51
51
  end
52
52
 
53
53
  def get_content
54
- open_my_site_by_name @site unless @browser.title=~/#{@site}/
55
- wiki unless @browser.title=~/Wiki$/
54
+ open_my_site_by_name @site
55
+ wiki
56
56
  on Rwiki do |edit|
57
57
  edit.open_wiki @title
58
58
  edit.edit
@@ -84,11 +84,11 @@ class AssessmentsList < AssessmentsBase
84
84
  # Opens the selected test for scoring
85
85
  # then instantiates the AssessmentTotalScores class.
86
86
  # @param test_title [String] the title of the test to be clicked.
87
- pgmd(:score_test) { |test_title, b| b.frm.tbody(:id=>"authorIndexForm:_id88:tbody_element").row(:text=>/#{Regexp.escape(test_title)}/).link(:id=>/authorIndexToScore/).click }
87
+ action(:score_test) { |test_title, b| b.frm.tbody(:id=>"authorIndexForm:_id88:tbody_element").row(:text=>/#{Regexp.escape(test_title)}/).link(:id=>/authorIndexToScore/).click }
88
88
 
89
- pgmd(:publish) { |test_title, b| b.pending_table.tr(:text=>/#{Regexp.escape(test_title)}/).select(:name=>/Select/).select "Publish" }
89
+ action(:publish) { |test_title, b| b.pending_table.tr(:text=>/#{Regexp.escape(test_title)}/).select(:name=>/Select/).select "Publish" }
90
90
 
91
- pgmd(:edit) { |test_title, b| b.form(:id=>"authorIndexForm").tr(:text=>/#{Regexp.escape(test_title)}/).select(:name=>/Select/).select "Edit" }
91
+ action(:edit) { |test_title, b| b.frm.form(:id=>"authorIndexForm").tr(:text=>/#{Regexp.escape(test_title)}/).select(:name=>/Select/).select "Edit" }
92
92
 
93
93
  element(:title) { |b| b.frm.text_field(:id=>"authorIndexForm:title") }
94
94
  element(:pending_table) { |b| b.frm.table(:id=>"authorIndexForm:coreAssessments") }
@@ -101,6 +101,62 @@ class AssessmentsList < AssessmentsBase
101
101
 
102
102
  end
103
103
 
104
+ # Page of Assessments accessible to a student user
105
+ #
106
+ # It may be that we want to deprecate this class and simply use
107
+ # the AssessmentsList class alone.
108
+ class StudentAssessmentsList < AssessmentsBase
109
+
110
+ # Returns an array containing the assessment names that appear on the page.
111
+ def available_assessments
112
+ list = []
113
+ table = available_assessments_table.to_a
114
+ table.delete_at(0)
115
+ table.each { |row| list<<row[0].gsub(/\s+$/, "") unless row[0]=="" }
116
+ list
117
+ end
118
+
119
+ # Method to get the titles of assessments that
120
+ # the student user has submitted. The titles are
121
+ # returned in an Array object.
122
+ def submitted_assessments
123
+ table_array = @browser.frame(:index=>1).table(:id=>"selectIndexForm:reviewTable").to_a
124
+ table_array.delete_at(0)
125
+ titles = []
126
+ table_array.each { |row|
127
+ unless row[0] == ""
128
+ titles << row[0]
129
+ end
130
+ }
131
+
132
+ return titles
133
+
134
+ end
135
+
136
+ # Clicks the specified assessment
137
+ # @param name [String] the name of the assessment you want to take
138
+ def take_assessment(name)
139
+ begin
140
+ frm.link(:text=>name).click
141
+ rescue Watir::Exception::UnknownObjectException
142
+ frm.link(:text=>CGI::escapeHTML(name)).click
143
+ end
144
+ end
145
+
146
+ # TODO This method is in need of improvement to make it more generalized for finding the correct test.
147
+ #
148
+ def feedback(test_name)
149
+ test_table = submitted_assessments_table.to_a
150
+ test_table.delete_if { |row| row[3] != "Immediate" }
151
+ index_value = test_table.index { |row| row[0] == test_name }
152
+ frm.link(:text=>"Feedback", :index=>index_value).click
153
+ end
154
+
155
+ element(:available_assessments_table) { |b| b.frm.table(:id=>"selectIndexForm:selectTable") }
156
+ element(:submitted_assessments_table) { |b| b.frm.table(:id=>"selectIndexForm:reviewTable") }
157
+
158
+ end
159
+
104
160
  # Page that appears when previewing an assessment.
105
161
  # It shows the basic information about the assessment.
106
162
  class PreviewOverview < BasePage
@@ -159,8 +215,8 @@ class AssessmentSettings < AssessmentsBase
159
215
  element(:due_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:endDate") }
160
216
  element(:retract_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:retractDate") }
161
217
  # Assessment Released To
162
- element(:released_to_anonymous) { |b| b.frm.radio(:name=>"assessmentSettingsAction:_id117") }
163
- element(:released_to_site) { |b| b.frm.radio(:name=>"assessmentSettingsAction:_id117") }
218
+ element(:released_to_anonymous) { |b| b.frm.radio(:value=>"Anonymous Users") }
219
+ element(:released_to_site) { |b| b.frm.radio(:name=>"assessmentSettingsAction:_id117", :index=>1) }
164
220
  element(:specified_ips) { |b| b.frm.text_field(:name=>"assessmentSettingsAction:_id132") }
165
221
  # High Security
166
222
  element(:secondary_id) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:username") }
@@ -170,52 +226,55 @@ class AssessmentSettings < AssessmentsBase
170
226
  element(:limit_hour) { |b| b.frm.select(:id=>"assessmentSettingsAction:timedHours") }
171
227
  element(:limit_mins) { |b| b.frm.select(:id=>"assessmentSettingsAction:timedMinutes") }
172
228
  # Assessment Organization
173
- element(:linear_access) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNavigation") }
174
- element(:random_access) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNavigation") }
175
- element(:question_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat") }
176
- element(:part_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat") }
177
- element(:assessment_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat") }
178
- element(:continuous_numbering) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNumbering") }
179
- element(:restart_per_part) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNumbering") }
229
+ element(:linear_access) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNavigation", :value=>"1") }
230
+ element(:random_access) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNavigation", :value=>"2") }
231
+ element(:question_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat", :value=>"1") }
232
+ element(:part_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat", :value=>"2") }
233
+ element(:assessment_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat", :value=>"3") }
234
+ element(:continuous_numbering) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNumbering", :value=>"1") }
235
+ element(:restart_per_part) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNumbering", :value=>"2") }
180
236
  # Mark for review
181
237
  element(:add_mark_for_review) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:markForReview1") }
182
- element(:unlimited_submissions) { |b| b.frm.radio(:name=>"assessmentSettingsAction:unlimitedSubmissions") }
183
- element(:only_x_submissions) { |b| b.frm.radio(:name=>"assessmentSettingsAction:unlimitedSubmissions") }
238
+ element(:unlimited_submissions) { |b| b.frm.radio(:name=>"assessmentSettingsAction:unlimitedSubmissions", :value=>"1") }
239
+ element(:only_x_submissions) { |b| b.frm.radio(:name=>"assessmentSettingsAction:unlimitedSubmissions", :value=>"0") }
184
240
  element(:allowed_submissions) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:submissions_Allowed") }
185
- element(:late_submissions_not_accepted) { |b| b.frm.radio(:name=>"assessmentSettingsAction:lateHandling") }
186
- element(:late_submissions_accepted) { |b| b.frm.radio(:name=>"assessmentSettingsAction:lateHandling") }
241
+ element(:late_submissions_not_accepted) { |b| b.frm.radio(:name=>"assessmentSettingsAction:lateHandling", :value=>"2") }
242
+ element(:late_submissions_accepted) { |b| b.frm.radio(:name=>"assessmentSettingsAction:lateHandling", :value=>"1") }
187
243
  # Submission Message
188
244
  element(:submission_message) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:_id250_textinput") }
189
245
  element(:final_page_url) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:finalPageUrl") }
190
246
  # Feedback
191
- element(:question_level_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
192
- element(:selection_level_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
193
- element(:both_feedback_levels) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
194
- element(:immediate_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery") }
195
- element(:feedback_on_submission) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery") }
196
- element(:no_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery") }
197
- element(:feedback_on_date) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery") }
247
+ element(:question_level_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring", :value=>"1") }
248
+ element(:selection_level_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring", :value=>"2") }
249
+ element(:both_feedback_levels) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring", :value=>"3") }
250
+ element(:immediate_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery", :value=>"1") }
251
+ element(:feedback_on_submission) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery", :value=>"4") }
252
+ element(:no_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery", :value=>"3") }
253
+ element(:feedback_on_date) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery", :value=>"2") }
198
254
  element(:feedback_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackDate") }
199
- element(:only_release_scores) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackComponentOption") }
200
- element(:release_questions_and) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackComponentOption") }
201
- element(:release_student_response) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox1") }
202
- element(:release_correct_response) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox3") }
203
- element(:release_students_assessment_scores) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox5") }
204
- element(:release_students_question_and_part_scores) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox7") }
205
- element(:release_question_level_feedback) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox2") }
206
- element(:release_selection_level_feedback) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox4") }
255
+ element(:only_release_scores) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackComponentOption", :value=>"1") }
256
+ element(:release_questions_and) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackComponentOption", :value=>"2") }
257
+ element(:release_student_response) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox1") }
258
+ element(:release_correct_response) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox3") }
259
+ element(:release_students_assessment_scores) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox5") }
260
+ element(:release_students_question_and_part_scores) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox7") }
261
+ element(:release_question_level_feedback) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox2") }
262
+ element(:release_selection_level_feedback) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox4") }
207
263
  element(:release_graders_comments) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox6") }
208
264
  element(:release_statistics) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox8") }
209
- element(:student_ids_seen) { |b| b.frm.radio(:name=>"assessmentSettingsAction:anonymousGrading1") }
210
- element(:anonymous_grading) { |b| b.frm.radio(:name=>"assessmentSettingsAction:anonymousGrading1") }
265
+ # Grading
266
+ element(:student_ids_seen) { |b| b.frm.radio(:name=>"assessmentSettingsAction:anonymousGrading1", :value=>"2") }
267
+ element(:anonymous_grading) { |b| b.frm.radio(:name=>"assessmentSettingsAction:anonymousGrading1", :value=>"1") }
211
268
  #radio_button(:no_gradebook_options) { |b| b.frm.radio(:name=>"") }
212
269
  #radio_button(:grades_sent_to_gradebook) { |b| b.frm.radio(:name=>"") }
270
+ # Graphics
213
271
  #radio_button(:record_highest_score) { |b| b.frm.radio(:name=>"") }
214
272
  #radio_button(:record_last_score) { |b| b.frm.radio(:name=>"") }
215
273
  #radio_button(:background_color) { |b| b.frm.radio(:name=>"") }
216
274
  #text_field(:color_value, :id=>"") }
217
275
  #radio_button(:background_image) { |b| b.frm.radio(:name=>"") }
218
276
  #text_field(:image_name, :=>"") }
277
+ # Metadata
219
278
  #text_field(:keywords, :=>"") }
220
279
  #text_field(:objectives, :=>"") }
221
280
  #text_field(:rubrics, :=>"") }
@@ -254,7 +313,7 @@ class AssessmentTotalScores < BasePage
254
313
  # selecting the appropriate comment box.
255
314
  # @param student_id [String] the target student id
256
315
  # @param comment [String] the text of the comment being made to the student
257
- pgmd(:comment_for_student) { |student_id, comment, b|
316
+ action(:comment_for_student) { |student_id, comment, b|
258
317
  index_val = b.student_ids.index(student_id)
259
318
  b.frm.text_field(:name=>"editTotalResults:totalScoreTable:#{index_val}:_id345").value=comment
260
319
  }
@@ -281,7 +340,7 @@ class AssessmentTotalScores < BasePage
281
340
  end
282
341
 
283
342
  # Clicks the Assessments link on the page
284
- # then instantiates the AssessmentsList class.
343
+ # then instantiates the AssessmentsList class. action(:
285
344
  def assessments
286
345
  frm.link(:text=>"Assessments").click
287
346
  AssessmentsList.new(@browser)
@@ -332,7 +391,7 @@ class EditAssessment < AssessmentsBase
332
391
  # Allows removing a specified
333
392
  # Assessment part number.
334
393
  # @param part_num [String] the part number of the assessment you want
335
- pgmd(:remove_part) { |part_num, b| b.frm.link(:xpath, "//a[contains(@onclick, 'assesssmentForm:parts:#{part_num.to_i-1}:copyToPool')]").click }
394
+ action(:remove_part) { |part_num, b| b.frm.link(:xpath, "//a[contains(@onclick, 'assesssmentForm:parts:#{part_num.to_i-1}:copyToPool')]").click }
336
395
 
337
396
  # Clicks the Add Part button, then
338
397
  # instantiates the AddEditAssessmentPart page class.
@@ -340,7 +399,7 @@ class EditAssessment < AssessmentsBase
340
399
 
341
400
  # Selects the desired question type from the
342
401
  # drop down list at the top of the page.
343
- pgmd(:question_type) { |qtype, b| b.frm.select(:id=>"assesssmentForm:changeQType").select(qtype) }
402
+ action(:question_type) { |qtype, b| b.frm.select(:id=>"assesssmentForm:changeQType").select(qtype) }
344
403
 
345
404
  # Clicks the Preview button,
346
405
  # then instantiates the PreviewOverview page class.
@@ -358,12 +417,13 @@ class EditAssessment < AssessmentsBase
358
417
  # text, by part and question number.
359
418
  # @param part_num [String] the Part number containing the question you want
360
419
  # @param question_num [String] the number of the question you want
361
- pgmd(:get_question_text) { |part_number, question_number, b| b.frm.table(:id=>"assesssmentForm:parts:#{part_number.to_i-1}:parts").div(:class=>"tier3", :index=>question_number.to_i-1).text }
420
+ action(:get_question_text) { |part_number, question_number, b| b.frm.table(:id=>"assesssmentForm:parts:#{part_number.to_i-1}:parts").div(:class=>"tier3", :index=>question_number.to_i-1).text }
362
421
 
363
422
  action(:print) { |b| b.frm.button(:text=>"Print").click }
364
423
  action(:update_points) { |b| b.frm.button(:id=>"assesssmentForm:pointsUpdate").click }
365
424
 
366
- pgmd(:add_question_to_part) { |part, p| p.assessment_form.row(:text=>/#{Regexp.escape(part)}/).select(:id=>/changeQType/) }
425
+ # TODO: Fix this method. It doesn't work for some reason...
426
+ action(:add_question_to_part) { |part, p| p.assessment_form.row(:text=>/#{Regexp.escape(part)}/).select(:id=>/changeQType/) }
367
427
 
368
428
  element(:assessment_form) { |b| b.table(:id=>"assesssmentForm:parts") }
369
429
 
@@ -434,34 +494,16 @@ class MultipleChoice < AssessmentsBase
434
494
  element(:multi_single) { |b| b.frm.radio(:name=>"itemForm:chooseAnswerTypeForMC", :index=>1) }
435
495
  element(:multi_multi) { |b| b.frm.radio(:name=>"itemForm:chooseAnswerTypeForMC", :index=>2) }
436
496
 
437
- element(:answer_a) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:0:_id140_textinput") }
438
- action(:remove_a) { |b| b.frm.link(:id=>"itemForm:mcchoices:0:removelinkSingle").click }
439
- element(:answer_b) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:1:_id140_textinput") }
440
- action(:remove_b) { |b| b.frm.link(:id=>"itemForm:mcchoices:1:removelinkSingle").click }
441
- element(:answer_c) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:2:_id140_textinput") }
442
- action(:remove_c) { |b| b.frm.link(:id=>"itemForm:mcchoices:2:removelinkSingle").click }
443
- element(:answer_d) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:3:_id140_textinput") }
444
- action(:remove_d) { |b| b.frm.link(:id=>"itemForm:mcchoices:3:removelinkSingle").click }
445
-
446
- # Radio buttons that appear when "single correct" is selected
447
- element(:a_correct) { |b| b.frm.radio(:name=>"itemForm:mcchoices:0:mcradiobtn") }
448
- element(:b_correct) { |b| b.frm.radio(:name=>"itemForm:mcchoices:1:mcradiobtn") }
449
- element(:c_correct) { |b| b.frm.radio(:name=>"itemForm:mcchoices:2:mcradiobtn") }
450
- element(:d_correct) { |b| b.frm.radio(:name=>"itemForm:mcchoices:3:mcradiobtn") }
451
-
452
- # % Value fields that appear when "single correct" and "partial credit" selected
453
- element(:a_value) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:0:partialCredit") }
454
- element(:b_value) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:1:partialCredit") }
455
- element(:c_value) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:2:partialCredit") }
456
- element(:d_value) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:3:partialCredit") }
497
+ action(:correct_answer) { |answer, b| b.frm.radio(:value=>answer) }
498
+ action(:answer_text) { |answer, b| b.frm.text_field(:name=>"itemForm:mcchoices:#{answer.ord-65}:_id140_textinput") }
499
+ action(:answer_feedback_text) { |answer, b| b.frm.text_field(:name=>"itemForm:mcchoices:#{answer.ord-65}:_id143_textinput") }
500
+
501
+ element(:correct_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id186_textinput") }
502
+ element(:incorrect_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id190_textinput") }
457
503
 
458
504
  action(:reset_score_values) { |b| b.frm.link(:text=>"Reset Score Values").click }
459
505
 
460
- # Checkboxes that appear when "multiple correct" is selected
461
- element(:check_a_correct) { |b| b.frm.checkbox(:name=>"itemForm:mcchoices:0:mccheckboxes") }
462
- element(:check_b_correct) { |b| b.frm.checkbox(:name=>"itemForm:mcchoices:1:mccheckboxes") }
463
- element(:check_c_correct) { |b| b.frm.checkbox(:name=>"itemForm:mcchoices:2:mccheckboxes") }
464
- element(:check_d_correct) { |b| b.frm.checkbox(:name=>"itemForm:mcchoices:3:mccheckboxes") }
506
+ action(:remove_last_answer) { |b| b.frm.link(:text=>"Remove", :index=>-1).click }
465
507
 
466
508
  element(:insert_additional_answers) { |b| b.frm.select(:id=>"itemForm:insertAdditionalAnswerSelectMenu") }
467
509
  element(:randomize_answers_yes) { |b| b.frm.radio(:index=>0, :name=>"itemForm:_id162") }
@@ -485,6 +527,7 @@ class Survey < AssessmentsBase
485
527
  element(:unacceptable_excellent) { |b| b.frm.radio(:index=>5, :name=>"itemForm:selectscale") }
486
528
  element(:one_to_five) { |b| b.frm.radio(:index=>6, :name=>"itemForm:selectscale") }
487
529
  element(:one_to_ten) { |b| b.frm.radio(:index=>7, :name=>"itemForm:selectscale") }
530
+ element(:feedback) { |b| b.frm.text_field(:id=>"itemForm:_id140_textinput") }
488
531
 
489
532
  end
490
533
 
@@ -495,6 +538,7 @@ class ShortAnswer < AssessmentsBase
495
538
  question_page_elements
496
539
 
497
540
  element(:model_short_answer) { |b| b.frm.text_field(:id=>"itemForm:_id129_textinput") }
541
+ element(:feedback) { |b| b.frm.text_field(:id=>"itemForm:_id133_textinput") }
498
542
 
499
543
  end
500
544
 
@@ -506,6 +550,8 @@ class FillInBlank < AssessmentsBase
506
550
 
507
551
  element(:case_sensitive) { |b| b.frm.checkbox(:name=>"itemForm:_id76") }
508
552
  element(:mutually_exclusive) { |b| b.frm.checkbox(:name=>"itemForm:_id78") }
553
+ element(:correct_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id144_textinput") }
554
+ element(:incorrect_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id147_textinput") }
509
555
 
510
556
  end
511
557
 
@@ -515,6 +561,9 @@ class NumericResponse < AssessmentsBase
515
561
  menu_bar_elements
516
562
  question_page_elements
517
563
 
564
+ element(:correct_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id141_textinput") }
565
+ element(:incorrect_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id143_textinput") }
566
+
518
567
  end
519
568
 
520
569
  # The page for setting up a matching question
@@ -525,6 +574,12 @@ class Matching < AssessmentsBase
525
574
 
526
575
  element(:choice) { |b| b.frm.text_field(:id=>"itemForm:_id147_textinput") }
527
576
  element(:match) { |b| b.frm.text_field(:id=>"itemForm:_id151_textinput") }
577
+ element(:correct_match_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id155_textinput") }
578
+ element(:incorrect_match_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id160_textinput") }
579
+ element(:correct_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id184_textinput") }
580
+ element(:incorrect_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id189_textinput") }
581
+
582
+ action(:distractor) { |b| b.frm.select(:id=>"itemForm:controllingSequence").select "*distractor*" }
528
583
  action(:save_pairing) { |b| b.frm.button(:name=>"itemForm:_id164").click }
529
584
 
530
585
  end
@@ -536,10 +591,11 @@ class TrueFalse < AssessmentsBase
536
591
  question_page_elements
537
592
 
538
593
  element(:negative_point_value) { |b| b.frm.text_field(:id=>"itemForm:answerdsc") }
539
- element(:answer_true) { |b| b.frm.radio(:index=>0, :name=>"itemForm:TF") }
540
- element(:answer_false) { |b| b.frm.radio(:index=>1, :name=>"itemForm:TF") }
594
+ action(:answer) { |answer, b| b.frm.radio(:value=>answer, :name=>"itemForm:TF") }
541
595
  element(:required_rationale_yes) { |b| b.frm.radio(:index=>0, :name=>"itemForm:rational") }
542
596
  element(:required_rationale_no) { |b| b.frm.radio(:index=>1, :name=>"itemForm:rational") }
597
+ element(:correct_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id148_textinput") }
598
+ element(:incorrect_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id152_textinput") }
543
599
 
544
600
  end
545
601
 
@@ -551,6 +607,7 @@ class AudioRecording < AssessmentsBase
551
607
 
552
608
  element(:time_allowed) { |b| b.frm.text_field(:id=>"itemForm:timeallowed") }
553
609
  element(:number_of_attempts) { |b| b.frm.select(:id=>"itemForm:noattempts") }
610
+ element(:feedback) { |b| b.frm.text_field(:id=>"itemForm:_id146_textinput") }
554
611
 
555
612
  end
556
613
 
@@ -560,6 +617,29 @@ class FileUpload < AssessmentsBase
560
617
 
561
618
  menu_bar_elements
562
619
  question_page_elements
620
+ element(:feedback) { |b| b.frm.text_field(:id=>"itemForm:_id130_textinput") }
621
+
622
+ end
623
+
624
+ # The page for setting up a calculated question
625
+ class CalculatedQuestions < AssessmentsBase
626
+
627
+ menu_bar_elements
628
+ question_page_elements
629
+
630
+ action(:extract_vs_and_fs) { |b| b.frm.button(:value=>"Extract Variables and Formulas").click; b.variables_table.wait_until_present }
631
+
632
+ action(:min_value) { |variable_name, p| p.variables_table.td(:text=>variable_name).parent.text_field(:name=>/itemForm:pairs:.:_id167/) }
633
+ action(:max_value) { |variable_name, p| p.variables_table.td(:text=>variable_name).parent.text_field(:name=>/_id170/) }
634
+ action(:var_decimals) { |variable_name, p| p.variables_table.td(:text=>variable_name).parent.select(:name=>/_id173/) }
635
+ action(:formula) { |formula_name, p| p.formulas_table.td(:text=>formula_name).parent.text_field(:name=>/_id186/) }
636
+ action(:tolerance) { |formula_name, p| p.formulas_table.td(:text=>formula_name).parent.text_field(:name=>/_id189/) }
637
+ action(:form_decimals) { |formula_name, p| p.formulas_table.td(:text=>formula_name).parent.select(:name=>/assignToPart/) }
638
+ element(:variables_table) { |b| b.frm.table(:id=>"itemForm:pairs") }
639
+ element(:formulas_table) { |b| b.frm.table(:id=>"itemForm:formulas") }
640
+
641
+ element(:correct_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id207_textinput") }
642
+ element(:incorrect_answer_feedback) { |b| b.frm.text_field(:id=>"itemForm:_id211_textinput") }
563
643
 
564
644
  end
565
645
 
@@ -686,91 +766,31 @@ class SelectQuestionType < AssessmentsBase
686
766
 
687
767
  end
688
768
 
689
- # Page of Assessments accessible to a student user
690
- #
691
- # It may be that we want to deprecate this class and simply use
692
- # the AssessmentsList class alone.
693
- class TakeAssessmentList < AssessmentsBase
694
769
 
695
- # Returns an array containing the assessment names that appear on the page.
696
- def available_assessments
697
- # define this later
698
- end
770
+ # The student view of the overview/intro page of an Assessment
771
+ class BeginAssessment < BasePage
699
772
 
700
- # Method to get the titles of assessments that
701
- # the student user has submitted. The titles are
702
- # returned in an Array object.
703
- def submitted_assessments
704
- table_array = @browser.frame(:index=>1).table(:id=>"selectIndexForm:reviewTable").to_a
705
- table_array.delete_at(0)
706
- titles = []
707
- table_array.each { |row|
708
- unless row[0] == ""
709
- titles << row[0]
710
- end
711
- }
773
+ frame_element
712
774
 
713
- return titles
775
+ action(:begin_assessment) { |b| b.frm.button(:value=>"Begin Assessment").click }
714
776
 
715
- end
777
+ value(:assessment_introduction) { |b| b.frm.div(:class=>"assessmentIntroduction").text }
716
778
 
717
- # Clicks the specified assessment
718
- # then instantiates the BeginAssessment
719
- # page class.
720
- # @param name [String] the name of the assessment you want to take
721
- def take_assessment(name)
722
- begin
723
- frm.link(:text=>name).click
724
- rescue Watir::Exception::UnknownObjectException
725
- frm.link(:text=>CGI::escapeHTML(name)).click
726
- end
727
- BeginAssessment.new(@browser)
728
- end
779
+ element(:info_table) { |b| b.frm.table(:index=>0) }
729
780
 
730
- # TODO This method is in need of improvement to make it more generalized for finding the correct test.
731
- #
732
- def feedback(test_name)
733
- test_table = frm.table(:id=>"selectIndexForm:reviewTable").to_a
734
- test_table.delete_if { |row| row[3] != "Immediate" }
735
- index_value = test_table.index { |row| row[0] == test_name }
736
- frm.link(:text=>"Feedback", :index=>index_value).click
737
- # Need to add a call to a New class here, when it's written
738
- end
781
+ #TODO: Write methods to extract pertinent info from the info table.
739
782
 
740
783
  end
741
784
 
742
- # The student view of the overview page of an Assessment
743
- class BeginAssessment < AssessmentsBase
785
+ # Pages student sees when taking an assessment
786
+ # Note that this class will only work when the Assessment being taken
787
+ # is set up to only display one question per page.
788
+ class TakeAssessment < AssessmentsBase
744
789
 
745
- # Clicks the Begin Assessment button.
746
- def begin_assessment
747
- frm.button(:value=>"Begin Assessment").click
748
- end
749
-
750
- # Clicks the Cancel button and instantiates the X Class.
751
- def cancel
752
- # Define this later
753
- end
790
+ action(:multiple_choice_answer) { |answer_text, b| b.frm }
754
791
 
755
- # Selects the specified radio button answer
756
- def multiple_choice_answer(letter)
757
- # TODO: Convert this to a hash instead of case statement
758
- index = case(letter.upcase)
759
- when "A" then "0"
760
- when "B" then "1"
761
- when "C" then "2"
762
- when "D" then "3"
763
- when "E" then "4"
764
- end
765
- frm.radio(:name=>/takeAssessmentForm.+:deliverMultipleChoice.+:_id.+:#{index}/).click
766
- end
767
-
768
- # Enters the answer into the specified blank number (1-based).
769
- # @param answer [String]
770
- def fill_in_blank_answer(answer, blank_number)
771
- index = blank_number.to_i-1
772
- frm.text_field(:name=>/deliverFillInTheBlank:_id.+:#{index}/).value=answer
773
- end
792
+ action(:fill_in_blank_answer) { |box, b| b.frm.text_field(:name=>/deliverFillInTheBlank:_id.+:#{box.to_i}/) }
793
+ action(:numeric_answer) { |box, b| b.frm.text_field(:name=>/deliverFillInNumeric:_id.+:#{box.to_i}/) }
774
794
 
775
795
  # Clicks either the True or the False radio button, as specified.
776
796
  def true_false_answer(answer)
@@ -783,16 +803,9 @@ class BeginAssessment < AssessmentsBase
783
803
  frm.text_field(:name=>/:deliverTrueFalse:rationale/).value=text
784
804
  end
785
805
 
786
- # Enters the specified text into the "Short Answer" field.
787
- def short_answer(answer)
788
- frm.text_field(:name=>/deliverShortAnswer/).value=answer
789
- end
806
+ element(:short_answer) { |b| b.frm.text_field(:name=>/deliverShortAnswer/) }
790
807
 
791
- # Selects the specified matching value, at the spot specified by the number (1-based counting).
792
- def match_answer(answer, number)
793
- index = number.to_i-1
794
- frm.select(:name=>/deliverMatching/, :index=>index).select(answer)
795
- end
808
+ action(:match_answer) { |match_text, b| b.frm.td(:text=>/#{Regexp.escape(match_text)}/).parent.select(:index=>0) }
796
809
 
797
810
  # Enters the specified file name in the file field. You can include the path to the file
798
811
  # as an optional second parameter.
@@ -802,16 +815,11 @@ class BeginAssessment < AssessmentsBase
802
815
  end
803
816
 
804
817
  # Clicks the Next button and instantiates the BeginAssessment Class.
805
- def next
806
- frm.button(:value=>"Next").click
807
- BeginAssessment.new(@browser)
808
- end
818
+ action(:next) { |b| b.frm.button(:value=>"Next").click }
809
819
 
810
820
  # Clicks the Submit for Grading button and instantiates the ConfirmSubmission Class.
811
- def submit_for_grading
812
- frm.button(:value=>"Submit for Grading").click
813
- ConfirmSubmission.new(@browser)
814
- end
821
+ action(:submit_for_grading){ |b| b.frm.button(:value=>"Submit for Grading").click }
822
+
815
823
  end
816
824
 
817
825
  # The confirmation page that appears when submitting an Assessment.