qti 2.15.0 → 2.15.3

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 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