qti 2.15.0 → 2.15.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fcafa61127adf8dafdd3084cd6c22d56630473c0d01e42a7e6cddf6ee7b4ba96
4
- data.tar.gz: 68fdf75e1b11fae2ca2ac55aca9daf936c2754ee1a0a244ccc94a51953c3957f
3
+ metadata.gz: f4d749cfb13026e00cdeabff06146d77241250a608825bff4b289ea632f24561
4
+ data.tar.gz: caa73136c519b5534c2309d73e5af6e5e4fdee04e7b22fb5065c5913abdc90d5
5
5
  SHA512:
6
- metadata.gz: 06543ad3a11e643f4c9731a641da3495afa53d94defa9ac8b40a34015d152ca24e5943fb1b33d9fe0db0714915f9a2e86dd2511821197f1b29395b071adf1ce0
7
- data.tar.gz: 7b3ad6b2fa593ca9f2be62f524777fef0d41d9ddc8833af38ec445a89a3ffe5c855dd80312000978a0bd55bada68b8d711220a54b46d1b231223b0e41727b0b3
6
+ metadata.gz: 01adeaad50a2f1247b5e5ced354a23db01781892b638bf4644df44facd17cd02853be8b5a96d55fcd911dcb9b98519937c628f9733373e331eaeb2dc6c774dae
7
+ data.tar.gz: 8ce6a9332d85cae1a0174b64c799c447a99f18a3096d8f0d0c7d507ebec1bc57708c20d25be6a4d3db0b0f2eaf2786ca628d2bf368d5812151c0c2568bad8243
@@ -63,6 +63,27 @@ module Qti
63
63
  end
64
64
  end
65
65
 
66
+ def parent_stimulus_item_ident_metadata?
67
+ if @doc.at_xpath('.//xmlns:qtimetadata').present?
68
+ qti_metadata_children.children.find do |node|
69
+ node.text == 'parent_stimulus_item_ident'
70
+ end.present?
71
+ else
72
+ false
73
+ end
74
+ end
75
+
76
+ def parent_stimulus_item_ident
77
+ @parent_stimulus_item_ident ||= begin
78
+ if parent_stimulus_item_ident_metadata?
79
+ parent_stimulus_item_ident_label = qti_metadata_children.children.find do |node|
80
+ node.text == 'parent_stimulus_item_ident'
81
+ end
82
+ parent_stimulus_item_ident_label.next.text
83
+ end
84
+ end
85
+ end
86
+
66
87
  def decvar_maxvalue
67
88
  @doc.at_xpath('.//xmlns:decvar/@maxvalue')&.value&.to_i ||
68
89
  @doc.at_xpath('.//xmlns:decvar/@defaultval')&.value&.to_i || 0
@@ -16,14 +16,19 @@ module Qti
16
16
  'marginOfError',
17
17
  equal_node.content.to_f.to_s,
18
18
  margin,
19
- 'absolute'
19
+ margin_type
20
20
  )
21
21
  end
22
22
 
23
23
  private
24
24
 
25
25
  def margin
26
- (equal_node.content.to_f - gte_node.content.to_f).to_s
26
+ equal_node.attributes['margin']&.value ||
27
+ (equal_node.content.to_f - gte_node.content.to_f).to_s
28
+ end
29
+
30
+ def margin_type
31
+ equal_node.attributes['margintype']&.value || 'absolute'
27
32
  end
28
33
 
29
34
  def valid?
@@ -18,16 +18,20 @@ module Qti
18
18
  'preciseResponse',
19
19
  value,
20
20
  precision.to_s,
21
- 'significantDigits'
21
+ precision_type
22
22
  )
23
23
  end
24
24
 
25
25
  def value
26
26
  fval = equal_node.content.to_f
27
- number_with_precision(fval, precision: precision, significant: true)
27
+ number_with_precision(fval, precision: precision, significant: precision_type == 'significantDigits')
28
28
  end
29
29
 
30
30
  def precision
31
+ overridden_precision = equal_node.attributes['precision']&.value
32
+
33
+ return overridden_precision.to_i if overridden_precision.present?
34
+
31
35
  sig = [
32
36
  Precision.significant_digits(gt_node.content),
33
37
  Precision.significant_digits(lte_node.content)
@@ -35,6 +39,10 @@ module Qti
35
39
  sig - 1
36
40
  end
37
41
 
42
+ def precision_type
43
+ equal_node.attributes['precisiontype']&.value || 'significantDigits'
44
+ end
45
+
38
46
  def self.significant_digits(number_s)
39
47
  sig = 0
40
48
  zeros = 0
@@ -14,6 +14,10 @@ module Qti
14
14
  @title ||= @node.attributes['title']&.value
15
15
  end
16
16
 
17
+ def instructions
18
+ @instructions ||= @node.attributes['instructions']&.value
19
+ end
20
+
17
21
  def body
18
22
  @body ||= begin
19
23
  presentation = @node.at_xpath('.//xmlns:presentation')
@@ -25,6 +29,38 @@ module Qti
25
29
  def stimulus_type
26
30
  'text'
27
31
  end
32
+
33
+ def qti_metadata_children
34
+ @node.at_xpath('.//xmlns:qtimetadata')&.children
35
+ end
36
+
37
+ def source_url_qti_metadata?
38
+ if @node.at_xpath('.//xmlns:qtimetadata').present?
39
+ source_url_label = qti_metadata_children.children.find { |node| node.text == 'source_url' }
40
+ source_url_label.present?
41
+ else
42
+ false
43
+ end
44
+ end
45
+
46
+ def source_url
47
+ @source_url ||= begin
48
+ if source_url_qti_metadata?
49
+ source_url_label = qti_metadata_children.children.find do |node|
50
+ node.text == 'source_url'
51
+ end
52
+ source_url_label&.next&.text
53
+ end
54
+ end
55
+ end
56
+
57
+ def orientation
58
+ @orientation ||= begin
59
+ presentation = @node.at_xpath('.//xmlns:presentation')
60
+ return 'left' if presentation.blank?
61
+ presentation.at_xpath('.//xmlns:material')&.attributes&.[]('orientation')&.value || 'left'
62
+ end
63
+ end
28
64
  end
29
65
  end
30
66
  end
@@ -31,6 +31,10 @@ module Qti
31
31
  end
32
32
  end
33
33
 
34
+ def parent_stimulus_item_ident
35
+ nil
36
+ end
37
+
34
38
  def interaction_model
35
39
  @interaction_model ||= begin
36
40
  V2::Models::Interactions.interaction_model(@doc, self)
@@ -25,6 +25,18 @@ module Qti
25
25
  def stimulus_type
26
26
  'text'
27
27
  end
28
+
29
+ def instructions
30
+ nil
31
+ end
32
+
33
+ def source_url
34
+ nil
35
+ end
36
+
37
+ def orientation
38
+ 'left'
39
+ end
28
40
  end
29
41
  end
30
42
  end
data/lib/qti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.15.0'.freeze
2
+ VERSION = '2.15.3'.freeze
3
3
  end
@@ -0,0 +1,58 @@
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="i3c06f375b6b24a39925dc6a213421021" title="Quiz1.Margin.Error">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <item ident="i028a5c60d8ce9dc63df3afefa2e9d01e" title="Question">
12
+ <itemmetadata>
13
+ <qtimetadata>
14
+ <qtimetadatafield>
15
+ <fieldlabel>question_type</fieldlabel>
16
+ <fieldentry>numerical_question</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>points_possible</fieldlabel>
20
+ <fieldentry>1.0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
24
+ <fieldentry>i874908082e9dce80647f2771296ca69c</fieldentry>
25
+ </qtimetadatafield>
26
+ </qtimetadata>
27
+ </itemmetadata>
28
+ <presentation>
29
+ <material>
30
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;QQ1.margin error&lt;/p&gt;&lt;/div&gt;</mattext>
31
+ </material>
32
+ <response_str ident="response1" rcardinality="Single">
33
+ <render_fib fibtype="Decimal">
34
+ <response_label ident="answer1"/>
35
+ </render_fib>
36
+ </response_str>
37
+ </presentation>
38
+ <resprocessing>
39
+ <outcomes>
40
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
41
+ </outcomes>
42
+ <respcondition continue="No">
43
+ <conditionvar>
44
+ <or>
45
+ <varequal respident="response1" margintype="percent" margin="20.0">200.0</varequal>
46
+ <and>
47
+ <vargte respident="response1">160.0</vargte>
48
+ <varlte respident="response1">240.0</varlte>
49
+ </and>
50
+ </or>
51
+ </conditionvar>
52
+ <setvar action="Set" varname="SCORE">100</setvar>
53
+ </respcondition>
54
+ </resprocessing>
55
+ </item>
56
+ </section>
57
+ </assessment>
58
+ </questestinterop>
@@ -0,0 +1,58 @@
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="id2b817165c302c0c57416146dc94ce47" title="Quiz1.precision">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <item ident="i3ac3c6ccf4dd3dce4d5b5a5721edd5d5" title="Question">
12
+ <itemmetadata>
13
+ <qtimetadata>
14
+ <qtimetadatafield>
15
+ <fieldlabel>question_type</fieldlabel>
16
+ <fieldentry>numerical_question</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>points_possible</fieldlabel>
20
+ <fieldentry>1.0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
24
+ <fieldentry>i792f29a40533189006a3bd7ffee3c857</fieldentry>
25
+ </qtimetadatafield>
26
+ </qtimetadata>
27
+ </itemmetadata>
28
+ <presentation>
29
+ <material>
30
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;QQ1.presision ss&lt;/p&gt;&lt;/div&gt;</mattext>
31
+ </material>
32
+ <response_str ident="response1" rcardinality="Single">
33
+ <render_fib fibtype="Decimal">
34
+ <response_label ident="answer1"/>
35
+ </render_fib>
36
+ </response_str>
37
+ </presentation>
38
+ <resprocessing>
39
+ <outcomes>
40
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
41
+ </outcomes>
42
+ <respcondition continue="No">
43
+ <conditionvar>
44
+ <or>
45
+ <varequal respident="response1" precisiontype="decimals" precision="4">100.1234</varequal>
46
+ <and>
47
+ <vargt respident="response1">999.995</vargt>
48
+ <varlte respident="response1">1000.005</varlte>
49
+ </and>
50
+ </or>
51
+ </conditionvar>
52
+ <setvar action="Set" varname="SCORE">100</setvar>
53
+ </respcondition>
54
+ </resprocessing>
55
+ </item>
56
+ </section>
57
+ </assessment>
58
+ </questestinterop>
@@ -0,0 +1,44 @@
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="i1e5e0d6fba7342e63ae43afe9863070d" title="Quiz.text">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <item ident="d74b47a4abeeed159e030bfecbcecea2" title="some title" instructions="some instructions">
12
+ <itemmetadata>
13
+ <qtimetadata>
14
+ <qtimetadatafield>
15
+ <fieldlabel>question_type</fieldlabel>
16
+ <fieldentry>text_only_question</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>points_possible</fieldlabel>
20
+ <fieldentry>0.0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>original_answer_ids</fieldlabel>
24
+ <fieldentry/>
25
+ </qtimetadatafield>
26
+ <qtimetadatafield>
27
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
28
+ <fieldentry>9f47365e112840d80a79a960b1b0b6a7</fieldentry>
29
+ </qtimetadatafield>
30
+ <qtimetadatafield>
31
+ <fieldlabel>source_url</fieldlabel>
32
+ <fieldentry>https://sourceurl.com</fieldentry>
33
+ </qtimetadatafield>
34
+ </qtimetadata>
35
+ </itemmetadata>
36
+ <presentation>
37
+ <material orientation="top">
38
+ <mattext texttype="text/html">&lt;p&gt;stimulus content&lt;/p&gt;</mattext>
39
+ </material>
40
+ </presentation>
41
+ </item>
42
+ </section>
43
+ </assessment>
44
+ </questestinterop>
@@ -0,0 +1,110 @@
1
+ <?xml version="1.0"?>
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="7f805e79bec484e9075115f05b2042fa" title="nq q with stimulus with attached question">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <item ident="6e2618d0f5e795a363f1eefec748fb68" title="stimulus title" instructions="some instructions">
12
+ <itemmetadata>
13
+ <qtimetadata>
14
+ <qtimetadatafield>
15
+ <fieldlabel>question_type</fieldlabel>
16
+ <fieldentry>text_only_question</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>points_possible</fieldlabel>
20
+ <fieldentry>0.0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>original_answer_ids</fieldlabel>
24
+ <fieldentry/>
25
+ </qtimetadatafield>
26
+ <qtimetadatafield>
27
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
28
+ <fieldentry>8efb1df4dc2fb1048a7f349a3165f28d</fieldentry>
29
+ </qtimetadatafield>
30
+ <qtimetadatafield>
31
+ <fieldlabel>source_url</fieldlabel>
32
+ <fieldentry>https://sourceurl.com</fieldentry>
33
+ </qtimetadatafield>
34
+ </qtimetadata>
35
+ </itemmetadata>
36
+ <presentation>
37
+ <material orientation="top">
38
+ <mattext texttype="text/html">&lt;p&gt;some content&lt;/p&gt;</mattext>
39
+ </material>
40
+ </presentation>
41
+ </item>
42
+ <item ident="bace7f0cffb532a21d2de194c68edeac" title="Child multiple choice question">
43
+ <itemmetadata>
44
+ <qtimetadata>
45
+ <qtimetadatafield>
46
+ <fieldlabel>question_type</fieldlabel>
47
+ <fieldentry>multiple_choice_question</fieldentry>
48
+ </qtimetadatafield>
49
+ <qtimetadatafield>
50
+ <fieldlabel>points_possible</fieldlabel>
51
+ <fieldentry>1.0</fieldentry>
52
+ </qtimetadatafield>
53
+ <qtimetadatafield>
54
+ <fieldlabel>original_answer_ids</fieldlabel>
55
+ <fieldentry>210e9a21-bf55-4472-97d7-1ddb973f4cea,ada66409-0d31-4e5f-b67b-8e33f66c8299,3b6679be-071a-46ca-a79f-6e019cd65af7,3a4658ed-c0ad-40cd-b8d8-627f87f9bcf0</fieldentry>
56
+ </qtimetadatafield>
57
+ <qtimetadatafield>
58
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
59
+ <fieldentry>5d040aba22c641e4c3ff7480aed7b1e2</fieldentry>
60
+ </qtimetadatafield>
61
+ <qtimetadatafield>
62
+ <fieldlabel>parent_stimulus_item_ident</fieldlabel>
63
+ <fieldentry>6e2618d0f5e795a363f1eefec748fb68</fieldentry>
64
+ </qtimetadatafield>
65
+ </qtimetadata>
66
+ </itemmetadata>
67
+ <presentation>
68
+ <material>
69
+ <mattext texttype="text/html">&lt;p&gt;the answer is letter A&lt;/p&gt;</mattext>
70
+ </material>
71
+ <response_lid ident="response1" rcardinality="Single">
72
+ <render_choice>
73
+ <response_label ident="210e9a21-bf55-4472-97d7-1ddb973f4cea">
74
+ <material>
75
+ <mattext texttype="text/html">&lt;p&gt;A&lt;/p&gt;</mattext>
76
+ </material>
77
+ </response_label>
78
+ <response_label ident="ada66409-0d31-4e5f-b67b-8e33f66c8299">
79
+ <material>
80
+ <mattext texttype="text/html">&lt;p&gt;B&lt;/p&gt;</mattext>
81
+ </material>
82
+ </response_label>
83
+ <response_label ident="3b6679be-071a-46ca-a79f-6e019cd65af7">
84
+ <material>
85
+ <mattext texttype="text/html">&lt;p&gt;C&lt;/p&gt;</mattext>
86
+ </material>
87
+ </response_label>
88
+ <response_label ident="3a4658ed-c0ad-40cd-b8d8-627f87f9bcf0">
89
+ <material>
90
+ <mattext texttype="text/html">&lt;p&gt;D&lt;/p&gt;</mattext>
91
+ </material>
92
+ </response_label>
93
+ </render_choice>
94
+ </response_lid>
95
+ </presentation>
96
+ <resprocessing>
97
+ <outcomes>
98
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
99
+ </outcomes>
100
+ <respcondition continue="No">
101
+ <conditionvar>
102
+ <varequal respident="response1">210e9a21-bf55-4472-97d7-1ddb973f4cea</varequal>
103
+ </conditionvar>
104
+ <setvar action="Set" varname="SCORE">100</setvar>
105
+ </respcondition>
106
+ </resprocessing>
107
+ </item>
108
+ </section>
109
+ </assessment>
110
+ </questestinterop>
@@ -93,6 +93,28 @@ describe Qti::V1::Models::AssessmentItem do
93
93
  end
94
94
  end
95
95
 
96
+ describe '#parent_stimulus_item_ident' do
97
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'stimulus_with_child_item.xml') }
98
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
99
+ let(:assessment_item_refs) { test_object.assessment_items }
100
+
101
+ context 'when it does not contain parent_stimulus_item_ident metadata' do
102
+ let(:loaded_class) { described_class.new(assessment_item_refs[0]) }
103
+
104
+ it 'returns nil' do
105
+ expect(loaded_class.parent_stimulus_item_ident).to be_nil
106
+ end
107
+ end
108
+
109
+ context 'when it contains parent_stimulus_item_ident metadata' do
110
+ let(:loaded_class) { described_class.new(assessment_item_refs[1]) }
111
+
112
+ it 'returns the parent_stimulus_item_ident value' do
113
+ expect(loaded_class.parent_stimulus_item_ident).to eq '6e2618d0f5e795a363f1eefec748fb68'
114
+ end
115
+ end
116
+ end
117
+
96
118
  describe '#scoring_data_structs' do
97
119
  it 'grabs the rcardinality and scoring data value' do
98
120
  struct = loaded_class.send(:scoring_data_structs)
@@ -65,6 +65,21 @@ describe Qti::V1::Models::Interactions::NumericInteraction do
65
65
  expect(loaded_class.item_body).to eq '<div><p>QQ1.margin error</p></div>'
66
66
  end
67
67
  end
68
+
69
+ context 'with explicit margin and margin_type' do
70
+ let(:xml_file_name) { 'numeric_margin_error_percent.xml' }
71
+ context 'the first item in numeric_margin_error.xml' do
72
+ let(:loaded_class) { described_class.new(assessment_item_refs.first, test_object) }
73
+ let(:answer_count) { 1 }
74
+
75
+ include_examples 'scoring_data_structs',
76
+ id: %w[response1],
77
+ type: %w[marginOfError],
78
+ value: %w[200.0],
79
+ margin: %w[20.0],
80
+ margin_type: %w[percent]
81
+ end
82
+ end
68
83
  end
69
84
 
70
85
  context 'precision' do
@@ -87,6 +102,22 @@ describe Qti::V1::Models::Interactions::NumericInteraction do
87
102
  expect(loaded_class.item_body).to eq '<div><p>QQ1.presision ss</p></div>'
88
103
  end
89
104
  end
105
+
106
+ context 'with explicit precision and precision_type' do
107
+ let(:xml_file_name) { 'numeric_precision_decimals.xml' }
108
+
109
+ context 'the first item in numeric_precision_decimals.xml' do
110
+ let(:loaded_class) { described_class.new(assessment_item_refs.first, test_object) }
111
+ let(:answer_count) { 1 }
112
+
113
+ include_examples 'scoring_data_structs',
114
+ id: %w[response1],
115
+ type: %w[preciseResponse],
116
+ value: %w[100.1234],
117
+ precision: %w[4],
118
+ precision_type: %w[decimals]
119
+ end
120
+ end
90
121
  end
91
122
 
92
123
  context 'wthin range' do
@@ -50,4 +50,36 @@ describe Qti::V1::Models::StimulusItem do
50
50
  it 'returns correct stimulus_type' do
51
51
  expect(loaded_class.stimulus_type).to eq('text')
52
52
  end
53
+
54
+ context 'when the stimulus item was generated by New Quizzes' do
55
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'stimulus.xml') }
56
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
57
+ let(:stimulus_item) { test_object.create_stimulus(test_object.assessment_items.first) }
58
+
59
+ {
60
+ source_url: 'https://sourceurl.com',
61
+ instructions: 'some instructions',
62
+ orientation: 'top'
63
+ }.each do |key, value|
64
+ it "returns the correct #{key}" do
65
+ expect(stimulus_item.send(key)).to eq(value)
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'when the stimulus item was not generated by New Quizzes' do
71
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'text.no.question.xml') }
72
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
73
+ let(:stimulus_item) { test_object.create_stimulus(test_object.assessment_items.first) }
74
+
75
+ {
76
+ source_url: nil,
77
+ instructions: nil,
78
+ orientation: 'left'
79
+ }.each do |key, value|
80
+ it "returns the correct #{key}" do
81
+ expect(stimulus_item.send(key)).to eq(value)
82
+ end
83
+ end
84
+ end
53
85
  end
@@ -28,6 +28,10 @@ describe Qti::V2::Models::AssessmentItem do
28
28
  expect(loaded_class.points_possible).to eq nil
29
29
  end
30
30
 
31
+ it 'falls back to nil parent_stimulus_item_ident value' do
32
+ expect(loaded_class.parent_stimulus_item_ident).to eq nil
33
+ end
34
+
31
35
  it 'grabs the type and scoring data value' do
32
36
  struct = loaded_class.send(:scoring_data_structs)
33
37
  expect(struct.first.values).to eq 'ChoiceA'
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.15.0
4
+ version: 2.15.3
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-05-16 00:00:00.000000000 Z
15
+ date: 2023-05-31 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: actionview
@@ -412,11 +412,15 @@ files:
412
412
  - spec/fixtures/items_1.2/multiple_choice.xml
413
413
  - spec/fixtures/items_1.2/numeric_exact_match.xml
414
414
  - spec/fixtures/items_1.2/numeric_margin_error.xml
415
+ - spec/fixtures/items_1.2/numeric_margin_error_percent.xml
415
416
  - spec/fixtures/items_1.2/numeric_precision.xml
417
+ - spec/fixtures/items_1.2/numeric_precision_decimals.xml
416
418
  - spec/fixtures/items_1.2/numeric_within_range.xml
417
419
  - spec/fixtures/items_1.2/ordering.xml
418
420
  - spec/fixtures/items_1.2/question_group.xml
419
421
  - spec/fixtures/items_1.2/single_fib.xml
422
+ - spec/fixtures/items_1.2/stimulus.xml
423
+ - spec/fixtures/items_1.2/stimulus_with_child_item.xml
420
424
  - spec/fixtures/items_1.2/text.no.question.xml
421
425
  - spec/fixtures/items_1.2/true_false.xml
422
426
  - spec/fixtures/items_1.2/upload.xml
@@ -726,7 +730,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
726
730
  - !ruby/object:Gem::Version
727
731
  version: '0'
728
732
  requirements: []
729
- rubygems_version: 3.3.7
733
+ rubygems_version: 3.4.10
730
734
  signing_key:
731
735
  specification_version: 4
732
736
  summary: QTI 1.2 and 2.1 import and export models
@@ -770,11 +774,15 @@ test_files:
770
774
  - spec/fixtures/items_1.2/multiple_choice.xml
771
775
  - spec/fixtures/items_1.2/numeric_exact_match.xml
772
776
  - spec/fixtures/items_1.2/numeric_margin_error.xml
777
+ - spec/fixtures/items_1.2/numeric_margin_error_percent.xml
773
778
  - spec/fixtures/items_1.2/numeric_precision.xml
779
+ - spec/fixtures/items_1.2/numeric_precision_decimals.xml
774
780
  - spec/fixtures/items_1.2/numeric_within_range.xml
775
781
  - spec/fixtures/items_1.2/ordering.xml
776
782
  - spec/fixtures/items_1.2/question_group.xml
777
783
  - spec/fixtures/items_1.2/single_fib.xml
784
+ - spec/fixtures/items_1.2/stimulus.xml
785
+ - spec/fixtures/items_1.2/stimulus_with_child_item.xml
778
786
  - spec/fixtures/items_1.2/text.no.question.xml
779
787
  - spec/fixtures/items_1.2/true_false.xml
780
788
  - spec/fixtures/items_1.2/upload.xml