qti 2.17.0 → 2.19.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.
- checksums.yaml +4 -4
- data/lib/qti/v1/models/assessment.rb +12 -2
- data/lib/qti/v1/models/assessment_item.rb +21 -0
- data/lib/qti/v1/models/bank_entry_item.rb +27 -0
- data/lib/qti/v1/models/interactions/base_interaction.rb +10 -0
- data/lib/qti/v2/models/assessment_test.rb +4 -0
- data/lib/qti/version.rb +1 -1
- data/lib/qti.rb +5 -0
- data/spec/fixtures/items_1.2/bank_entry_item.xml +14 -0
- data/spec/fixtures/items_1.2/true_false.xml +1 -1
- data/spec/fixtures/items_1.2/true_false_with_calculator.xml +90 -0
- data/spec/fixtures/test_qti_1.2_bank_entry_item/imsmanifest.xml +33 -0
- data/spec/fixtures/test_qti_1.2_bank_entry_item/quiz.xml +14 -0
- data/spec/lib/qti/v1/models/assessment_item_spec.rb +20 -0
- data/spec/lib/qti/v1/models/assessment_spec.rb +18 -0
- data/spec/lib/qti/v1/models/bank_entry_item_spec.rb +12 -0
- data/spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb +14 -0
- data/spec/lib/qti/v2/models/assessment_test_spec.rb +9 -0
- data/spec/lib/qti_spec.rb +20 -0
- metadata +13 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 59b8ff402b8251fba645448e0c6159d73cbfbaa383d7a796c379136ba5b957bc
|
|
4
|
+
data.tar.gz: 9b3d848749f95e31dc095c0b3d8b6eddafdc4eb2eed7fc775b5c3d34a696e56e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9487c787ace952ccb0771573bf7293c3797982c411f3c21af35bd57fca53b1a956cf593650aff155af2ea29471e59efa7586bf89a39cf9485396790d62ecc37e
|
|
7
|
+
data.tar.gz: c23ecddd40c5dc43e7078b66e569658fa34e25e5511d4999252b9e81cd0bc72ddb098fa64c1f99b6dcf5056ed38b40150b385e6ac6cfad8ca3a77081e9899490
|
|
@@ -15,11 +15,12 @@ module Qti
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def assessment_items
|
|
18
|
-
@doc.xpath("//*[self::#{GROUP_ID} or self::xmlns:item[not(ancestor::#{GROUP_ID})]
|
|
18
|
+
@doc.xpath("//*[self::#{GROUP_ID} or self::xmlns:item[not(ancestor::#{GROUP_ID})]" \
|
|
19
|
+
' or self::xmlns:bankentry_item]')
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
def create_assessment_item(assessment_item)
|
|
22
|
-
return nil if sub_section?(assessment_item)
|
|
23
|
+
return nil if sub_section?(assessment_item) || bank_entry_item?(assessment_item)
|
|
23
24
|
item = Qti::V1::Models::AssessmentItem.new(assessment_item, @package_root, self)
|
|
24
25
|
item.manifest = manifest
|
|
25
26
|
item
|
|
@@ -39,6 +40,11 @@ module Qti
|
|
|
39
40
|
Qti::V1::Models::QuestionGroup.new(group_ref)
|
|
40
41
|
end
|
|
41
42
|
|
|
43
|
+
def create_bank_entry_item(bank_entry_item_ref)
|
|
44
|
+
return nil unless bank_entry_item?(bank_entry_item_ref)
|
|
45
|
+
Qti::V1::Models::BankEntryItem.new(bank_entry_item_ref)
|
|
46
|
+
end
|
|
47
|
+
|
|
42
48
|
private
|
|
43
49
|
|
|
44
50
|
def sub_section?(ref_node)
|
|
@@ -57,6 +63,10 @@ module Qti
|
|
|
57
63
|
def question_group?(ref_node)
|
|
58
64
|
ref_node.xpath("self::#{GROUP_ID}").present?
|
|
59
65
|
end
|
|
66
|
+
|
|
67
|
+
def bank_entry_item?(ref_node)
|
|
68
|
+
ref_node.xpath('self::xmlns:bankentry_item').present?
|
|
69
|
+
end
|
|
60
70
|
end
|
|
61
71
|
end
|
|
62
72
|
end
|
|
@@ -84,6 +84,27 @@ module Qti
|
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
+
def calculator_type
|
|
88
|
+
@calculator_type ||= begin
|
|
89
|
+
if calculator_type_metadata?
|
|
90
|
+
calculator_type_metadata_label = qti_metadata_children.children.find do |node|
|
|
91
|
+
node.text == 'calculator_type'
|
|
92
|
+
end
|
|
93
|
+
calculator_type_metadata_label.next.text
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def calculator_type_metadata?
|
|
99
|
+
if @doc.at_xpath('.//xmlns:qtimetadata').present?
|
|
100
|
+
qti_metadata_children.children.find do |node|
|
|
101
|
+
node.text == 'calculator_type'
|
|
102
|
+
end.present?
|
|
103
|
+
else
|
|
104
|
+
false
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
87
108
|
def decvar_maxvalue
|
|
88
109
|
@doc.at_xpath('.//xmlns:decvar/@maxvalue')&.value&.to_i ||
|
|
89
110
|
@doc.at_xpath('.//xmlns:decvar/@defaultval')&.value&.to_i || 0
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Qti
|
|
2
|
+
module V1
|
|
3
|
+
module Models
|
|
4
|
+
class BankEntryItem < Qti::V1::Models::Base
|
|
5
|
+
attr_reader :doc
|
|
6
|
+
|
|
7
|
+
def initialize(item, package_root = nil)
|
|
8
|
+
@doc = item
|
|
9
|
+
@path = item.document.url
|
|
10
|
+
self.package_root = package_root
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def sourcebank_ref
|
|
14
|
+
@sourcebank_ref ||= @doc.attribute('sourcebank_ref').value
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def item_ref
|
|
18
|
+
@item_ref ||= @doc.attribute('item_ref').value
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def points_possible
|
|
22
|
+
@points_possible ||= @doc.attribute('points_possible')&.value || 1
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -40,6 +40,16 @@ module Qti
|
|
|
40
40
|
@node.at_xpath('.//xmlns:render_choice/@shuffle')&.value.try(:downcase) == 'yes'
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
def locked_choices
|
|
44
|
+
return [] unless shuffled?
|
|
45
|
+
|
|
46
|
+
@node.xpath('.//xmlns:response_label').filter_map.with_index do |answer_node, index|
|
|
47
|
+
is_locked = answer_node.attributes['lock']&.value&.downcase == 'yes'
|
|
48
|
+
|
|
49
|
+
is_locked ? index : nil
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
43
53
|
def scoring_data_structs
|
|
44
54
|
raise NotImplementedError
|
|
45
55
|
end
|
|
@@ -44,6 +44,10 @@ module Qti
|
|
|
44
44
|
def create_stimulus(stimulus_ref)
|
|
45
45
|
Qti::V2::Models::StimulusItem.new(path: stimulus_ref, package_root: @package_root, html: true)
|
|
46
46
|
end
|
|
47
|
+
|
|
48
|
+
def create_bank_entry_item(_bank_entry_item_ref = nil)
|
|
49
|
+
nil # we don't support this in QTI V2 yet
|
|
50
|
+
end
|
|
47
51
|
end
|
|
48
52
|
end
|
|
49
53
|
end
|
data/lib/qti/version.rb
CHANGED
data/lib/qti.rb
CHANGED
|
@@ -68,6 +68,10 @@ module Qti
|
|
|
68
68
|
def create_question_group(question_group_ref)
|
|
69
69
|
@import.create_question_group(question_group_ref)
|
|
70
70
|
end
|
|
71
|
+
|
|
72
|
+
def create_bank_entry_item(bank_entry_item_ref)
|
|
73
|
+
@import.create_bank_entry_item(bank_entry_item_ref)
|
|
74
|
+
end
|
|
71
75
|
end
|
|
72
76
|
|
|
73
77
|
def self.configuration
|
|
@@ -117,6 +121,7 @@ require 'qti/v1/models/object_bank'
|
|
|
117
121
|
require 'qti/v1/models/scoring_data'
|
|
118
122
|
require 'qti/v1/models/stimulus_item'
|
|
119
123
|
require 'qti/v1/models/question_group'
|
|
124
|
+
require 'qti/v1/models/bank_entry_item'
|
|
120
125
|
|
|
121
126
|
require 'qti/v1/models/interactions/base_interaction'
|
|
122
127
|
require 'qti/v1/models/interactions/choice_interaction'
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
|
|
3
|
+
<assessment ident="i1211c711ada74a559ee1b6c122358695" title="Question Groups">
|
|
4
|
+
<qtimetadata>
|
|
5
|
+
<qtimetadatafield>
|
|
6
|
+
<fieldlabel>cc_maxattempts</fieldlabel>
|
|
7
|
+
<fieldentry>1</fieldentry>
|
|
8
|
+
</qtimetadatafield>
|
|
9
|
+
</qtimetadata>
|
|
10
|
+
<section ident="root_section">
|
|
11
|
+
<bankentry_item sourcebank_ref="gafe7177102bee6759845b002c5de397c" item_ref="ge0c6b84f2afc834ec575718bbc1451ff" points_possible="2.0"/>
|
|
12
|
+
</section>
|
|
13
|
+
</assessment>
|
|
14
|
+
</questestinterop>
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
</material>
|
|
22
22
|
<response_lid ident="QUE_1004_RL" rcardinality="Single" rtiming="No">
|
|
23
23
|
<render_choice shuffle="Yes">
|
|
24
|
-
<response_label ident="QUE_1005_A1">
|
|
24
|
+
<response_label ident="QUE_1005_A1" lock="Yes">
|
|
25
25
|
<material>
|
|
26
26
|
<mattext texttype="text/html"><![CDATA[True]]></mattext>
|
|
27
27
|
</material>
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
2
|
+
<questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
|
|
3
|
+
<assessment title="1.2 Import Quiz" ident="A1001">
|
|
4
|
+
<section title="Main" ident="S1002">
|
|
5
|
+
<item title="Grading - specific - 3 pt score" ident="QUE_1003">
|
|
6
|
+
<itemmetadata>
|
|
7
|
+
<qtimetadata>
|
|
8
|
+
<qtimetadatafield>
|
|
9
|
+
<fieldlabel>question_type</fieldlabel>
|
|
10
|
+
<fieldentry>true_false_question</fieldentry>
|
|
11
|
+
</qtimetadatafield>
|
|
12
|
+
<qtimetadatafield>
|
|
13
|
+
<fieldlabel>assessment_question_identifierref</fieldlabel>
|
|
14
|
+
<fieldentry>iff205c7405d3b36bdca9b75b51198932</fieldentry>
|
|
15
|
+
</qtimetadatafield>
|
|
16
|
+
<qtimetadatafield>
|
|
17
|
+
<fieldlabel>calculator_type</fieldlabel>
|
|
18
|
+
<fieldentry>basic</fieldentry>
|
|
19
|
+
</qtimetadatafield>
|
|
20
|
+
</qtimetadata>
|
|
21
|
+
</itemmetadata>
|
|
22
|
+
<presentation>
|
|
23
|
+
<material>
|
|
24
|
+
<mattext texttype="text/html"><![CDATA[If I get a 3, I must have done something wrong. <img data-equation-content="sample equation" script="alert('bad')" align="bottom" alt="image.png" src="org0/images/image.png" border="0"/> <img script="alert('bad')" align="bottom" alt="image.png" src="org0/images/image.png" border="0"/>]]></mattext>
|
|
25
|
+
</material>
|
|
26
|
+
<response_lid ident="QUE_1004_RL" rcardinality="Single" rtiming="No">
|
|
27
|
+
<render_choice shuffle="Yes">
|
|
28
|
+
<response_label ident="QUE_1005_A1">
|
|
29
|
+
<material>
|
|
30
|
+
<mattext texttype="text/html"><![CDATA[True]]></mattext>
|
|
31
|
+
</material>
|
|
32
|
+
</response_label>
|
|
33
|
+
<response_label ident="QUE_1006_A2">
|
|
34
|
+
<material>
|
|
35
|
+
<mattext texttype="text/html"><![CDATA[False]]></mattext>
|
|
36
|
+
</material>
|
|
37
|
+
</response_label>
|
|
38
|
+
</render_choice>
|
|
39
|
+
</response_lid>
|
|
40
|
+
</presentation>
|
|
41
|
+
<resprocessing>
|
|
42
|
+
<outcomes>
|
|
43
|
+
<decvar vartype="Decimal" defaultval="0" varname="que_score"/>
|
|
44
|
+
</outcomes>
|
|
45
|
+
<respcondition>
|
|
46
|
+
<conditionvar>
|
|
47
|
+
<varequal respident="QUE_1004_RL">QUE_1005_A1</varequal>
|
|
48
|
+
</conditionvar>
|
|
49
|
+
<setvar varname="que_score" action="Add">0</setvar>
|
|
50
|
+
</respcondition>
|
|
51
|
+
<respcondition>
|
|
52
|
+
<conditionvar>
|
|
53
|
+
<varequal respident="QUE_1004_RL">QUE_1006_A2</varequal>
|
|
54
|
+
</conditionvar>
|
|
55
|
+
<setvar varname="que_score" action="Set">10.00</setvar>
|
|
56
|
+
<displayfeedback feedbacktype="Response" linkrefid="fb_QUE_1006_A2"/>
|
|
57
|
+
</respcondition>
|
|
58
|
+
</resprocessing>
|
|
59
|
+
<itemfeedback ident="general_fb">
|
|
60
|
+
<flow_mat>
|
|
61
|
+
<material>
|
|
62
|
+
<mattext texttype="text/html"><p>Neutral</p><img script="alert('bad')" alt="image.png" src="org0/images/image.png"/></mattext>
|
|
63
|
+
</material>
|
|
64
|
+
</flow_mat>
|
|
65
|
+
</itemfeedback>
|
|
66
|
+
<itemfeedback ident="correct_fb">
|
|
67
|
+
<flow_mat>
|
|
68
|
+
<material>
|
|
69
|
+
<mattext texttype="text/html"><p>Correct</p><img script="alert('bad')" alt="image.png" src="org0/images/image.png"/></mattext>
|
|
70
|
+
</material>
|
|
71
|
+
</flow_mat>
|
|
72
|
+
</itemfeedback>
|
|
73
|
+
<itemfeedback ident="general_incorrect_fb">
|
|
74
|
+
<flow_mat>
|
|
75
|
+
<material>
|
|
76
|
+
<mattext texttype="text/html"><p>Incorrect</p><img script="alert('bad')" alt="image.png" src="org0/images/image.png"/></mattext>
|
|
77
|
+
</material>
|
|
78
|
+
</flow_mat>
|
|
79
|
+
</itemfeedback>
|
|
80
|
+
<itemfeedback ident="fb_QUE_1006_A2">
|
|
81
|
+
<flow_mat>
|
|
82
|
+
<material>
|
|
83
|
+
<mattext texttype="text/html"><p>Answer was Correct</p><img script="alert('bad')" alt="image.png" src="org0/images/image.png"/></mattext>
|
|
84
|
+
</material>
|
|
85
|
+
</flow_mat>
|
|
86
|
+
</itemfeedback>
|
|
87
|
+
</item>
|
|
88
|
+
</section>
|
|
89
|
+
</assessment>
|
|
90
|
+
</questestinterop>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<manifest identifier="MANIFEST1" xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
|
|
3
|
+
xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
|
|
4
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
5
|
+
xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">
|
|
6
|
+
<metadata>
|
|
7
|
+
<schema>IMS Content</schema>
|
|
8
|
+
<schemaversion>1.1.3</schemaversion>
|
|
9
|
+
<imsmd:lom>
|
|
10
|
+
<imsmd:general>
|
|
11
|
+
<imsmd:identifier>
|
|
12
|
+
<imsmd:langstring xml:lang="en-US">52BF3E44F087427782489C7DC5CAB5FD</imsmd:langstring>
|
|
13
|
+
</imsmd:identifier>
|
|
14
|
+
<imsmd:title>
|
|
15
|
+
<imsmd:langstring xml:lang="en-US">Quiz (Respondus IMS QTI export)</imsmd:langstring>
|
|
16
|
+
</imsmd:title>
|
|
17
|
+
</imsmd:general>
|
|
18
|
+
</imsmd:lom>
|
|
19
|
+
</metadata>
|
|
20
|
+
<organizations default="EXAM1">
|
|
21
|
+
<organization identifier="EXAM1" structure="hierarchical">
|
|
22
|
+
<title>default</title>
|
|
23
|
+
<item identifier="ITEM1" identifierref="RESOURCE1">
|
|
24
|
+
<title>Exam 1</title>
|
|
25
|
+
</item>
|
|
26
|
+
</organization>
|
|
27
|
+
</organizations>
|
|
28
|
+
<resources>
|
|
29
|
+
<resource identifier="RESOURCE1" type="imsqti_xmlv1p2" href="quiz.xml">
|
|
30
|
+
<file href="quiz.xml" />
|
|
31
|
+
</resource>
|
|
32
|
+
</resources>
|
|
33
|
+
</manifest>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
|
|
3
|
+
<assessment ident="i1211c711ada74a559ee1b6c122358695" title="Question Groups">
|
|
4
|
+
<qtimetadata>
|
|
5
|
+
<qtimetadatafield>
|
|
6
|
+
<fieldlabel>cc_maxattempts</fieldlabel>
|
|
7
|
+
<fieldentry>1</fieldentry>
|
|
8
|
+
</qtimetadatafield>
|
|
9
|
+
</qtimetadata>
|
|
10
|
+
<section ident="root_section">
|
|
11
|
+
<bankentry_item sourcebank_ref="gafe7177102bee6759845b002c5de397c" item_ref="ge0c6b84f2afc834ec575718bbc1451ff"/>
|
|
12
|
+
</section>
|
|
13
|
+
</assessment>
|
|
14
|
+
</questestinterop>
|
|
@@ -115,6 +115,26 @@ describe Qti::V1::Models::AssessmentItem do
|
|
|
115
115
|
end
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
+
describe '#calculator_type' do
|
|
119
|
+
let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
|
|
120
|
+
let(:assessment_item_refs) { test_object.assessment_items }
|
|
121
|
+
let(:loaded_class) { described_class.new(assessment_item_refs) }
|
|
122
|
+
|
|
123
|
+
context 'when it does not contain calculator_type metadata' do
|
|
124
|
+
let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'true_false.xml') }
|
|
125
|
+
it 'returns nil' do
|
|
126
|
+
expect(loaded_class.calculator_type).to be_nil
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
context 'when it contains calculator_type metadata' do
|
|
131
|
+
let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'true_false_with_calculator.xml') }
|
|
132
|
+
it 'returns the calculator_type value' do
|
|
133
|
+
expect(loaded_class.calculator_type).to eq 'basic'
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
118
138
|
describe '#scoring_data_structs' do
|
|
119
139
|
it 'grabs the rcardinality and scoring data value' do
|
|
120
140
|
struct = loaded_class.send(:scoring_data_structs)
|
|
@@ -228,4 +228,22 @@ describe Qti::V1::Models::Assessment do
|
|
|
228
228
|
).to eq(nil)
|
|
229
229
|
end
|
|
230
230
|
end
|
|
231
|
+
|
|
232
|
+
describe 'bank entry items' do
|
|
233
|
+
let(:fixtures_path) { File.join('spec', 'fixtures', 'items_1.2') }
|
|
234
|
+
let(:test_object) { described_class.from_path!(file_path) }
|
|
235
|
+
let(:assessment_item_refs) { test_object.assessment_items }
|
|
236
|
+
let(:assessment_item_ref) { assessment_item_refs.first }
|
|
237
|
+
let(:file_path) { File.join(fixtures_path, 'bank_entry_item.xml') }
|
|
238
|
+
|
|
239
|
+
it 'methods behave as expected' do
|
|
240
|
+
expect(
|
|
241
|
+
test_object.create_assessment_item(assessment_item_ref)
|
|
242
|
+
).to eq(nil)
|
|
243
|
+
|
|
244
|
+
expect(
|
|
245
|
+
test_object.create_bank_entry_item(assessment_item_ref).class
|
|
246
|
+
).to be(Qti::V1::Models::BankEntryItem)
|
|
247
|
+
end
|
|
248
|
+
end
|
|
231
249
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
describe Qti::V1::Models::BankEntryItem do
|
|
2
|
+
let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'bank_entry_item.xml') }
|
|
3
|
+
let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
|
|
4
|
+
let(:assessment_item_refs) { test_object.assessment_items }
|
|
5
|
+
let(:loaded_class) { described_class.new(assessment_item_refs.first) }
|
|
6
|
+
|
|
7
|
+
it 'configures a bank entry item correctly' do
|
|
8
|
+
expect(loaded_class.sourcebank_ref).to eq('gafe7177102bee6759845b002c5de397c')
|
|
9
|
+
expect(loaded_class.item_ref).to eq('ge0c6b84f2afc834ec575718bbc1451ff')
|
|
10
|
+
expect(loaded_class.points_possible).to eq('2.0')
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -10,6 +10,12 @@ describe Qti::V1::Models::Interactions::ChoiceInteraction do
|
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
shared_examples_for 'locked_choices' do
|
|
14
|
+
it 'returns locked choices setting' do
|
|
15
|
+
expect(loaded_class.locked_choices).to eq locked_choices_value
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
13
19
|
shared_examples_for 'answers' do
|
|
14
20
|
it 'returns the answers' do
|
|
15
21
|
expect(loaded_class.answers.count).to eq answer_choices_count
|
|
@@ -27,10 +33,12 @@ describe Qti::V1::Models::Interactions::ChoiceInteraction do
|
|
|
27
33
|
context 'multiple_choice.xml' do
|
|
28
34
|
let(:file_path) { File.join(fixtures_path, 'multiple_choice.xml') }
|
|
29
35
|
let(:shuffle_value) { false }
|
|
36
|
+
let(:locked_choices_value) { [] }
|
|
30
37
|
let(:answer_choices_count) { 5 }
|
|
31
38
|
let(:meta_type) { nil }
|
|
32
39
|
|
|
33
40
|
include_examples 'shuffled?'
|
|
41
|
+
include_examples 'locked_choices'
|
|
34
42
|
include_examples 'answers'
|
|
35
43
|
include_examples 'meta_type'
|
|
36
44
|
end
|
|
@@ -38,10 +46,12 @@ describe Qti::V1::Models::Interactions::ChoiceInteraction do
|
|
|
38
46
|
context 'true_false.xml' do
|
|
39
47
|
let(:file_path) { File.join(fixtures_path, 'true_false.xml') }
|
|
40
48
|
let(:shuffle_value) { true }
|
|
49
|
+
let(:locked_choices_value) { [0] }
|
|
41
50
|
let(:answer_choices_count) { 2 }
|
|
42
51
|
let(:meta_type) { 'true_false_question' }
|
|
43
52
|
|
|
44
53
|
include_examples 'shuffled?'
|
|
54
|
+
include_examples 'locked_choices'
|
|
45
55
|
include_examples 'answers'
|
|
46
56
|
include_examples 'meta_type'
|
|
47
57
|
end
|
|
@@ -49,17 +59,21 @@ describe Qti::V1::Models::Interactions::ChoiceInteraction do
|
|
|
49
59
|
context 'multiple_answer.xml' do
|
|
50
60
|
let(:file_path) { File.join(fixtures_path, 'multiple_answer.xml') }
|
|
51
61
|
let(:shuffle_value) { false }
|
|
62
|
+
let(:locked_choices_value) { [] }
|
|
52
63
|
|
|
53
64
|
include_examples 'shuffled?'
|
|
65
|
+
include_examples 'locked_choices'
|
|
54
66
|
end
|
|
55
67
|
|
|
56
68
|
context 'multiple_answer_canvas.xml' do
|
|
57
69
|
let(:file_path) { File.join(fixtures_path, 'multiple_answer_canvas.xml') }
|
|
58
70
|
let(:shuffle_value) { false }
|
|
71
|
+
let(:locked_choices_value) { [] }
|
|
59
72
|
let(:answer_choices_count) { 4 }
|
|
60
73
|
let(:meta_type) { 'multiple_answers_question' }
|
|
61
74
|
|
|
62
75
|
include_examples 'shuffled?'
|
|
76
|
+
include_examples 'locked_choices'
|
|
63
77
|
include_examples 'meta_type'
|
|
64
78
|
end
|
|
65
79
|
|
|
@@ -77,6 +77,15 @@ describe Qti::V2::Models::AssessmentTest do
|
|
|
77
77
|
end
|
|
78
78
|
end
|
|
79
79
|
|
|
80
|
+
describe '#create_bank_entry_item' do
|
|
81
|
+
let(:path) { File.join(fixtures_path, 'test_qti_2.2', 'assessment.xml') }
|
|
82
|
+
let(:loaded_class) { described_class.from_path!(path) }
|
|
83
|
+
|
|
84
|
+
it 'returns nil' do
|
|
85
|
+
expect(loaded_class.create_bank_entry_item).to be_nil
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
80
89
|
# describe '#create_stimulus' do
|
|
81
90
|
# let(:path) { File.join(fixtures_path, 'test_qti_2.2', 'assessment.xml') }
|
|
82
91
|
# let(:loaded_class) { described_class.from_path!(path) }
|
data/spec/lib/qti_spec.rb
CHANGED
|
@@ -45,6 +45,26 @@ describe Qti::Importer do
|
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
+
describe '#create_bank_entry_item' do
|
|
49
|
+
context 'when given a bankentry_item object' do
|
|
50
|
+
let(:file_path) { File.join(fixtures_path, 'test_qti_1.2_bank_entry_item') }
|
|
51
|
+
|
|
52
|
+
it 'creates a bankentry_item instance' do
|
|
53
|
+
bank_entry_item = importer.create_bank_entry_item(importer.assessment_item_refs.first)
|
|
54
|
+
expect(bank_entry_item).to be_a(Qti::V1::Models::BankEntryItem)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context 'when given an object other than a bankentry_item' do
|
|
59
|
+
let(:file_path) { File.join(fixtures_path, 'test_qti_1.2') }
|
|
60
|
+
|
|
61
|
+
it 'returns nil' do
|
|
62
|
+
bank_entry_item = importer.create_bank_entry_item(importer.assessment_item_refs.first)
|
|
63
|
+
expect(bank_entry_item).to be_nil
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
48
68
|
context 'canvas generated' do
|
|
49
69
|
let(:file_path) { File.join(fixtures_path, 'test_qti_1.2_canvas') }
|
|
50
70
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: qti
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.19.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Adrian Diaz
|
|
@@ -12,7 +12,7 @@ authors:
|
|
|
12
12
|
autorequire:
|
|
13
13
|
bindir: bin
|
|
14
14
|
cert_chain: []
|
|
15
|
-
date: 2023-
|
|
15
|
+
date: 2023-08-01 00:00:00.000000000 Z
|
|
16
16
|
dependencies:
|
|
17
17
|
- !ruby/object:Gem::Dependency
|
|
18
18
|
name: actionview
|
|
@@ -325,6 +325,7 @@ files:
|
|
|
325
325
|
- lib/qti/sanitizer.rb
|
|
326
326
|
- lib/qti/v1/models/assessment.rb
|
|
327
327
|
- lib/qti/v1/models/assessment_item.rb
|
|
328
|
+
- lib/qti/v1/models/bank_entry_item.rb
|
|
328
329
|
- lib/qti/v1/models/base.rb
|
|
329
330
|
- lib/qti/v1/models/choices/fill_blank_choice.rb
|
|
330
331
|
- lib/qti/v1/models/choices/logical_identifier_choice.rb
|
|
@@ -392,6 +393,7 @@ files:
|
|
|
392
393
|
- spec/fixtures/imsqti_2.2_package/images/sign.png
|
|
393
394
|
- spec/fixtures/imsqti_2.2_package/imsmanifest.xml
|
|
394
395
|
- spec/fixtures/interaction_checks_1.2.xml
|
|
396
|
+
- spec/fixtures/items_1.2/bank_entry_item.xml
|
|
395
397
|
- spec/fixtures/items_1.2/canvas_multiple_dropdown.xml
|
|
396
398
|
- spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
|
|
397
399
|
- spec/fixtures/items_1.2/canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml
|
|
@@ -428,6 +430,7 @@ files:
|
|
|
428
430
|
- spec/fixtures/items_1.2/stimulus_with_child_item.xml
|
|
429
431
|
- spec/fixtures/items_1.2/text.no.question.xml
|
|
430
432
|
- spec/fixtures/items_1.2/true_false.xml
|
|
433
|
+
- spec/fixtures/items_1.2/true_false_with_calculator.xml
|
|
431
434
|
- spec/fixtures/items_1.2/upload.xml
|
|
432
435
|
- spec/fixtures/items_2.1/Example02-feedbackInline.xml
|
|
433
436
|
- spec/fixtures/items_2.1/categorization.xml
|
|
@@ -557,6 +560,8 @@ files:
|
|
|
557
560
|
- spec/fixtures/test_qti_1.2/image.png
|
|
558
561
|
- spec/fixtures/test_qti_1.2/imsmanifest.xml
|
|
559
562
|
- spec/fixtures/test_qti_1.2/quiz.xml
|
|
563
|
+
- spec/fixtures/test_qti_1.2_bank_entry_item/imsmanifest.xml
|
|
564
|
+
- spec/fixtures/test_qti_1.2_bank_entry_item/quiz.xml
|
|
560
565
|
- spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
|
|
561
566
|
- spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
|
|
562
567
|
- spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
|
|
@@ -674,6 +679,7 @@ files:
|
|
|
674
679
|
- spec/lib/qti/sanitizer_spec.rb
|
|
675
680
|
- spec/lib/qti/v1/models/assessment_item_spec.rb
|
|
676
681
|
- spec/lib/qti/v1/models/assessment_spec.rb
|
|
682
|
+
- spec/lib/qti/v1/models/bank_entry_item_spec.rb
|
|
677
683
|
- spec/lib/qti/v1/models/base_spec.rb
|
|
678
684
|
- spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
|
|
679
685
|
- spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
|
|
@@ -759,6 +765,7 @@ test_files:
|
|
|
759
765
|
- spec/fixtures/imsqti_2.2_package/images/sign.png
|
|
760
766
|
- spec/fixtures/imsqti_2.2_package/imsmanifest.xml
|
|
761
767
|
- spec/fixtures/interaction_checks_1.2.xml
|
|
768
|
+
- spec/fixtures/items_1.2/bank_entry_item.xml
|
|
762
769
|
- spec/fixtures/items_1.2/canvas_multiple_dropdown.xml
|
|
763
770
|
- spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
|
|
764
771
|
- spec/fixtures/items_1.2/canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml
|
|
@@ -795,6 +802,7 @@ test_files:
|
|
|
795
802
|
- spec/fixtures/items_1.2/stimulus_with_child_item.xml
|
|
796
803
|
- spec/fixtures/items_1.2/text.no.question.xml
|
|
797
804
|
- spec/fixtures/items_1.2/true_false.xml
|
|
805
|
+
- spec/fixtures/items_1.2/true_false_with_calculator.xml
|
|
798
806
|
- spec/fixtures/items_1.2/upload.xml
|
|
799
807
|
- spec/fixtures/items_2.1/Example02-feedbackInline.xml
|
|
800
808
|
- spec/fixtures/items_2.1/categorization.xml
|
|
@@ -924,6 +932,8 @@ test_files:
|
|
|
924
932
|
- spec/fixtures/test_qti_1.2/image.png
|
|
925
933
|
- spec/fixtures/test_qti_1.2/imsmanifest.xml
|
|
926
934
|
- spec/fixtures/test_qti_1.2/quiz.xml
|
|
935
|
+
- spec/fixtures/test_qti_1.2_bank_entry_item/imsmanifest.xml
|
|
936
|
+
- spec/fixtures/test_qti_1.2_bank_entry_item/quiz.xml
|
|
927
937
|
- spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
|
|
928
938
|
- spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
|
|
929
939
|
- spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
|
|
@@ -1041,6 +1051,7 @@ test_files:
|
|
|
1041
1051
|
- spec/lib/qti/sanitizer_spec.rb
|
|
1042
1052
|
- spec/lib/qti/v1/models/assessment_item_spec.rb
|
|
1043
1053
|
- spec/lib/qti/v1/models/assessment_spec.rb
|
|
1054
|
+
- spec/lib/qti/v1/models/bank_entry_item_spec.rb
|
|
1044
1055
|
- spec/lib/qti/v1/models/base_spec.rb
|
|
1045
1056
|
- spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
|
|
1046
1057
|
- spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
|