scorm2004-manifest 0.1.0

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 (129) hide show
  1. data/.document +5 -0
  2. data/Gemfile +12 -0
  3. data/Gemfile.lock +36 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +94 -0
  6. data/Rakefile +39 -0
  7. data/VERSION +1 -0
  8. data/lib/scorm2004/manifest/adlseq_map_info.rb +17 -0
  9. data/lib/scorm2004/manifest/adlseq_objective.rb +14 -0
  10. data/lib/scorm2004/manifest/adlseq_objectives.rb +11 -0
  11. data/lib/scorm2004/manifest/attributes.rb +147 -0
  12. data/lib/scorm2004/manifest/children.rb +83 -0
  13. data/lib/scorm2004/manifest/completion_threshold.rb +13 -0
  14. data/lib/scorm2004/manifest/condition_rule.rb +12 -0
  15. data/lib/scorm2004/manifest/constrained_choice_considerations.rb +12 -0
  16. data/lib/scorm2004/manifest/control_mode.rb +16 -0
  17. data/lib/scorm2004/manifest/custom_error.rb +15 -0
  18. data/lib/scorm2004/manifest/data.rb +11 -0
  19. data/lib/scorm2004/manifest/data_from_lms.rb +21 -0
  20. data/lib/scorm2004/manifest/delivery_controls.rb +13 -0
  21. data/lib/scorm2004/manifest/dependency.rb +21 -0
  22. data/lib/scorm2004/manifest/error.rb +5 -0
  23. data/lib/scorm2004/manifest/file.rb +16 -0
  24. data/lib/scorm2004/manifest/hide_lmsui.rb +21 -0
  25. data/lib/scorm2004/manifest/href.rb +24 -0
  26. data/lib/scorm2004/manifest/item.rb +36 -0
  27. data/lib/scorm2004/manifest/limit_conditions.rb +12 -0
  28. data/lib/scorm2004/manifest/manifest.rb +26 -0
  29. data/lib/scorm2004/manifest/map.rb +13 -0
  30. data/lib/scorm2004/manifest/map_info.rb +15 -0
  31. data/lib/scorm2004/manifest/min_normalized_measure.rb +18 -0
  32. data/lib/scorm2004/manifest/navigation_interface.rb +10 -0
  33. data/lib/scorm2004/manifest/objective.rb +16 -0
  34. data/lib/scorm2004/manifest/objectives.rb +12 -0
  35. data/lib/scorm2004/manifest/organization.rb +20 -0
  36. data/lib/scorm2004/manifest/organizations.rb +24 -0
  37. data/lib/scorm2004/manifest/presentation.rb +10 -0
  38. data/lib/scorm2004/manifest/primary_objective.rb +24 -0
  39. data/lib/scorm2004/manifest/randomization_controls.rb +16 -0
  40. data/lib/scorm2004/manifest/resource.rb +18 -0
  41. data/lib/scorm2004/manifest/resources.rb +12 -0
  42. data/lib/scorm2004/manifest/rollup_action.rb +13 -0
  43. data/lib/scorm2004/manifest/rollup_condition.rb +24 -0
  44. data/lib/scorm2004/manifest/rollup_conditions.rb +14 -0
  45. data/lib/scorm2004/manifest/rollup_considerations.rb +17 -0
  46. data/lib/scorm2004/manifest/rollup_rule.rb +19 -0
  47. data/lib/scorm2004/manifest/rollup_rules.rb +16 -0
  48. data/lib/scorm2004/manifest/rule_action.rb +31 -0
  49. data/lib/scorm2004/manifest/rule_condition.rb +41 -0
  50. data/lib/scorm2004/manifest/rule_conditions.rb +14 -0
  51. data/lib/scorm2004/manifest/schema.rb +18 -0
  52. data/lib/scorm2004/manifest/schemaversion.rb +18 -0
  53. data/lib/scorm2004/manifest/sequencing.rb +24 -0
  54. data/lib/scorm2004/manifest/sequencing_collection.rb +11 -0
  55. data/lib/scorm2004/manifest/sequencing_rules.rb +13 -0
  56. data/lib/scorm2004/manifest/text_node.rb +11 -0
  57. data/lib/scorm2004/manifest/time_limit_action.rb +24 -0
  58. data/lib/scorm2004/manifest/title.rb +16 -0
  59. data/lib/scorm2004/manifest/visitor_pattern.rb +31 -0
  60. data/lib/scorm2004/manifest/xml_base.rb +38 -0
  61. data/lib/scorm2004/manifest.rb +76 -0
  62. data/lib/scorm2004-manifest.rb +1 -0
  63. data/test/functional_test.rb +45 -0
  64. data/test/helper.rb +18 -0
  65. data/test/mbce_test.rb +66 -0
  66. data/test/msce_test.rb +55 -0
  67. data/test/scorm2004/manifest/adlseq_map_info_test.rb +47 -0
  68. data/test/scorm2004/manifest/adlseq_objective_test.rb +44 -0
  69. data/test/scorm2004/manifest/adlseq_objectives_test.rb +29 -0
  70. data/test/scorm2004/manifest/any_uri_token_test.rb +40 -0
  71. data/test/scorm2004/manifest/attributes_test.rb +224 -0
  72. data/test/scorm2004/manifest/children_test.rb +330 -0
  73. data/test/scorm2004/manifest/completion_threshold_test.rb +80 -0
  74. data/test/scorm2004/manifest/condition_rule_test.rb +40 -0
  75. data/test/scorm2004/manifest/constrained_choice_considerations_test.rb +25 -0
  76. data/test/scorm2004/manifest/control_mode_test.rb +41 -0
  77. data/test/scorm2004/manifest/custom_error_test.rb +43 -0
  78. data/test/scorm2004/manifest/data_from_lms_test.rb +47 -0
  79. data/test/scorm2004/manifest/data_test.rb +31 -0
  80. data/test/scorm2004/manifest/delivery_controls_test.rb +27 -0
  81. data/test/scorm2004/manifest/dependency_test.rb +53 -0
  82. data/test/scorm2004/manifest/duration_attribute_test.rb +59 -0
  83. data/test/scorm2004/manifest/file_test.rb +40 -0
  84. data/test/scorm2004/manifest/hide_lmsui_test.rb +40 -0
  85. data/test/scorm2004/manifest/href_test.rb +43 -0
  86. data/test/scorm2004/manifest/item_test.rb +86 -0
  87. data/test/scorm2004/manifest/limit_conditions_test.rb +34 -0
  88. data/test/scorm2004/manifest/manifest_test.rb +152 -0
  89. data/test/scorm2004/manifest/map_info_test.rb +41 -0
  90. data/test/scorm2004/manifest/map_test.rb +32 -0
  91. data/test/scorm2004/manifest/min_normalized_measure_test.rb +28 -0
  92. data/test/scorm2004/manifest/navigation_interface_test.rb +29 -0
  93. data/test/scorm2004/manifest/non_negative_integer_attribute_test.rb +64 -0
  94. data/test/scorm2004/manifest/objective_test.rb +45 -0
  95. data/test/scorm2004/manifest/objectives_test.rb +37 -0
  96. data/test/scorm2004/manifest/organization_test.rb +115 -0
  97. data/test/scorm2004/manifest/organizations_test.rb +68 -0
  98. data/test/scorm2004/manifest/partial_manifest.rb +23 -0
  99. data/test/scorm2004/manifest/partial_manifest_test.rb +44 -0
  100. data/test/scorm2004/manifest/presentation_test.rb +26 -0
  101. data/test/scorm2004/manifest/primary_objective_test.rb +65 -0
  102. data/test/scorm2004/manifest/randomization_controls_test.rb +71 -0
  103. data/test/scorm2004/manifest/resource_test.rb +96 -0
  104. data/test/scorm2004/manifest/resources_test.rb +41 -0
  105. data/test/scorm2004/manifest/rollup_action_test.rb +33 -0
  106. data/test/scorm2004/manifest/rollup_condition_test.rb +42 -0
  107. data/test/scorm2004/manifest/rollup_conditions_test.rb +53 -0
  108. data/test/scorm2004/manifest/rollup_considerations_test.rb +42 -0
  109. data/test/scorm2004/manifest/rollup_rule_test.rb +87 -0
  110. data/test/scorm2004/manifest/rollup_rules_test.rb +60 -0
  111. data/test/scorm2004/manifest/rule_action_test.rb +79 -0
  112. data/test/scorm2004/manifest/rule_condition_test.rb +70 -0
  113. data/test/scorm2004/manifest/rule_conditions_test.rb +37 -0
  114. data/test/scorm2004/manifest/schema_test.rb +29 -0
  115. data/test/scorm2004/manifest/schemaversion_test.rb +29 -0
  116. data/test/scorm2004/manifest/sequencing_collection_test.rb +31 -0
  117. data/test/scorm2004/manifest/sequencing_rules_test.rb +36 -0
  118. data/test/scorm2004/manifest/sequencing_test.rb +42 -0
  119. data/test/scorm2004/manifest/string_attribute_test.rb +68 -0
  120. data/test/scorm2004/manifest/text_node_test.rb +37 -0
  121. data/test/scorm2004/manifest/time_limit_action_test.rb +51 -0
  122. data/test/scorm2004/manifest/title_test.rb +59 -0
  123. data/test/scorm2004/manifest/token_attribute_test.rb +53 -0
  124. data/test/scorm2004/manifest/visitor_pattern_test.rb +85 -0
  125. data/test/scorm2004/manifest/xml_base_test.rb +125 -0
  126. data/test/scorm2004/manifest_test.rb +33 -0
  127. data/test/scorm2004_test.rb +9 -0
  128. data/test/sece_test.rb +53 -0
  129. metadata +260 -0
@@ -0,0 +1,224 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class AttributesTest < ActiveSupport::TestCase
6
+ include PartialManifest
7
+
8
+ class Visitor
9
+ include VisitorPattern
10
+ include Attributes
11
+ end
12
+
13
+ context 'visitor having binary attributes with default values' do
14
+ class VisitorHavingBinaryAttributesWithDefaultValues < Visitor
15
+ attribute(:boolean, 'defaultsTrue', default: true)
16
+ attribute(:boolean, 'defaultsFalse', default: false)
17
+ end
18
+
19
+ setup do
20
+ @v = VisitorHavingBinaryAttributesWithDefaultValues.new
21
+ end
22
+
23
+ should 'set default values' do
24
+ el('<dummy />').accept(@v)
25
+ assert_equal true, @v.defaults_true
26
+ assert_equal false, @v.defaults_false
27
+ end
28
+
29
+ should 'set boolean values' do
30
+ el('<dummy defaultsTrue="false" defaultsFalse="true" />').accept(@v)
31
+ assert_equal false, @v.defaults_true
32
+ assert_equal true, @v.defaults_false
33
+ end
34
+ end
35
+
36
+ context 'visitor having binary attributes without default values' do
37
+ class VisitorHavingBinaryAttributesWithoutDefaultValues < Visitor
38
+ include CustomError
39
+
40
+ attribute(:boolean, 'foo')
41
+ attribute(:boolean, 'bar')
42
+ end
43
+
44
+ setup do
45
+ @v = VisitorHavingBinaryAttributesWithoutDefaultValues.new
46
+ end
47
+
48
+ should 'raise exception if the attribute not found' do
49
+ assert_raise VisitorHavingBinaryAttributesWithoutDefaultValues::Error do
50
+ el('<dummy foo="true" />').accept(@v)
51
+ end
52
+ end
53
+ end
54
+
55
+ context 'visitor having a attribute with namespace prefix' do
56
+ class VisitorHavingNamespacedAttribute < Visitor
57
+ attribute(:boolean, 'adlcp:foo')
58
+ end
59
+
60
+ setup do
61
+ @v = VisitorHavingNamespacedAttribute.new
62
+ end
63
+
64
+ should 'create an unnamespaced attribute' do
65
+ el('<dummy adlcp:foo="false" />').accept(@v)
66
+ assert_equal false, @v.foo
67
+ end
68
+ end
69
+
70
+ context 'visitor with an id attribute' do
71
+ class VisitorWithIdAttribute < Visitor
72
+ include CustomError
73
+
74
+ attribute(:id, 'foo')
75
+ end
76
+
77
+ setup do
78
+ @v = VisitorWithIdAttribute.new
79
+ end
80
+
81
+ should 'set a string value as the attribute' do
82
+ el('<dummy foo="bar" />').accept(@v)
83
+ assert_equal 'bar', @v.foo
84
+ end
85
+
86
+ should 'raise exception unless the attribute exists' do
87
+ assert_raise VisitorWithIdAttribute::Error do
88
+ el('<dummy />').accept(@v)
89
+ end
90
+ end
91
+
92
+ whitespaces = {
93
+ 'space' => ' ',
94
+ 'tab' => "\t",
95
+ 'newline' => "\n",
96
+ 'return' => "\r"
97
+ }
98
+ whitespaces.each do |k, v|
99
+ should "raise exception if the attribute value contains a #{k}" do
100
+ assert_raise VisitorWithIdAttribute::Error do
101
+ el("<dummy foo='bar#{v}baz' />").accept(@v)
102
+ end
103
+ end
104
+ end
105
+
106
+ should 'raise exception if the attribute value consists of digits' do
107
+ assert_nothing_raised do
108
+ el('<dummy foo="4bar2baz6" />').accept(@v)
109
+ end
110
+
111
+ assert_raise VisitorWithIdAttribute::Error do
112
+ el('<dummy foo="123456789" />').accept(@v)
113
+ end
114
+ end
115
+ end
116
+
117
+ context 'visitor having a decimal attribute without a default value' do
118
+ class VisitorHavingDecimalAttributeWithoutDefaultValue < Visitor
119
+ include CustomError
120
+
121
+ attribute(:decimal, 'foo')
122
+ end
123
+
124
+ setup do
125
+ @v = VisitorHavingDecimalAttributeWithoutDefaultValue.new
126
+ end
127
+
128
+ should 'raise exception unless the attribute exists' do
129
+ assert_raise VisitorHavingDecimalAttributeWithoutDefaultValue::Error do
130
+ el('<dummy />').accept(@v)
131
+ end
132
+ end
133
+
134
+ should 'set a float value' do
135
+ el('<dummy foo="6.789" />').accept(@v)
136
+ assert_equal 6.789, @v.foo
137
+ end
138
+ end
139
+
140
+ context 'visitor having a decimal attribute with a default value' do
141
+ class VisitorHavingDecimalAttributeWithDefaultValue < Visitor
142
+ attribute(:decimal, 'foo', default: -1.234)
143
+ end
144
+
145
+ setup do
146
+ @v = VisitorHavingDecimalAttributeWithDefaultValue.new
147
+ end
148
+
149
+ should 'set a default value' do
150
+ el('<dummy />').accept(@v)
151
+ assert_equal -1.234, @v.foo
152
+ end
153
+
154
+ should 'set a float value' do
155
+ el('<dummy foo="45.67" />').accept(@v)
156
+ assert_equal 45.67, @v.foo
157
+ end
158
+ end
159
+
160
+ context 'visitor having a decimal attribute with a range' do
161
+ class VisitorHavingDecimalAttributeWithRange < Visitor
162
+ include CustomError
163
+
164
+ attribute(:decimal, 'foo', range: -1.0..1.0)
165
+ end
166
+
167
+ setup do
168
+ @v = VisitorHavingDecimalAttributeWithRange.new
169
+ end
170
+
171
+ should 'set a float value if the value is within the range' do
172
+ [-1.0, 0.0, 1.0].each do |v|
173
+ el("<dummy foo='#{v}' />").accept(@v)
174
+ assert_equal v, @v.foo, v
175
+ end
176
+ end
177
+
178
+ should 'raise exception if the value is out of the range' do
179
+ [-1.0001, 1.0001].each do |v|
180
+ assert_raise VisitorHavingDecimalAttributeWithRange::Error do
181
+ el("<dummy foo='#{v}' />").accept(@v)
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ context 'visitor having an idref attribute' do
188
+ class VisitorHavingIdrefAttribute < Visitor
189
+ include CustomError
190
+
191
+ attribute :idref, 'foo'
192
+ end
193
+
194
+ setup do
195
+ @v = VisitorHavingIdrefAttribute.new
196
+ end
197
+
198
+ context 'visitng an element with an idref attribute' do
199
+ should 'set the idref value ast its attribute' do
200
+ el('<dummy foo="bar" />').accept(@v)
201
+ assert_equal 'bar', @v.foo
202
+ end
203
+ end
204
+
205
+ context 'visiting an element without an idref attribute' do
206
+ should 'raise exception' do
207
+ assert_raise VisitorHavingIdrefAttribute::Error do
208
+ el('<dummy />').accept(@v)
209
+ end
210
+ end
211
+ end
212
+ end
213
+ end
214
+ end
215
+ end
216
+
217
+ # LocalWords: AttributesTest PartialManifest VisitorPattern defaultsTrue el
218
+ # LocalWords: VisitorHavingBinaryAttributesWithDefaultValues defaultsFalse
219
+ # LocalWords: VisitorHavingBinaryAttributesWithoutDefaultValues CustomError
220
+ # LocalWords: VisitorHavingNamespacedAttribute adlcp unnamespaced spm baz
221
+ # LocalWords: VisitorWithStringAttribute VisitorWithIdAttribute whitespaces
222
+ # LocalWords: VisitorHavingDecimalAttributeWithDefaultValue
223
+ # LocalWords: VisitorHavingDecimalAttributeWithoutDefaultValue
224
+ # LocalWords: VisitorHavingDecimalAttributeWithRange
@@ -0,0 +1,330 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class Son
6
+ include VisitorPattern
7
+ end
8
+
9
+ class Grandson
10
+ include VisitorPattern
11
+ end
12
+
13
+ class ChildrenTest < ActiveSupport::TestCase
14
+ include PartialManifest
15
+
16
+ context 'visitor that has one and only one child' do
17
+ class VisitorHasOneAndOnlyOneChild
18
+ include VisitorPattern
19
+ include CustomError
20
+ include Children
21
+
22
+ has_one_and_only_one('imscp:son')
23
+ end
24
+
25
+ setup do
26
+ @v = VisitorHasOneAndOnlyOneChild.new
27
+ end
28
+
29
+ context 'visiting an element with one child' do
30
+ should 'visit the only one child' do
31
+ @v.expects(:visit_son).once
32
+ assert el('<dummy><son /></dummy>').accept(@v)
33
+ end
34
+
35
+ should 'provide an accessor method for the child' do
36
+ el('<dummy><son /></dummy>').accept(@v)
37
+ assert @v.respond_to?(:son)
38
+ assert_kind_of Son, @v.son
39
+ end
40
+
41
+ should 'call a visitor factory method during the visit' do
42
+ @v.expects(:son_visitor).once.returns(mock(:visit))
43
+ el('<dummy><son /></dummy>').accept(@v)
44
+ end
45
+ end
46
+
47
+ context 'visiting an element without the child' do
48
+ should 'raise exception' do
49
+ assert_raise VisitorHasOneAndOnlyOneChild::Error do
50
+ el('<dummy />').accept(@v)
51
+ end
52
+ end
53
+ end
54
+
55
+ context 'visiting an element with two children' do
56
+ should 'raise exception' do
57
+ assert_raise VisitorHasOneAndOnlyOneChild::Error do
58
+ el(<<XML).accept(@v)
59
+ <dummy>
60
+ <son />
61
+ <son />
62
+ </dummy>
63
+ XML
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ context 'visitor that has zero or one child' do
70
+ class VisitorHasZeroOrOneChild
71
+ include VisitorPattern
72
+ include CustomError
73
+ include Children
74
+
75
+ has_zero_or_one('imscp:son')
76
+ end
77
+
78
+ setup do
79
+ @v = VisitorHasZeroOrOneChild.new
80
+ end
81
+
82
+ context 'visiting an element with one child' do
83
+ should 'visit the only one child' do
84
+ @v.expects(:visit_son).once
85
+ assert el('<dummy><son /></dummy>').accept(@v)
86
+ end
87
+
88
+ should 'provide an accessor method for the child' do
89
+ el('<dummy><son /></dummy>').accept(@v)
90
+ assert @v.respond_to?(:son)
91
+ assert_kind_of Son, @v.son
92
+ end
93
+
94
+ should 'call a visitor factory method during the visit' do
95
+ @v.expects(:son_visitor).once.returns(mock(:visit))
96
+ el('<dummy><son /></dummy>').accept(@v)
97
+ end
98
+ end
99
+
100
+ context 'visiting an element without the child' do
101
+ should 'raise nothing' do
102
+ assert_nothing_raised do
103
+ el('<dummy />').accept(@v)
104
+ end
105
+ end
106
+ end
107
+
108
+ context 'visiting an element with two children' do
109
+ should 'raise exception' do
110
+ assert_raise VisitorHasZeroOrOneChild::Error do
111
+ el(<<XML).accept(@v)
112
+ <dummy>
113
+ <son />
114
+ <son />
115
+ </dummy>
116
+ XML
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ context 'visitor that has one or more children' do
123
+ class VisitorHasOneOrMoreChildren
124
+ include VisitorPattern
125
+ include CustomError
126
+ include Children
127
+
128
+ has_one_or_more('imscp:son')
129
+ end
130
+
131
+ setup do
132
+ @v = VisitorHasOneOrMoreChildren.new
133
+ end
134
+
135
+ context 'visiting an element without a child' do
136
+ should 'raise exception' do
137
+ assert_raise VisitorHasOneOrMoreChildren::Error do
138
+ el('<dummy />').accept(@v)
139
+ end
140
+ end
141
+ end
142
+
143
+ context 'visiting an element with a child' do
144
+ should 'visit the child' do
145
+ @v.expects(:visit_sons)
146
+ assert el('<dummy><son /></dummy>').accept(@v)
147
+ end
148
+
149
+ should 'provide an accessor method for children' do
150
+ el('<dummy><son /></dummy>').accept(@v)
151
+ assert_kind_of Array, @v.sons
152
+ assert_equal 1, @v.sons.size
153
+ end
154
+
155
+ should 'call a visitor factory method during the visit' do
156
+ @v.expects(:son_visitor).once.returns(mock(:visit))
157
+ el('<dummy><son /></dummy>').accept(@v)
158
+ end
159
+ end
160
+
161
+ context 'visiting an element with two children' do
162
+ should 'visit the children' do
163
+ @v.expects(:visit_sons)
164
+ assert el(<<XML).accept(@v)
165
+ <dummy>
166
+ <son />
167
+ <son />
168
+ </dummy>
169
+ XML
170
+ end
171
+
172
+ should 'provide an accessor method for children' do
173
+ assert el(<<XML).accept(@v)
174
+ <dummy>
175
+ <son />
176
+ <son />
177
+ </dummy>
178
+ XML
179
+ assert_kind_of Array, @v.sons
180
+ assert_equal 2, @v.sons.size
181
+ end
182
+
183
+ should 'call a visitor factory method during the visit' do
184
+ @v.expects(:son_visitor).twice.returns(stub(:visit))
185
+ assert el(<<XML).accept(@v)
186
+ <dummy>
187
+ <son />
188
+ <son />
189
+ </dummy>
190
+ XML
191
+ end
192
+ end
193
+ end
194
+
195
+ context 'visitor that has zero or more children' do
196
+ class VisitorHasZeroOrMoreChildren
197
+ include VisitorPattern
198
+ include CustomError
199
+ include Children
200
+
201
+ has_zero_or_more('imscp:son')
202
+ end
203
+
204
+ setup do
205
+ @v = VisitorHasZeroOrMoreChildren.new
206
+ end
207
+
208
+ context 'visiting an element without a child' do
209
+ should 'not raise exception' do
210
+ assert_nothing_raised do
211
+ el('<dummy />').accept(@v)
212
+ end
213
+ end
214
+ end
215
+
216
+ context 'visiting an element with a child' do
217
+ should 'visit the child' do
218
+ @v.expects(:visit_sons)
219
+ assert el('<dummy><son /></dummy>').accept(@v)
220
+ end
221
+
222
+ should 'provide an accessor method for children' do
223
+ el('<dummy><son /></dummy>').accept(@v)
224
+ assert_kind_of Array, @v.sons
225
+ assert_equal 1, @v.sons.size
226
+ end
227
+
228
+ should 'call a visitor factory method during the visit' do
229
+ @v.expects(:son_visitor).once.returns(mock(:visit))
230
+ el('<dummy><son /></dummy>').accept(@v)
231
+ end
232
+ end
233
+
234
+ context 'visiting an element with two children' do
235
+ should 'visit the children' do
236
+ @v.expects(:visit_sons)
237
+ assert el(<<XML).accept(@v)
238
+ <dummy>
239
+ <son />
240
+ <son />
241
+ </dummy>
242
+ XML
243
+ end
244
+
245
+ should 'provide an accessor method for children' do
246
+ assert el(<<XML).accept(@v)
247
+ <dummy>
248
+ <son />
249
+ <son />
250
+ </dummy>
251
+ XML
252
+ assert_kind_of Array, @v.sons
253
+ assert_equal 2, @v.sons.size
254
+ end
255
+
256
+ should 'call a visitor factory method during the visit' do
257
+ @v.expects(:son_visitor).twice.returns(stub(:visit))
258
+ assert el(<<XML).accept(@v)
259
+ <dummy>
260
+ <son />
261
+ <son />
262
+ </dummy>
263
+ XML
264
+ end
265
+ end
266
+ end
267
+
268
+ context 'visitor has one grandson' do
269
+ class VisitorHasOneGrandson
270
+ include VisitorPattern
271
+ include CustomError
272
+ include Children
273
+
274
+ has_one_and_only_one './imscp:son/imscp:grandson'
275
+ end
276
+
277
+ setup do
278
+ @v = VisitorHasOneGrandson.new
279
+ end
280
+
281
+ should 'raise exception if the grandson does not exist' do
282
+ assert_raise VisitorHasOneGrandson::Error do
283
+ el('<dummy><grandson /></dummy>').accept(@v)
284
+ end
285
+ end
286
+
287
+ should 'visit the grandson' do
288
+ el(<<-XML).accept(@v)
289
+ <dummy>
290
+ <son>
291
+ <grandson />
292
+ </son>
293
+ </dummy>
294
+ XML
295
+ assert_kind_of Grandson, @v.grandson
296
+ end
297
+
298
+ should 'call the grandson_visitor method during the visit' do
299
+ @v.expects(:grandson_visitor).once.returns(mock(:visit))
300
+ el(<<-XML).accept(@v)
301
+ <dummy>
302
+ <son>
303
+ <grandson />
304
+ </son>
305
+ </dummy>
306
+ XML
307
+ end
308
+ end
309
+
310
+ context 'a visitor with the visitor option' do
311
+ class NamespacedVisitor
312
+ include VisitorPattern
313
+ include CustomError
314
+ include Children
315
+
316
+ has_one_and_only_one 'imscp:foo', visitor: :foo_bar
317
+ end
318
+
319
+ setup do
320
+ @v = NamespacedVisitor.new
321
+ @v.expects(:foo_bar_visitor).once.returns(mock(:visit))
322
+ end
323
+
324
+ should 'visits a child element using the visitor' do
325
+ el('<dummy><foo /></dummy>').accept(@v)
326
+ end
327
+ end
328
+ end
329
+ end
330
+ end
@@ -0,0 +1,80 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class CompletionThresholdTest < ActiveSupport::TestCase
6
+ include PartialManifest
7
+
8
+
9
+ context 'an <adlcp:completionThreshold> visitor' do
10
+ setup do
11
+ @v = CompletionThreshold.new
12
+ end
13
+
14
+ context 'visiting an <adlcp:completionThreshold> element' do
15
+ setup do
16
+ el(<<-XML).accept(@v)
17
+ <adlcp:completionThreshold
18
+ completedByMeasure = "true"
19
+ minProgressMeasure = "0.75"
20
+ progressWeight = "0.3" />
21
+ XML
22
+ end
23
+
24
+ should 'set completedByMeasure value as its attribute' do
25
+ assert_equal true, @v.completed_by_measure
26
+ end
27
+
28
+ should 'set minProgressMeasure value as its attribute' do
29
+ assert_equal 0.75, @v.min_progress_measure
30
+ end
31
+
32
+ should 'set progressWeight value as its attribute' do
33
+ assert_equal 0.3, @v.progress_weight
34
+ end
35
+ end
36
+
37
+ context 'visiting an empty <adlcp:completionThreshold> element' do
38
+ should 'set default values' do
39
+ el('<adlcp:completionThreshold />').accept(@v)
40
+ assert_equal false, @v.completed_by_measure
41
+ assert_equal 1.0, @v.min_progress_measure
42
+ assert_equal 1.0, @v.progress_weight
43
+ end
44
+ end
45
+
46
+ context 'visiting an <adlcp:completionThreshold> element with its attribute value out of range' do
47
+ should 'raise exception for too small minProgressMeasure' do
48
+ assert_error do
49
+ el('<adlcp:completionThreshold minProgressMeasure="-0.0001" />').accept(@v)
50
+ end
51
+ end
52
+
53
+ should 'raise exception for too large minProgressMeasure' do
54
+ assert_error do
55
+ el('<adlcp:completionThreshold minProgressMeasure="1.0001" />').accept(@v)
56
+ end
57
+ end
58
+
59
+ should 'raise exception for too small progressWeight' do
60
+ assert_error do
61
+ el('<adlcp:completionThreshold progressWeight="-0.0001" />').accept(@v)
62
+ end
63
+ end
64
+
65
+ should 'raise exception for too large progressWeight' do
66
+ assert_error do
67
+ el('<adlcp:completionThreshold progressWeight="1.0001" />').accept(@v)
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def assert_error(&block)
76
+ assert_raise CompletionThreshold::Error, &block
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class ConditionRuleTest < ActiveSupport::TestCase
6
+ include PartialManifest
7
+
8
+ setup do
9
+ @v = ConditionRule.new
10
+ end
11
+
12
+ test 'a visitor visits children' do
13
+ @v.expects(:rule_conditions_visitor).once.returns(mock(:visit))
14
+ @v.expects(:rule_action_visitor).once.returns(mock(:visit))
15
+ el(<<-XML).accept(@v)
16
+ <dummy>
17
+ <imsss:ruleConditions />
18
+ <imsss:ruleAction />
19
+ </dummy>
20
+ XML
21
+ end
22
+
23
+ test 'an element without <ruleConditions> causes error' do
24
+ assert_error do
25
+ el('<dummy><imsss:ruleAction /></dummy>').accept(@v)
26
+ end
27
+ end
28
+
29
+ test 'an element without <ruleAction> causes error' do
30
+ assert_error do
31
+ el('<dummy><imsss:ruleCondition></dummy>').accept(@v)
32
+ end
33
+ end
34
+
35
+ def assert_error(&block)
36
+ assert_raise ConditionRule::Error, &block
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class ConstrainedChoiceConsiderationsTest < ActiveSupport::TestCase
6
+ include PartialManifest
7
+
8
+ setup do
9
+ @v = ConstrainedChoiceConsiderations.new
10
+ end
11
+
12
+ test 'default values' do
13
+ el.accept @v
14
+ assert_equal false, @v.prevent_activation
15
+ assert_equal false, @v.constrain_choice
16
+ end
17
+
18
+ test 'attributes' do
19
+ el('<dummy preventActivation="1" constrainChoice="1" />').accept @v
20
+ assert_equal true, @v.prevent_activation
21
+ assert_equal true, @v.constrain_choice
22
+ end
23
+ end
24
+ end
25
+ end