@longsightgroup/qti3-core 0.10.6 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -0
- package/dist/adaptive-turn-materializer.js +4 -5
- package/dist/adaptive-turn-materializer.js.map +1 -1
- package/dist/adaptive-turn.d.ts.map +1 -1
- package/dist/adaptive-turn.js +1 -0
- package/dist/adaptive-turn.js.map +1 -1
- package/dist/attempt-state.d.ts.map +1 -1
- package/dist/attempt-state.js +41 -1
- package/dist/attempt-state.js.map +1 -1
- package/dist/binary-choice.d.ts +9 -0
- package/dist/binary-choice.d.ts.map +1 -0
- package/dist/binary-choice.js +81 -0
- package/dist/binary-choice.js.map +1 -0
- package/dist/diagnostics.d.ts +13 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +28 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +19 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/item-submission-materialization.d.ts.map +1 -1
- package/dist/item-submission-materialization.js +2 -0
- package/dist/item-submission-materialization.js.map +1 -1
- package/dist/parser-processing.d.ts.map +1 -1
- package/dist/parser-processing.js +8 -18
- package/dist/parser-processing.js.map +1 -1
- package/dist/parser-values.d.ts.map +1 -1
- package/dist/parser-values.js +1 -3
- package/dist/parser-values.js.map +1 -1
- package/dist/parser.js +32 -0
- package/dist/parser.js.map +1 -1
- package/dist/processing-equality.d.ts +10 -0
- package/dist/processing-equality.d.ts.map +1 -0
- package/dist/processing-equality.js +78 -0
- package/dist/processing-equality.js.map +1 -0
- package/dist/processing-evaluator-comparison.d.ts.map +1 -1
- package/dist/processing-evaluator-comparison.js +14 -9
- package/dist/processing-evaluator-comparison.js.map +1 -1
- package/dist/processing-evaluator-numeric.d.ts.map +1 -1
- package/dist/processing-evaluator-numeric.js +2 -1
- package/dist/processing-evaluator-numeric.js.map +1 -1
- package/dist/processing-evaluator-string.d.ts.map +1 -1
- package/dist/processing-evaluator-string.js +26 -10
- package/dist/processing-evaluator-string.js.map +1 -1
- package/dist/processing-evaluator-variable.d.ts.map +1 -1
- package/dist/processing-evaluator-variable.js +9 -3
- package/dist/processing-evaluator-variable.js.map +1 -1
- package/dist/processing-evaluator.d.ts +5 -1
- package/dist/processing-evaluator.d.ts.map +1 -1
- package/dist/processing-evaluator.js +13 -4
- package/dist/processing-evaluator.js.map +1 -1
- package/dist/processing-expression-children.d.ts.map +1 -1
- package/dist/processing-expression-children.js +2 -3
- package/dist/processing-expression-children.js.map +1 -1
- package/dist/processing-expression-tags.d.ts +2 -1
- package/dist/processing-expression-tags.d.ts.map +1 -1
- package/dist/processing-expression-tags.js +2 -1
- package/dist/processing-expression-tags.js.map +1 -1
- package/dist/processing-mapping.d.ts.map +1 -1
- package/dist/processing-mapping.js +26 -16
- package/dist/processing-mapping.js.map +1 -1
- package/dist/processing-state.d.ts +2 -2
- package/dist/processing-state.d.ts.map +1 -1
- package/dist/processing-state.js +5 -2
- package/dist/processing-state.js.map +1 -1
- package/dist/processing-values.d.ts +1 -2
- package/dist/processing-values.d.ts.map +1 -1
- package/dist/processing-values.js +1 -3
- package/dist/processing-values.js.map +1 -1
- package/dist/processing-variables.d.ts.map +1 -1
- package/dist/processing-variables.js +10 -5
- package/dist/processing-variables.js.map +1 -1
- package/dist/qti-identifier.d.ts +3 -0
- package/dist/qti-identifier.d.ts.map +1 -0
- package/dist/qti-identifier.js +5 -0
- package/dist/qti-identifier.js.map +1 -0
- package/dist/qti-package-assets.d.ts.map +1 -1
- package/dist/qti-package-assets.js +16 -10
- package/dist/qti-package-assets.js.map +1 -1
- package/dist/qti-package-manifest.d.ts +1 -0
- package/dist/qti-package-manifest.d.ts.map +1 -1
- package/dist/qti-package-manifest.js +1 -0
- package/dist/qti-package-manifest.js.map +1 -1
- package/dist/qti-package-metadata.d.ts.map +1 -1
- package/dist/qti-package-metadata.js +11 -0
- package/dist/qti-package-metadata.js.map +1 -1
- package/dist/qti-package-paths.d.ts +2 -0
- package/dist/qti-package-paths.d.ts.map +1 -1
- package/dist/qti-package-paths.js +6 -0
- package/dist/qti-package-paths.js.map +1 -1
- package/dist/qti-package-plan.d.ts +1 -1
- package/dist/qti-package-plan.d.ts.map +1 -1
- package/dist/qti-package-types.d.ts +9 -0
- package/dist/qti-package-types.d.ts.map +1 -1
- package/dist/qti-package-xml.d.ts +6 -1
- package/dist/qti-package-xml.d.ts.map +1 -1
- package/dist/qti-package-xml.js +11 -6
- package/dist/qti-package-xml.js.map +1 -1
- package/dist/qti-package-zip.d.ts +13 -1
- package/dist/qti-package-zip.d.ts.map +1 -1
- package/dist/qti-package-zip.js +185 -54
- package/dist/qti-package-zip.js.map +1 -1
- package/dist/qti-package.d.ts +12 -5
- package/dist/qti-package.d.ts.map +1 -1
- package/dist/qti-package.js +63 -8
- package/dist/qti-package.js.map +1 -1
- package/dist/response-validation-policy.d.ts.map +1 -1
- package/dist/response-validation-policy.js +3 -1
- package/dist/response-validation-policy.js.map +1 -1
- package/dist/response-validation.d.ts.map +1 -1
- package/dist/response-validation.js +2 -1
- package/dist/response-validation.js.map +1 -1
- package/dist/serializer-processing-expressions.d.ts.map +1 -1
- package/dist/serializer-processing-expressions.js +2 -10
- package/dist/serializer-processing-expressions.js.map +1 -1
- package/dist/server-scoring.d.ts.map +1 -1
- package/dist/server-scoring.js +1 -0
- package/dist/server-scoring.js.map +1 -1
- package/dist/session-builtins.d.ts +16 -0
- package/dist/session-builtins.d.ts.map +1 -0
- package/dist/session-builtins.js +58 -0
- package/dist/session-builtins.js.map +1 -0
- package/dist/session.d.ts +5 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +63 -11
- package/dist/session.js.map +1 -1
- package/dist/support-evidence.d.ts.map +1 -1
- package/dist/support-evidence.js +2 -0
- package/dist/support-evidence.js.map +1 -1
- package/dist/support.d.ts.map +1 -1
- package/dist/support.js +66 -23
- package/dist/support.js.map +1 -1
- package/dist/test-expression-parser.d.ts +6 -0
- package/dist/test-expression-parser.d.ts.map +1 -0
- package/dist/test-expression-parser.js +76 -0
- package/dist/test-expression-parser.js.map +1 -0
- package/dist/test-expression-serializer.d.ts +5 -0
- package/dist/test-expression-serializer.d.ts.map +1 -0
- package/dist/test-expression-serializer.js +54 -0
- package/dist/test-expression-serializer.js.map +1 -0
- package/dist/test-expression-validation.d.ts +14 -0
- package/dist/test-expression-validation.d.ts.map +1 -0
- package/dist/test-expression-validation.js +101 -0
- package/dist/test-expression-validation.js.map +1 -0
- package/dist/test-expression.d.ts +99 -0
- package/dist/test-expression.d.ts.map +1 -0
- package/dist/test-expression.js +28 -0
- package/dist/test-expression.js.map +1 -0
- package/dist/test-model.d.ts +62 -0
- package/dist/test-model.d.ts.map +1 -0
- package/dist/test-model.js +5 -0
- package/dist/test-model.js.map +1 -0
- package/dist/test-parser.d.ts +13 -0
- package/dist/test-parser.d.ts.map +1 -0
- package/dist/test-parser.js +144 -0
- package/dist/test-parser.js.map +1 -0
- package/dist/test-processing.d.ts +22 -0
- package/dist/test-processing.d.ts.map +1 -0
- package/dist/test-processing.js +84 -0
- package/dist/test-processing.js.map +1 -0
- package/dist/test-session.d.ts +31 -0
- package/dist/test-session.d.ts.map +1 -0
- package/dist/test-session.js +102 -0
- package/dist/test-session.js.map +1 -0
- package/dist/test-support.d.ts +4 -0
- package/dist/test-support.d.ts.map +1 -0
- package/dist/test-support.js +30 -0
- package/dist/test-support.js.map +1 -0
- package/dist/test-validation.d.ts +4 -0
- package/dist/test-validation.d.ts.map +1 -0
- package/dist/test-validation.js +133 -0
- package/dist/test-validation.js.map +1 -0
- package/dist/test-xml.d.ts +7 -0
- package/dist/test-xml.d.ts.map +1 -0
- package/dist/test-xml.js +23 -0
- package/dist/test-xml.js.map +1 -0
- package/dist/trusted-item-session.d.ts +4 -1
- package/dist/trusted-item-session.d.ts.map +1 -1
- package/dist/trusted-item-session.js +8 -3
- package/dist/trusted-item-session.js.map +1 -1
- package/dist/types.d.ts +26 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/validation-declaration-entries.d.ts.map +1 -1
- package/dist/validation-declaration-entries.js +11 -1
- package/dist/validation-declaration-entries.js.map +1 -1
- package/dist/validation-item-children.d.ts +4 -0
- package/dist/validation-item-children.d.ts.map +1 -0
- package/dist/validation-item-children.js +45 -0
- package/dist/validation-item-children.js.map +1 -0
- package/dist/validation-processing.d.ts.map +1 -1
- package/dist/validation-processing.js +45 -12
- package/dist/validation-processing.js.map +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +12 -0
- package/dist/validation.js.map +1 -1
- package/dist/value-guards.d.ts +4 -0
- package/dist/value-guards.d.ts.map +1 -0
- package/dist/value-guards.js +5 -0
- package/dist/value-guards.js.map +1 -0
- package/dist/xml-schema-regex-data.d.ts +48 -0
- package/dist/xml-schema-regex-data.d.ts.map +1 -0
- package/dist/xml-schema-regex-data.js +403 -0
- package/dist/xml-schema-regex-data.js.map +1 -0
- package/dist/xml-schema-regex-parser.d.ts +31 -0
- package/dist/xml-schema-regex-parser.d.ts.map +1 -0
- package/dist/xml-schema-regex-parser.js +245 -0
- package/dist/xml-schema-regex-parser.js.map +1 -0
- package/dist/xml-schema-regex.d.ts +14 -0
- package/dist/xml-schema-regex.d.ts.map +1 -0
- package/dist/xml-schema-regex.js +114 -0
- package/dist/xml-schema-regex.js.map +1 -0
- package/package.json +1 -1
- package/src/adaptive-turn-materializer.ts +4 -3
- package/src/adaptive-turn.ts +1 -0
- package/src/attempt-state.ts +54 -1
- package/src/binary-choice.ts +96 -0
- package/src/diagnostics.ts +29 -0
- package/src/index.ts +38 -0
- package/src/item-submission-materialization.ts +2 -0
- package/src/parser-processing.ts +15 -18
- package/src/parser-values.ts +1 -5
- package/src/parser.ts +34 -0
- package/src/processing-equality.ts +104 -0
- package/src/processing-evaluator-comparison.ts +19 -14
- package/src/processing-evaluator-numeric.ts +2 -6
- package/src/processing-evaluator-string.ts +25 -18
- package/src/processing-evaluator-variable.ts +8 -3
- package/src/processing-evaluator.ts +20 -7
- package/src/processing-expression-children.ts +2 -3
- package/src/processing-expression-tags.ts +2 -1
- package/src/processing-mapping.ts +31 -25
- package/src/processing-state.ts +6 -1
- package/src/processing-values.ts +2 -11
- package/src/processing-variables.ts +9 -7
- package/src/qti-identifier.ts +4 -0
- package/src/qti-package-assets.ts +20 -13
- package/src/qti-package-manifest.ts +1 -0
- package/src/qti-package-metadata.ts +11 -0
- package/src/qti-package-paths.ts +9 -0
- package/src/qti-package-plan.ts +1 -1
- package/src/qti-package-types.ts +10 -0
- package/src/qti-package-xml.ts +11 -6
- package/src/qti-package-zip.ts +330 -97
- package/src/qti-package.ts +106 -7
- package/src/response-validation-policy.ts +5 -1
- package/src/response-validation.ts +2 -1
- package/src/serializer-processing-expressions.ts +8 -25
- package/src/server-scoring.ts +1 -0
- package/src/session-builtins.ts +75 -0
- package/src/session.ts +64 -8
- package/src/support-evidence.ts +2 -0
- package/src/support.ts +86 -23
- package/src/test-expression-parser.ts +89 -0
- package/src/test-expression-serializer.ts +71 -0
- package/src/test-expression-validation.ts +139 -0
- package/src/test-expression.ts +66 -0
- package/src/test-model.ts +68 -0
- package/src/test-parser.ts +201 -0
- package/src/test-processing.ts +107 -0
- package/src/test-session.ts +160 -0
- package/src/test-support.ts +31 -0
- package/src/test-validation.ts +190 -0
- package/src/test-xml.ts +37 -0
- package/src/trusted-item-session.ts +13 -2
- package/src/types.ts +36 -4
- package/src/validation-declaration-entries.ts +11 -1
- package/src/validation-item-children.ts +48 -0
- package/src/validation-processing.ts +47 -10
- package/src/validation.ts +14 -0
- package/src/value-guards.ts +6 -0
- package/src/xml-schema-regex-data.ts +404 -0
- package/src/xml-schema-regex-parser.ts +234 -0
- package/src/xml-schema-regex.ts +115 -0
package/dist/support.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { testExecutionSupport } from "./test-support.js";
|
|
1
2
|
import { browserFeedbackTests, browserHarnessTests, coreIntegrationTest, interactionSupportFixtures, interactionSupportTests, processingBrowserEvidence, processingMappingTest, processingOperatorsTest, processingResponseTest, processingTemplateTest, } from "./support-evidence.js";
|
|
2
3
|
export const interactionSupport = [
|
|
3
4
|
entry("qti-associate-interaction", "associate"),
|
|
@@ -59,7 +60,10 @@ export const processingSupport = [
|
|
|
59
60
|
"packages/fixtures/xml/random-integer-template-reference.xml",
|
|
60
61
|
"packages/fixtures/xml/template-content-reference.xml",
|
|
61
62
|
]),
|
|
62
|
-
|
|
63
|
+
{
|
|
64
|
+
...templateProcessingEntry("qti-set-default-value"),
|
|
65
|
+
notes: "Updates effective response/outcome defaults for the clone, including explicit NULL overrides; rejected template passes discard their overrides.",
|
|
66
|
+
},
|
|
63
67
|
templateProcessingEntry("qti-set-correct-response", [
|
|
64
68
|
"packages/fixtures/xml/template-processing-reference.xml",
|
|
65
69
|
"packages/fixtures/xml/random-integer-template-reference.xml",
|
|
@@ -100,28 +104,54 @@ export const processingSupport = [
|
|
|
100
104
|
operatorProcessingEntry("qti-null"),
|
|
101
105
|
mappingProcessingEntry("qti-match-table"),
|
|
102
106
|
mappingProcessingEntry("qti-match-table-entry"),
|
|
103
|
-
|
|
107
|
+
{
|
|
108
|
+
...mappingProcessingEntry("qti-interpolation-table"),
|
|
109
|
+
notes: "Selects the first authored entry whose source-value is below the input, including equality only when include-boundary permits it.",
|
|
110
|
+
},
|
|
104
111
|
mappingProcessingEntry("qti-interpolation-table-entry"),
|
|
105
|
-
|
|
112
|
+
{
|
|
113
|
+
...operatorProcessingEntry("qti-is-null"),
|
|
114
|
+
notes: "Accepts one arbitrary expression, evaluates it in the full variable context, and tests the result for NULL.",
|
|
115
|
+
},
|
|
106
116
|
mappingProcessingEntry("qti-match", [
|
|
107
117
|
"packages/fixtures/xml/generic-match-processing-reference.xml",
|
|
108
118
|
"packages/fixtures/xml/advanced-processing-reference.xml",
|
|
109
119
|
]),
|
|
110
120
|
mappingProcessingEntry("qti-correct"),
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
"
|
|
121
|
-
|
|
121
|
+
{
|
|
122
|
+
...mappingProcessingEntry("qti-default", [], [processingTemplateTest]),
|
|
123
|
+
notes: "Reads the effective authored or template-overridden default, independently of the variable's current value.",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
...mappingProcessingEntry("qti-map-response"),
|
|
127
|
+
notes: "String map entries honor case-sensitive (default false); mapping counts each distinct response value once using QTI base-type equality, then applies bounds.",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
...mappingProcessingEntry("qti-map-response-point"),
|
|
131
|
+
notes: "Each point selects the first matching authored area; each selected area contributes at most once.",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
...responseProcessingEntry("qti-variable", [
|
|
135
|
+
"packages/fixtures/xml/generic-match-processing-reference.xml",
|
|
136
|
+
"packages/fixtures/xml/template-processing-reference.xml",
|
|
137
|
+
"packages/fixtures/xml/random-integer-template-reference.xml",
|
|
138
|
+
"packages/fixtures/xml/template-content-reference.xml",
|
|
139
|
+
"packages/fixtures/xml/advanced-processing-reference.xml",
|
|
140
|
+
"packages/fixtures/xml/adaptive-feedback-reference.xml",
|
|
141
|
+
]),
|
|
142
|
+
notes: "Resolves declared variables and implicit completionStatus, numAttempts, timed-item duration (float seconds), and QTI_CONTEXT; session environment is resolved before template processing.",
|
|
143
|
+
tests: [
|
|
144
|
+
processingResponseTest,
|
|
145
|
+
"packages/core/src/session-builtins.test.ts",
|
|
146
|
+
"tests/browser/player-lifecycle.spec.ts",
|
|
147
|
+
],
|
|
148
|
+
},
|
|
122
149
|
templateProcessingEntry("qti-random-integer", ["packages/fixtures/xml/random-integer-template-reference.xml"], [...processingBrowserEvidence["qti-random-integer"]]),
|
|
123
150
|
operatorProcessingEntry("qti-random-float"),
|
|
124
|
-
|
|
151
|
+
{
|
|
152
|
+
...operatorProcessingEntry("qti-random"),
|
|
153
|
+
notes: "Evaluates one multiple/ordered container expression, including variables, then selects a scalar member; NULL/empty containers return NULL and serialization retains the operand.",
|
|
154
|
+
},
|
|
125
155
|
operatorProcessingEntry("qti-multiple", [
|
|
126
156
|
"packages/fixtures/xml/advanced-processing-reference.xml",
|
|
127
157
|
]),
|
|
@@ -129,7 +159,10 @@ export const processingSupport = [
|
|
|
129
159
|
"packages/fixtures/xml/advanced-processing-reference.xml",
|
|
130
160
|
]),
|
|
131
161
|
operatorProcessingEntry("qti-index"),
|
|
132
|
-
|
|
162
|
+
{
|
|
163
|
+
...operatorProcessingEntry("qti-contains", [], ["packages/core/src/processing-containment.test.ts"]),
|
|
164
|
+
notes: "Multiple containers use multiset containment; ordered containers require a contiguous sequence and preserve duplicate counts, including variable/delete/repeat operands.",
|
|
165
|
+
},
|
|
133
166
|
operatorProcessingEntry("qti-container-size", [
|
|
134
167
|
"packages/fixtures/xml/advanced-processing-reference.xml",
|
|
135
168
|
]),
|
|
@@ -155,10 +188,14 @@ export const processingSupport = [
|
|
|
155
188
|
operatorProcessingEntry("qti-any-n"),
|
|
156
189
|
operatorProcessingEntry("qti-or"),
|
|
157
190
|
operatorProcessingEntry("qti-not"),
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
"
|
|
161
|
-
|
|
191
|
+
{
|
|
192
|
+
...operatorProcessingEntry("qti-equal", [], ["packages/core/src/processing-equality.test.ts"]),
|
|
193
|
+
notes: "Preserves and evaluates exact, absolute, and relative tolerance with asymmetric bounds, variable tolerances, and inclusive/exclusive boundaries.",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
...operatorProcessingEntry("qti-equal-rounded", ["packages/fixtures/xml/advanced-processing-reference.xml"], ["packages/core/src/processing-equality.test.ts"]),
|
|
197
|
+
notes: "Defaults rounding-mode to significantFigures and resolves integer-or-variable-reference figures at evaluation time, preserving both through serialization.",
|
|
198
|
+
},
|
|
162
199
|
mappingProcessingEntry("qti-field-value"),
|
|
163
200
|
operatorProcessingEntry("qti-lt"),
|
|
164
201
|
operatorProcessingEntry("qti-lte"),
|
|
@@ -166,7 +203,11 @@ export const processingSupport = [
|
|
|
166
203
|
operatorProcessingEntry("qti-gte"),
|
|
167
204
|
operatorProcessingEntry("qti-string-match"),
|
|
168
205
|
operatorProcessingEntry("qti-substring"),
|
|
169
|
-
|
|
206
|
+
{
|
|
207
|
+
...operatorProcessingEntry("qti-pattern-match"),
|
|
208
|
+
tests: [processingOperatorsTest, "packages/core/src/processing-pattern.test.ts"],
|
|
209
|
+
notes: "XML Schema Appendix F whole-string matching, XML name escapes, Unicode categories/blocks and class subtraction; brace-enclosed pattern variables, NULL propagation and explicit syntax/resource diagnostics. No JavaScript-pattern fallback.",
|
|
210
|
+
},
|
|
170
211
|
operatorProcessingEntry("qti-member"),
|
|
171
212
|
operatorProcessingEntry("qti-delete"),
|
|
172
213
|
operatorProcessingEntry("qti-duration-gte"),
|
|
@@ -232,9 +273,10 @@ export const itemMetadataSupport = [
|
|
|
232
273
|
tests: [
|
|
233
274
|
processingResponseTest,
|
|
234
275
|
"packages/core/src/parser-item-metadata.test.ts",
|
|
276
|
+
"packages/core/src/adaptive-turn-materializer.test.ts",
|
|
235
277
|
...browserFeedbackTests,
|
|
236
278
|
],
|
|
237
|
-
notes: "Parsed by parser-item-metadata.ts and validated by validateModalFeedback. Response processing supplies the outcome
|
|
279
|
+
notes: "Parsed by parser-item-metadata.ts and validated by validateModalFeedback. Response processing supplies the scalar/container outcome used for show/hide visibility, including inverse hide conditions, in both player rendering and adaptive candidate XML materialization.",
|
|
238
280
|
},
|
|
239
281
|
{
|
|
240
282
|
qtiName: "qti-companion-materials-info",
|
|
@@ -291,6 +333,7 @@ export const itemMetadataSupport = [
|
|
|
291
333
|
},
|
|
292
334
|
];
|
|
293
335
|
export const elementSupport = [
|
|
336
|
+
...testExecutionSupport,
|
|
294
337
|
...interactionSupport,
|
|
295
338
|
...deprecatedInteractionSupport,
|
|
296
339
|
...processingSupport,
|
|
@@ -351,7 +394,7 @@ function entry(qtiName, interactionType) {
|
|
|
351
394
|
? "Supports single and multiple unordered pair responses."
|
|
352
395
|
: "Supports single and multiple directedPair responses."
|
|
353
396
|
: interactionType === "graphicGapMatch"
|
|
354
|
-
? "Requires multiple directedPair responses."
|
|
397
|
+
? "Requires multiple directedPair responses; multiple and repeated placements in one hotspot preserve each association through rendering, removal, scoring, and restoration, subject to source/target match-max and max-associations."
|
|
355
398
|
: undefined,
|
|
356
399
|
};
|
|
357
400
|
}
|
package/dist/support.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.js","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"support.js","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,kBAAkB,GAAmC;IAChE,KAAK,CAAC,2BAA2B,EAAE,WAAW,CAAC;IAC/C,KAAK,CAAC,wBAAwB,EAAE,QAAQ,CAAC;IACzC,KAAK,CAAC,yBAAyB,EAAE,SAAS,CAAC;IAC3C,KAAK,CAAC,6BAA6B,EAAE,YAAY,CAAC;IAClD,4BAA4B,EAAE;IAC9B,KAAK,CAAC,2BAA2B,EAAE,UAAU,CAAC;IAC9C,KAAK,CAAC,mCAAmC,EAAE,kBAAkB,CAAC;IAC9D,KAAK,CAAC,mCAAmC,EAAE,iBAAiB,CAAC;IAC7D,KAAK,CAAC,+BAA+B,EAAE,cAAc,CAAC;IACtD,KAAK,CAAC,yBAAyB,EAAE,SAAS,CAAC;IAC3C,KAAK,CAAC,yBAAyB,EAAE,SAAS,CAAC;IAC3C,KAAK,CAAC,+BAA+B,EAAE,cAAc,CAAC;IACtD,KAAK,CAAC,uBAAuB,EAAE,OAAO,CAAC;IACvC,KAAK,CAAC,uBAAuB,EAAE,OAAO,CAAC;IACvC,KAAK,CAAC,uBAAuB,EAAE,OAAO,CAAC;IACvC,KAAK,CAAC,iCAAiC,EAAE,gBAAgB,CAAC;IAC1D,QAAQ,EAAE;IACV,KAAK,CAAC,8BAA8B,EAAE,aAAa,CAAC;IACpD,KAAK,CAAC,wBAAwB,EAAE,QAAQ,CAAC;IACzC,yBAAyB,EAAE;IAC3B,KAAK,CAAC,wBAAwB,EAAE,QAAQ,CAAC;CAC1C,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAmC;IAC1E;QACE,OAAO,EAAE,wBAAwB;QACjC,eAAe,EAAE,QAAQ;QACzB,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,YAAY;QACrB,aAAa,EAAE,oBAAoB;QACnC,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,CAAC,mBAAmB,CAAC;QAC5B,KAAK,EAAE,yDAAyD;KACjE;CACF,CAAC;AAEF,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;AAC3E,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;AAC3E,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;AACzE,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,uBAAuB,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,iBAAiB,GAAkC;IAC9D,uBAAuB,CACrB,yBAAyB,EACzB;QACE,yDAAyD;QACzD,6DAA6D;QAC7D,sDAAsD;KACvD,EACD,CAAC,GAAG,yBAAyB,CAAC,yBAAyB,CAAC,CAAC,CAC1D;IACD,uBAAuB,CACrB,yBAAyB,EACzB;QACE,wDAAwD;QACxD,8DAA8D;QAC9D,yDAAyD;QACzD,uDAAuD;KACxD,EACD,CAAC,GAAG,yBAAyB,CAAC,yBAAyB,CAAC,CAAC,CAC1D;IACD,uBAAuB,CAAC,wBAAwB,EAAE;QAChD,yDAAyD;QACzD,6DAA6D;QAC7D,sDAAsD;KACvD,CAAC;IACF;QACE,GAAG,uBAAuB,CAAC,uBAAuB,CAAC;QACnD,KAAK,EACH,iJAAiJ;KACpJ;IACD,uBAAuB,CAAC,0BAA0B,EAAE;QAClD,yDAAyD;QACzD,6DAA6D;KAC9D,CAAC;IACF,uBAAuB,CAAC,wBAAwB,CAAC;IACjD,uBAAuB,CAAC,iBAAiB,CAAC;IAC1C,uBAAuB,CAAC,sBAAsB,CAAC;IAC/C,uBAAuB,CAAC,mBAAmB,CAAC;IAC5C,uBAAuB,CAAC,yBAAyB,CAAC;IAClD,uBAAuB,CAAC,wBAAwB,EAAE;QAChD,8DAA8D;QAC9D,yDAAyD;QACzD,uDAAuD;KACxD,CAAC;IACF,uBAAuB,CAAC,iBAAiB,EAAE;QACzC,8DAA8D;QAC9D,yDAAyD;QACzD,uDAAuD;KACxD,CAAC;IACF,uBAAuB,CAAC,sBAAsB,CAAC;IAC/C,uBAAuB,CAAC,mBAAmB,EAAE;QAC3C,8DAA8D;KAC/D,CAAC;IACF,uBAAuB,CAAC,uBAAuB,EAAE;QAC/C,8DAA8D;QAC9D,yDAAyD;QACzD,uDAAuD;KACxD,CAAC;IACF,sBAAsB,CAAC,0BAA0B,CAAC;IAClD,uBAAuB,CAAC,mBAAmB,CAAC;IAC5C,uBAAuB,CAAC,mBAAmB,CAAC;IAC5C,uBAAuB,CAAC,kCAAkC,CAAC;IAC3D,uBAAuB,CAAC,gBAAgB,EAAE;QACxC,8DAA8D;QAC9D,yDAAyD;QACzD,yDAAyD;KAC1D,CAAC;IACF,uBAAuB,CAAC,UAAU,CAAC;IACnC,sBAAsB,CAAC,iBAAiB,CAAC;IACzC,sBAAsB,CAAC,uBAAuB,CAAC;IAC/C;QACE,GAAG,sBAAsB,CAAC,yBAAyB,CAAC;QACpD,KAAK,EACH,mIAAmI;KACtI;IACD,sBAAsB,CAAC,+BAA+B,CAAC;IACvD;QACE,GAAG,uBAAuB,CAAC,aAAa,CAAC;QACzC,KAAK,EACH,6GAA6G;KAChH;IACD,sBAAsB,CAAC,WAAW,EAAE;QAClC,8DAA8D;QAC9D,yDAAyD;KAC1D,CAAC;IACF,sBAAsB,CAAC,aAAa,CAAC;IACrC;QACE,GAAG,sBAAsB,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC;QACtE,KAAK,EACH,6GAA6G;KAChH;IACD;QACE,GAAG,sBAAsB,CAAC,kBAAkB,CAAC;QAC7C,KAAK,EACH,8JAA8J;KACjK;IACD;QACE,GAAG,sBAAsB,CAAC,wBAAwB,CAAC;QACnD,KAAK,EACH,mGAAmG;KACtG;IACD;QACE,GAAG,uBAAuB,CAAC,cAAc,EAAE;YACzC,8DAA8D;YAC9D,yDAAyD;YACzD,6DAA6D;YAC7D,sDAAsD;YACtD,yDAAyD;YACzD,uDAAuD;SACxD,CAAC;QACF,KAAK,EACH,2LAA2L;QAC7L,KAAK,EAAE;YACL,sBAAsB;YACtB,4CAA4C;YAC5C,wCAAwC;SACzC;KACF;IACD,uBAAuB,CACrB,oBAAoB,EACpB,CAAC,6DAA6D,CAAC,EAC/D,CAAC,GAAG,yBAAyB,CAAC,oBAAoB,CAAC,CAAC,CACrD;IACD,uBAAuB,CAAC,kBAAkB,CAAC;IAC3C;QACE,GAAG,uBAAuB,CAAC,YAAY,CAAC;QACxC,KAAK,EACH,kLAAkL;KACrL;IACD,uBAAuB,CAAC,cAAc,EAAE;QACtC,yDAAyD;KAC1D,CAAC;IACF,uBAAuB,CAAC,aAAa,EAAE;QACrC,yDAAyD;KAC1D,CAAC;IACF,uBAAuB,CAAC,WAAW,CAAC;IACpC;QACE,GAAG,uBAAuB,CACxB,cAAc,EACd,EAAE,EACF,CAAC,kDAAkD,CAAC,CACrD;QACD,KAAK,EACH,0KAA0K;KAC7K;IACD,uBAAuB,CAAC,oBAAoB,EAAE;QAC5C,yDAAyD;KAC1D,CAAC;IACF,uBAAuB,CAAC,SAAS,EAAE;QACjC,yDAAyD;QACzD,6DAA6D;KAC9D,CAAC;IACF,uBAAuB,CAAC,aAAa,EAAE;QACrC,6DAA6D;KAC9D,CAAC;IACF,uBAAuB,CAAC,SAAS,CAAC;IAClC,uBAAuB,CAAC,SAAS,CAAC;IAClC,uBAAuB,CAAC,cAAc,CAAC;IACvC,uBAAuB,CAAC,YAAY,CAAC;IACrC,uBAAuB,CAAC,WAAW,CAAC;IACpC,uBAAuB,CAAC,oBAAoB,CAAC;IAC7C,uBAAuB,CAAC,qBAAqB,CAAC;IAC9C,uBAAuB,CAAC,WAAW,CAAC;IACpC,uBAAuB,CAAC,cAAc,CAAC;IACvC,uBAAuB,CAAC,cAAc,CAAC;IACvC,uBAAuB,CAAC,sBAAsB,CAAC;IAC/C,uBAAuB,CAAC,SAAS,CAAC;IAClC,uBAAuB,CAAC,WAAW,CAAC;IACpC,uBAAuB,CAAC,QAAQ,CAAC;IACjC,uBAAuB,CAAC,SAAS,CAAC;IAClC;QACE,GAAG,uBAAuB,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,+CAA+C,CAAC,CAAC;QAC9F,KAAK,EACH,kJAAkJ;KACrJ;IACD;QACE,GAAG,uBAAuB,CACxB,mBAAmB,EACnB,CAAC,yDAAyD,CAAC,EAC3D,CAAC,+CAA+C,CAAC,CAClD;QACD,KAAK,EACH,4JAA4J;KAC/J;IACD,sBAAsB,CAAC,iBAAiB,CAAC;IACzC,uBAAuB,CAAC,QAAQ,CAAC;IACjC,uBAAuB,CAAC,SAAS,CAAC;IAClC,uBAAuB,CAAC,QAAQ,CAAC;IACjC,uBAAuB,CAAC,SAAS,CAAC;IAClC,uBAAuB,CAAC,kBAAkB,CAAC;IAC3C,uBAAuB,CAAC,eAAe,CAAC;IACxC;QACE,GAAG,uBAAuB,CAAC,mBAAmB,CAAC;QAC/C,KAAK,EAAE,CAAC,uBAAuB,EAAE,8CAA8C,CAAC;QAChF,KAAK,EACH,8OAA8O;KACjP;IACD,uBAAuB,CAAC,YAAY,CAAC;IACrC,uBAAuB,CAAC,YAAY,CAAC;IACrC,uBAAuB,CAAC,kBAAkB,CAAC;IAC3C,uBAAuB,CAAC,iBAAiB,CAAC;IAC1C,uBAAuB,CAAC,SAAS,EAAE,CAAC,yDAAyD,CAAC,CAAC;IAC/F,sBAAsB,CAAC,YAAY,EAAE,CAAC,yDAAyD,CAAC,CAAC;IACjG,uBAAuB,CAAC,SAAS,EAAE,CAAC,yDAAyD,CAAC,CAAC;IAC/F,uBAAuB,CAAC,mBAAmB,CAAC;IAC5C,uBAAuB,CAAC,mBAAmB,CAAC;IAC5C,uBAAuB,CAAC,YAAY,EAAE;QACpC,yDAAyD;KAC1D,CAAC;IACF,uBAAuB,CAAC,oBAAoB,EAAE;QAC5C,yDAAyD;KAC1D,CAAC;IACF,uBAAuB,CAAC,qBAAqB,CAAC;CAC/C,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAoC;IAClE;QACE,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,QAAQ;QACjB,aAAa,EAAE,eAAe;QAC9B,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE;YACR,iGAAiG;SAClG;QACD,KAAK,EAAE,CAAC,gDAAgD,EAAE,GAAG,mBAAmB,CAAC;QACjF,KAAK,EACH,wLAAwL;KAC3L;IACD;QACE,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,UAAU;QACnB,aAAa,EAAE,eAAe;QAC9B,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE;YACR,iGAAiG;SAClG;QACD,KAAK,EAAE;YACL,gDAAgD;YAChD,sCAAsC;YACtC,GAAG,mBAAmB;SACvB;QACD,KAAK,EACH,kLAAkL;KACrL;IACD;QACE,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,UAAU;QACnB,aAAa,EAAE,eAAe;QAC9B,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,CAAC,gCAAgC,CAAC;QAC5C,KAAK,EAAE;YACL,sBAAsB;YACtB,gDAAgD;YAChD,sDAAsD;YACtD,GAAG,oBAAoB;SACxB;QACD,KAAK,EACH,4QAA4Q;KAC/Q;IACD;QACE,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,QAAQ;QACjB,aAAa,EAAE,eAAe;QAC9B,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE;YACR,iGAAiG;SAClG;QACD,KAAK,EAAE;YACL,sDAAsD;YACtD,gDAAgD;YAChD,GAAG,mBAAmB;SACvB;QACD,KAAK,EACH,8TAA8T;KACjU;IACD;QACE,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,QAAQ;QACjB,aAAa,EAAE,eAAe;QAC9B,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,CAAC,sDAAsD,CAAC;QAClE,KAAK,EAAE;YACL,sDAAsD;YACtD,gDAAgD;SACjD;QACD,KAAK,EACH,qNAAqN;KACxN;IACD;QACE,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,QAAQ;QACjB,aAAa,EAAE,eAAe;QAC9B,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE;YACR,iGAAiG;SAClG;QACD,KAAK,EAAE;YACL,sDAAsD;YACtD,gDAAgD;SACjD;QACD,KAAK,EACH,wRAAwR;KAC3R;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAwB;IACjD,GAAG,oBAAoB;IACvB,GAAG,kBAAkB;IACrB,GAAG,4BAA4B;IAC/B,GAAG,iBAAiB;IACpB,GAAG,mBAAmB;CACvB,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,GAAG,kBAAkB,EAAE,GAAG,4BAA4B,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAC1C,qBAAqB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAC1E,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO;QAAE,OAAO,aAAa,CAAC;IACnC,OAAO,OAAO,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,OAAe,EACf,MAAyB;IAEzB,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL;gBACE,IAAI,EAAE,yBAAyB;gBAC/B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,GAAG,OAAO,4CAA4C;gBAC/D,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM;aACP;SACF,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QACrC,OAAO;YACL;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,GAAG,OAAO,mBAAmB,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;gBAClE,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM;aACP;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,KAAK,CAAC,OAAe,EAAE,eAAmC;IACjE,OAAO;QACL,OAAO;QACP,eAAe;QACf,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,WAAW;QACpB,aAAa,EAAE,eAAe;QAC9B,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,0BAA0B,CAAC,eAAe,CAAC;QACrD,KAAK,EAAE,uBAAuB,CAAC,eAAe,CAAC;QAC/C,KAAK,EAAE,CAAC,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;YACrF,CAAC,CAAC,eAAe,KAAK,WAAW,IAAI,eAAe,KAAK,kBAAkB;gBACzE,CAAC,CAAC,wDAAwD;gBAC1D,CAAC,CAAC,sDAAsD;YAC1D,CAAC,CAAC,eAAe,KAAK,iBAAiB;gBACrC,CAAC,CAAC,oOAAoO;gBACtO,CAAC,CAAC,SAAS;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO;QACL,GAAG,KAAK,CAAC,+BAA+B,EAAE,cAAc,CAAC;QACzD,KAAK,EACH,sKAAsK;KACzK,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO;QACL,GAAG,KAAK,CAAC,4BAA4B,EAAE,WAAW,CAAC;QACnD,KAAK,EACH,sKAAsK;KACzK,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;QACL,GAAG,KAAK,CAAC,iCAAiC,EAAE,gBAAgB,CAAC;QAC7D,KAAK,EACH,iNAAiN;KACpN,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,OAAO,CACL,OAAe,EACf,WAAqB,EAAE,EACvB,aAAuB,EAAE,EACI,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,eAAe,CACtB,QAAgB,EAChB,OAAe,EACf,WAAqB,EAAE,EACvB,aAAuB,EAAE;IAEzB,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,WAAW;QACpB,aAAa,EAAE,0BAA0B;QACzC,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,IAAI;QACb,QAAQ;QACR,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type QtiTestExpression } from "./test-expression.js";
|
|
2
|
+
import type { QtiDiagnostic } from "./types.js";
|
|
3
|
+
import { type XmlNode } from "./xml.js";
|
|
4
|
+
/** Read the single expression owned by a branch or outcome assignment. */
|
|
5
|
+
export declare function parseTestExpressionChild(node: XmlNode, diagnostics: QtiDiagnostic[]): QtiTestExpression | undefined;
|
|
6
|
+
//# sourceMappingURL=test-expression-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-expression-parser.d.ts","sourceRoot":"","sources":["../src/test-expression-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAErD,0EAA0E;AAC1E,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,aAAa,EAAE,GAC3B,iBAAiB,GAAG,SAAS,CAO/B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { assertNever } from "./assert-never.js";
|
|
2
|
+
import { coerceValue } from "./parser-values.js";
|
|
3
|
+
import { isTestBaseType, testExpressionSyntax } from "./test-expression.js";
|
|
4
|
+
import { checkTestXml, rejectTestXml } from "./test-xml.js";
|
|
5
|
+
import { textContent } from "./xml.js";
|
|
6
|
+
/** Read the single expression owned by a branch or outcome assignment. */
|
|
7
|
+
export function parseTestExpressionChild(node, diagnostics) {
|
|
8
|
+
const first = node.children[0];
|
|
9
|
+
if (node.children.length !== 1 || !first) {
|
|
10
|
+
rejectTestXml(node, diagnostics);
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
return parseTestExpression(first, diagnostics);
|
|
14
|
+
}
|
|
15
|
+
function parseTestExpression(node, diagnostics) {
|
|
16
|
+
const syntax = testExpressionSyntax.find((entry) => entry.name === node.localName);
|
|
17
|
+
if (!syntax) {
|
|
18
|
+
rejectTestXml(node, diagnostics);
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
checkTestXml(node, testExpressionSyntax.map((entry) => entry.name), syntax.attributes, diagnostics, syntax.type === "baseValue");
|
|
22
|
+
const arityValid = syntax.arity === "oneOrMore" ? node.children.length > 0 : node.children.length === syntax.arity;
|
|
23
|
+
if (!arityValid) {
|
|
24
|
+
rejectTestXml(node, diagnostics);
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const expressions = [];
|
|
28
|
+
for (const child of node.children) {
|
|
29
|
+
const parsed = parseTestExpression(child, diagnostics);
|
|
30
|
+
if (!parsed)
|
|
31
|
+
return undefined;
|
|
32
|
+
expressions.push(parsed);
|
|
33
|
+
}
|
|
34
|
+
const source = node.source;
|
|
35
|
+
switch (syntax.type) {
|
|
36
|
+
case "baseValue": {
|
|
37
|
+
const baseType = node.attributes["base-type"];
|
|
38
|
+
if (!isTestBaseType(baseType)) {
|
|
39
|
+
rejectTestXml(node, diagnostics);
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
type: "baseValue",
|
|
44
|
+
baseType,
|
|
45
|
+
value: coerceValue(textContent(node), baseType),
|
|
46
|
+
source,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
case "variable":
|
|
50
|
+
return { type: "variable", identifier: node.attributes.identifier ?? "", source };
|
|
51
|
+
case "testVariables":
|
|
52
|
+
return {
|
|
53
|
+
type: "testVariables",
|
|
54
|
+
variableIdentifier: node.attributes["variable-identifier"] ?? "",
|
|
55
|
+
includeCategory: node.attributes["include-category"],
|
|
56
|
+
source,
|
|
57
|
+
};
|
|
58
|
+
case "sum":
|
|
59
|
+
case "and":
|
|
60
|
+
case "or":
|
|
61
|
+
return { type: syntax.type, expressions, source };
|
|
62
|
+
case "numericCompare": {
|
|
63
|
+
const [left, right] = expressions;
|
|
64
|
+
if (!left || !right)
|
|
65
|
+
return undefined;
|
|
66
|
+
return { type: "numericCompare", operator: syntax.operator, left, right, source };
|
|
67
|
+
}
|
|
68
|
+
case "not": {
|
|
69
|
+
const expression = expressions[0];
|
|
70
|
+
return expression ? { type: "not", expression, source } : undefined;
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
return assertNever(syntax);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=test-expression-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-expression-parser.js","sourceRoot":"","sources":["../src/test-expression-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type QtiTestExpression } from "./test-expression.js";
|
|
2
|
+
import { type QtiTestResult } from "./test-model.js";
|
|
3
|
+
/** Serialize the closed test expression language without involving item processing. */
|
|
4
|
+
export declare function serializeTestExpression(expression: QtiTestExpression): QtiTestResult<string>;
|
|
5
|
+
//# sourceMappingURL=test-expression-serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-expression-serializer.d.ts","sourceRoot":"","sources":["../src/test-expression-serializer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGlE,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAG5F"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { assertNever } from "./assert-never.js";
|
|
2
|
+
import { renderElement } from "./serializer-processing-xml.js";
|
|
3
|
+
import { testExpressionSyntax } from "./test-expression.js";
|
|
4
|
+
import { testFailure } from "./test-model.js";
|
|
5
|
+
import { escapeXmlText } from "./xml.js";
|
|
6
|
+
/** Serialize the closed test expression language without involving item processing. */
|
|
7
|
+
export function serializeTestExpression(expression) {
|
|
8
|
+
const result = serializeExpression(expression, 0);
|
|
9
|
+
return result.ok ? { ok: true, value: result.value.join("\n") } : result;
|
|
10
|
+
}
|
|
11
|
+
function serializeExpression(expression, indent) {
|
|
12
|
+
const syntax = testExpressionSyntax.find((entry) => entry.type === expression.type &&
|
|
13
|
+
(expression.type !== "numericCompare" ||
|
|
14
|
+
(entry.type === "numericCompare" && entry.operator === expression.operator)));
|
|
15
|
+
if (!syntax)
|
|
16
|
+
return testFailure("expression.unsupported", "Cannot serialize an unsupported test expression.");
|
|
17
|
+
const attributes = [];
|
|
18
|
+
let children = [];
|
|
19
|
+
switch (expression.type) {
|
|
20
|
+
case "baseValue":
|
|
21
|
+
return {
|
|
22
|
+
ok: true,
|
|
23
|
+
value: renderElement(syntax.name, [["base-type", expression.baseType]], escapeXmlText(String(expression.value)), indent),
|
|
24
|
+
};
|
|
25
|
+
case "variable":
|
|
26
|
+
attributes.push(["identifier", expression.identifier]);
|
|
27
|
+
break;
|
|
28
|
+
case "testVariables":
|
|
29
|
+
attributes.push(["variable-identifier", expression.variableIdentifier], ["include-category", expression.includeCategory]);
|
|
30
|
+
break;
|
|
31
|
+
case "sum":
|
|
32
|
+
case "and":
|
|
33
|
+
case "or":
|
|
34
|
+
children = expression.expressions;
|
|
35
|
+
break;
|
|
36
|
+
case "numericCompare":
|
|
37
|
+
children = [expression.left, expression.right];
|
|
38
|
+
break;
|
|
39
|
+
case "not":
|
|
40
|
+
children = [expression.expression];
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
return assertNever(expression);
|
|
44
|
+
}
|
|
45
|
+
const content = [];
|
|
46
|
+
for (const child of children) {
|
|
47
|
+
const result = serializeExpression(child, indent + 1);
|
|
48
|
+
if (!result.ok)
|
|
49
|
+
return result;
|
|
50
|
+
content.push(...result.value);
|
|
51
|
+
}
|
|
52
|
+
return { ok: true, value: renderElement(syntax.name, attributes, content, indent) };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=test-expression-serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-expression-serializer.js","sourceRoot":"","sources":["../src/test-expression-serializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type QtiTestBaseType, type QtiTestExpression } from "./test-expression.js";
|
|
2
|
+
import type { QtiDiagnostic, QtiOutcomeDeclaration, QtiValue } from "./types.js";
|
|
3
|
+
/** The declared QTI type of an expression, including its cardinality. */
|
|
4
|
+
export interface TestExpressionType {
|
|
5
|
+
readonly baseType: QtiTestBaseType;
|
|
6
|
+
readonly cardinality: "single" | "multiple";
|
|
7
|
+
}
|
|
8
|
+
/** Check scalar literals and defaults against the supported base types. */
|
|
9
|
+
export declare function isTestScalarValue(baseType: string | undefined, value: QtiValue): boolean;
|
|
10
|
+
/** Infer a test expression's QTI type and diagnose invalid operands and scope. */
|
|
11
|
+
export declare function checkTestExpression(expression: QtiTestExpression, declarations: ReadonlyMap<string, QtiOutcomeDeclaration>, categories: ReadonlySet<string>, scope: "outcome" | "branch", diagnostics: QtiDiagnostic[]): TestExpressionType | undefined;
|
|
12
|
+
/** Whether a branch expression has the required single boolean type. */
|
|
13
|
+
export declare function isBoolean(type: TestExpressionType | undefined): boolean;
|
|
14
|
+
//# sourceMappingURL=test-expression-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-expression-validation.d.ts","sourceRoot":"","sources":["../src/test-expression-validation.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjF,yEAAyE;AACzE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC7C;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAexF;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACxD,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,EAC/B,KAAK,EAAE,SAAS,GAAG,QAAQ,EAC3B,WAAW,EAAE,aAAa,EAAE,GAC3B,kBAAkB,GAAG,SAAS,CAyFhC;AAMD,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAEvE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { assertNever } from "./assert-never.js";
|
|
2
|
+
import { isTestBaseType, testExpressionSyntax, } from "./test-expression.js";
|
|
3
|
+
/** Check scalar literals and defaults against the supported base types. */
|
|
4
|
+
export function isTestScalarValue(baseType, value) {
|
|
5
|
+
if (baseType === undefined)
|
|
6
|
+
return false;
|
|
7
|
+
switch (baseType) {
|
|
8
|
+
case "integer":
|
|
9
|
+
return typeof value === "number" && Number.isSafeInteger(value);
|
|
10
|
+
case "float":
|
|
11
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
12
|
+
case "boolean":
|
|
13
|
+
return typeof value === "boolean";
|
|
14
|
+
case "string":
|
|
15
|
+
case "identifier":
|
|
16
|
+
return typeof value === "string";
|
|
17
|
+
default:
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Infer a test expression's QTI type and diagnose invalid operands and scope. */
|
|
22
|
+
export function checkTestExpression(expression, declarations, categories, scope, diagnostics) {
|
|
23
|
+
const reject = (code, message) => {
|
|
24
|
+
diagnostics.push({
|
|
25
|
+
code: `test.${code}`,
|
|
26
|
+
severity: "error",
|
|
27
|
+
message,
|
|
28
|
+
source: expression.source,
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
const check = (child) => checkTestExpression(child, declarations, categories, scope, diagnostics);
|
|
32
|
+
if (!testExpressionSyntax.some((syntax) => syntax.type === expression.type)) {
|
|
33
|
+
reject("expression.unsupported", "Expression is outside the supported test execution profile.");
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
switch (expression.type) {
|
|
37
|
+
case "baseValue":
|
|
38
|
+
if (!isTestScalarValue(expression.baseType, expression.value)) {
|
|
39
|
+
reject("expression.value", "Expression values must match a supported scalar base type.");
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return { baseType: expression.baseType, cardinality: "single" };
|
|
43
|
+
case "variable": {
|
|
44
|
+
const declaration = declarations.get(expression.identifier);
|
|
45
|
+
if (!declaration || !isTestBaseType(declaration.baseType)) {
|
|
46
|
+
reject("expression.variable", "Test expression references an undeclared or unsupported outcome.");
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return { baseType: declaration.baseType, cardinality: "single" };
|
|
50
|
+
}
|
|
51
|
+
case "testVariables":
|
|
52
|
+
if (scope === "branch")
|
|
53
|
+
reject("branch.scope", "Test-variable aggregation belongs in outcome processing, not a branch rule.");
|
|
54
|
+
if (expression.variableIdentifier !== "SCORE" ||
|
|
55
|
+
(expression.includeCategory !== undefined && !categories.has(expression.includeCategory)))
|
|
56
|
+
reject("expression.testVariables", "This test profile aggregates item SCORE values from declared categories.");
|
|
57
|
+
return { baseType: "float", cardinality: "multiple" };
|
|
58
|
+
case "sum": {
|
|
59
|
+
const operands = expression.expressions.map(check);
|
|
60
|
+
if (!operands.length || operands.some((type) => !isNumeric(type)))
|
|
61
|
+
reject("expression.sum", "Test sums require numeric operands.");
|
|
62
|
+
return {
|
|
63
|
+
baseType: operands.every((type) => type?.baseType === "integer") ? "integer" : "float",
|
|
64
|
+
cardinality: "single",
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
case "numericCompare": {
|
|
68
|
+
const left = check(expression.left);
|
|
69
|
+
const right = check(expression.right);
|
|
70
|
+
if (!testExpressionSyntax.some((syntax) => syntax.type === "numericCompare" && syntax.operator === expression.operator))
|
|
71
|
+
reject("expression.compare", "Unsupported test comparison operator.");
|
|
72
|
+
if (!isNumeric(left) ||
|
|
73
|
+
left?.cardinality !== "single" ||
|
|
74
|
+
!isNumeric(right) ||
|
|
75
|
+
right?.cardinality !== "single")
|
|
76
|
+
reject("expression.compare", "Test comparisons require two scalar numbers.");
|
|
77
|
+
return { baseType: "boolean", cardinality: "single" };
|
|
78
|
+
}
|
|
79
|
+
case "and":
|
|
80
|
+
case "or": {
|
|
81
|
+
const operands = expression.expressions.map(check);
|
|
82
|
+
if (!operands.length || operands.some((type) => !isBoolean(type)))
|
|
83
|
+
reject("expression.boolean", "Test logic requires boolean operands.");
|
|
84
|
+
return { baseType: "boolean", cardinality: "single" };
|
|
85
|
+
}
|
|
86
|
+
case "not":
|
|
87
|
+
if (!isBoolean(check(expression.expression)))
|
|
88
|
+
reject("expression.boolean", "Test logic requires a boolean operand.");
|
|
89
|
+
return { baseType: "boolean", cardinality: "single" };
|
|
90
|
+
default:
|
|
91
|
+
return assertNever(expression);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function isNumeric(type) {
|
|
95
|
+
return type?.baseType === "integer" || type?.baseType === "float";
|
|
96
|
+
}
|
|
97
|
+
/** Whether a branch expression has the required single boolean type. */
|
|
98
|
+
export function isBoolean(type) {
|
|
99
|
+
return type?.baseType === "boolean" && type.cardinality === "single";
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=test-expression-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-expression-validation.js","sourceRoot":"","sources":["../src/test-expression-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { QtiSourceLocation } from "./types.js";
|
|
2
|
+
/** Scalar types supported by deterministic test outcome processing. */
|
|
3
|
+
export type QtiTestBaseType = "integer" | "float" | "boolean" | "string" | "identifier";
|
|
4
|
+
/** Test expressions form a closed language, independent of item processing. */
|
|
5
|
+
export type QtiTestExpression = ({
|
|
6
|
+
readonly type: "baseValue";
|
|
7
|
+
readonly baseType: QtiTestBaseType;
|
|
8
|
+
readonly value: number | boolean | string;
|
|
9
|
+
} | {
|
|
10
|
+
readonly type: "variable";
|
|
11
|
+
readonly identifier: string;
|
|
12
|
+
} | {
|
|
13
|
+
readonly type: "testVariables";
|
|
14
|
+
readonly variableIdentifier: string;
|
|
15
|
+
readonly includeCategory?: string | undefined;
|
|
16
|
+
} | {
|
|
17
|
+
readonly type: "sum";
|
|
18
|
+
readonly expressions: readonly QtiTestExpression[];
|
|
19
|
+
} | {
|
|
20
|
+
readonly type: "and";
|
|
21
|
+
readonly expressions: readonly QtiTestExpression[];
|
|
22
|
+
} | {
|
|
23
|
+
readonly type: "or";
|
|
24
|
+
readonly expressions: readonly QtiTestExpression[];
|
|
25
|
+
} | {
|
|
26
|
+
readonly type: "numericCompare";
|
|
27
|
+
readonly operator: "gt" | "gte" | "lt" | "lte";
|
|
28
|
+
readonly left: QtiTestExpression;
|
|
29
|
+
readonly right: QtiTestExpression;
|
|
30
|
+
} | {
|
|
31
|
+
readonly type: "not";
|
|
32
|
+
readonly expression: QtiTestExpression;
|
|
33
|
+
}) & {
|
|
34
|
+
readonly source?: QtiSourceLocation | undefined;
|
|
35
|
+
};
|
|
36
|
+
/** XML names, AST variants, arities and attributes owned by the test language. */
|
|
37
|
+
export declare const testExpressionSyntax: readonly [{
|
|
38
|
+
readonly name: "qti-base-value";
|
|
39
|
+
readonly type: "baseValue";
|
|
40
|
+
readonly arity: 0;
|
|
41
|
+
readonly attributes: readonly ["base-type"];
|
|
42
|
+
}, {
|
|
43
|
+
readonly name: "qti-variable";
|
|
44
|
+
readonly type: "variable";
|
|
45
|
+
readonly arity: 0;
|
|
46
|
+
readonly attributes: readonly ["identifier"];
|
|
47
|
+
}, {
|
|
48
|
+
readonly name: "qti-test-variables";
|
|
49
|
+
readonly type: "testVariables";
|
|
50
|
+
readonly arity: 0;
|
|
51
|
+
readonly attributes: readonly ["variable-identifier", "include-category"];
|
|
52
|
+
}, {
|
|
53
|
+
readonly name: "qti-sum";
|
|
54
|
+
readonly type: "sum";
|
|
55
|
+
readonly arity: "oneOrMore";
|
|
56
|
+
readonly attributes: readonly [];
|
|
57
|
+
}, {
|
|
58
|
+
readonly name: "qti-gt";
|
|
59
|
+
readonly type: "numericCompare";
|
|
60
|
+
readonly operator: "gt";
|
|
61
|
+
readonly arity: 2;
|
|
62
|
+
readonly attributes: readonly [];
|
|
63
|
+
}, {
|
|
64
|
+
readonly name: "qti-gte";
|
|
65
|
+
readonly type: "numericCompare";
|
|
66
|
+
readonly operator: "gte";
|
|
67
|
+
readonly arity: 2;
|
|
68
|
+
readonly attributes: readonly [];
|
|
69
|
+
}, {
|
|
70
|
+
readonly name: "qti-lt";
|
|
71
|
+
readonly type: "numericCompare";
|
|
72
|
+
readonly operator: "lt";
|
|
73
|
+
readonly arity: 2;
|
|
74
|
+
readonly attributes: readonly [];
|
|
75
|
+
}, {
|
|
76
|
+
readonly name: "qti-lte";
|
|
77
|
+
readonly type: "numericCompare";
|
|
78
|
+
readonly operator: "lte";
|
|
79
|
+
readonly arity: 2;
|
|
80
|
+
readonly attributes: readonly [];
|
|
81
|
+
}, {
|
|
82
|
+
readonly name: "qti-and";
|
|
83
|
+
readonly type: "and";
|
|
84
|
+
readonly arity: "oneOrMore";
|
|
85
|
+
readonly attributes: readonly [];
|
|
86
|
+
}, {
|
|
87
|
+
readonly name: "qti-or";
|
|
88
|
+
readonly type: "or";
|
|
89
|
+
readonly arity: "oneOrMore";
|
|
90
|
+
readonly attributes: readonly [];
|
|
91
|
+
}, {
|
|
92
|
+
readonly name: "qti-not";
|
|
93
|
+
readonly type: "not";
|
|
94
|
+
readonly arity: 1;
|
|
95
|
+
readonly attributes: readonly [];
|
|
96
|
+
}];
|
|
97
|
+
/** Refine a supported test scalar type without accepting item-only base types. */
|
|
98
|
+
export declare function isTestBaseType(value: string | undefined): value is QtiTestBaseType;
|
|
99
|
+
//# sourceMappingURL=test-expression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-expression.d.ts","sourceRoot":"","sources":["../src/test-expression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,uEAAuE;AACvE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;AAExF,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAC5B;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CAC3C,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,GAC3E;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;CAAE,CACnE,GAAG;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;CAAE,CAAC;AAExD,kFAAkF;AAClF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB9B,CAAC;AAEJ,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,eAAe,CAQlF"}
|