scorm2004-manifest 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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