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.
- data/.document +5 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +36 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +94 -0
- data/Rakefile +39 -0
- data/VERSION +1 -0
- data/lib/scorm2004/manifest/adlseq_map_info.rb +17 -0
- data/lib/scorm2004/manifest/adlseq_objective.rb +14 -0
- data/lib/scorm2004/manifest/adlseq_objectives.rb +11 -0
- data/lib/scorm2004/manifest/attributes.rb +147 -0
- data/lib/scorm2004/manifest/children.rb +83 -0
- data/lib/scorm2004/manifest/completion_threshold.rb +13 -0
- data/lib/scorm2004/manifest/condition_rule.rb +12 -0
- data/lib/scorm2004/manifest/constrained_choice_considerations.rb +12 -0
- data/lib/scorm2004/manifest/control_mode.rb +16 -0
- data/lib/scorm2004/manifest/custom_error.rb +15 -0
- data/lib/scorm2004/manifest/data.rb +11 -0
- data/lib/scorm2004/manifest/data_from_lms.rb +21 -0
- data/lib/scorm2004/manifest/delivery_controls.rb +13 -0
- data/lib/scorm2004/manifest/dependency.rb +21 -0
- data/lib/scorm2004/manifest/error.rb +5 -0
- data/lib/scorm2004/manifest/file.rb +16 -0
- data/lib/scorm2004/manifest/hide_lmsui.rb +21 -0
- data/lib/scorm2004/manifest/href.rb +24 -0
- data/lib/scorm2004/manifest/item.rb +36 -0
- data/lib/scorm2004/manifest/limit_conditions.rb +12 -0
- data/lib/scorm2004/manifest/manifest.rb +26 -0
- data/lib/scorm2004/manifest/map.rb +13 -0
- data/lib/scorm2004/manifest/map_info.rb +15 -0
- data/lib/scorm2004/manifest/min_normalized_measure.rb +18 -0
- data/lib/scorm2004/manifest/navigation_interface.rb +10 -0
- data/lib/scorm2004/manifest/objective.rb +16 -0
- data/lib/scorm2004/manifest/objectives.rb +12 -0
- data/lib/scorm2004/manifest/organization.rb +20 -0
- data/lib/scorm2004/manifest/organizations.rb +24 -0
- data/lib/scorm2004/manifest/presentation.rb +10 -0
- data/lib/scorm2004/manifest/primary_objective.rb +24 -0
- data/lib/scorm2004/manifest/randomization_controls.rb +16 -0
- data/lib/scorm2004/manifest/resource.rb +18 -0
- data/lib/scorm2004/manifest/resources.rb +12 -0
- data/lib/scorm2004/manifest/rollup_action.rb +13 -0
- data/lib/scorm2004/manifest/rollup_condition.rb +24 -0
- data/lib/scorm2004/manifest/rollup_conditions.rb +14 -0
- data/lib/scorm2004/manifest/rollup_considerations.rb +17 -0
- data/lib/scorm2004/manifest/rollup_rule.rb +19 -0
- data/lib/scorm2004/manifest/rollup_rules.rb +16 -0
- data/lib/scorm2004/manifest/rule_action.rb +31 -0
- data/lib/scorm2004/manifest/rule_condition.rb +41 -0
- data/lib/scorm2004/manifest/rule_conditions.rb +14 -0
- data/lib/scorm2004/manifest/schema.rb +18 -0
- data/lib/scorm2004/manifest/schemaversion.rb +18 -0
- data/lib/scorm2004/manifest/sequencing.rb +24 -0
- data/lib/scorm2004/manifest/sequencing_collection.rb +11 -0
- data/lib/scorm2004/manifest/sequencing_rules.rb +13 -0
- data/lib/scorm2004/manifest/text_node.rb +11 -0
- data/lib/scorm2004/manifest/time_limit_action.rb +24 -0
- data/lib/scorm2004/manifest/title.rb +16 -0
- data/lib/scorm2004/manifest/visitor_pattern.rb +31 -0
- data/lib/scorm2004/manifest/xml_base.rb +38 -0
- data/lib/scorm2004/manifest.rb +76 -0
- data/lib/scorm2004-manifest.rb +1 -0
- data/test/functional_test.rb +45 -0
- data/test/helper.rb +18 -0
- data/test/mbce_test.rb +66 -0
- data/test/msce_test.rb +55 -0
- data/test/scorm2004/manifest/adlseq_map_info_test.rb +47 -0
- data/test/scorm2004/manifest/adlseq_objective_test.rb +44 -0
- data/test/scorm2004/manifest/adlseq_objectives_test.rb +29 -0
- data/test/scorm2004/manifest/any_uri_token_test.rb +40 -0
- data/test/scorm2004/manifest/attributes_test.rb +224 -0
- data/test/scorm2004/manifest/children_test.rb +330 -0
- data/test/scorm2004/manifest/completion_threshold_test.rb +80 -0
- data/test/scorm2004/manifest/condition_rule_test.rb +40 -0
- data/test/scorm2004/manifest/constrained_choice_considerations_test.rb +25 -0
- data/test/scorm2004/manifest/control_mode_test.rb +41 -0
- data/test/scorm2004/manifest/custom_error_test.rb +43 -0
- data/test/scorm2004/manifest/data_from_lms_test.rb +47 -0
- data/test/scorm2004/manifest/data_test.rb +31 -0
- data/test/scorm2004/manifest/delivery_controls_test.rb +27 -0
- data/test/scorm2004/manifest/dependency_test.rb +53 -0
- data/test/scorm2004/manifest/duration_attribute_test.rb +59 -0
- data/test/scorm2004/manifest/file_test.rb +40 -0
- data/test/scorm2004/manifest/hide_lmsui_test.rb +40 -0
- data/test/scorm2004/manifest/href_test.rb +43 -0
- data/test/scorm2004/manifest/item_test.rb +86 -0
- data/test/scorm2004/manifest/limit_conditions_test.rb +34 -0
- data/test/scorm2004/manifest/manifest_test.rb +152 -0
- data/test/scorm2004/manifest/map_info_test.rb +41 -0
- data/test/scorm2004/manifest/map_test.rb +32 -0
- data/test/scorm2004/manifest/min_normalized_measure_test.rb +28 -0
- data/test/scorm2004/manifest/navigation_interface_test.rb +29 -0
- data/test/scorm2004/manifest/non_negative_integer_attribute_test.rb +64 -0
- data/test/scorm2004/manifest/objective_test.rb +45 -0
- data/test/scorm2004/manifest/objectives_test.rb +37 -0
- data/test/scorm2004/manifest/organization_test.rb +115 -0
- data/test/scorm2004/manifest/organizations_test.rb +68 -0
- data/test/scorm2004/manifest/partial_manifest.rb +23 -0
- data/test/scorm2004/manifest/partial_manifest_test.rb +44 -0
- data/test/scorm2004/manifest/presentation_test.rb +26 -0
- data/test/scorm2004/manifest/primary_objective_test.rb +65 -0
- data/test/scorm2004/manifest/randomization_controls_test.rb +71 -0
- data/test/scorm2004/manifest/resource_test.rb +96 -0
- data/test/scorm2004/manifest/resources_test.rb +41 -0
- data/test/scorm2004/manifest/rollup_action_test.rb +33 -0
- data/test/scorm2004/manifest/rollup_condition_test.rb +42 -0
- data/test/scorm2004/manifest/rollup_conditions_test.rb +53 -0
- data/test/scorm2004/manifest/rollup_considerations_test.rb +42 -0
- data/test/scorm2004/manifest/rollup_rule_test.rb +87 -0
- data/test/scorm2004/manifest/rollup_rules_test.rb +60 -0
- data/test/scorm2004/manifest/rule_action_test.rb +79 -0
- data/test/scorm2004/manifest/rule_condition_test.rb +70 -0
- data/test/scorm2004/manifest/rule_conditions_test.rb +37 -0
- data/test/scorm2004/manifest/schema_test.rb +29 -0
- data/test/scorm2004/manifest/schemaversion_test.rb +29 -0
- data/test/scorm2004/manifest/sequencing_collection_test.rb +31 -0
- data/test/scorm2004/manifest/sequencing_rules_test.rb +36 -0
- data/test/scorm2004/manifest/sequencing_test.rb +42 -0
- data/test/scorm2004/manifest/string_attribute_test.rb +68 -0
- data/test/scorm2004/manifest/text_node_test.rb +37 -0
- data/test/scorm2004/manifest/time_limit_action_test.rb +51 -0
- data/test/scorm2004/manifest/title_test.rb +59 -0
- data/test/scorm2004/manifest/token_attribute_test.rb +53 -0
- data/test/scorm2004/manifest/visitor_pattern_test.rb +85 -0
- data/test/scorm2004/manifest/xml_base_test.rb +125 -0
- data/test/scorm2004/manifest_test.rb +33 -0
- data/test/scorm2004_test.rb +9 -0
- data/test/sece_test.rb +53 -0
- 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
|