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