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,24 @@
1
+ module Scorm2004
2
+ module Manifest
3
+ class TimeLimitAction
4
+ include VisitorPattern
5
+ include CustomError
6
+ include TextNode
7
+
8
+ def self.vocabulary
9
+ [ 'exit, message',
10
+ 'exit,no message',
11
+ 'continue, message',
12
+ 'continue,no message' ]
13
+ end
14
+
15
+ private
16
+
17
+ def do_visit
18
+ unless self.class.vocabulary.include?(content)
19
+ error("Invalid <adlcp:timeLimitAction> token: #{content}")
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ module Scorm2004
2
+ module Manifest
3
+ class Title
4
+ include VisitorPattern
5
+ include CustomError
6
+ include TextNode
7
+
8
+ private
9
+
10
+ def do_visit
11
+ error('Empty <title> element.') unless content.present?
12
+ error('The <title> element exceeds the SPM of 200 characters:') if content.length > 200
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ module Scorm2004
2
+ module Manifest
3
+ module VisitorPattern
4
+ attr_reader :el
5
+
6
+ def initialize(options = {})
7
+ @options = options
8
+ end
9
+
10
+ def visit(el)
11
+ @el = el
12
+ check_attributes if self.class.respond_to?(:attributes)
13
+ do_visit if self.respond_to?(:do_visit, true)
14
+ visit_children if self.class.respond_to?(:children)
15
+ self
16
+ end
17
+
18
+ def check_attributes
19
+ self.class.attributes.each do |attr|
20
+ send("check_#{attr}".intern)
21
+ end
22
+ end
23
+
24
+ def visit_children
25
+ self.class.children.each do |child|
26
+ send("visit_#{child}".intern)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ require 'uri'
2
+ require 'pathname'
3
+
4
+ module Scorm2004
5
+ module Manifest
6
+ module XmlBase
7
+ def base
8
+ normalize_path(parent_base ? resolve_base : relative_base)
9
+ end
10
+
11
+ private
12
+
13
+ def relative_base
14
+ value = el.at('./@xml:base', NS)
15
+ return unless value
16
+ error("Invalid XML Base value: #{value}") if %r!^/|[^/]$! =~ value
17
+ uri = URI(value)
18
+ uri.absolute? ? uri : Pathname(uri.path)
19
+ end
20
+
21
+ def parent_base
22
+ @options[:base]
23
+ end
24
+
25
+ def resolve_base
26
+ if relative_base.is_a?(URI)
27
+ relative_base
28
+ else
29
+ parent_base + relative_base.to_s
30
+ end
31
+ end
32
+
33
+ def normalize_path(path)
34
+ path.is_a?(Pathname) ? (Pathname('/') + path).relative_path_from(Pathname('/')) : path
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,76 @@
1
+ require 'nokogiri'
2
+ require 'active_support/core_ext'
3
+ require 'scorm2004/manifest/visitor_pattern'
4
+ require 'scorm2004/manifest/custom_error'
5
+ require 'scorm2004/manifest/attributes'
6
+ require 'scorm2004/manifest/children'
7
+ require 'scorm2004/manifest/xml_base'
8
+ require 'scorm2004/manifest/error'
9
+ require 'scorm2004/manifest/text_node'
10
+ require 'scorm2004/manifest/manifest'
11
+ require 'scorm2004/manifest/schema'
12
+ require 'scorm2004/manifest/schemaversion'
13
+ require 'scorm2004/manifest/resources'
14
+ require 'scorm2004/manifest/href'
15
+ require 'scorm2004/manifest/resource'
16
+ require 'scorm2004/manifest/file'
17
+ require 'scorm2004/manifest/dependency'
18
+ require 'scorm2004/manifest/organizations'
19
+ require 'scorm2004/manifest/organization'
20
+ require 'scorm2004/manifest/title'
21
+ require 'scorm2004/manifest/completion_threshold'
22
+ require 'scorm2004/manifest/item'
23
+ require 'scorm2004/manifest/time_limit_action'
24
+ require 'scorm2004/manifest/data_from_lms'
25
+ require 'scorm2004/manifest/presentation'
26
+ require 'scorm2004/manifest/navigation_interface'
27
+ require 'scorm2004/manifest/hide_lmsui'
28
+ require 'scorm2004/manifest/data.rb'
29
+ require 'scorm2004/manifest/map.rb'
30
+ require 'scorm2004/manifest/sequencing_collection'
31
+ require 'scorm2004/manifest/sequencing'
32
+ require 'scorm2004/manifest/control_mode'
33
+ require 'scorm2004/manifest/sequencing_rules'
34
+ require 'scorm2004/manifest/condition_rule'
35
+ require 'scorm2004/manifest/rule_conditions'
36
+ require 'scorm2004/manifest/rule_action'
37
+ require 'scorm2004/manifest/rule_condition'
38
+ require 'scorm2004/manifest/limit_conditions'
39
+ require 'scorm2004/manifest/rollup_rules'
40
+ require 'scorm2004/manifest/rollup_rule'
41
+ require 'scorm2004/manifest/rollup_conditions'
42
+ require 'scorm2004/manifest/rollup_condition'
43
+ require 'scorm2004/manifest/rollup_action'
44
+ require 'scorm2004/manifest/objectives'
45
+ require 'scorm2004/manifest/primary_objective'
46
+ require 'scorm2004/manifest/min_normalized_measure'
47
+ require 'scorm2004/manifest/map_info'
48
+ require 'scorm2004/manifest/objective'
49
+ require 'scorm2004/manifest/randomization_controls'
50
+ require 'scorm2004/manifest/delivery_controls'
51
+ require 'scorm2004/manifest/constrained_choice_considerations'
52
+ require 'scorm2004/manifest/rollup_considerations'
53
+ require 'scorm2004/manifest/adlseq_objectives'
54
+ require 'scorm2004/manifest/adlseq_objective'
55
+ require 'scorm2004/manifest/adlseq_map_info'
56
+
57
+ module Scorm2004
58
+ def self.Manifest(*args)
59
+ Scorm2004::Manifest.parse(*args)
60
+ end
61
+
62
+ module Manifest
63
+ NS = {
64
+ 'imscp' => "http://www.imsglobal.org/xsd/imscp_v1p1",
65
+ 'adlcp' => "http://www.adlnet.org/xsd/adlcp_v1p3",
66
+ 'adlseq' => "http://www.adlnet.org/xsd/adlseq_v1p3",
67
+ 'adlnav' => "http://www.adlnet.org/xsd/adlnav_v1p3",
68
+ 'imsss' => "http://www.imsglobal.org/xsd/imsss"
69
+ }
70
+
71
+ def self.parse(*args)
72
+ manifest_visitor = Scorm2004::Manifest::Manifest.new
73
+ Nokogiri::XML(*args) { |config| config.strict.noent }.root.accept manifest_visitor
74
+ end
75
+ end
76
+ end
@@ -0,0 +1 @@
1
+ require 'scorm2004/manifest'
@@ -0,0 +1,45 @@
1
+ require 'pathname'
2
+ require 'open-uri'
3
+
4
+ module FunctionalTest
5
+ @@tmpdir = Pathname('../tmp')
6
+
7
+ def self.included(base)
8
+ base.extend ClassMethods
9
+ end
10
+
11
+ def xml
12
+ File.exists?(cache_path) ? open(cache_path) : download
13
+ end
14
+
15
+ def gist_url
16
+ "https://raw.github.com/gist/#{gist_id}/imsmanifest.xml"
17
+ end
18
+
19
+ def download
20
+ File.open(cache_path, 'wb') do |f|
21
+ f.write open(gist_url, proxy: ENV['http_proxy']).read
22
+ end
23
+ end
24
+
25
+ def cache_path
26
+ create_tmpdir + "#{nickname}.xml"
27
+ end
28
+
29
+ def create_tmpdir
30
+ if File.exist?(@@tmpdir) && File.directory?(@@tmpdir)
31
+ @@tmpdir
32
+ else
33
+ Pathname(FileUtils.mkdir_p(tmpdir).first)
34
+ end
35
+ end
36
+
37
+ module ClassMethods
38
+ attr_reader :gist_id, :nickname
39
+
40
+ def gist(gist_id, nickname)
41
+ define_method(:gist_id) { gist_id }
42
+ define_method(:nickname) { nickname }
43
+ end
44
+ end
45
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'active_support/test_case'
12
+ require 'shoulda-context'
13
+ require 'mocha'
14
+
15
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
16
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
17
+ require 'scorm2004-manifest'
18
+ require 'scorm2004/manifest/partial_manifest'
data/test/mbce_test.rb ADDED
@@ -0,0 +1,66 @@
1
+ require_relative 'helper'
2
+ require_relative 'functional_test'
3
+
4
+ class MbceTest < ActiveSupport::TestCase
5
+ include FunctionalTest
6
+
7
+ gist 201036, 'mbce'
8
+
9
+ test 'parsing imsmanifest.xml of ADL SCORM 2004 4th Edition MBCE' do
10
+ manifest = Scorm2004::Manifest(xml)
11
+
12
+ # <manifest>
13
+ assert_equal 'LMSTestPackage_T-01b', manifest.identifier
14
+ assert_equal '1.0', manifest.version
15
+
16
+ # <resources>
17
+ resources = manifest.resources
18
+
19
+ # <resource>
20
+ resource_0 = resources.resources[0]
21
+ assert_equal 'RES-0E255857-7E71-D9B4-3AFB-3F743420BFC7', resource_0.identifier
22
+ assert_equal 'asset', resource_0.scorm_type
23
+
24
+ resource_1 = resources.resources[1]
25
+ assert_equal 'RES-A5C12CB1-389E-4B4D-2420-2F194C3E51C0', resource_1.identifier
26
+ assert_equal 'sco', resource_1.scorm_type
27
+ assert_equal 'MBCE/01_introduction_to_manifests.html', resource_1.href
28
+ assert_equal 1, resource_1.files.size
29
+ assert_equal 1, resource_1.dependencies.size
30
+
31
+ # <file>
32
+ assert_equal 11, resource_0.files.size
33
+ file_0 = resource_0.files[0]
34
+ assert_equal 'Shared%20Files/scripts/APIWrapper.js', file_0.href
35
+
36
+ # <dependency>
37
+ dependency_0 = resource_1.dependencies[0]
38
+ assert_equal 'RES-0E255857-7E71-D9B4-3AFB-3F743420BFC7', dependency_0.identifierref
39
+
40
+ # <organizations>
41
+ organizations = manifest.organizations
42
+ assert_equal 'ORG-AAE040C6-5D31-FF80-7A74-C93346D3DE42', organizations.default
43
+ assert_equal 1, organizations.organizations.size
44
+
45
+ # <organization>
46
+ organization = organizations.organizations.first
47
+ assert_equal 'ORG-AAE040C6-5D31-FF80-7A74-C93346D3DE42', organization.identifier
48
+ assert_equal 'SCORM 2004 4th Edition Manifest Basics Content Example 1.0', organization.title.to_s
49
+
50
+ # <sequencing>
51
+ sequencing = organization.sequencing
52
+ assert_equal true, sequencing.control_mode.flow
53
+
54
+ # <item>
55
+ item_0 = organization.items[0]
56
+ assert_equal 'ITEM-5C1908B3-BD20-5B1D-0586-F9B3EA30732D', item_0.identifier
57
+ assert_equal true, item_0.isvisible
58
+ assert_equal 'RES-A5C12CB1-389E-4B4D-2420-2F194C3E51C0', item_0.identifierref
59
+ assert_equal 'Introduction to Manifests', item_0.title.to_s
60
+
61
+ # <presentation>
62
+ assert_equal 'continue', item_0.presentation.navigation_interface.hide_lmsuis[0].to_s
63
+ assert_equal 'previous', item_0.presentation.navigation_interface.hide_lmsuis[1].to_s
64
+ end
65
+ end
66
+
data/test/msce_test.rb ADDED
@@ -0,0 +1,55 @@
1
+ require_relative 'helper'
2
+ require_relative 'functional_test'
3
+
4
+ class MsceTest < ActiveSupport::TestCase
5
+ include FunctionalTest
6
+
7
+ gist 2034296, 'msce'
8
+
9
+ test 'parsing imsmanifest.xml of ADL SCORM 2004 4th Edition MSCE' do
10
+ manifest = Scorm2004::Manifest(xml)
11
+
12
+ # <manifest>
13
+ assert_equal 'LMSTestPackage_RU-12b', manifest.identifier
14
+
15
+ # <organizations>
16
+ organizations = manifest.organizations
17
+ assert_equal 'org1', organizations.default
18
+
19
+ # <organization>
20
+ organization = organizations.organizations.first
21
+ assert_equal 'org1', organization.identifier
22
+
23
+ # <item>
24
+ pretest = organization.items.find { |item| item.identifier == 'pretest' }
25
+ assert_equal 'Pre-Assessment', pretest.title.to_s
26
+
27
+ # <sequencingRules>
28
+ rule = pretest.sequencing.sequencing_rules.pre_condition_rules.first
29
+ assert_equal 'attempted', rule.rule_conditions.rule_conditions.first.condition
30
+ assert_equal 'skip', rule.rule_action.action
31
+
32
+ # <objectives>
33
+ assert_equal false, pretest.sequencing.rollup_rules.rollup_objective_satisfied
34
+ assert_equal 'PRIMARYOBJ', pretest.sequencing.objectives.primary_objective.objective_id
35
+ objectives = pretest.sequencing.objectives.objectives
36
+ obj1 = objectives[0]
37
+ assert_equal 'obj_module_1', obj1.objective_id
38
+ map_info = obj1.map_infos[0]
39
+ assert_equal 'obj_module_1', map_info.target_objective_id
40
+ assert_equal false, map_info.read_satisfied_status
41
+ assert_equal false, map_info.read_normalized_measure
42
+ assert_equal true, map_info.write_satisfied_status
43
+ assert_equal true, map_info.write_normalized_measure
44
+
45
+ # assessment activity
46
+ assessment = organization.items.find { |item| item.identifier == 'assessment' }
47
+ module1 = assessment.items.find { |item| item.identifier == 'assess-module1' }
48
+ sequencing = module1.sequencing
49
+ rollup_rule = sequencing.rollup_rules.rollup_rules[0]
50
+ condition = rollup_rule.rollup_conditions.rollup_conditions[0]
51
+ assert_equal 'attempted', condition.condition
52
+ assert_equal 'completed', rollup_rule.rollup_action.action
53
+ assert_equal 'ifNotSkipped', sequencing.rollup_considerations.required_for_completed
54
+ end
55
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class AdlseqMapInfoTest < ActiveSupport::TestCase
6
+ include PartialManifest
7
+
8
+ class << self
9
+ def flags
10
+ AdlseqMapInfo.attributes - [:target_objective_id]
11
+ end
12
+
13
+ def default(attr)
14
+ /^read/ =~ attr ? true : false
15
+ end
16
+ end
17
+
18
+ setup do
19
+ @v = AdlseqMapInfo.new
20
+ end
21
+
22
+ test 'an empty element causes error' do
23
+ assert_raise(AdlseqMapInfo::Error) { el.accept @v }
24
+ end
25
+
26
+ flags.each do |attr|
27
+ test "default value of #{attr.to_s.camelize :lower}" do
28
+ el('<dummy targetObjectiveID="foo" />').accept @v
29
+ assert_equal default(attr), @v.send(attr)
30
+ end
31
+ end
32
+
33
+ flags.each do |attr|
34
+ test "#{attr.to_s.camelize :lower} = #{!default(attr)}" do
35
+ el("<dummy targetObjectiveID='bar' #{attr.to_s.camelize :lower}='#{!default(attr)}' />")
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+
42
+ def default(attr)
43
+ self.class.default attr
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,44 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class AdlseqObjectiveTest < ActiveSupport::TestCase
6
+ include PartialManifest
7
+
8
+ setup do
9
+ @v = AdlseqObjective.new
10
+ end
11
+
12
+ test 'an empty element causes error' do
13
+ assert_error { el.accept @v }
14
+ end
15
+
16
+ test 'an element must have the objectiveID attribute' do
17
+ assert_error { el('<dummy><adlseq:mapInfo /></dummy').accept @v }
18
+ end
19
+
20
+ test 'an element must have at least one <adlseq:mapInfo>' do
21
+ assert_error { el('<dummy objectiveID="foo" />').accept @v }
22
+ end
23
+
24
+ test 'a valid element' do
25
+ map_info_visitor = mock()
26
+ map_info_visitor.expects(:visit).twice
27
+ @v.expects(:adlseq_map_info_visitor).twice.returns(map_info_visitor)
28
+ el(<<-XML).accept @v
29
+ <dummy objectiveID="bar">
30
+ <adlseq:mapInfo />
31
+ <adlseq:mapInfo />
32
+ </dummy>
33
+ XML
34
+ assert_equal 'bar', @v.objective_id
35
+ end
36
+
37
+ private
38
+
39
+ def assert_error &block
40
+ assert_raise AdlseqObjective::Error, &block
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class AdlseqObjectivesTest < ActiveSupport::TestCase
6
+ include PartialManifest
7
+
8
+ setup do
9
+ @v = AdlseqObjectives.new
10
+ end
11
+
12
+ test 'an empty element cause error' do
13
+ assert_raise(AdlseqObjectives::Error) { el.accept @v }
14
+ end
15
+
16
+ test 'visiting multiple <adlseq:objective>' do
17
+ objective_visitor = mock()
18
+ objective_visitor.expects(:visit).twice
19
+ @v.expects(:adlseq_objective_visitor).twice.returns(objective_visitor)
20
+ el(<<-XML).accept @v
21
+ <dummy>
22
+ <adlseq:objective />
23
+ <adlseq:objective />
24
+ </dummy>
25
+ XML
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../helper'
2
+
3
+ module Scorm2004
4
+ module Manifest
5
+ class AnyUriTokenTest < ActiveSupport::TestCase
6
+ include PartialManifest
7
+
8
+ class Visitor
9
+ include VisitorPattern
10
+ include CustomError
11
+ include Attributes
12
+
13
+ attribute :any_uri, 'foo'
14
+ end
15
+
16
+ setup do
17
+ @v = Visitor.new
18
+ end
19
+
20
+ valid_uris = [
21
+ ' http://example.com/a ',
22
+ ' path/to/somewhere '
23
+ ]
24
+
25
+ valid_uris.each do |valid_uri|
26
+ tag = "<dummy foo='#{valid_uri}' />"
27
+ test tag do
28
+ el(tag).accept(@v)
29
+ assert_equal URI(valid_uri).to_s, @v.foo
30
+ end
31
+ end
32
+
33
+ test 'invalid uri causes error' do
34
+ assert_raise Visitor::Error do
35
+ el('<dummy foo=" a b c " />').accept(@v)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end