sambal-cle 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.