qti 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +28 -0
- data/Rakefile +1 -0
- data/lib/qti.rb +62 -0
- data/lib/qti/models/base.rb +80 -0
- data/lib/qti/models/manifest.rb +20 -0
- data/lib/qti/v1/models/assessment.rb +17 -0
- data/lib/qti/v1/models/assessment_item.rb +59 -0
- data/lib/qti/v1/models/base.rb +13 -0
- data/lib/qti/v1/models/choices/logical_identifier_choice.rb +26 -0
- data/lib/qti/v1/models/interactions/logical_identifier_interaction.rb +32 -0
- data/lib/qti/v2/models/assessment_item.rb +62 -0
- data/lib/qti/v2/models/assessment_test.rb +32 -0
- data/lib/qti/v2/models/base.rb +70 -0
- data/lib/qti/v2/models/choices/simple_choice.rb +28 -0
- data/lib/qti/v2/models/interactions.rb +25 -0
- data/lib/qti/v2/models/interactions/choice_interaction.rb +50 -0
- data/spec/fixtures/items_1.2/multiple_answer.xml +105 -0
- data/spec/fixtures/items_1.2/multiple_choice.xml +83 -0
- data/spec/fixtures/items_1.2/true_false.xml +50 -0
- data/spec/fixtures/items_2.1/Example01-modalFeedback.xml +79 -0
- data/spec/fixtures/items_2.1/Example02-feedbackInline.xml +67 -0
- data/spec/fixtures/items_2.1/Example03-feedbackBlock-solution-random.xml +223 -0
- data/spec/fixtures/items_2.1/Example03-feedbackBlock-solution.xml +238 -0
- data/spec/fixtures/items_2.1/Example04-feedbackBlock-templateBlock.xml +582 -0
- data/spec/fixtures/items_2.1/Example05-feedbackBlock-adaptive.xml +397 -0
- data/spec/fixtures/items_2.1/adaptive.xml +286 -0
- data/spec/fixtures/items_2.1/adaptive_template.xml +350 -0
- data/spec/fixtures/items_2.1/associate.xml +33 -0
- data/spec/fixtures/items_2.1/audio-video.xml +46 -0
- data/spec/fixtures/items_2.1/choice.xml +31 -0
- data/spec/fixtures/items_2.1/choice_aria.xml +42 -0
- data/spec/fixtures/items_2.1/choice_fixed.xml +33 -0
- data/spec/fixtures/items_2.1/choice_multiple.xml +31 -0
- data/spec/fixtures/items_2.1/choice_multiple_chocolade.xml +74 -0
- data/spec/fixtures/items_2.1/choice_multiple_rtl.xml +33 -0
- data/spec/fixtures/items_2.1/choice_ruby.xml +39 -0
- data/spec/fixtures/items_2.1/choice_t_f.xml +30 -0
- data/spec/fixtures/items_2.1/choice_true_false.xml +30 -0
- data/spec/fixtures/items_2.1/data-attributes.xml +61 -0
- data/spec/fixtures/items_2.1/drawing.xml +16 -0
- data/spec/fixtures/items_2.1/essay.xml +14 -0
- data/spec/fixtures/items_2.1/extended_text.xml +24 -0
- data/spec/fixtures/items_2.1/extended_text_rubric.xml +36 -0
- data/spec/fixtures/items_2.1/feedback_adaptive.xml +142 -0
- data/spec/fixtures/items_2.1/figures.xml +32 -0
- data/spec/fixtures/items_2.1/gap_match.xml +33 -0
- data/spec/fixtures/items_2.1/graphic_associate.xml +36 -0
- data/spec/fixtures/items_2.1/graphic_gap_match.xml +54 -0
- data/spec/fixtures/items_2.1/graphic_gap_match_text.xml +50 -0
- data/spec/fixtures/items_2.1/graphic_order.xml +32 -0
- data/spec/fixtures/items_2.1/hint.xml +85 -0
- data/spec/fixtures/items_2.1/hotspot.xml +26 -0
- data/spec/fixtures/items_2.1/hottext.xml +33 -0
- data/spec/fixtures/items_2.1/images/CBG.png +0 -0
- data/spec/fixtures/items_2.1/images/EBG.png +0 -0
- data/spec/fixtures/items_2.1/images/EDI.png +0 -0
- data/spec/fixtures/items_2.1/images/GLA.png +0 -0
- data/spec/fixtures/items_2.1/images/MAN.png +0 -0
- data/spec/fixtures/items_2.1/images/MCH.png +0 -0
- data/spec/fixtures/items_2.1/images/airport.png +0 -0
- data/spec/fixtures/items_2.1/images/blueStar.png +0 -0
- data/spec/fixtures/items_2.1/images/blue_door.png +0 -0
- data/spec/fixtures/items_2.1/images/bus.png +0 -0
- data/spec/fixtures/items_2.1/images/castle.png +0 -0
- data/spec/fixtures/items_2.1/images/greenTriangle.png +0 -0
- data/spec/fixtures/items_2.1/images/green_door.png +0 -0
- data/spec/fixtures/items_2.1/images/house.png +0 -0
- data/spec/fixtures/items_2.1/images/open_car.png +0 -0
- data/spec/fixtures/items_2.1/images/open_goat.png +0 -0
- data/spec/fixtures/items_2.1/images/plane.png +0 -0
- data/spec/fixtures/items_2.1/images/postcard.eps +3581 -0
- data/spec/fixtures/items_2.1/images/postcard.png +0 -0
- data/spec/fixtures/items_2.1/images/rectangle.svg +1 -0
- data/spec/fixtures/items_2.1/images/redCircle.png +0 -0
- data/spec/fixtures/items_2.1/images/red_door.png +0 -0
- data/spec/fixtures/items_2.1/images/sign.png +0 -0
- data/spec/fixtures/items_2.1/images/survey.jpg +0 -0
- data/spec/fixtures/items_2.1/images/train.png +0 -0
- data/spec/fixtures/items_2.1/images/uk.png +0 -0
- data/spec/fixtures/items_2.1/images/ukair.png +0 -0
- data/spec/fixtures/items_2.1/images/ukairtags.png +0 -0
- data/spec/fixtures/items_2.1/imsmanifest.xml +227 -0
- data/spec/fixtures/items_2.1/inline_choice.xml +26 -0
- data/spec/fixtures/items_2.1/inline_choice_math.xml +68 -0
- data/spec/fixtures/items_2.1/likert.xml +21 -0
- data/spec/fixtures/items_2.1/match.xml +41 -0
- data/spec/fixtures/items_2.1/math.xml +35 -0
- data/spec/fixtures/items_2.1/mc_calc3.xml +164 -0
- data/spec/fixtures/items_2.1/mc_calc5.xml +211 -0
- data/spec/fixtures/items_2.1/mc_stat2.xml +219 -0
- data/spec/fixtures/items_2.1/media_coords.xml +33 -0
- data/spec/fixtures/items_2.1/multi-input.xml +271 -0
- data/spec/fixtures/items_2.1/nested_object.xml +26 -0
- data/spec/fixtures/items_2.1/order.xml +25 -0
- data/spec/fixtures/items_2.1/order_partial_scoring.xml +55 -0
- data/spec/fixtures/items_2.1/order_rtl.xml +27 -0
- data/spec/fixtures/items_2.1/orkney1.xml +34 -0
- data/spec/fixtures/items_2.1/orkney2.xml +34 -0
- data/spec/fixtures/items_2.1/position_object.xml +34 -0
- data/spec/fixtures/items_2.1/select_point.xml +23 -0
- data/spec/fixtures/items_2.1/shared/orkney.css +1 -0
- data/spec/fixtures/items_2.1/shared/orkney.html +20 -0
- data/spec/fixtures/items_2.1/slider.xml +35 -0
- data/spec/fixtures/items_2.1/svg.xml +28 -0
- data/spec/fixtures/items_2.1/template.xml +88 -0
- data/spec/fixtures/items_2.1/template_image.xml +74 -0
- data/spec/fixtures/items_2.1/text_entry.xml +27 -0
- data/spec/fixtures/items_2.1/upload.xml +18 -0
- data/spec/fixtures/items_2.1/upload_composite.xml +24 -0
- data/spec/fixtures/test_qti_1.2.zip +0 -0
- data/spec/fixtures/test_qti_1.2/contact info.png +0 -0
- data/spec/fixtures/test_qti_1.2/exam1/my_files/org0/images/image.png +0 -0
- data/spec/fixtures/test_qti_1.2/exam1/my_files/org1/images/image.png +0 -0
- data/spec/fixtures/test_qti_1.2/image.png +0 -0
- data/spec/fixtures/test_qti_1.2/imsmanifest.xml +37 -0
- data/spec/fixtures/test_qti_1.2/quiz.xml +216 -0
- data/spec/fixtures/test_qti_2.1.zip +0 -0
- data/spec/fixtures/test_qti_2.1/assessment.xml +77 -0
- data/spec/fixtures/test_qti_2.1/imsmanifest.xml +211 -0
- data/spec/fixtures/test_qti_2.1/mathassess.xsd +54 -0
- data/spec/fixtures/test_qti_2.1/multiple-answer/multiple-answer.xml +31 -0
- data/spec/fixtures/test_qti_2.1/multiple-choice/multiple-choice.xml +31 -0
- data/spec/fixtures/test_qti_2.1/text-entry/text-entry.xml +330 -0
- data/spec/fixtures/test_qti_2.1/true-false/true-false.xml +55 -0
- data/spec/fixtures/tests/feedbackTest/assessment.xml +252 -0
- data/spec/fixtures/tests/feedbackTest/id-38d47747fb30/Example02-feedbackInline.xml +51 -0
- data/spec/fixtures/tests/feedbackTest/id-5e216df10030/Example03-feedbackBlock-solution.xml +199 -0
- data/spec/fixtures/tests/feedbackTest/id-9c33d141576e/Example05-feedbackBlock-adaptive.xml +330 -0
- data/spec/fixtures/tests/feedbackTest/id-aaa0bbf5da1d/Example03-feedbackBlock-solution-random.xml +223 -0
- data/spec/fixtures/tests/feedbackTest/id-d599169403d2/Example04-feedbackBlock-templateBlock.xml +534 -0
- data/spec/fixtures/tests/feedbackTest/id-fa3ee5852723/Example01-modalFeedback.xml +55 -0
- data/spec/fixtures/tests/feedbackTest/imsmanifest.xml +239 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Choicemultiple_2014410822.xml +110 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Choicemultiple_871212949.xml +208 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Choicesingle_853928446.xml +159 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Choicetruefalse_176040516.xml +98 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Hotspot_278940407.xml +109 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Hottext_801974120.xml +106 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/InteractionMixSachsen_1901710679.xml +54 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Matchmultiple_1038910213.xml +139 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Matchsingle_143114773.xml +133 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/Order_913967682.xml +117 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/TextEntry_883368511.xml +114 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/TextEntrynumeric_2040297025.xml +154 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/TextEntrynumeric_770468849.xml +124 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/TextEntrysubset_806481421.xml +227 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/imsmanifest.xml +278 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/03c5e2f774db49598deb3ac7d05b53f9.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/0563e67fb1bb48ad882e0a5abf2a2686.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/2f44366716474a5d8e2a2e32346cbc05.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/71a299b50b5e4b1492f8ee51ce25be7d.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/a439b702d5034ca38f6df26a12835db3.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/b660fc9f268c4ef688d8606116c70160.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/c2f541343b9b4bfdba9fc90c7a18403e.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/e18b5a2eb8104d0994a182ee0176a05c.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/f88c5aa2c6724a388fdbadc7133eb757.jpg +0 -0
- data/spec/fixtures/tests/interactionmix_saxony_v3/media/ffe337505ef74334a0cecb33310f99c1.jpg +0 -0
- data/spec/fixtures/tests/tests/complete.xml +33 -0
- data/spec/fixtures/tests/tests/report.xml +70 -0
- data/spec/fixtures/tests/tests/rtest01-fragment.xml +12 -0
- data/spec/fixtures/tests/tests/rtest01-set01.xml +17 -0
- data/spec/fixtures/tests/tests/rtest01-set02.xml +17 -0
- data/spec/fixtures/tests/tests/rtest01-set03.xml +17 -0
- data/spec/fixtures/tests/tests/rtest01.xml +16 -0
- data/spec/fixtures/tests/tests/rtest02.xml +48 -0
- data/spec/fixtures/tests/tests/rtest03.xml +38 -0
- data/spec/fixtures/tests/tests/rtest04.xml +50 -0
- data/spec/fixtures/tests/tests/rtest06.xml +34 -0
- data/spec/fixtures/tests/tests/rtest08.xml +38 -0
- data/spec/fixtures/tests/tests/rtest09.xml +33 -0
- data/spec/fixtures/tests/tests/rtest10.xml +48 -0
- data/spec/fixtures/tests/tests/rtest12.xml +38 -0
- data/spec/fixtures/tests/tests/rtest13.xml +62 -0
- data/spec/fixtures/tests/tests/rtest22.xml +41 -0
- data/spec/fixtures/tests/tests/rtest24.xml +37 -0
- data/spec/fixtures/tests/tests/rtest25.xml +62 -0
- data/spec/fixtures/tests/tests/rtest26.xml +38 -0
- data/spec/fixtures/tests/tests/rtest27.xml +46 -0
- data/spec/qti/models/base_spec.rb +71 -0
- data/spec/qti/models/manifest_spec.rb +19 -0
- data/spec/qti/v1/models/assessment_item_spec.rb +49 -0
- data/spec/qti/v1/models/assessment_spec.rb +18 -0
- data/spec/qti/v1/models/choices/logical_identifier_choice_spec.rb +23 -0
- data/spec/qti/v1/models/interactions/logical_identifier_interaction_spec.rb +20 -0
- data/spec/qti/v2/models/assessment_item_spec.rb +67 -0
- data/spec/qti/v2/models/assessment_test_spec.rb +60 -0
- data/spec/qti/v2/models/choices/simple_choice_spec.rb +22 -0
- data/spec/qti/v2/models/interactions/choice_interaction_spec.rb +27 -0
- data/spec/qti_spec.rb +38 -0
- data/spec/spec_helper.rb +10 -0
- metadata +506 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<assessmentTest 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="RTEST-24" title="Randomizing the Order of Items and Sections">
|
6
|
+
<testPart navigationMode="nonlinear" submissionMode="simultaneous" identifier="RTEST-24-A">
|
7
|
+
<assessmentSection identifier="sectionA" title="Section A" visible="true">
|
8
|
+
<ordering shuffle="true"/>
|
9
|
+
<rubricBlock view="candidate">
|
10
|
+
<p>Instructions for Section A</p>
|
11
|
+
</rubricBlock>
|
12
|
+
<assessmentItemRef identifier="item034" href="item034.xml" fixed="true"/>
|
13
|
+
<assessmentItemRef identifier="item160" href="item160.xml"/>
|
14
|
+
<assessmentItemRef identifier="item063" href="item063.xml"/>
|
15
|
+
</assessmentSection>
|
16
|
+
<assessmentSection identifier="sectionB" title="Section B" visible="true">
|
17
|
+
<ordering shuffle="true"/>
|
18
|
+
<rubricBlock view="candidate">
|
19
|
+
<p>Instructions for Section B</p>
|
20
|
+
</rubricBlock>
|
21
|
+
<assessmentItemRef identifier="item434" href="item434.xml"/>
|
22
|
+
<assessmentItemRef identifier="item065" href="item065.xml"/>
|
23
|
+
<assessmentItemRef identifier="item365" href="item365.xml"/>
|
24
|
+
<assessmentSection identifier="sectionB1" title="Section B1" visible="false"
|
25
|
+
keepTogether="true">
|
26
|
+
<ordering shuffle="false"/>
|
27
|
+
<rubricBlock view="candidate">
|
28
|
+
<p>More instructions to cover these items only, displayed in addition to the
|
29
|
+
general instructions for section B.</p>
|
30
|
+
</rubricBlock>
|
31
|
+
<assessmentItemRef identifier="item347" href="item347.xml"/>
|
32
|
+
<assessmentItemRef identifier="item653" href="item653.xml"/>
|
33
|
+
</assessmentSection>
|
34
|
+
<assessmentItemRef identifier="item656" href="item656.xml"/>
|
35
|
+
</assessmentSection>
|
36
|
+
</testPart>
|
37
|
+
</assessmentTest>
|
@@ -0,0 +1,62 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<assessmentTest 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="RTEST-25" title="Basic Statistics as Outcomes">
|
6
|
+
<outcomeDeclaration identifier="NCORRECTA" cardinality="single" baseType="integer"/>
|
7
|
+
<outcomeDeclaration identifier="NCORRECTB" cardinality="single" baseType="integer"/>
|
8
|
+
<outcomeDeclaration identifier="NINCORRECT" cardinality="single" baseType="integer"/>
|
9
|
+
<outcomeDeclaration identifier="NRESPONSED" cardinality="single" baseType="integer"/>
|
10
|
+
<outcomeDeclaration identifier="NPRESENTED" cardinality="single" baseType="integer"/>
|
11
|
+
<outcomeDeclaration identifier="NSELECTED" cardinality="single" baseType="integer"/>
|
12
|
+
<outcomeDeclaration identifier="PERCENT_CORRECT" cardinality="single" baseType="float"/>
|
13
|
+
<testPart navigationMode="nonlinear" submissionMode="simultaneous" identifier="RTEST-25-A">
|
14
|
+
<assessmentSection identifier="sectionA" title="Section A" visible="true">
|
15
|
+
<rubricBlock view="candidate">
|
16
|
+
<p>Instructions for Section A</p>
|
17
|
+
</rubricBlock>
|
18
|
+
<assessmentItemRef identifier="item034" href="item034.xml"/>
|
19
|
+
<assessmentItemRef identifier="item160" href="item160.xml"/>
|
20
|
+
<assessmentItemRef identifier="item063" href="item063.xml"/>
|
21
|
+
</assessmentSection>
|
22
|
+
<assessmentSection identifier="sectionB" title="Section B" visible="true">
|
23
|
+
<selection select="2"/>
|
24
|
+
<rubricBlock view="candidate">
|
25
|
+
<p>Instructions for Section B</p>
|
26
|
+
</rubricBlock>
|
27
|
+
<assessmentItemRef identifier="item434" href="item434.xml"/>
|
28
|
+
<assessmentItemRef identifier="item065" href="item065.xml"/>
|
29
|
+
<assessmentItemRef identifier="item365" href="item365.xml"/>
|
30
|
+
<assessmentItemRef identifier="item656" href="item656.xml"/>
|
31
|
+
</assessmentSection>
|
32
|
+
</testPart>
|
33
|
+
<outcomeProcessing>
|
34
|
+
<setOutcomeValue identifier="NCORRECTA">
|
35
|
+
<numberCorrect sectionIdentifier="sectionA"/>
|
36
|
+
</setOutcomeValue>
|
37
|
+
<setOutcomeValue identifier="NCORRECTB">
|
38
|
+
<numberCorrect sectionIdentifier="sectionB"/>
|
39
|
+
</setOutcomeValue>
|
40
|
+
<setOutcomeValue identifier="NINCORRECT">
|
41
|
+
<numberIncorrect/>
|
42
|
+
</setOutcomeValue>
|
43
|
+
<setOutcomeValue identifier="NRESPONSED">
|
44
|
+
<numberResponded/>
|
45
|
+
</setOutcomeValue>
|
46
|
+
<setOutcomeValue identifier="NPRESENTED">
|
47
|
+
<numberPresented/>
|
48
|
+
</setOutcomeValue>
|
49
|
+
<setOutcomeValue identifier="NSELECTED">
|
50
|
+
<numberSelected/>
|
51
|
+
</setOutcomeValue>
|
52
|
+
<setOutcomeValue identifier="PERCENT_CORRECT">
|
53
|
+
<product>
|
54
|
+
<baseValue baseType="float">100.0</baseValue>
|
55
|
+
<divide>
|
56
|
+
<numberCorrect/>
|
57
|
+
<numberSelected/>
|
58
|
+
</divide>
|
59
|
+
</product>
|
60
|
+
</setOutcomeValue>
|
61
|
+
</outcomeProcessing>
|
62
|
+
</assessmentTest>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<assessmentTest xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2"
|
2
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
3
|
+
xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p2 http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd"
|
4
|
+
identifier="RTEST-26" title="Mapping item outcomes prior to aggregation">
|
5
|
+
<!-- Support for mapping of item outcomes prior to aggregation -->
|
6
|
+
<outcomeDeclaration baseType="float" cardinality="single" identifier="SCORE">
|
7
|
+
<defaultValue>
|
8
|
+
<value>0</value>
|
9
|
+
</defaultValue>
|
10
|
+
</outcomeDeclaration>
|
11
|
+
<testPart navigationMode="nonlinear" submissionMode="simultaneous" identifier="RTEST-26-A">
|
12
|
+
<assessmentSection identifier="sectionA" title="Section A" visible="true">
|
13
|
+
<rubricBlock view="candidate">
|
14
|
+
<p>Instructions for Section A</p>
|
15
|
+
</rubricBlock>
|
16
|
+
<assessmentItemRef identifier="item034" href="item034.xml">
|
17
|
+
<variableMapping sourceIdentifier="NOTA" targetIdentifier="SCORE"/>
|
18
|
+
</assessmentItemRef>
|
19
|
+
<assessmentItemRef identifier="item160" href="item160.xml"/>
|
20
|
+
<assessmentItemRef identifier="item063" href="item063.xml"/>
|
21
|
+
</assessmentSection>
|
22
|
+
<assessmentSection identifier="sectionB" title="Section B" visible="true">
|
23
|
+
<rubricBlock view="candidate">
|
24
|
+
<p>Instructions for Section B</p>
|
25
|
+
</rubricBlock>
|
26
|
+
<assessmentItemRef identifier="item434" href="item434.xml"/>
|
27
|
+
<assessmentItemRef identifier="item065" href="ïtem065.xml"/>
|
28
|
+
<assessmentItemRef identifier="item365" href="item365.xml"/>
|
29
|
+
</assessmentSection>
|
30
|
+
</testPart>
|
31
|
+
<outcomeProcessing>
|
32
|
+
<setOutcomeValue identifier="SCORE">
|
33
|
+
<sum>
|
34
|
+
<testVariables variableIdentifier="SCORE"/>
|
35
|
+
</sum>
|
36
|
+
</setOutcomeValue>
|
37
|
+
</outcomeProcessing>
|
38
|
+
</assessmentTest>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<assessmentTest 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="RTEST-27" title="Generalized Processing of Item Outcomes">
|
6
|
+
<outcomeDeclaration identifier="SCORE365" cardinality="single" baseType="integer"/>
|
7
|
+
<outcomeDeclaration identifier="SCOREA" cardinality="single" baseType="integer"/>
|
8
|
+
<outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float"/>
|
9
|
+
<testPart navigationMode="nonlinear" submissionMode="simultaneous" identifier="RTEST-27-A">
|
10
|
+
<assessmentSection identifier="sectionA" title="Section A" visible="true">
|
11
|
+
<rubricBlock view="candidate">
|
12
|
+
<p>Instructions for Section A</p>
|
13
|
+
</rubricBlock>
|
14
|
+
<assessmentItemRef identifier="item034" href="item034.xml"/>
|
15
|
+
<assessmentItemRef identifier="item160" href="item160.xml"/>
|
16
|
+
<assessmentItemRef identifier="item063" href="item063.xml"/>
|
17
|
+
</assessmentSection>
|
18
|
+
<assessmentSection identifier="sectionB" title="Section B" visible="true">
|
19
|
+
<rubricBlock view="candidate">
|
20
|
+
<p>Instructions for Section B</p>
|
21
|
+
</rubricBlock>
|
22
|
+
<assessmentItemRef identifier="item434" href="item434.xml"/>
|
23
|
+
<assessmentItemRef identifier="item065" href="item065.xml"/>
|
24
|
+
<assessmentItemRef identifier="item365" href="item365.xml"/>
|
25
|
+
<assessmentItemRef identifier="item656" href="item656.xml"/>
|
26
|
+
</assessmentSection>
|
27
|
+
</testPart>
|
28
|
+
<outcomeProcessing>
|
29
|
+
<!-- just a single item score -->
|
30
|
+
<setOutcomeValue identifier="SCORE365">
|
31
|
+
<variable identifier="item365.SCORE"/>
|
32
|
+
</setOutcomeValue>
|
33
|
+
<!-- all the scores in section A -->
|
34
|
+
<setOutcomeValue identifier="SCOREA">
|
35
|
+
<sum>
|
36
|
+
<testVariables sectionIdentifier="SectionA" variableIdentifier="SCORE"/>
|
37
|
+
</sum>
|
38
|
+
</setOutcomeValue>
|
39
|
+
<!-- all the scores in the test -->
|
40
|
+
<setOutcomeValue identifier="SCORE">
|
41
|
+
<sum>
|
42
|
+
<testVariables variableIdentifier="SCORE"/>
|
43
|
+
</sum>
|
44
|
+
</setOutcomeValue>
|
45
|
+
</outcomeProcessing>
|
46
|
+
</assessmentTest>
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::Models::Base do
|
4
|
+
let(:loaded_class) do
|
5
|
+
path = File.join('spec', 'fixtures', 'test_qti_2.1', 'assessment.xml')
|
6
|
+
described_class.from_path!(path)
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'specified as single content node matching helpers' do
|
10
|
+
let(:content_stub) { Struct.new(:content, :thing) }
|
11
|
+
|
12
|
+
# "assessmentItemRef" should match 4 nodes, and therefore raise for these helpers
|
13
|
+
let(:bad_xpath) { '//xmlns:assessmentItemRef' }
|
14
|
+
let(:bad_css_path) { 'assessmentItemRef' }
|
15
|
+
|
16
|
+
let(:xpath) { '//xmlns:assessmentTest' }
|
17
|
+
let(:css_path) { 'assessmentTest' }
|
18
|
+
|
19
|
+
describe '#xpath_with_single_check' do
|
20
|
+
it 'raises if node count is more than 1' do
|
21
|
+
expect do
|
22
|
+
loaded_class.xpath_with_single_check(bad_xpath)
|
23
|
+
end.to raise_error
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'doesn\'t raise with a single node count' do
|
27
|
+
expect do
|
28
|
+
loaded_class.xpath_with_single_check(xpath)
|
29
|
+
end.not_to raise_error
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#css_with_single_check' do
|
34
|
+
it 'raises if node count is more than 1' do
|
35
|
+
expect do
|
36
|
+
loaded_class.css_with_single_check(bad_css_path)
|
37
|
+
end.to raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'doesn\'t raise with a single node count' do
|
41
|
+
expect do
|
42
|
+
loaded_class.css_with_single_check(css_path)
|
43
|
+
end.not_to raise_error
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#remap_href_path' do
|
48
|
+
let(:href) { 'hi.xml' }
|
49
|
+
let(:base_path) { 'hello/bob.xml' }
|
50
|
+
let(:remapped_path) { File.join(File.dirname(base_path), href) }
|
51
|
+
let(:subject) { loaded_class.remap_href_path(href, base_path) }
|
52
|
+
|
53
|
+
it 'passes the original path if it exists' do
|
54
|
+
allow(File).to receive(:exist?).with(href).and_return(true)
|
55
|
+
expect(subject).to eq href
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'passes the original path when the remapped path doesn\'t exist' do
|
59
|
+
allow(File).to receive(:exist?).with(href).and_return(false)
|
60
|
+
allow(File).to receive(:exist?).with(remapped_path).and_return(false)
|
61
|
+
expect(subject).to eq href
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'passes the remapped path if it exists' do
|
65
|
+
allow(File).to receive(:exist?).with(href).and_return(false)
|
66
|
+
allow(File).to receive(:exist?).with(remapped_path).and_return(true)
|
67
|
+
expect(subject).to eq remapped_path
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
fixtures_path = File.join('spec', 'fixtures')
|
4
|
+
|
5
|
+
describe Qti::Models::Manifest do
|
6
|
+
manifest_files = Dir.glob(File.join(fixtures_path, '**', 'imsmanifest.xml'))
|
7
|
+
manifest_files.each do |file|
|
8
|
+
context "File: #{file}" do
|
9
|
+
it 'parses the manifest file without error' do
|
10
|
+
expect { described_class.from_path!(file) }.not_to raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns a path to the xml test reference if it exists' do
|
14
|
+
href = described_class.from_path!(file).assessment_test_href
|
15
|
+
expect(File.extname(href)).to eq '.xml' if href
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::V1::Models::AssessmentItem do
|
4
|
+
context 'quiz.xml' do
|
5
|
+
let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'true_false.xml') }
|
6
|
+
let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
|
7
|
+
let(:assessment_item_refs) { test_object.assessment_items }
|
8
|
+
let(:loaded_class) { described_class.new(assessment_item_refs) }
|
9
|
+
|
10
|
+
it 'loads an AssessmentItem ref' do
|
11
|
+
expect do
|
12
|
+
described_class.new(assessment_item_ref)
|
13
|
+
end.to_not raise_error(Qti::ParseError)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'has the title' do
|
17
|
+
expect(loaded_class.title).to eq 'Grading - specific - 3 pt score'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'has sanitized item_body' do
|
21
|
+
expect(loaded_class.item_body).to include '<img'
|
22
|
+
expect(loaded_class.item_body).to include 'If I get a 3, I must have done something wrong.'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'grabs the points possible' do
|
26
|
+
expect(loaded_class.points_possible).to eq '0'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'grabs the rcardinality and scoring data value' do
|
30
|
+
struct = loaded_class.send(:scoring_data_structs)
|
31
|
+
expect(struct.first.values).to eq 'QUE_1005_A1'
|
32
|
+
expect(struct.first.rcardinality).to eq 'Single'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'has the identifier used to identify it in manifest/test files' do
|
36
|
+
expect(loaded_class.identifier).to eq 'QUE_1003'
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'loads the interaction_model without erroring' do
|
40
|
+
expect { loaded_class.interaction_model }.not_to raise_error
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'loads the correct interaction model' do
|
44
|
+
expect(loaded_class.interaction_model).to be_an_instance_of(
|
45
|
+
Qti::V1::Models::Interactions::LogicalIdentifierInteraction
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
fixtures_path = File.join('spec', 'fixtures')
|
4
|
+
|
5
|
+
describe Qti::V1::Models::Assessment do
|
6
|
+
let(:path) { File.join(fixtures_path, 'test_qti_1.2', 'quiz.xml') }
|
7
|
+
let(:loaded_class) { described_class.from_path!(path) }
|
8
|
+
|
9
|
+
it 'loads an AssessmentXML file' do
|
10
|
+
expect do
|
11
|
+
described_class.from_path!(path)
|
12
|
+
end.to_not raise_error
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'has the title' do
|
16
|
+
expect(loaded_class.title).to eq '1.2 Import Quiz'
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::V1::Models::Choices::LogicalIdentifierChoice do
|
4
|
+
context 'quiz.xml' do
|
5
|
+
let(:fixtures_path) { File.join('spec', 'fixtures') }
|
6
|
+
let(:file_path) { File.join(fixtures_path, 'test_qti_1.2', 'quiz.xml') }
|
7
|
+
let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
|
8
|
+
let(:nodes) { test_object.assessment_items }
|
9
|
+
let(:choices) { nodes.map { |node| described_class.new(node) } }
|
10
|
+
|
11
|
+
it 'returns the right identifier' do
|
12
|
+
expect(choices.map(&:identifier)).to eq %w(QUE_1003 QUE_1007 QUE_1022)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns the item body text' do
|
16
|
+
expect(choices.map(&:item_body).map(&:empty?).any?).to eq false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'removes inline feedback elements from item_body' do
|
20
|
+
expect(choices.map(&:item_body).map { |text| text.include? 'correct' }.any?).to eq false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::V1::Models::Interactions::LogicalIdentifierInteraction do
|
4
|
+
context 'quiz.xml' do
|
5
|
+
let(:fixtures_path) { File.join('spec', 'fixtures') }
|
6
|
+
let(:file_path) { File.join(fixtures_path, 'test_qti_1.2', 'quiz.xml') }
|
7
|
+
let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
|
8
|
+
let(:assessment_item_refs) { test_object.assessment_items }
|
9
|
+
let(:loaded_class) { described_class.new(assessment_item_refs.first) }
|
10
|
+
|
11
|
+
it 'returns shuffle setting' do
|
12
|
+
expect(loaded_class.shuffled?).to eq true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns the answers' do
|
16
|
+
expect(loaded_class.answers.count).to eq 2
|
17
|
+
expect(loaded_class.answers.first).to be_an_instance_of(Qti::V1::Models::Choices::LogicalIdentifierChoice)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::V2::Models::AssessmentItem do
|
4
|
+
context 'choice.xml' do
|
5
|
+
let(:fixtures_path) { File.join('spec', 'fixtures') }
|
6
|
+
let(:file_path) { File.join(fixtures_path, 'items_2.1', 'choice.xml') }
|
7
|
+
let(:loaded_class) { described_class.from_path!(file_path) }
|
8
|
+
|
9
|
+
it 'loads an AssessmentItem XML file' do
|
10
|
+
expect do
|
11
|
+
described_class.from_path!(file_path)
|
12
|
+
end.to_not raise_error(Qti::ParseError)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'has the title' do
|
16
|
+
expect(loaded_class.title).to eq 'Unattended Luggage'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'has sanitized item_body' do
|
20
|
+
expect(loaded_class.item_body).to include '<img'
|
21
|
+
expect(loaded_class.item_body).to include '<p'
|
22
|
+
expect(loaded_class.item_body).to include 'Look at the text in the picture.'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'falls back onto nil points possible value' do
|
26
|
+
expect(loaded_class.points_possible).to eq nil
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'grabs the type and scoring data value' do
|
30
|
+
struct = loaded_class.send(:scoring_data_structs)
|
31
|
+
expect(struct.first.values).to eq 'ChoiceA'
|
32
|
+
expect(struct.first.type).to eq 'identifier'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'has the identifier used to identify it in manifest/test files' do
|
36
|
+
expect(loaded_class.identifier).to eq 'choice'
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'loads the interaction_model without erroring' do
|
40
|
+
expect { loaded_class.interaction_model }.not_to raise_error
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'loads the correct interaction model' do
|
44
|
+
expect(loaded_class.interaction_model).to be_an_instance_of(Qti::V2::Models::Interactions::ChoiceInteraction)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'all test files' do
|
49
|
+
test_files = Dir.glob(File.join('spec', 'fixtures', 'items_2.1', '*.xml'))
|
50
|
+
test_files.each do |file|
|
51
|
+
next if file.include? 'imsmanifest.xml'
|
52
|
+
context File.basename(file) do
|
53
|
+
let(:loaded_class) { described_class.from_path!(file) }
|
54
|
+
|
55
|
+
it 'loads an AssessmentItem XML file' do
|
56
|
+
expect do
|
57
|
+
described_class.from_path!(file)
|
58
|
+
end.to_not raise_error
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'has a title' do
|
62
|
+
expect(loaded_class.title).to be_a String
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|