qti 0.3.16 → 0.4.16
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.rb +1 -0
- data/lib/qti/v2/models/choices/gap_match_choice.rb +28 -0
- data/lib/qti/v2/models/interactions/gap_match_interaction.rb +105 -13
- data/lib/qti/v2/models/scoring_data.rb +5 -1
- data/spec/fixtures/items_2.1/gap_match.xml +30 -30
- data/spec/fixtures/items_2.1/text_entry.xml +24 -24
- data/spec/fixtures/test_qti_2.2/fib/fib.xml +33 -0
- data/spec/fixtures/test_qti_2.2/imsmanifest.xml +1 -0
- data/spec/lib/qti/v2/models/choices/gap_match_choice_spec.rb +22 -0
- data/spec/lib/qti/v2/models/interactions/gap_match_interaction_spec.rb +58 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f6c8a03de219970a4b393485157b90247559323
|
4
|
+
data.tar.gz: b92d0b520d3b4ed2f18ad89eb25c4b77435c55e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1d379ca58f26bdb0d92db3a3f3929f90774a05104381c9653246a228d9dd3998b78c77b660fb74ae1a049e846bdf2eb8b042d0dcef27ee59781622efcdae95f
|
7
|
+
data.tar.gz: 70bba648502519b9d9f6a43c7cdf97dddb141e5359e0e1391ea3db138397a4d0dfd630b593abe6d9a505f48e4bfdb728fc051177848e395f07a5dba6895fdf60
|
data/lib/qti.rb
CHANGED
@@ -65,6 +65,7 @@ require 'qti/v2/models/base'
|
|
65
65
|
require 'qti/v2/models/interactions/base_interaction'
|
66
66
|
require 'qti/v2/models/choices/simple_choice'
|
67
67
|
require 'qti/v2/models/choices/simple_associable_choice'
|
68
|
+
require 'qti/v2/models/choices/gap_match_choice'
|
68
69
|
require 'qti/v2/models/assessment_item'
|
69
70
|
require 'qti/v2/models/assessment_test'
|
70
71
|
require 'qti/v2/models/scoring_data'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'qti/v2/models/base'
|
2
|
+
|
3
|
+
module Qti
|
4
|
+
module V2
|
5
|
+
module Models
|
6
|
+
module Choices
|
7
|
+
class GapMatchChoice < Qti::V2::Models::Base
|
8
|
+
PROHIBITED_NODE_NAMES = 'feedbackInline'.freeze
|
9
|
+
def initialize(node)
|
10
|
+
@node = node
|
11
|
+
end
|
12
|
+
|
13
|
+
def identifier
|
14
|
+
@identifier ||= @node.attributes['identifier'].value
|
15
|
+
end
|
16
|
+
|
17
|
+
def item_body
|
18
|
+
@item_body ||= begin
|
19
|
+
node = @node.dup
|
20
|
+
node.children.filter(PROHIBITED_NODE_NAMES).each(&:unlink)
|
21
|
+
node.content.strip.gsub(/\s+/, ' ')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -2,30 +2,122 @@ module Qti
|
|
2
2
|
module V2
|
3
3
|
module Models
|
4
4
|
module Interactions
|
5
|
-
class GapMatchInteraction <
|
6
|
-
NODE_NAME = 'gapMatchInteraction'.freeze
|
7
|
-
# This will know if a class matches
|
5
|
+
class GapMatchInteraction < BaseInteraction
|
8
6
|
def self.matches(node)
|
9
|
-
matches = node.
|
10
|
-
return false if matches.
|
11
|
-
|
12
|
-
raise Qti::UnsupportedSchema if matches.size > 1
|
13
|
-
new(matches.first)
|
7
|
+
matches = node.xpath('.//xmlns:gapMatchInteraction')
|
8
|
+
return false if matches.count != 1
|
9
|
+
new(node)
|
14
10
|
end
|
15
11
|
|
16
12
|
def initialize(node)
|
17
13
|
@node = node
|
18
14
|
end
|
19
15
|
|
20
|
-
def
|
21
|
-
@node.attributes['
|
16
|
+
def shuffled?
|
17
|
+
@node.at_xpath('.//xmlns:gapMatchInteraction').attributes['shuffle']&.value.try(:downcase) == 'true'
|
18
|
+
end
|
19
|
+
|
20
|
+
def clean_stem_items
|
21
|
+
@clean_stem_items ||= begin
|
22
|
+
node = @node.dup
|
23
|
+
gap_node = node.xpath('.//xmlns:gapMatchInteraction')
|
24
|
+
gap_node.children.filter('gapText').each(&:remove)
|
25
|
+
|
26
|
+
gap_node.children.each do |child|
|
27
|
+
if child.inner_text.strip.empty?
|
28
|
+
child.remove
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
gap_node
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def prompt
|
37
|
+
clean_stem_items.children.filter('prompt')
|
38
|
+
end
|
39
|
+
|
40
|
+
def stem_items
|
41
|
+
if prompt.present?
|
42
|
+
stem_text_with_prompt = stem_text.unshift(prompt_hash)
|
43
|
+
stem_items_with_id_and_position(stem_text_with_prompt)
|
44
|
+
else
|
45
|
+
stem_items_with_id_and_position(stem_text)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def stem_items_with_id_and_position(stem_text)
|
50
|
+
stem_text.map.with_index do |stem_item, index|
|
51
|
+
stem_item.merge(
|
52
|
+
id: "stem_#{index}",
|
53
|
+
position: index + 1
|
54
|
+
)
|
55
|
+
end
|
22
56
|
end
|
23
57
|
|
24
|
-
def
|
25
|
-
|
58
|
+
def prompt_hash
|
59
|
+
{
|
60
|
+
type: 'text',
|
61
|
+
value: prompt.first.text
|
62
|
+
}
|
26
63
|
end
|
27
64
|
|
28
|
-
def
|
65
|
+
def stem_text
|
66
|
+
clean_stem_items.search('p').children.map do |stem_item|
|
67
|
+
if stem_item.name == 'gap'
|
68
|
+
{
|
69
|
+
type: 'blank',
|
70
|
+
blank_id: stem_item.attributes['identifier'].value
|
71
|
+
}
|
72
|
+
else
|
73
|
+
{
|
74
|
+
type: 'text',
|
75
|
+
value: stem_item.text.empty? ? " " : stem_item.text
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def blanks
|
82
|
+
node.xpath('.//xmlns:gapText').map do |blank|
|
83
|
+
{ id: blank.attributes['identifier'].value }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def answers
|
88
|
+
@answers ||= answer_nodes.map do |node|
|
89
|
+
V2::Models::Choices::GapMatchChoice.new(node)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def scoring_data_structs
|
94
|
+
question_response_pairs = node.xpath('.//xmlns:correctResponse//xmlns:value').map do |value|
|
95
|
+
value.content.split
|
96
|
+
end
|
97
|
+
question_response_pairs.map!{ |qrp| qrp.reverse }
|
98
|
+
question_response_id_mapping = Hash[question_response_pairs]
|
99
|
+
answer_nodes.map { |value_node|
|
100
|
+
node_id = value_node.attributes['identifier']&.value
|
101
|
+
answer_choice = choices.find{ |choice| choice.attributes['identifier']&.value == question_response_id_mapping[node_id] }
|
102
|
+
ScoringData.new(
|
103
|
+
answer_choice.content,
|
104
|
+
'directedPair',
|
105
|
+
{
|
106
|
+
id: node_id,
|
107
|
+
case: false
|
108
|
+
}
|
109
|
+
)
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
113
|
+
def choices
|
114
|
+
@node.xpath('.//xmlns:gapText')
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def answer_nodes
|
120
|
+
@node.xpath('.//xmlns:gap')
|
29
121
|
end
|
30
122
|
end
|
31
123
|
end
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module Qti
|
2
2
|
module V2
|
3
3
|
module Models
|
4
|
-
ScoringData = Struct.new(:values, :type)
|
4
|
+
ScoringData = Struct.new(:values, :type, :id, :case) do
|
5
|
+
def initialize(values, rcardinality, options={})
|
6
|
+
super(values, rcardinality, options[:id], options[:case])
|
7
|
+
end
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,33 +1,33 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<assessmentItem xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2"
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
4
|
+
xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p2 http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd"
|
5
|
+
identifier="gapMatch" title="Richard III (Take 1)" adaptive="false" timeDependent="false">
|
6
|
+
<responseDeclaration identifier="RESPONSE" cardinality="multiple" baseType="directedPair">
|
7
|
+
<correctResponse>
|
8
|
+
<value>W G1</value>
|
9
|
+
<value>Su G2</value>
|
10
|
+
</correctResponse>
|
11
|
+
<mapping defaultValue="-1" lowerBound="0">
|
12
|
+
<mapEntry mapKey="W G1" mappedValue="1"/>
|
13
|
+
<mapEntry mapKey="Su G2" mappedValue="2"/>
|
14
|
+
</mapping>
|
15
|
+
</responseDeclaration>
|
16
|
+
<outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float"/>
|
17
|
+
<itemBody>
|
18
|
+
<gapMatchInteraction responseIdentifier="RESPONSE" shuffle="false">
|
19
|
+
<prompt>Identify the missing words in this famous quote from Shakespeare's Richard III.</prompt>
|
20
|
+
<gapText identifier="W" matchMax="1">winter</gapText>
|
21
|
+
<gapText identifier="Sp" matchMax="1">spring</gapText>
|
22
|
+
<gapText identifier="Su" matchMax="1">summer</gapText>
|
23
|
+
<gapText identifier="A" matchMax="1">autumn</gapText>
|
24
|
+
<blockquote>
|
25
|
+
<p>Now is the <gap identifier="G1"/> of our discontent<br/> Made glorious <gap
|
26
|
+
identifier="G2"/> by this sun of York;<br/> And all the clouds that lour'd
|
27
|
+
upon our house<br/> In the deep bosom of the ocean buried.</p>
|
28
|
+
</blockquote>
|
29
|
+
</gapMatchInteraction>
|
30
|
+
</itemBody>
|
31
|
+
<responseProcessing
|
32
|
+
template="http://www.imsglobal.org/question/qti_v2p2/rptemplates/map_response"/>
|
33
33
|
</assessmentItem>
|
@@ -1,27 +1,27 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<assessmentItem xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2"
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
4
|
+
xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p2 http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd"
|
5
|
+
identifier="textEntry" title="Richard III (Take 3)" adaptive="false" timeDependent="false">
|
6
|
+
<responseDeclaration identifier="RESPONSE" cardinality="single" baseType="string">
|
7
|
+
<correctResponse>
|
8
|
+
<value>York</value>
|
9
|
+
</correctResponse>
|
10
|
+
<mapping defaultValue="0">
|
11
|
+
<mapEntry mapKey="York" mappedValue="1"/>
|
12
|
+
<mapEntry mapKey="york" mappedValue="0.5"/>
|
13
|
+
</mapping>
|
14
|
+
</responseDeclaration>
|
15
|
+
<outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float"/>
|
16
|
+
<itemBody>
|
17
|
+
<p>Identify the missing word in this famous quote from Shakespeare's Richard III.</p>
|
18
|
+
<blockquote>
|
19
|
+
<p>Now is the winter of our discontent<br/> Made glorious summer by this sun of
|
20
|
+
<textEntryInteraction responseIdentifier="RESPONSE" expectedLength="15"/>;<br/>
|
21
|
+
And all the clouds that lour'd upon our house<br/> In the deep bosom of the ocean
|
22
|
+
buried.</p>
|
23
|
+
</blockquote>
|
24
|
+
</itemBody>
|
25
|
+
<responseProcessing
|
26
|
+
template="http://www.imsglobal.org/question/qti_v2p2/rptemplates/map_response"/>
|
27
27
|
</assessmentItem>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<assessmentItem xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2"
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
4
|
+
xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p2 http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd"
|
5
|
+
identifier="gapMatch" title="Richard III (Take 1)" adaptive="false" timeDependent="false">
|
6
|
+
<responseDeclaration identifier="RESPONSE" cardinality="multiple" baseType="directedPair">
|
7
|
+
<correctResponse>
|
8
|
+
<value>W G1</value>
|
9
|
+
<value>Su G2</value>
|
10
|
+
</correctResponse>
|
11
|
+
<mapping defaultValue="-1" lowerBound="0">
|
12
|
+
<mapEntry mapKey="W G1" mappedValue="1"/>
|
13
|
+
<mapEntry mapKey="Su G2" mappedValue="2"/>
|
14
|
+
</mapping>
|
15
|
+
</responseDeclaration>
|
16
|
+
<outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float" normalMaximum="2.0"/>
|
17
|
+
<itemBody>
|
18
|
+
<gapMatchInteraction responseIdentifier="RESPONSE" shuffle="false">
|
19
|
+
<prompt>Identify the missing words in this famous quote from Shakespeare's Richard III.</prompt>
|
20
|
+
<gapText identifier="W" matchMax="1">winter</gapText>
|
21
|
+
<gapText identifier="Sp" matchMax="1">spring</gapText>
|
22
|
+
<gapText identifier="Su" matchMax="1">summer</gapText>
|
23
|
+
<gapText identifier="A" matchMax="1">autumn</gapText>
|
24
|
+
<blockquote>
|
25
|
+
<p>Now is the <gap identifier="G1"/> of our discontent<br/> Made glorious <gap
|
26
|
+
identifier="G2"/> by this sun of York;<br/> And all the clouds that lour'd
|
27
|
+
upon our house<br/> In the deep bosom of the ocean buried.</p>
|
28
|
+
</blockquote>
|
29
|
+
</gapMatchInteraction>
|
30
|
+
</itemBody>
|
31
|
+
<responseProcessing
|
32
|
+
template="http://www.imsglobal.org/question/qti_v2p2/rptemplates/map_response"/>
|
33
|
+
</assessmentItem>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::V2::Models::Choices::GapMatchChoice do
|
4
|
+
context 'choice.xml' do
|
5
|
+
let(:io) { File.read(File.join('spec', 'fixtures', 'items_2.1', 'gap_match.xml')) }
|
6
|
+
let(:nodes) { Nokogiri::XML(io).xpath('//xmlns:gapText') }
|
7
|
+
|
8
|
+
let(:choices) { nodes.map { |node| described_class.new(node) } }
|
9
|
+
|
10
|
+
it 'returns the right identifier' do
|
11
|
+
expect(choices.map(&:identifier)).to eq %w(W Sp Su A)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns the item body text' do
|
15
|
+
expect(choices.map(&:item_body).map(&:empty?).any?).to eq false
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'removes inline feedback elements from item_body' do
|
19
|
+
expect(choices.map(&:item_body).map { |text| text.include? 'correct' }.any?).to eq false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::V2::Models::Interactions::GapMatchInteraction do
|
4
|
+
context 'gap_match.xml' do
|
5
|
+
let(:io) { File.read(File.join('spec', 'fixtures', 'items_2.1', 'gap_match.xml')) }
|
6
|
+
let(:node) { Nokogiri::XML(io) }
|
7
|
+
let(:loaded_class) { described_class.new(node) }
|
8
|
+
|
9
|
+
let(:expected_stem_items) {[
|
10
|
+
{type: "text",
|
11
|
+
value: "Identify the missing words in this famous quote from Shakespeare's Richard III.",
|
12
|
+
id: "stem_0", position: 1},
|
13
|
+
{type: 'text', value: 'Now is the ', id: 'stem_1', position: 2},
|
14
|
+
{type: 'blank', :blank_id=>'G1', id: 'stem_2', position: 3},
|
15
|
+
{type: 'text', value: ' of our discontent', id: 'stem_3', position: 4},
|
16
|
+
{type: 'text', value: ' ', id: 'stem_4', position: 5},
|
17
|
+
{type: 'text', value: ' Made glorious ', id: 'stem_5', position: 6},
|
18
|
+
{type: 'blank', :blank_id=>'G2', id: 'stem_6', position: 7},
|
19
|
+
{type: 'text', value: ' by this sun of York;', id: 'stem_7', position: 8},
|
20
|
+
{type: 'text', value: ' ', id: 'stem_8', position: 9},
|
21
|
+
{type: 'text', value: " And all the clouds that lour'd\n upon our house",
|
22
|
+
id: 'stem_9', position: 10},
|
23
|
+
{type: 'text', value: ' ', id: 'stem_10', position: 11},
|
24
|
+
{type: 'text', value: ' In the deep bosom of the ocean buried.',
|
25
|
+
id: 'stem_11', position: 12}
|
26
|
+
]}
|
27
|
+
|
28
|
+
let(:scoring_data_ids) { %w(G1 G2) }
|
29
|
+
let(:scoring_data_values) { %w(winter summer) }
|
30
|
+
|
31
|
+
it 'returns shuffle setting' do
|
32
|
+
expect(loaded_class.shuffled?).to eq false
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'returns the blanks' do
|
36
|
+
expect(loaded_class.blanks).to eq [{ id: "W" }, { id: "Sp" }, { id: "Su" }, { id: "A" }]
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the stem_items' do
|
40
|
+
expect(loaded_class.stem_items).to eq(expected_stem_items)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns the answers' do
|
44
|
+
expect(loaded_class.answers.count).to eq 2
|
45
|
+
expect(loaded_class.answers.first).to be_an_instance_of(Qti::V2::Models::Choices::GapMatchChoice)
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
it 'returns the choices' do
|
50
|
+
expect(loaded_class.choices.count).to eq 4
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'returns the scoring_data_structs' do
|
54
|
+
expect(loaded_class.scoring_data_structs.map(&:id)).to eq(scoring_data_ids)
|
55
|
+
expect(loaded_class.scoring_data_structs.map(&:values)).to eq(scoring_data_values)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
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: 0.
|
4
|
+
version: 0.4.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hannah Bottalla
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-05-
|
12
|
+
date: 2017-05-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -350,6 +350,7 @@ files:
|
|
350
350
|
- spec/fixtures/test_qti_2.2.zip
|
351
351
|
- spec/fixtures/test_qti_2.2/assessment.xml
|
352
352
|
- spec/fixtures/test_qti_2.2/essay/essay.xml
|
353
|
+
- spec/fixtures/test_qti_2.2/fib/fib.xml
|
353
354
|
- spec/fixtures/test_qti_2.2/images/sign.png
|
354
355
|
- spec/fixtures/test_qti_2.2/imsmanifest.xml
|
355
356
|
- spec/fixtures/test_qti_2.2/mathassess.xsd
|
@@ -424,9 +425,11 @@ files:
|
|
424
425
|
- spec/lib/qti/v1/models/interactions/string_interaction_spec.rb
|
425
426
|
- spec/lib/qti/v2/models/assessment_item_spec.rb
|
426
427
|
- spec/lib/qti/v2/models/assessment_test_spec.rb
|
428
|
+
- spec/lib/qti/v2/models/choices/gap_match_choice_spec.rb
|
427
429
|
- spec/lib/qti/v2/models/choices/simple_choice_spec.rb
|
428
430
|
- spec/lib/qti/v2/models/interactions/choice_interaction_spec.rb
|
429
431
|
- spec/lib/qti/v2/models/interactions/extended_text_interaction_spec.rb
|
432
|
+
- spec/lib/qti/v2/models/interactions/gap_match_interaction_spec.rb
|
430
433
|
- spec/lib/qti/v2/models/interactions/match_interaction_spec.rb
|
431
434
|
- spec/lib/qti_spec.rb
|
432
435
|
- spec/spec_helper.rb
|
@@ -577,6 +580,7 @@ test_files:
|
|
577
580
|
- spec/fixtures/test_qti_2.2.zip
|
578
581
|
- spec/fixtures/test_qti_2.2/assessment.xml
|
579
582
|
- spec/fixtures/test_qti_2.2/essay/essay.xml
|
583
|
+
- spec/fixtures/test_qti_2.2/fib/fib.xml
|
580
584
|
- spec/fixtures/test_qti_2.2/images/sign.png
|
581
585
|
- spec/fixtures/test_qti_2.2/imsmanifest.xml
|
582
586
|
- spec/fixtures/test_qti_2.2/mathassess.xsd
|
@@ -651,9 +655,11 @@ test_files:
|
|
651
655
|
- spec/lib/qti/v1/models/interactions/string_interaction_spec.rb
|
652
656
|
- spec/lib/qti/v2/models/assessment_item_spec.rb
|
653
657
|
- spec/lib/qti/v2/models/assessment_test_spec.rb
|
658
|
+
- spec/lib/qti/v2/models/choices/gap_match_choice_spec.rb
|
654
659
|
- spec/lib/qti/v2/models/choices/simple_choice_spec.rb
|
655
660
|
- spec/lib/qti/v2/models/interactions/choice_interaction_spec.rb
|
656
661
|
- spec/lib/qti/v2/models/interactions/extended_text_interaction_spec.rb
|
662
|
+
- spec/lib/qti/v2/models/interactions/gap_match_interaction_spec.rb
|
657
663
|
- spec/lib/qti/v2/models/interactions/match_interaction_spec.rb
|
658
664
|
- spec/lib/qti_spec.rb
|
659
665
|
- spec/spec_helper.rb
|