@doenet/doenetml 0.6.0-alpha1

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.
Files changed (549) hide show
  1. package/.prettierrc +3 -0
  2. package/LICENSE +661 -0
  3. package/README.md +146 -0
  4. package/cypress/e2e/ActivityViewer/activityVariants.cy.js +1770 -0
  5. package/cypress/e2e/ActivityViewer/compiledActivity.cy.js +83 -0
  6. package/cypress/e2e/ActivityViewer/relationshipsAmongPages.cy.js +697 -0
  7. package/cypress/e2e/answerValidation/errorinnumbers.cy.js +2125 -0
  8. package/cypress/e2e/answerValidation/factoring.cy.js +1945 -0
  9. package/cypress/e2e/answerValidation/factoringOldAlgorithm.cy.js +892 -0
  10. package/cypress/e2e/answerValidation/functionanswers.cy.js +314 -0
  11. package/cypress/e2e/answerValidation/matchingpatterns.cy.js +287 -0
  12. package/cypress/e2e/answerValidation/matchpartial.cy.js +6711 -0
  13. package/cypress/e2e/answerValidation/pointlocation.cy.js +3989 -0
  14. package/cypress/e2e/answerValidation/symbolicequality.cy.js +1893 -0
  15. package/cypress/e2e/answerValidation/videoProgress.cy.js +210 -0
  16. package/cypress/e2e/assignNames/basiccopy.cy.js +2376 -0
  17. package/cypress/e2e/assignNames/collections.cy.js +9247 -0
  18. package/cypress/e2e/assignNames/selects.cy.js +105 -0
  19. package/cypress/e2e/assignNames/sequences.cy.js +1964 -0
  20. package/cypress/e2e/baseComponent/basecomponentproperties.cy.js +999 -0
  21. package/cypress/e2e/baseComponent/doenetMLtext.cy.js +427 -0
  22. package/cypress/e2e/chemistry/atom.cy.js +201 -0
  23. package/cypress/e2e/chemistry/ion.cy.js +608 -0
  24. package/cypress/e2e/chemistry/ioniccompound.cy.js +133 -0
  25. package/cypress/e2e/dynamicalsystem/cobwebpolyline.cy.js +2653 -0
  26. package/cypress/e2e/dynamicalsystem/equilibriumcurve.cy.js +311 -0
  27. package/cypress/e2e/dynamicalsystem/equilibriumline.cy.js +279 -0
  28. package/cypress/e2e/dynamicalsystem/equilibriumpoint.cy.js +283 -0
  29. package/cypress/e2e/dynamicalsystem/odesystem.cy.js +1834 -0
  30. package/cypress/e2e/equality/mathexpressions.cy.js +948 -0
  31. package/cypress/e2e/graphing/graphreferences.cy.js +978 -0
  32. package/cypress/e2e/graphing/graphreferences2.cy.js +615 -0
  33. package/cypress/e2e/linearAlgebra/eigenDecomposition.cy.js +401 -0
  34. package/cypress/e2e/tagSpecific/angle.cy.js +3898 -0
  35. package/cypress/e2e/tagSpecific/animatefromsequence.cy.js +2306 -0
  36. package/cypress/e2e/tagSpecific/answer.cy.js +31647 -0
  37. package/cypress/e2e/tagSpecific/bestfitline.cy.js +612 -0
  38. package/cypress/e2e/tagSpecific/blockquote.cy.js +30 -0
  39. package/cypress/e2e/tagSpecific/boolean.cy.js +742 -0
  40. package/cypress/e2e/tagSpecific/booleaninput.cy.js +1283 -0
  41. package/cypress/e2e/tagSpecific/booleanlist.cy.js +588 -0
  42. package/cypress/e2e/tagSpecific/booleanoperators.cy.js +596 -0
  43. package/cypress/e2e/tagSpecific/booleanoperatorsonmath.cy.js +498 -0
  44. package/cypress/e2e/tagSpecific/callaction.cy.js +2835 -0
  45. package/cypress/e2e/tagSpecific/choiceinput.cy.js +3205 -0
  46. package/cypress/e2e/tagSpecific/circle.cy.js +22036 -0
  47. package/cypress/e2e/tagSpecific/codeeditor.cy.js +1995 -0
  48. package/cypress/e2e/tagSpecific/collect.cy.js +5035 -0
  49. package/cypress/e2e/tagSpecific/componentsize.cy.js +502 -0
  50. package/cypress/e2e/tagSpecific/conditionalcontent.cy.js +3495 -0
  51. package/cypress/e2e/tagSpecific/contentBrowser.cy.js +335 -0
  52. package/cypress/e2e/tagSpecific/contentpicker.cy.js +261 -0
  53. package/cypress/e2e/tagSpecific/copy.cy.js +12627 -0
  54. package/cypress/e2e/tagSpecific/copy2.cy.js +5698 -0
  55. package/cypress/e2e/tagSpecific/curve.bezier.cy.js +12440 -0
  56. package/cypress/e2e/tagSpecific/curve.cy.js +1716 -0
  57. package/cypress/e2e/tagSpecific/curve.function.cy.js +1471 -0
  58. package/cypress/e2e/tagSpecific/curve.parametrized.cy.js +920 -0
  59. package/cypress/e2e/tagSpecific/document.cy.js +234 -0
  60. package/cypress/e2e/tagSpecific/endpoint.cy.js +197 -0
  61. package/cypress/e2e/tagSpecific/evaluate.cy.js +8895 -0
  62. package/cypress/e2e/tagSpecific/extract.cy.js +2282 -0
  63. package/cypress/e2e/tagSpecific/feedback.cy.js +2941 -0
  64. package/cypress/e2e/tagSpecific/function.cy.js +9450 -0
  65. package/cypress/e2e/tagSpecific/functioniterates.cy.js +1178 -0
  66. package/cypress/e2e/tagSpecific/functionoperators.cy.js +4047 -0
  67. package/cypress/e2e/tagSpecific/graph.cy.js +2491 -0
  68. package/cypress/e2e/tagSpecific/group.cy.js +683 -0
  69. package/cypress/e2e/tagSpecific/hint.cy.js +204 -0
  70. package/cypress/e2e/tagSpecific/image.cy.js +770 -0
  71. package/cypress/e2e/tagSpecific/integer.cy.js +206 -0
  72. package/cypress/e2e/tagSpecific/label.cy.js +800 -0
  73. package/cypress/e2e/tagSpecific/legend.cy.js +1001 -0
  74. package/cypress/e2e/tagSpecific/line.cy.js +12167 -0
  75. package/cypress/e2e/tagSpecific/linesegment.cy.js +4749 -0
  76. package/cypress/e2e/tagSpecific/lorem.cy.js +289 -0
  77. package/cypress/e2e/tagSpecific/map.cy.js +4476 -0
  78. package/cypress/e2e/tagSpecific/matchespattern.cy.js +693 -0
  79. package/cypress/e2e/tagSpecific/math.cy.js +10990 -0
  80. package/cypress/e2e/tagSpecific/mathdisplay.cy.js +2689 -0
  81. package/cypress/e2e/tagSpecific/mathinput.cy.js +15628 -0
  82. package/cypress/e2e/tagSpecific/mathinputgraph.cy.js +566 -0
  83. package/cypress/e2e/tagSpecific/mathlist.cy.js +4073 -0
  84. package/cypress/e2e/tagSpecific/mathoperators.cy.js +13851 -0
  85. package/cypress/e2e/tagSpecific/matrix.cy.js +8825 -0
  86. package/cypress/e2e/tagSpecific/matrixinput.cy.js +16277 -0
  87. package/cypress/e2e/tagSpecific/module.cy.js +1771 -0
  88. package/cypress/e2e/tagSpecific/number.cy.js +2221 -0
  89. package/cypress/e2e/tagSpecific/numberlist.cy.js +1285 -0
  90. package/cypress/e2e/tagSpecific/p.cy.js +72 -0
  91. package/cypress/e2e/tagSpecific/paginator.cy.js +2983 -0
  92. package/cypress/e2e/tagSpecific/parabola.cy.js +14331 -0
  93. package/cypress/e2e/tagSpecific/paragraphmarkup.cy.js +104 -0
  94. package/cypress/e2e/tagSpecific/periodicset.cy.js +1439 -0
  95. package/cypress/e2e/tagSpecific/piecewisefunction.cy.js +1055 -0
  96. package/cypress/e2e/tagSpecific/pluralize.cy.js +274 -0
  97. package/cypress/e2e/tagSpecific/point.cy.js +8895 -0
  98. package/cypress/e2e/tagSpecific/point2.cy.js +10259 -0
  99. package/cypress/e2e/tagSpecific/polygon.cy.js +5039 -0
  100. package/cypress/e2e/tagSpecific/polyline.cy.js +4704 -0
  101. package/cypress/e2e/tagSpecific/problem.cy.js +2768 -0
  102. package/cypress/e2e/tagSpecific/ray.cy.js +10770 -0
  103. package/cypress/e2e/tagSpecific/rectangle.cy.js +2143 -0
  104. package/cypress/e2e/tagSpecific/ref.cy.js +420 -0
  105. package/cypress/e2e/tagSpecific/regularPolygon.cy.js +1006 -0
  106. package/cypress/e2e/tagSpecific/regularPolygon2.cy.js +100 -0
  107. package/cypress/e2e/tagSpecific/regularPolygon3.cy.js +777 -0
  108. package/cypress/e2e/tagSpecific/samplerandomnumbers.cy.js +3619 -0
  109. package/cypress/e2e/tagSpecific/sectioning.cy.js +3530 -0
  110. package/cypress/e2e/tagSpecific/select.cy.js +5376 -0
  111. package/cypress/e2e/tagSpecific/selectfromsequence.cy.js +3846 -0
  112. package/cypress/e2e/tagSpecific/selectrandomnumbers.cy.js +2914 -0
  113. package/cypress/e2e/tagSpecific/sequence.cy.js +2093 -0
  114. package/cypress/e2e/tagSpecific/shuffle.cy.js +490 -0
  115. package/cypress/e2e/tagSpecific/sidebyside.cy.js +8057 -0
  116. package/cypress/e2e/tagSpecific/singlecharactercomponents.cy.js +72 -0
  117. package/cypress/e2e/tagSpecific/slider.cy.js +914 -0
  118. package/cypress/e2e/tagSpecific/solution.cy.js +109 -0
  119. package/cypress/e2e/tagSpecific/solveequations.cy.js +1026 -0
  120. package/cypress/e2e/tagSpecific/sort.cy.js +1685 -0
  121. package/cypress/e2e/tagSpecific/spreadsheet.cy.js +5971 -0
  122. package/cypress/e2e/tagSpecific/subsetofreals.cy.js +2725 -0
  123. package/cypress/e2e/tagSpecific/substitute.cy.js +2646 -0
  124. package/cypress/e2e/tagSpecific/tabular.cy.js +36 -0
  125. package/cypress/e2e/tagSpecific/text.cy.js +975 -0
  126. package/cypress/e2e/tagSpecific/textinput.cy.js +2177 -0
  127. package/cypress/e2e/tagSpecific/textlist.cy.js +369 -0
  128. package/cypress/e2e/tagSpecific/triangle.cy.js +1936 -0
  129. package/cypress/e2e/tagSpecific/triggerset.cy.js +2023 -0
  130. package/cypress/e2e/tagSpecific/updatevalue.cy.js +3288 -0
  131. package/cypress/e2e/tagSpecific/vector.cy.js +20183 -0
  132. package/cypress/e2e/tagSpecific/video.cy.js +612 -0
  133. package/cypress/e2e/tagSpecific/when.cy.js +202 -0
  134. package/cypress/e2e/variants/specifysinglevariant.cy.js +6726 -0
  135. package/cypress/e2e/variants/uniquevariants.cy.js +4846 -0
  136. package/cypress/fixtures/example.json +5 -0
  137. package/cypress/support/commands.js +32 -0
  138. package/cypress/support/e2e.js +31 -0
  139. package/cypress.config.js +18 -0
  140. package/docs/codeSnippet.jsx +11 -0
  141. package/docs/index.html +133 -0
  142. package/docs/index.jsx +138 -0
  143. package/docs/prism.css +3 -0
  144. package/index.html +14 -0
  145. package/index.js +21 -0
  146. package/media/answer_example.png +0 -0
  147. package/media/graph_example.png +0 -0
  148. package/media/graph_markup_example.png +0 -0
  149. package/package.json +83 -0
  150. package/public/favicon.ico +0 -0
  151. package/public/fonts/files/open-sans-v18-latin-700.woff +0 -0
  152. package/public/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  153. package/public/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  154. package/public/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  155. package/public/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  156. package/public/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  157. package/public/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  158. package/public/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  159. package/public/fonts/files/open-sans-v18-latin-light.woff +0 -0
  160. package/public/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  161. package/public/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  162. package/public/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  163. package/src/Core/ComponentTypes.js +426 -0
  164. package/src/Core/Core.js +11852 -0
  165. package/src/Core/CoreWorker.js +127 -0
  166. package/src/Core/Dependencies.js +8226 -0
  167. package/src/Core/Numerics.js +473 -0
  168. package/src/Core/ParameterStack.js +36 -0
  169. package/src/Core/ReadOnlyProxyHandler.js +41 -0
  170. package/src/Core/StateProxyHandler.js +88 -0
  171. package/src/Core/components/Aliases.js +67 -0
  172. package/src/Core/components/Angle.js +758 -0
  173. package/src/Core/components/AnimateFromSequence.js +922 -0
  174. package/src/Core/components/Answer.js +2087 -0
  175. package/src/Core/components/AsList.js +83 -0
  176. package/src/Core/components/AttractTo.js +245 -0
  177. package/src/Core/components/AttractToAngles.js +262 -0
  178. package/src/Core/components/AttractToConstraint.js +104 -0
  179. package/src/Core/components/AttractToGrid.js +315 -0
  180. package/src/Core/components/Award.js +906 -0
  181. package/src/Core/components/BestFitLine.js +318 -0
  182. package/src/Core/components/BezierControls.js +719 -0
  183. package/src/Core/components/BlockQuote.js +35 -0
  184. package/src/Core/components/Boolean.js +500 -0
  185. package/src/Core/components/BooleanInput.js +330 -0
  186. package/src/Core/components/BooleanList.js +396 -0
  187. package/src/Core/components/BooleanOperators.js +35 -0
  188. package/src/Core/components/BooleanOperatorsOfMath.js +148 -0
  189. package/src/Core/components/CallAction.js +261 -0
  190. package/src/Core/components/Caption.js +73 -0
  191. package/src/Core/components/Case.js +56 -0
  192. package/src/Core/components/Cell.js +439 -0
  193. package/src/Core/components/CellBlock.js +64 -0
  194. package/src/Core/components/Chart.js +795 -0
  195. package/src/Core/components/Choice.js +266 -0
  196. package/src/Core/components/ChoiceInput.js +1407 -0
  197. package/src/Core/components/Circle.js +2884 -0
  198. package/src/Core/components/CodeEditor.js +647 -0
  199. package/src/Core/components/CodeViewer.js +294 -0
  200. package/src/Core/components/CollaborateGroupSetup.js +46 -0
  201. package/src/Core/components/CollaborateGroups.js +119 -0
  202. package/src/Core/components/Collect.js +850 -0
  203. package/src/Core/components/Column.js +608 -0
  204. package/src/Core/components/ConditionalContent.js +468 -0
  205. package/src/Core/components/ConsiderAsResponses.js +49 -0
  206. package/src/Core/components/ConstrainTo.js +161 -0
  207. package/src/Core/components/ConstrainToAngles.js +244 -0
  208. package/src/Core/components/ConstrainToGraph.js +142 -0
  209. package/src/Core/components/ConstrainToGrid.js +175 -0
  210. package/src/Core/components/ConstraintUnion.js +119 -0
  211. package/src/Core/components/Constraints.js +497 -0
  212. package/src/Core/components/ContentBrowser.js +441 -0
  213. package/src/Core/components/ContentPicker.js +263 -0
  214. package/src/Core/components/ControlVectors.js +25 -0
  215. package/src/Core/components/Coords.js +63 -0
  216. package/src/Core/components/Copy.js +3412 -0
  217. package/src/Core/components/Curve.js +4130 -0
  218. package/src/Core/components/CustomAttribute.js +175 -0
  219. package/src/Core/components/DataFrame.js +357 -0
  220. package/src/Core/components/DiscreteSimulationResultList.js +342 -0
  221. package/src/Core/components/DiscreteSimulationResultPolyline.js +581 -0
  222. package/src/Core/components/Divisions.js +55 -0
  223. package/src/Core/components/Document.js +888 -0
  224. package/src/Core/components/Embed.js +65 -0
  225. package/src/Core/components/Endpoint.js +62 -0
  226. package/src/Core/components/Evaluate.js +321 -0
  227. package/src/Core/components/Extract.js +656 -0
  228. package/src/Core/components/Extrema.js +556 -0
  229. package/src/Core/components/Feedback.js +200 -0
  230. package/src/Core/components/FeedbackDefinitions.js +97 -0
  231. package/src/Core/components/Figure.js +148 -0
  232. package/src/Core/components/Footnote.js +73 -0
  233. package/src/Core/components/Function.js +5344 -0
  234. package/src/Core/components/FunctionIterates.js +306 -0
  235. package/src/Core/components/FunctionOperators.js +702 -0
  236. package/src/Core/components/Graph.js +1679 -0
  237. package/src/Core/components/Group.js +7 -0
  238. package/src/Core/components/HasSameFactoring.js +407 -0
  239. package/src/Core/components/Hint.js +241 -0
  240. package/src/Core/components/Image.js +524 -0
  241. package/src/Core/components/Indexing.js +79 -0
  242. package/src/Core/components/IntComma.js +64 -0
  243. package/src/Core/components/Integer.js +81 -0
  244. package/src/Core/components/Intersection.js +328 -0
  245. package/src/Core/components/Interval.js +29 -0
  246. package/src/Core/components/Label.js +492 -0
  247. package/src/Core/components/Latex.js +104 -0
  248. package/src/Core/components/Legend.js +329 -0
  249. package/src/Core/components/Line.js +2040 -0
  250. package/src/Core/components/LineSegment.js +882 -0
  251. package/src/Core/components/Lists.js +180 -0
  252. package/src/Core/components/Lorem.js +249 -0
  253. package/src/Core/components/MMeMen.js +377 -0
  254. package/src/Core/components/Map.js +873 -0
  255. package/src/Core/components/Markers.js +101 -0
  256. package/src/Core/components/MatchesPattern.js +339 -0
  257. package/src/Core/components/Math.js +2552 -0
  258. package/src/Core/components/MathInput.js +948 -0
  259. package/src/Core/components/MathList.js +828 -0
  260. package/src/Core/components/MathOperators.js +1286 -0
  261. package/src/Core/components/Matrix.js +497 -0
  262. package/src/Core/components/MatrixInput.js +3157 -0
  263. package/src/Core/components/MdMdnMrow.js +394 -0
  264. package/src/Core/components/Module.js +16 -0
  265. package/src/Core/components/Number.js +1031 -0
  266. package/src/Core/components/NumberList.js +550 -0
  267. package/src/Core/components/Option.js +24 -0
  268. package/src/Core/components/P.js +71 -0
  269. package/src/Core/components/Paginator.js +338 -0
  270. package/src/Core/components/Panel.js +126 -0
  271. package/src/Core/components/Parabola.js +1561 -0
  272. package/src/Core/components/ParagraphMarkup.js +59 -0
  273. package/src/Core/components/Pegboard.js +43 -0
  274. package/src/Core/components/PeriodicSet.js +291 -0
  275. package/src/Core/components/PiecewiseFunction.js +832 -0
  276. package/src/Core/components/Pluralize.js +198 -0
  277. package/src/Core/components/Point.js +1295 -0
  278. package/src/Core/components/Polygon.js +408 -0
  279. package/src/Core/components/Polyline.js +841 -0
  280. package/src/Core/components/RandomizedTextList.js +225 -0
  281. package/src/Core/components/Ray.js +1737 -0
  282. package/src/Core/components/Rectangle.js +1535 -0
  283. package/src/Core/components/Ref.js +350 -0
  284. package/src/Core/components/RegionBetweenCurveXAxis.js +124 -0
  285. package/src/Core/components/RegionHalfPlane.js +107 -0
  286. package/src/Core/components/RegularPolygon.js +2118 -0
  287. package/src/Core/components/RenderDoenetML.js +181 -0
  288. package/src/Core/components/Row.js +780 -0
  289. package/src/Core/components/SampleRandomNumbers.js +653 -0
  290. package/src/Core/components/Sectioning.js +303 -0
  291. package/src/Core/components/Select.js +947 -0
  292. package/src/Core/components/SelectFromSequence.js +1242 -0
  293. package/src/Core/components/SelectRandomNumbers.js +225 -0
  294. package/src/Core/components/Sequence.js +444 -0
  295. package/src/Core/components/Setup.js +53 -0
  296. package/src/Core/components/Shuffle.js +470 -0
  297. package/src/Core/components/SideBySide.js +2130 -0
  298. package/src/Core/components/SingleCharacterComponents.js +41 -0
  299. package/src/Core/components/Slider.js +819 -0
  300. package/src/Core/components/SolutionContainer.js +67 -0
  301. package/src/Core/components/Solutions.js +334 -0
  302. package/src/Core/components/SolveEquations.js +568 -0
  303. package/src/Core/components/Sort.js +398 -0
  304. package/src/Core/components/Sources.js +108 -0
  305. package/src/Core/components/Split.js +205 -0
  306. package/src/Core/components/Spreadsheet.js +1507 -0
  307. package/src/Core/components/StyleDefinitions.js +111 -0
  308. package/src/Core/components/SubsetOfReals.js +348 -0
  309. package/src/Core/components/SubsetOfRealsInput.js +1474 -0
  310. package/src/Core/components/Substitute.js +496 -0
  311. package/src/Core/components/SummaryStatistics.js +652 -0
  312. package/src/Core/components/Table.js +145 -0
  313. package/src/Core/components/Tabular.js +384 -0
  314. package/src/Core/components/Template.js +360 -0
  315. package/src/Core/components/Text.js +341 -0
  316. package/src/Core/components/TextInput.js +566 -0
  317. package/src/Core/components/TextList.js +442 -0
  318. package/src/Core/components/TextListFromString.js +137 -0
  319. package/src/Core/components/TextOperatorsOfMath.js +21 -0
  320. package/src/Core/components/Triangle.js +280 -0
  321. package/src/Core/components/TriggerSet.js +189 -0
  322. package/src/Core/components/TupleList.js +43 -0
  323. package/src/Core/components/UpdateValue.js +435 -0
  324. package/src/Core/components/VariantControl.js +36 -0
  325. package/src/Core/components/Vector.js +2478 -0
  326. package/src/Core/components/Verbatim.js +125 -0
  327. package/src/Core/components/Video.js +673 -0
  328. package/src/Core/components/When.js +198 -0
  329. package/src/Core/components/abstract/AngleListComponent.js +140 -0
  330. package/src/Core/components/abstract/BaseComponent.js +1496 -0
  331. package/src/Core/components/abstract/BlockComponent.js +5 -0
  332. package/src/Core/components/abstract/BooleanBaseOperator.js +88 -0
  333. package/src/Core/components/abstract/BooleanBaseOperatorOfMath.js +100 -0
  334. package/src/Core/components/abstract/BooleanBaseOperatorOneInput.js +44 -0
  335. package/src/Core/components/abstract/ComponentSize.js +789 -0
  336. package/src/Core/components/abstract/ComponentWithSelectableType.js +537 -0
  337. package/src/Core/components/abstract/CompositeComponent.js +142 -0
  338. package/src/Core/components/abstract/ConstraintComponent.js +19 -0
  339. package/src/Core/components/abstract/FunctionBaseOperator.js +680 -0
  340. package/src/Core/components/abstract/GraphicalComponent.js +56 -0
  341. package/src/Core/components/abstract/InlineComponent.js +5 -0
  342. package/src/Core/components/abstract/InlineRenderInlineChildren.js +63 -0
  343. package/src/Core/components/abstract/Input.js +192 -0
  344. package/src/Core/components/abstract/IntervalListComponent.js +218 -0
  345. package/src/Core/components/abstract/LineListComponent.js +114 -0
  346. package/src/Core/components/abstract/MathBaseOperator.js +631 -0
  347. package/src/Core/components/abstract/MathBaseOperatorOneInput.js +112 -0
  348. package/src/Core/components/abstract/PointListComponent.js +238 -0
  349. package/src/Core/components/abstract/SectioningComponent.js +1262 -0
  350. package/src/Core/components/abstract/SingleCharacterInline.js +23 -0
  351. package/src/Core/components/abstract/TextBaseOperatorOfMath.js +47 -0
  352. package/src/Core/components/abstract/TextOrInline.js +66 -0
  353. package/src/Core/components/abstract/VariableName.js +31 -0
  354. package/src/Core/components/abstract/VariableNameList.js +83 -0
  355. package/src/Core/components/abstract/VectorListComponent.js +235 -0
  356. package/src/Core/components/chemistry/Atom.js +910 -0
  357. package/src/Core/components/chemistry/ElectronConfiguration.js +36 -0
  358. package/src/Core/components/chemistry/Ion.js +684 -0
  359. package/src/Core/components/chemistry/IonicCompound.js +189 -0
  360. package/src/Core/components/chemistry/OrbitalDiagram.js +175 -0
  361. package/src/Core/components/chemistry/OrbitalDiagramInput.js +753 -0
  362. package/src/Core/components/chemistry/index.js +6 -0
  363. package/src/Core/components/commonsugar/breakstrings.js +627 -0
  364. package/src/Core/components/commonsugar/lists.js +177 -0
  365. package/src/Core/components/dynamicalSystems/CobwebPolyline.js +913 -0
  366. package/src/Core/components/dynamicalSystems/EquilibriumCurve.js +95 -0
  367. package/src/Core/components/dynamicalSystems/EquilibriumLine.js +93 -0
  368. package/src/Core/components/dynamicalSystems/EquilibriumPoint.js +93 -0
  369. package/src/Core/components/dynamicalSystems/ODESystem.js +943 -0
  370. package/src/Core/components/dynamicalSystems/index.js +5 -0
  371. package/src/Core/components/linearAlgebra/EigenDecomposition.js +294 -0
  372. package/src/Core/utils/array.js +30 -0
  373. package/src/Core/utils/booleanLogic.js +965 -0
  374. package/src/Core/utils/checkEquality.js +818 -0
  375. package/src/Core/utils/cid.js +29 -0
  376. package/src/Core/utils/componentInfoObjects.js +100 -0
  377. package/src/Core/utils/constraints.js +23 -0
  378. package/src/Core/utils/copy.js +572 -0
  379. package/src/Core/utils/deepFunctions.js +173 -0
  380. package/src/Core/utils/descendants.js +252 -0
  381. package/src/Core/utils/enumeration.js +234 -0
  382. package/src/Core/utils/feedback.js +84 -0
  383. package/src/Core/utils/function.js +1343 -0
  384. package/src/Core/utils/graphical.js +196 -0
  385. package/src/Core/utils/label.js +396 -0
  386. package/src/Core/utils/math.js +1056 -0
  387. package/src/Core/utils/naming.js +45 -0
  388. package/src/Core/utils/periodicSetEquality.js +403 -0
  389. package/src/Core/utils/randomNumbers.js +70 -0
  390. package/src/Core/utils/retrieveMedia.js +98 -0
  391. package/src/Core/utils/retrieveTextFile.js +140 -0
  392. package/src/Core/utils/returnAllPossibleVariants.js +73 -0
  393. package/src/Core/utils/rounding.js +316 -0
  394. package/src/Core/utils/sequence.js +754 -0
  395. package/src/Core/utils/serializedStateProcessing.js +4049 -0
  396. package/src/Core/utils/size.js +22 -0
  397. package/src/Core/utils/stateVariables.js +138 -0
  398. package/src/Core/utils/style.js +535 -0
  399. package/src/Core/utils/subset-of-reals.js +796 -0
  400. package/src/Core/utils/table.js +41 -0
  401. package/src/Core/utils/text.js +16 -0
  402. package/src/Core/utils/triggering.js +167 -0
  403. package/src/Core/utils/variants.js +477 -0
  404. package/src/DoenetML.css +308 -0
  405. package/src/DoenetML.jsx +201 -0
  406. package/src/Parser/doenet.grammar +90 -0
  407. package/src/Parser/doenet.js +33 -0
  408. package/src/Parser/doenet.terms.js +20 -0
  409. package/src/Parser/parser.js +266 -0
  410. package/src/Parser/tokens.js +129 -0
  411. package/src/Tools/CodeMirror.jsx +440 -0
  412. package/src/Tools/DarkmodeController.jsx +21 -0
  413. package/src/Tools/Footers/MathInputSelector.jsx +34 -0
  414. package/src/Tools/Footers/VirtualKeyboard.jsx +751 -0
  415. package/src/Tools/cypressTest/CypressTest.jsx +341 -0
  416. package/src/Tools/cypressTest/index.html +102 -0
  417. package/src/Tools/cypressTest/index.jsx +40 -0
  418. package/src/Viewer/ActivityViewer.jsx +1461 -0
  419. package/src/Viewer/PageViewer.jsx +1329 -0
  420. package/src/Viewer/renderers/alert.jsx +17 -0
  421. package/src/Viewer/renderers/angle.jsx +209 -0
  422. package/src/Viewer/renderers/answer.jsx +206 -0
  423. package/src/Viewer/renderers/asList.jsx +25 -0
  424. package/src/Viewer/renderers/blockQuote.jsx +41 -0
  425. package/src/Viewer/renderers/boolean.jsx +17 -0
  426. package/src/Viewer/renderers/booleanInput.css +105 -0
  427. package/src/Viewer/renderers/booleanInput.jsx +636 -0
  428. package/src/Viewer/renderers/button.jsx +369 -0
  429. package/src/Viewer/renderers/c.jsx +17 -0
  430. package/src/Viewer/renderers/callAction.jsx +18 -0
  431. package/src/Viewer/renderers/cell.jsx +59 -0
  432. package/src/Viewer/renderers/chart.jsx +83 -0
  433. package/src/Viewer/renderers/choiceInput.css +223 -0
  434. package/src/Viewer/renderers/choiceInput.jsx +535 -0
  435. package/src/Viewer/renderers/circle.jsx +990 -0
  436. package/src/Viewer/renderers/cobwebPolyline.jsx +442 -0
  437. package/src/Viewer/renderers/codeEditor.jsx +248 -0
  438. package/src/Viewer/renderers/codeViewer.jsx +105 -0
  439. package/src/Viewer/renderers/containerBlock.jsx +41 -0
  440. package/src/Viewer/renderers/containerInline.jsx +17 -0
  441. package/src/Viewer/renderers/contentBrowser.jsx +159 -0
  442. package/src/Viewer/renderers/contentPicker.jsx +160 -0
  443. package/src/Viewer/renderers/curve.jsx +1072 -0
  444. package/src/Viewer/renderers/ellipsis.jsx +17 -0
  445. package/src/Viewer/renderers/em.jsx +17 -0
  446. package/src/Viewer/renderers/embed.jsx +110 -0
  447. package/src/Viewer/renderers/feedback.jsx +74 -0
  448. package/src/Viewer/renderers/figure.jsx +131 -0
  449. package/src/Viewer/renderers/footnote.jsx +52 -0
  450. package/src/Viewer/renderers/graph.jsx +925 -0
  451. package/src/Viewer/renderers/hint.jsx +142 -0
  452. package/src/Viewer/renderers/image.jsx +581 -0
  453. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs +2 -0
  454. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs.map +1 -0
  455. package/src/Viewer/renderers/label.jsx +470 -0
  456. package/src/Viewer/renderers/legend.jsx +306 -0
  457. package/src/Viewer/renderers/line.jsx +511 -0
  458. package/src/Viewer/renderers/lineSegment.jsx +754 -0
  459. package/src/Viewer/renderers/list.jsx +111 -0
  460. package/src/Viewer/renderers/lq.jsx +12 -0
  461. package/src/Viewer/renderers/lsq.jsx +12 -0
  462. package/src/Viewer/renderers/math.jsx +582 -0
  463. package/src/Viewer/renderers/mathInput.css +10 -0
  464. package/src/Viewer/renderers/mathInput.jsx +425 -0
  465. package/src/Viewer/renderers/mathInputog.jsx +534 -0
  466. package/src/Viewer/renderers/mathList.jsx +39 -0
  467. package/src/Viewer/renderers/matrixInput.jsx +317 -0
  468. package/src/Viewer/renderers/mdash.jsx +12 -0
  469. package/src/Viewer/renderers/nbsp.jsx +12 -0
  470. package/src/Viewer/renderers/ndash.jsx +12 -0
  471. package/src/Viewer/renderers/number.jsx +454 -0
  472. package/src/Viewer/renderers/numberList.jsx +35 -0
  473. package/src/Viewer/renderers/orbitalDiagram.jsx +247 -0
  474. package/src/Viewer/renderers/orbitalDiagramInput.jsx +450 -0
  475. package/src/Viewer/renderers/p.jsx +38 -0
  476. package/src/Viewer/renderers/paginatorControls.jsx +41 -0
  477. package/src/Viewer/renderers/pegboard.jsx +239 -0
  478. package/src/Viewer/renderers/point.jsx +649 -0
  479. package/src/Viewer/renderers/polygon.jsx +612 -0
  480. package/src/Viewer/renderers/polyline.jsx +608 -0
  481. package/src/Viewer/renderers/pre.jsx +34 -0
  482. package/src/Viewer/renderers/q.jsx +17 -0
  483. package/src/Viewer/renderers/ray.jsx +410 -0
  484. package/src/Viewer/renderers/ref.jsx +149 -0
  485. package/src/Viewer/renderers/regionBetweenCurveXAxis.jsx +182 -0
  486. package/src/Viewer/renderers/renderDoenetML.jsx +56 -0
  487. package/src/Viewer/renderers/row.jsx +31 -0
  488. package/src/Viewer/renderers/rq.jsx +12 -0
  489. package/src/Viewer/renderers/rsq.jsx +12 -0
  490. package/src/Viewer/renderers/section.jsx +427 -0
  491. package/src/Viewer/renderers/sideBySide.jsx +80 -0
  492. package/src/Viewer/renderers/slider.jsx +800 -0
  493. package/src/Viewer/renderers/solution.jsx +134 -0
  494. package/src/Viewer/renderers/spreadsheet.jsx +83 -0
  495. package/src/Viewer/renderers/sq.jsx +17 -0
  496. package/src/Viewer/renderers/styles/global.css +14 -0
  497. package/src/Viewer/renderers/subsetOfRealsInput.jsx +392 -0
  498. package/src/Viewer/renderers/summaryStatistics.jsx +83 -0
  499. package/src/Viewer/renderers/table.jsx +78 -0
  500. package/src/Viewer/renderers/tabular.jsx +58 -0
  501. package/src/Viewer/renderers/tag.jsx +26 -0
  502. package/src/Viewer/renderers/text.jsx +439 -0
  503. package/src/Viewer/renderers/textInput.jsx +774 -0
  504. package/src/Viewer/renderers/textList.jsx +30 -0
  505. package/src/Viewer/renderers/triggerSet.jsx +52 -0
  506. package/src/Viewer/renderers/updateValue.jsx +30 -0
  507. package/src/Viewer/renderers/utils/css.js +13 -0
  508. package/src/Viewer/renderers/utils/graph.js +159 -0
  509. package/src/Viewer/renderers/utils/offGraphIndicators.js +91 -0
  510. package/src/Viewer/renderers/vector.jsx +678 -0
  511. package/src/Viewer/renderers/video.jsx +494 -0
  512. package/src/Viewer/useDoenetRenderer.jsx +128 -0
  513. package/src/main.jsx +16 -0
  514. package/src/media/fonts/files/open-sans-v18-latin-700.woff +0 -0
  515. package/src/media/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  516. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  517. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  518. package/src/media/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  519. package/src/media/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  520. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  521. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  522. package/src/media/fonts/files/open-sans-v18-latin-light.woff +0 -0
  523. package/src/media/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  524. package/src/media/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  525. package/src/media/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  526. package/src/test/testCode.doenet +26 -0
  527. package/src/test/testViewer.jsx +158 -0
  528. package/src/uiComponents/ActionButton.jsx +157 -0
  529. package/src/uiComponents/ActionButtonGroup.jsx +93 -0
  530. package/src/uiComponents/Button.jsx +160 -0
  531. package/src/uiComponents/ButtonGroup.jsx +56 -0
  532. package/src/uiComponents/ToggleButton.jsx +194 -0
  533. package/src/uiComponents/ToggleButtonGroup.jsx +77 -0
  534. package/src/utils/activityUtils.js +713 -0
  535. package/src/utils/array.js +17 -0
  536. package/src/utils/cid.js +34 -0
  537. package/src/utils/componentInfoObjects.js +89 -0
  538. package/src/utils/deepFunctions.js +165 -0
  539. package/src/utils/enumeration.js +226 -0
  540. package/src/utils/math.js +624 -0
  541. package/src/utils/naming.js +44 -0
  542. package/src/utils/retrieveTextFile.js +156 -0
  543. package/src/utils/returnAllPossibleVariants.js +81 -0
  544. package/src/utils/sequence.js +715 -0
  545. package/src/utils/serialize.js +29 -0
  546. package/src/utils/serializedStateProcessing.js +2587 -0
  547. package/src/utils/subset-of-reals.js +783 -0
  548. package/src/utils/url.js +19 -0
  549. package/vite.config.js +14 -0
@@ -0,0 +1,1770 @@
1
+ import { numberToLetters } from "../../../src/Core/utils/sequence";
2
+ import { cesc, cesc2 } from "../../../src/_utils/url";
3
+
4
+ describe("Activity variants tests", function () {
5
+ beforeEach(() => {
6
+ cy.clearIndexedDB();
7
+ cy.visit("/src/Tools/cypressTest/");
8
+ });
9
+
10
+ it("Variants from single page, no variant control in page", () => {
11
+ cy.get("#testRunner_toggleControls").click();
12
+ cy.get("#testRunner_allowLocalState").click();
13
+ cy.wait(100);
14
+ cy.get("#testRunner_toggleControls").click();
15
+
16
+ let activityDefinition;
17
+
18
+ let attemptNumber = 0;
19
+
20
+ for (let ind = 1; ind <= 200; ind += 97) {
21
+ cy.window().then(async (win) => {
22
+ attemptNumber++;
23
+ activityDefinition = `
24
+ <document type="activity">
25
+ <order>
26
+ <page>
27
+ <text>${attemptNumber}</text>
28
+ Enter <selectFromSequence from="1" to="1000" assignNames="n" />:
29
+ <answer>$n</answer>
30
+ </page>
31
+ </order>
32
+ </document>
33
+ `;
34
+ win.postMessage(
35
+ {
36
+ activityDefinition,
37
+ requestedVariantIndex: ind,
38
+ attemptNumber,
39
+ },
40
+ "*",
41
+ );
42
+ cy.get(cesc("#\\/_text1")).should("have.text", `${attemptNumber}`);
43
+ });
44
+
45
+ cy.window().then(async (win) => {
46
+ let activityData = win.returnActivityData();
47
+
48
+ expect(activityData.requestedVariantIndex).eq(ind);
49
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
50
+ expect(activityData.variantsByPage).eqls([((ind - 1) % 100) + 1]);
51
+
52
+ let stateVariables = await win.returnAllStateVariables1();
53
+ let n = stateVariables["/n"].stateValues.value;
54
+
55
+ expect(n).gte(1);
56
+ expect(n).lte(1000);
57
+
58
+ let mathinputName = cesc2(
59
+ stateVariables["/_answer1"].stateValues.inputChildren[0]
60
+ .componentName,
61
+ );
62
+ let mathinputAnchor = "#" + mathinputName + " textarea";
63
+ let mathinputEditiableFieldAnchor =
64
+ "#" + mathinputName + " .mq-editable-field";
65
+ let mathinputSubmitAnchor = "#" + mathinputName + "_submit";
66
+ let mathinputCorrectAnchor = "#" + mathinputName + "_correct";
67
+ let mathinputIncorrectAnchor = "#" + mathinputName + "_incorrect";
68
+
69
+ cy.get(mathinputAnchor).type(`${n}{enter}`, { force: true });
70
+ cy.get(mathinputCorrectAnchor).should("be.visible");
71
+
72
+ cy.window().then(async (win) => {
73
+ let stateVariables = await win.returnAllStateVariables1();
74
+
75
+ expect(stateVariables["/_answer1"].stateValues.creditAchieved).eq(1);
76
+ });
77
+
78
+ cy.wait(2000); // wait for 1 second debounce
79
+
80
+ cy.reload();
81
+
82
+ cy.window().then(async (win) => {
83
+ win.postMessage(
84
+ {
85
+ activityDefinition,
86
+ requestedVariantIndex: ind,
87
+ attemptNumber,
88
+ },
89
+ "*",
90
+ );
91
+ cy.get(cesc("#\\/_text1")).should("have.text", `${attemptNumber}`);
92
+ });
93
+
94
+ // wait until core is loaded
95
+ cy.waitUntil(() =>
96
+ cy.window().then(async (win) => {
97
+ let stateVariables = await win.returnAllStateVariables1();
98
+ return stateVariables["/_answer1"];
99
+ }),
100
+ );
101
+
102
+ cy.window().then(async (win) => {
103
+ let stateVariables = await win.returnAllStateVariables1();
104
+ expect(stateVariables["/_answer1"].stateValues.creditAchieved).eq(1);
105
+ });
106
+
107
+ cy.get(mathinputAnchor).type(`{end}1`, { force: true });
108
+ cy.get(mathinputSubmitAnchor).click();
109
+ cy.get(mathinputIncorrectAnchor).should("be.visible");
110
+
111
+ cy.get(mathinputAnchor).type(`{end}{backspace}`, { force: true });
112
+ cy.get(mathinputSubmitAnchor).click();
113
+ cy.get(mathinputCorrectAnchor).should("be.visible");
114
+ });
115
+ }
116
+ });
117
+
118
+ it("Variants from single page, specified variants in page", () => {
119
+ cy.get("#testRunner_toggleControls").click();
120
+ cy.get("#testRunner_allowLocalState").click();
121
+ cy.wait(100);
122
+ cy.get("#testRunner_toggleControls").click();
123
+
124
+ let activityDefinition = `
125
+ <document type="activity">
126
+ <order>
127
+ <page>
128
+ <variantControl numVariants="3" variantNames="red blue green" />
129
+ <text>a</text>
130
+ Enter
131
+ <select assignNames="color" >
132
+ <option selectForVariants="red">red</option>
133
+ <option selectForVariants="blue">blue</option>
134
+ <option selectForVariants="green">green</option>
135
+ </select>
136
+ :
137
+ <answer type="text">$color</answer>
138
+ </page>
139
+ </order>
140
+ </document>
141
+ `;
142
+
143
+ for (let ind = 1; ind <= 4; ind++) {
144
+ if (ind > 1) {
145
+ cy.get("#testRunner_toggleControls").click();
146
+ cy.get("#testRunner_newAttempt").click();
147
+ cy.wait(100);
148
+ cy.get("#testRunner_toggleControls").click();
149
+ cy.reload();
150
+ }
151
+
152
+ cy.window().then(async (win) => {
153
+ win.postMessage(
154
+ {
155
+ activityDefinition,
156
+ requestedVariantIndex: ind,
157
+ },
158
+ "*",
159
+ );
160
+ });
161
+
162
+ cy.get(cesc("#\\/_text1")).should("have.text", "a");
163
+
164
+ let color = ["red", "blue", "green"][(ind - 1) % 3];
165
+
166
+ cy.window().then(async (win) => {
167
+ let activityData = win.returnActivityData();
168
+
169
+ expect(activityData.requestedVariantIndex).eq(ind);
170
+ expect(activityData.variantIndex).eq(((ind - 1) % 100) + 1);
171
+ expect(activityData.variantsByPage).eqls([((ind - 1) % 3) + 1]);
172
+
173
+ let stateVariables = await win.returnAllStateVariables1();
174
+ expect(stateVariables["/color"].replacements[0]).eq(color);
175
+
176
+ let textinputName = cesc2(
177
+ stateVariables["/_answer1"].stateValues.inputChildren[0]
178
+ .componentName,
179
+ );
180
+ let textinputAnchor = "#" + textinputName + "_input";
181
+ let textinputSubmitAnchor = "#" + textinputName + "_submit";
182
+ let textinputCorrectAnchor = "#" + textinputName + "_correct";
183
+ let textinputIncorrectAnchor = "#" + textinputName + "_incorrect";
184
+
185
+ cy.get(textinputAnchor).type(`${color}{enter}`);
186
+ cy.get(textinputCorrectAnchor).should("be.visible");
187
+
188
+ cy.window().then(async (win) => {
189
+ let stateVariables = await win.returnAllStateVariables1();
190
+
191
+ expect(stateVariables["/_answer1"].stateValues.creditAchieved).eq(1);
192
+ });
193
+
194
+ cy.wait(2000); // wait for 1 second debounce
195
+
196
+ cy.reload();
197
+
198
+ cy.window().then(async (win) => {
199
+ win.postMessage(
200
+ {
201
+ activityDefinition,
202
+ requestedVariantIndex: 1,
203
+ },
204
+ "*",
205
+ );
206
+ });
207
+
208
+ cy.get(cesc("#\\/_text1")).should("have.text", "a");
209
+
210
+ // wait until core is loaded
211
+ cy.waitUntil(() =>
212
+ cy.window().then(async (win) => {
213
+ let stateVariables = await win.returnAllStateVariables1();
214
+ return stateVariables["/_answer1"];
215
+ }),
216
+ );
217
+
218
+ cy.window().then(async (win) => {
219
+ let stateVariables = await win.returnAllStateVariables1();
220
+ expect(stateVariables["/_answer1"].stateValues.creditAchieved).eq(1);
221
+ });
222
+
223
+ cy.get(textinputAnchor).type(`{end}x`);
224
+ cy.get(textinputSubmitAnchor).click();
225
+ cy.get(textinputIncorrectAnchor).should("be.visible");
226
+
227
+ cy.get(textinputAnchor).type(`{end}{backspace}`);
228
+ cy.get(textinputSubmitAnchor).click();
229
+ cy.get(textinputCorrectAnchor).should("be.visible");
230
+ });
231
+ }
232
+ });
233
+
234
+ it("Variants from single page, specified variants in problem in page", () => {
235
+ cy.get("#testRunner_toggleControls").click();
236
+ cy.get("#testRunner_allowLocalState").click();
237
+ cy.wait(100);
238
+ cy.get("#testRunner_toggleControls").click();
239
+
240
+ let activityDefinition = `
241
+ <document type="activity">
242
+ <order>
243
+ <page>
244
+ <problem>
245
+ <variantControl uniqueVariants />
246
+ <text>a</text>
247
+ Enter
248
+ <select assignNames="color" >
249
+ <option>red</option>
250
+ <option>blue</option>
251
+ <option>green</option>
252
+ </select>
253
+ :
254
+ <answer type="text">$color</answer>
255
+ </problem>
256
+ </page>
257
+ </order>
258
+ </document>
259
+ `;
260
+
261
+ for (let ind = 1; ind <= 4; ind++) {
262
+ if (ind > 1) {
263
+ cy.get("#testRunner_toggleControls").click();
264
+ cy.get("#testRunner_newAttempt").click();
265
+ cy.wait(100);
266
+ cy.get("#testRunner_toggleControls").click();
267
+ cy.reload();
268
+ }
269
+
270
+ cy.window().then(async (win) => {
271
+ win.postMessage(
272
+ {
273
+ activityDefinition,
274
+ requestedVariantIndex: ind,
275
+ },
276
+ "*",
277
+ );
278
+ });
279
+
280
+ cy.get(cesc("#\\/_text1")).should("have.text", "a");
281
+
282
+ let color = ["red", "blue", "green"][(ind - 1) % 3];
283
+
284
+ cy.window().then(async (win) => {
285
+ let activityData = win.returnActivityData();
286
+
287
+ expect(activityData.requestedVariantIndex).eq(ind);
288
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
289
+ expect(activityData.variantsByPage).eqls([((ind - 1) % 3) + 1]);
290
+
291
+ let stateVariables = await win.returnAllStateVariables1();
292
+ expect(stateVariables["/color"].replacements[0]).eq(color);
293
+
294
+ let textinputName = cesc2(
295
+ stateVariables["/_answer1"].stateValues.inputChildren[0]
296
+ .componentName,
297
+ );
298
+ let textinputAnchor = "#" + textinputName + "_input";
299
+ let textinputSubmitAnchor = "#" + textinputName + "_submit";
300
+ let textinputCorrectAnchor = "#" + textinputName + "_correct";
301
+ let textinputIncorrectAnchor = "#" + textinputName + "_incorrect";
302
+
303
+ cy.get(textinputAnchor).type(`${color}{enter}`);
304
+ cy.get(textinputCorrectAnchor).should("be.visible");
305
+
306
+ cy.window().then(async (win) => {
307
+ let stateVariables = await win.returnAllStateVariables1();
308
+
309
+ expect(stateVariables["/_answer1"].stateValues.creditAchieved).eq(1);
310
+ });
311
+
312
+ cy.wait(2000); // wait for 1 second debounce
313
+
314
+ cy.reload();
315
+
316
+ cy.window().then(async (win) => {
317
+ win.postMessage(
318
+ {
319
+ activityDefinition,
320
+ requestedVariantIndex: 1,
321
+ },
322
+ "*",
323
+ );
324
+ });
325
+
326
+ cy.get(cesc("#\\/_text1")).should("have.text", "a");
327
+
328
+ // wait until core is loaded
329
+ cy.waitUntil(() =>
330
+ cy.window().then(async (win) => {
331
+ let stateVariables = await win.returnAllStateVariables1();
332
+ return stateVariables["/_answer1"];
333
+ }),
334
+ );
335
+
336
+ cy.window().then(async (win) => {
337
+ let stateVariables = await win.returnAllStateVariables1();
338
+ expect(stateVariables["/_answer1"].stateValues.creditAchieved).eq(1);
339
+ });
340
+
341
+ cy.get(textinputAnchor).type(`{end}x`);
342
+ cy.get(textinputSubmitAnchor).click();
343
+ cy.get(textinputIncorrectAnchor).should("be.visible");
344
+
345
+ cy.get(textinputAnchor).type(`{end}{backspace}`);
346
+ cy.get(textinputSubmitAnchor).click();
347
+ cy.get(textinputCorrectAnchor).should("be.visible");
348
+ });
349
+ }
350
+ });
351
+
352
+ it("Two pages few variants, page variants enumerated", () => {
353
+ let activityDefinition = `
354
+ <document type="activity">
355
+ <order>
356
+ <page>
357
+ <text>a</text>
358
+ <variantControl uniqueVariants />
359
+ <selectFromSequence from="1" to="2" assignNames="n" />
360
+ </page>
361
+ <page>
362
+ <text>b</text>
363
+ <variantControl uniqueVariants />
364
+ <selectFromSequence type="letters" from="a" to="c" assignNames="l" />
365
+ </page>
366
+ </order>
367
+ </document>
368
+ `;
369
+
370
+ for (let ind = 1; ind <= 2000; ind += 371) {
371
+ if (ind > 1) {
372
+ cy.reload();
373
+ }
374
+
375
+ cy.window().then(async (win) => {
376
+ win.postMessage(
377
+ {
378
+ activityDefinition,
379
+ requestedVariantIndex: ind,
380
+ },
381
+ "*",
382
+ );
383
+ });
384
+
385
+ if (ind > 1) {
386
+ cy.get("[data-test=previous]").click();
387
+ }
388
+
389
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
390
+
391
+ cy.window().then(async (win) => {
392
+ let activityData = win.returnActivityData();
393
+
394
+ expect(activityData.requestedVariantIndex).eq(ind);
395
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
396
+ expect(activityData.variantsByPage.length).eq(2);
397
+ expect(activityData.variantsByPage[0]).eq(
398
+ ((activityData.variantIndex - 1) % 2) + 1,
399
+ );
400
+ expect(activityData.variantsByPage[1]).eq(
401
+ ((activityData.variantIndex - 1) % 3) + 1,
402
+ );
403
+
404
+ let stateVariables1 = await win.returnAllStateVariables1();
405
+
406
+ expect(stateVariables1["/n"].stateValues.value).eq(
407
+ activityData.variantsByPage[0],
408
+ );
409
+
410
+ cy.get("[data-test=next]").click();
411
+
412
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
413
+
414
+ cy.window().then(async (win) => {
415
+ let stateVariables2 = await win.returnAllStateVariables2();
416
+
417
+ expect(stateVariables2["/l"].stateValues.value).eq(
418
+ numberToLetters(activityData.variantsByPage[1], true),
419
+ );
420
+ });
421
+ });
422
+ }
423
+ });
424
+
425
+ it("Two pages, numberOfVariants not specified, defaults to 1000", () => {
426
+ cy.get("#testRunner_toggleControls").click();
427
+ cy.get("#testRunner_allowLocalState").click();
428
+ cy.wait(100);
429
+ cy.get("#testRunner_toggleControls").click();
430
+
431
+ let activityDefinition = `
432
+ <document type="activity">
433
+ <order>
434
+ <page>
435
+ <text>a</text>
436
+ Enter <selectFromSequence from="1" to="1000" assignNames="n" />:
437
+ <answer>$n</answer>
438
+ </page>
439
+ <page>
440
+ <text>b</text>
441
+ <variantControl uniqueVariants />
442
+ Enter <selectFromSequence type="letters" from="a" to="z" assignNames="l" />:
443
+ <answer type="text">$l</answer>
444
+ </page>
445
+ </order>
446
+ </document>
447
+ `;
448
+
449
+ for (let ind = 1; ind <= 2000; ind += 970) {
450
+ if (ind > 1) {
451
+ cy.get("#testRunner_toggleControls").click();
452
+ cy.get("#testRunner_newAttempt").click();
453
+ cy.wait(100);
454
+ cy.get("#testRunner_toggleControls").click();
455
+ cy.reload();
456
+ }
457
+
458
+ cy.window().then(async (win) => {
459
+ win.postMessage(
460
+ {
461
+ activityDefinition,
462
+ requestedVariantIndex: ind,
463
+ },
464
+ "*",
465
+ );
466
+ });
467
+
468
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
469
+
470
+ cy.window().then(async (win) => {
471
+ let activityData = win.returnActivityData();
472
+
473
+ expect(activityData.requestedVariantIndex).eq(ind);
474
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
475
+ expect(activityData.variantsByPage.length).eq(2);
476
+ expect(activityData.variantsByPage[0]).gte(1);
477
+ expect(activityData.variantsByPage[0]).lte(100);
478
+ expect(activityData.variantsByPage[1]).gte(1);
479
+ expect(activityData.variantsByPage[1]).lte(26);
480
+
481
+ let l = numberToLetters(activityData.variantsByPage[1], true);
482
+
483
+ let stateVariables1 = await win.returnAllStateVariables1();
484
+ let n = stateVariables1["/n"].stateValues.value;
485
+
486
+ expect(n).gte(1);
487
+ expect(n).lte(1000);
488
+
489
+ let mathinputName = cesc2(
490
+ stateVariables1["/_answer1"].stateValues.inputChildren[0]
491
+ .componentName,
492
+ );
493
+ let mathinputAnchor = "#page1" + mathinputName + " textarea";
494
+ let mathinputEditiableFieldAnchor =
495
+ "#page1" + mathinputName + " .mq-editable-field";
496
+ let mathinputSubmitAnchor = "#page1" + mathinputName + "_submit";
497
+ let mathinputCorrectAnchor = "#page1" + mathinputName + "_correct";
498
+ let mathinputIncorrectAnchor = "#page1" + mathinputName + "_incorrect";
499
+
500
+ cy.get(mathinputAnchor).type(`${n}{enter}`, { force: true });
501
+ cy.get(mathinputCorrectAnchor).should("be.visible");
502
+
503
+ cy.window().then(async (win) => {
504
+ let stateVariables1 = await win.returnAllStateVariables1();
505
+ expect(stateVariables1["/_answer1"].stateValues.creditAchieved).eq(1);
506
+ });
507
+
508
+ cy.get("[data-test=next]").click();
509
+
510
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
511
+
512
+ cy.window().then(async (win) => {
513
+ let stateVariables2 = await win.returnAllStateVariables2();
514
+
515
+ expect(stateVariables2["/l"].stateValues.value).eq(l);
516
+
517
+ let textinputName = cesc2(
518
+ stateVariables2["/_answer1"].stateValues.inputChildren[0]
519
+ .componentName,
520
+ );
521
+ let textinputAnchor = "#page2" + textinputName + "_input";
522
+ let textinputSubmitAnchor = "#page2" + textinputName + "_submit";
523
+ let textinputCorrectAnchor = "#page2" + textinputName + "_correct";
524
+ let textinputIncorrectAnchor =
525
+ "#page2" + textinputName + "_incorrect";
526
+
527
+ cy.get(textinputAnchor).type(`${l}{enter}`);
528
+ cy.get(textinputCorrectAnchor).should("be.visible");
529
+
530
+ cy.window().then(async (win) => {
531
+ let stateVariables2 = await win.returnAllStateVariables2();
532
+ expect(stateVariables2["/_answer1"].stateValues.creditAchieved).eq(
533
+ 1,
534
+ );
535
+ });
536
+
537
+ cy.get("[data-test=previous]").click();
538
+
539
+ cy.get(mathinputEditiableFieldAnchor).should("have.text", `${n}`);
540
+ cy.get(mathinputCorrectAnchor).should("be.visible");
541
+
542
+ cy.get("[data-test=next]").click();
543
+
544
+ cy.get(textinputAnchor).should("have.value", l);
545
+ cy.get(textinputCorrectAnchor).should("be.visible");
546
+
547
+ cy.wait(2000); // wait for 1 second debounce
548
+
549
+ cy.reload();
550
+
551
+ cy.window().then(async (win) => {
552
+ win.postMessage(
553
+ {
554
+ activityDefinition,
555
+ requestedVariantIndex: 1,
556
+ },
557
+ "*",
558
+ );
559
+ });
560
+
561
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
562
+
563
+ // wait until core is loaded
564
+ cy.waitUntil(() =>
565
+ cy.window().then(async (win) => {
566
+ let stateVariables2 = await win.returnAllStateVariables2();
567
+ return stateVariables2["/_answer1"];
568
+ }),
569
+ );
570
+
571
+ cy.window().then(async (win) => {
572
+ let stateVariables2 = await win.returnAllStateVariables2();
573
+ expect(stateVariables2["/_answer1"].stateValues.creditAchieved).eq(
574
+ 1,
575
+ );
576
+ });
577
+
578
+ cy.get(textinputAnchor).type(`{end}X`);
579
+ cy.get(textinputSubmitAnchor).click();
580
+ cy.get(textinputIncorrectAnchor).should("be.visible");
581
+
582
+ cy.window().then(async (win) => {
583
+ let stateVariables2 = await win.returnAllStateVariables2();
584
+ expect(stateVariables2["/_answer1"].stateValues.creditAchieved).eq(
585
+ 0,
586
+ );
587
+ });
588
+
589
+ cy.get("[data-test=previous]").click();
590
+
591
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
592
+
593
+ // wait until core is loaded
594
+ cy.waitUntil(() =>
595
+ cy.window().then(async (win) => {
596
+ let stateVariables1 = await win.returnAllStateVariables1();
597
+ return stateVariables1["/_answer1"];
598
+ }),
599
+ );
600
+
601
+ cy.window().then(async (win) => {
602
+ let stateVariables1 = await win.returnAllStateVariables1();
603
+ expect(stateVariables1["/_answer1"].stateValues.creditAchieved).eq(
604
+ 1,
605
+ );
606
+ });
607
+
608
+ cy.get(mathinputAnchor).type(`{end}1`, { force: true });
609
+ cy.get(mathinputSubmitAnchor).click();
610
+ cy.get(mathinputIncorrectAnchor).should("be.visible");
611
+
612
+ cy.window().then(async (win) => {
613
+ let stateVariables1 = await win.returnAllStateVariables1();
614
+ expect(stateVariables1["/_answer1"].stateValues.creditAchieved).eq(
615
+ 0,
616
+ );
617
+ });
618
+
619
+ cy.get("[data-test=next]").click();
620
+
621
+ cy.get(textinputAnchor).type(`{end}{backspace}`);
622
+ cy.get(textinputSubmitAnchor).click();
623
+ cy.get(textinputCorrectAnchor).should("be.visible");
624
+
625
+ cy.get("[data-test=previous]").click();
626
+
627
+ cy.get(mathinputAnchor).type(`{end}{backspace}`, { force: true });
628
+ cy.get(mathinputSubmitAnchor).click();
629
+ cy.get(mathinputCorrectAnchor).should("be.visible");
630
+
631
+ cy.window().then(async (win) => {
632
+ let stateVariables1 = await win.returnAllStateVariables1();
633
+ expect(stateVariables1["/_answer1"].stateValues.creditAchieved).eq(
634
+ 1,
635
+ );
636
+ let stateVariables2 = await win.returnAllStateVariables2();
637
+ expect(stateVariables2["/_answer1"].stateValues.creditAchieved).eq(
638
+ 1,
639
+ );
640
+ });
641
+ });
642
+ });
643
+ }
644
+ });
645
+
646
+ it("Two pages, specify numberOfVariants is 2", () => {
647
+ let activityDefinition = `
648
+ <document type="activity" numberOfVariants="2">
649
+ <order>
650
+ <page>
651
+ <text>a</text>
652
+ Enter <selectFromSequence from="1" to="1000" assignNames="n" />:
653
+ <answer>$n</answer>
654
+ </page>
655
+ <page>
656
+ <text>b</text>
657
+ <variantControl uniqueVariants />
658
+ Enter <selectFromSequence type="letters" from="a" to="z" assignNames="l" />:
659
+ <answer type="text">$l</answer>
660
+ </page>
661
+ </order>
662
+ </document>
663
+ `;
664
+
665
+ let numbers = [];
666
+ let letters = [];
667
+
668
+ for (let ind = 1; ind <= 3; ind++) {
669
+ if (ind > 1) {
670
+ cy.reload();
671
+ }
672
+
673
+ cy.window().then(async (win) => {
674
+ win.postMessage(
675
+ {
676
+ activityDefinition,
677
+ requestedVariantIndex: ind,
678
+ },
679
+ "*",
680
+ );
681
+ });
682
+
683
+ if (ind > 1) {
684
+ cy.get("[data-test=previous]").click();
685
+ }
686
+
687
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
688
+
689
+ cy.window().then(async (win) => {
690
+ let activityData = win.returnActivityData();
691
+
692
+ expect(activityData.requestedVariantIndex).eq(ind);
693
+ expect(activityData.variantIndex).eq(((ind - 1) % 2) + 1);
694
+ expect(activityData.variantsByPage.length).eq(2);
695
+ expect(activityData.variantsByPage[0]).gte(1);
696
+ expect(activityData.variantsByPage[0]).lte(100);
697
+ expect(activityData.variantsByPage[1]).gte(1);
698
+ expect(activityData.variantsByPage[1]).lte(26);
699
+
700
+ let l = numberToLetters(activityData.variantsByPage[1], true);
701
+
702
+ if (letters[activityData.variantIndex] === undefined) {
703
+ letters[activityData.variantIndex] = l;
704
+ } else {
705
+ expect(l).eq(letters[activityData.variantIndex]);
706
+ }
707
+
708
+ let stateVariables1 = await win.returnAllStateVariables1();
709
+ let n = stateVariables1["/n"].stateValues.value;
710
+
711
+ if (numbers[activityData.variantIndex] === undefined) {
712
+ numbers[activityData.variantIndex] = n;
713
+ } else {
714
+ expect(n).eq(numbers[activityData.variantIndex]);
715
+ }
716
+
717
+ let mathinputName = cesc2(
718
+ stateVariables1["/_answer1"].stateValues.inputChildren[0]
719
+ .componentName,
720
+ );
721
+ let mathinputAnchor = "#page1" + mathinputName + " textarea";
722
+ let mathinputEditiableFieldAnchor =
723
+ "#page1" + mathinputName + " .mq-editable-field";
724
+ let mathinputSubmitAnchor = "#page1" + mathinputName + "_submit";
725
+ let mathinputCorrectAnchor = "#page1" + mathinputName + "_correct";
726
+ let mathinputIncorrectAnchor = "#page1" + mathinputName + "_incorrect";
727
+
728
+ cy.get(mathinputAnchor).type(`${n}{enter}`, { force: true });
729
+ cy.get(mathinputCorrectAnchor).should("be.visible");
730
+
731
+ cy.window().then(async (win) => {
732
+ let stateVariables1 = await win.returnAllStateVariables1();
733
+ expect(stateVariables1["/_answer1"].stateValues.creditAchieved).eq(1);
734
+ });
735
+
736
+ cy.get("[data-test=next]").click();
737
+
738
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
739
+
740
+ cy.window().then(async (win) => {
741
+ let stateVariables2 = await win.returnAllStateVariables2();
742
+
743
+ expect(stateVariables2["/l"].stateValues.value).eq(l);
744
+
745
+ let textinputName = cesc2(
746
+ stateVariables2["/_answer1"].stateValues.inputChildren[0]
747
+ .componentName,
748
+ );
749
+ let textinputAnchor = "#page2" + textinputName + "_input";
750
+ let textinputSubmitAnchor = "#page2" + textinputName + "_submit";
751
+ let textinputCorrectAnchor = "#page2" + textinputName + "_correct";
752
+ let textinputIncorrectAnchor =
753
+ "#page2" + textinputName + "_incorrect";
754
+
755
+ cy.get(textinputAnchor).type(`${l}{enter}`);
756
+ cy.get(textinputCorrectAnchor).should("be.visible");
757
+
758
+ cy.window().then(async (win) => {
759
+ let stateVariables2 = await win.returnAllStateVariables2();
760
+ expect(stateVariables2["/_answer1"].stateValues.creditAchieved).eq(
761
+ 1,
762
+ );
763
+ });
764
+
765
+ cy.get("[data-test=previous]").click();
766
+
767
+ cy.get(mathinputEditiableFieldAnchor).should("have.text", `${n}`);
768
+ cy.get(mathinputCorrectAnchor).should("be.visible");
769
+
770
+ cy.get("[data-test=next]").click();
771
+
772
+ cy.get(textinputAnchor).should("have.value", l);
773
+ cy.get(textinputCorrectAnchor).should("be.visible");
774
+ });
775
+ });
776
+ }
777
+ });
778
+
779
+ it("Shuffle and select orders, numberOfVariants not specified", () => {
780
+ let activityDefinition = `
781
+ <document type="activity">
782
+ <order behavior="shuffle">
783
+ <page>
784
+ <title>A</title>
785
+ <text>a</text>
786
+ <selectFromSequence from="1" to="1000" assignNames="n" />
787
+ </page>
788
+ <order behavior="select">
789
+ <page>
790
+ <title>B</title>
791
+ <text>a</text>
792
+ <selectFromSequence from="1" to="1000" assignNames="n" />
793
+ </page>
794
+ <page>
795
+ <title>C</title>
796
+ <text>a</text>
797
+ <selectFromSequence from="1" to="1000" assignNames="n" />
798
+ </page>
799
+ </order>
800
+ </order>
801
+ </document>
802
+ `;
803
+
804
+ let selectionByVariant = {};
805
+
806
+ for (let ind = 5; ind <= 1500; ind += 250) {
807
+ if (ind > 5) {
808
+ cy.reload();
809
+ }
810
+
811
+ cy.window().then(async (win) => {
812
+ win.postMessage(
813
+ {
814
+ activityDefinition,
815
+ requestedVariantIndex: ind,
816
+ },
817
+ "*",
818
+ );
819
+ });
820
+
821
+ if (ind > 5) {
822
+ cy.get("[data-test=previous]").click();
823
+ }
824
+
825
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
826
+
827
+ cy.window().then(async (win) => {
828
+ let activityData = win.returnActivityData();
829
+
830
+ expect(activityData.requestedVariantIndex).eq(ind);
831
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
832
+ expect(activityData.variantsByPage.length).eq(2);
833
+ expect(activityData.variantsByPage[0]).gte(1);
834
+ expect(activityData.variantsByPage[0]).lte(100);
835
+ expect(activityData.variantsByPage[1]).gte(1);
836
+ expect(activityData.variantsByPage[1]).lte(100);
837
+
838
+ let selection = {
839
+ order: activityData.order,
840
+ variantsByPage: activityData.variantsByPage,
841
+ };
842
+
843
+ let titles = [];
844
+
845
+ let stateVariables1 = await win.returnAllStateVariables1();
846
+ let title1 = stateVariables1["/_title1"].stateValues.value;
847
+
848
+ titles.push(title1);
849
+
850
+ let page1 = {
851
+ title: title1,
852
+ n: stateVariables1["/n"].stateValues.value,
853
+ };
854
+
855
+ selection.page1 = page1;
856
+
857
+ cy.get("[data-test=next]").click();
858
+
859
+ cy.get(cesc("#page2\\/_title1")).should("not.have.text", title1);
860
+ cy.get(cesc("#page2\\/_text1"))
861
+ .should("have.text", "a")
862
+ .then(async () => {
863
+ let stateVariables2 = await win.returnAllStateVariables2();
864
+ let title2 = stateVariables2["/_title1"].stateValues.value;
865
+
866
+ titles.push(title2);
867
+
868
+ let page2 = {
869
+ title: title2,
870
+ n: stateVariables2["/n"].stateValues.value,
871
+ };
872
+
873
+ titles.sort();
874
+
875
+ let validTitles =
876
+ (titles[0] === "A" && (titles[1] === "B" || titles[1] === "C")) ||
877
+ (titles[0] === "B" && titles[1] === "C");
878
+
879
+ expect(validTitles).eq(true);
880
+
881
+ selection.page2 = page2;
882
+
883
+ if (selectionByVariant[activityData.variantIndex] === undefined) {
884
+ selectionByVariant[activityData.variantIndex] = selection;
885
+ } else {
886
+ expect(selection).eqls(
887
+ selectionByVariant[activityData.variantIndex],
888
+ );
889
+ }
890
+ });
891
+ });
892
+ }
893
+ });
894
+
895
+ it("Two pages, unique variants, variants to exclude", () => {
896
+ let activityDefinition = `
897
+ <document type="activity">
898
+ <order>
899
+ <page>
900
+ <text>a</text>
901
+ <variantControl uniqueVariants variantsToExclude="a c d" />
902
+ <selectFromSequence from="1" to="5" assignNames="n" />
903
+ </page>
904
+ <page>
905
+ <text>b</text>
906
+ <variantControl uniqueVariants variantsToExclude="b c d f" />
907
+ <selectFromSequence type="letters" from="a" to="g" assignNames="l" />
908
+ </page>
909
+ </order>
910
+ </document>
911
+ `;
912
+
913
+ for (let ind = 1; ind <= 20; ind += 5) {
914
+ if (ind > 1) {
915
+ cy.reload();
916
+ }
917
+
918
+ cy.window().then(async (win) => {
919
+ win.postMessage(
920
+ {
921
+ activityDefinition,
922
+ requestedVariantIndex: ind,
923
+ },
924
+ "*",
925
+ );
926
+ });
927
+
928
+ if (ind > 1) {
929
+ cy.get("[data-test=previous]").click();
930
+ }
931
+
932
+ let nFromVariant = [2, 5];
933
+ let lFromVariant = ["a", "e", "g"];
934
+
935
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
936
+
937
+ cy.window().then(async (win) => {
938
+ let activityData = win.returnActivityData();
939
+
940
+ console.log("activityData", activityData);
941
+
942
+ expect(activityData.requestedVariantIndex).eq(ind);
943
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
944
+ expect(activityData.variantsByPage.length).eq(2);
945
+ expect(activityData.variantsByPage[0]).eq(
946
+ ((activityData.variantIndex - 1) % 2) + 1,
947
+ );
948
+ expect(activityData.variantsByPage[1]).eq(
949
+ ((activityData.variantIndex - 1) % 3) + 1,
950
+ );
951
+
952
+ let stateVariables1 = await win.returnAllStateVariables1();
953
+
954
+ expect(stateVariables1["/n"].stateValues.value).eq(
955
+ nFromVariant[activityData.variantsByPage[0] - 1],
956
+ );
957
+
958
+ cy.get("[data-test=next]").click();
959
+
960
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
961
+
962
+ cy.window().then(async (win) => {
963
+ let stateVariables2 = await win.returnAllStateVariables2();
964
+
965
+ expect(stateVariables2["/l"].stateValues.value).eq(
966
+ lFromVariant[activityData.variantsByPage[1] - 1],
967
+ );
968
+ });
969
+ });
970
+ }
971
+ });
972
+
973
+ it("Two pages, unique variants, variants to include", () => {
974
+ let activityDefinition = `
975
+ <document type="activity">
976
+ <order>
977
+ <page>
978
+ <text>a</text>
979
+ <variantControl uniqueVariants variantsToInclude="b e" />
980
+ <selectFromSequence from="1" to="5" assignNames="n" />
981
+ </page>
982
+ <page>
983
+ <text>b</text>
984
+ <variantControl uniqueVariants variantsToInclude="a e g" />
985
+ <selectFromSequence type="letters" from="a" to="g" assignNames="l" />
986
+ </page>
987
+ </order>
988
+ </document>
989
+ `;
990
+
991
+ for (let ind = 1; ind <= 20; ind += 5) {
992
+ if (ind > 1) {
993
+ cy.reload();
994
+ }
995
+
996
+ cy.window().then(async (win) => {
997
+ win.postMessage(
998
+ {
999
+ activityDefinition,
1000
+ requestedVariantIndex: ind,
1001
+ },
1002
+ "*",
1003
+ );
1004
+ });
1005
+
1006
+ if (ind > 1) {
1007
+ cy.get("[data-test=previous]").click();
1008
+ }
1009
+
1010
+ let nFromVariant = [2, 5];
1011
+ let lFromVariant = ["a", "e", "g"];
1012
+
1013
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1014
+
1015
+ cy.window().then(async (win) => {
1016
+ let activityData = win.returnActivityData();
1017
+
1018
+ console.log("activityData", activityData);
1019
+
1020
+ expect(activityData.requestedVariantIndex).eq(ind);
1021
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1022
+ expect(activityData.variantsByPage.length).eq(2);
1023
+ expect(activityData.variantsByPage[0]).eq(
1024
+ ((activityData.variantIndex - 1) % 2) + 1,
1025
+ );
1026
+ expect(activityData.variantsByPage[1]).eq(
1027
+ ((activityData.variantIndex - 1) % 3) + 1,
1028
+ );
1029
+
1030
+ let stateVariables1 = await win.returnAllStateVariables1();
1031
+
1032
+ expect(stateVariables1["/n"].stateValues.value).eq(
1033
+ nFromVariant[activityData.variantsByPage[0] - 1],
1034
+ );
1035
+
1036
+ cy.get("[data-test=next]").click();
1037
+
1038
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1039
+
1040
+ cy.window().then(async (win) => {
1041
+ let stateVariables2 = await win.returnAllStateVariables2();
1042
+
1043
+ expect(stateVariables2["/l"].stateValues.value).eq(
1044
+ lFromVariant[activityData.variantsByPage[1] - 1],
1045
+ );
1046
+ });
1047
+ });
1048
+ }
1049
+ });
1050
+
1051
+ it("Two pages, named variants, variants to exclude", () => {
1052
+ let activityDefinition = `
1053
+ <document type="activity">
1054
+ <order>
1055
+ <page>
1056
+ <text>a</text>
1057
+ <variantControl numVariants="5" variantsToExclude="a c d" />
1058
+ <select assignNames="(n)">
1059
+ <option selectForVariants="a"><number>1</number></option>
1060
+ <option selectForVariants="b"><number>2</number></option>
1061
+ <option selectForVariants="c"><number>3</number></option>
1062
+ <option selectForVariants="d"><number>4</number></option>
1063
+ <option selectForVariants="e"><number>5</number></option>
1064
+ </select>
1065
+ </page>
1066
+ <page>
1067
+ <text>b</text>
1068
+ <variantControl numVariants="7" variantsToExclude="b c d f" />
1069
+ <select assignNames="(l)">
1070
+ <option selectForVariants="a"><text>a</text></option>
1071
+ <option selectForVariants="b"><text>b</text></option>
1072
+ <option selectForVariants="c"><text>c</text></option>
1073
+ <option selectForVariants="d"><text>d</text></option>
1074
+ <option selectForVariants="e"><text>e</text></option>
1075
+ <option selectForVariants="f"><text>f</text></option>
1076
+ <option selectForVariants="g"><text>g</text></option>
1077
+ </select>
1078
+ </page>
1079
+ </order>
1080
+ </document>
1081
+ `;
1082
+
1083
+ for (let ind = 1; ind <= 20; ind += 5) {
1084
+ if (ind > 1) {
1085
+ cy.reload();
1086
+ }
1087
+
1088
+ cy.window().then(async (win) => {
1089
+ win.postMessage(
1090
+ {
1091
+ activityDefinition,
1092
+ requestedVariantIndex: ind,
1093
+ },
1094
+ "*",
1095
+ );
1096
+ });
1097
+
1098
+ if (ind > 1) {
1099
+ cy.get("[data-test=previous]").click();
1100
+ }
1101
+
1102
+ let nFromVariant = [2, 5];
1103
+ let lFromVariant = ["a", "e", "g"];
1104
+
1105
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1106
+
1107
+ cy.window().then(async (win) => {
1108
+ let activityData = win.returnActivityData();
1109
+
1110
+ expect(activityData.requestedVariantIndex).eq(ind);
1111
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1112
+ expect(activityData.variantsByPage.length).eq(2);
1113
+ expect(activityData.variantsByPage[0]).eq(
1114
+ ((activityData.variantIndex - 1) % 2) + 1,
1115
+ );
1116
+ expect(activityData.variantsByPage[1]).eq(
1117
+ ((activityData.variantIndex - 1) % 3) + 1,
1118
+ );
1119
+
1120
+ let stateVariables1 = await win.returnAllStateVariables1();
1121
+
1122
+ expect(stateVariables1["/n"].stateValues.value).eq(
1123
+ nFromVariant[activityData.variantsByPage[0] - 1],
1124
+ );
1125
+
1126
+ cy.get("[data-test=next]").click();
1127
+
1128
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1129
+
1130
+ cy.window().then(async (win) => {
1131
+ let stateVariables2 = await win.returnAllStateVariables2();
1132
+
1133
+ expect(stateVariables2["/l"].stateValues.value).eq(
1134
+ lFromVariant[activityData.variantsByPage[1] - 1],
1135
+ );
1136
+ });
1137
+ });
1138
+ }
1139
+ });
1140
+
1141
+ it("Two pages, named variants, variants to include", () => {
1142
+ let activityDefinition = `
1143
+ <document type="activity">
1144
+ <order>
1145
+ <page>
1146
+ <text>a</text>
1147
+ <variantControl numVariants="5" variantsToInclude="b e" />
1148
+ <select assignNames="(n)">
1149
+ <option selectForVariants="a"><number>1</number></option>
1150
+ <option selectForVariants="b"><number>2</number></option>
1151
+ <option selectForVariants="c"><number>3</number></option>
1152
+ <option selectForVariants="d"><number>4</number></option>
1153
+ <option selectForVariants="e"><number>5</number></option>
1154
+ </select>
1155
+ </page>
1156
+ <page>
1157
+ <text>b</text>
1158
+ <variantControl numVariants="7" variantsToInclude="a e g" />
1159
+ <select assignNames="(l)">
1160
+ <option selectForVariants="a"><text>a</text></option>
1161
+ <option selectForVariants="b"><text>b</text></option>
1162
+ <option selectForVariants="c"><text>c</text></option>
1163
+ <option selectForVariants="d"><text>d</text></option>
1164
+ <option selectForVariants="e"><text>e</text></option>
1165
+ <option selectForVariants="f"><text>f</text></option>
1166
+ <option selectForVariants="g"><text>g</text></option>
1167
+ </select>
1168
+ </page>
1169
+ </order>
1170
+ </document>
1171
+ `;
1172
+
1173
+ for (let ind = 1; ind <= 20; ind += 5) {
1174
+ if (ind > 1) {
1175
+ cy.reload();
1176
+ }
1177
+
1178
+ cy.window().then(async (win) => {
1179
+ win.postMessage(
1180
+ {
1181
+ activityDefinition,
1182
+ requestedVariantIndex: ind,
1183
+ },
1184
+ "*",
1185
+ );
1186
+ });
1187
+
1188
+ if (ind > 1) {
1189
+ cy.get("[data-test=previous]").click();
1190
+ }
1191
+
1192
+ let nFromVariant = [2, 5];
1193
+ let lFromVariant = ["a", "e", "g"];
1194
+
1195
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1196
+
1197
+ cy.window().then(async (win) => {
1198
+ let activityData = win.returnActivityData();
1199
+
1200
+ expect(activityData.requestedVariantIndex).eq(ind);
1201
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1202
+ expect(activityData.variantsByPage.length).eq(2);
1203
+ expect(activityData.variantsByPage[0]).eq(
1204
+ ((activityData.variantIndex - 1) % 2) + 1,
1205
+ );
1206
+ expect(activityData.variantsByPage[1]).eq(
1207
+ ((activityData.variantIndex - 1) % 3) + 1,
1208
+ );
1209
+
1210
+ let stateVariables1 = await win.returnAllStateVariables1();
1211
+
1212
+ expect(stateVariables1["/n"].stateValues.value).eq(
1213
+ nFromVariant[activityData.variantsByPage[0] - 1],
1214
+ );
1215
+
1216
+ cy.get("[data-test=next]").click();
1217
+
1218
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1219
+
1220
+ cy.window().then(async (win) => {
1221
+ let stateVariables2 = await win.returnAllStateVariables2();
1222
+
1223
+ expect(stateVariables2["/l"].stateValues.value).eq(
1224
+ lFromVariant[activityData.variantsByPage[1] - 1],
1225
+ );
1226
+ });
1227
+ });
1228
+ }
1229
+ });
1230
+
1231
+ it("Two pages, variants from problem, variant to exclude", () => {
1232
+ let activityDefinition = `
1233
+ <document type="activity">
1234
+ <order>
1235
+ <page>
1236
+ <problem>
1237
+ <text>a</text>
1238
+ <variantControl numVariants="5" variantsToExclude="a c d" />
1239
+ <select assignNames="(n)">
1240
+ <option selectForVariants="a"><number>1</number></option>
1241
+ <option selectForVariants="b"><number>2</number></option>
1242
+ <option selectForVariants="c"><number>3</number></option>
1243
+ <option selectForVariants="d"><number>4</number></option>
1244
+ <option selectForVariants="e"><number>5</number></option>
1245
+ </select>
1246
+ </problem>
1247
+ </page>
1248
+ <page>
1249
+ <problem>
1250
+ <text>b</text>
1251
+ <variantControl uniqueVariants variantsToExclude="b c d f" />
1252
+ <selectFromSequence type="letters" from="a" to="g" assignNames="l" />
1253
+ </problem>
1254
+ </page>
1255
+ </order>
1256
+ </document>
1257
+ `;
1258
+
1259
+ for (let ind = 1; ind <= 20; ind += 5) {
1260
+ if (ind > 1) {
1261
+ cy.reload();
1262
+ }
1263
+
1264
+ cy.window().then(async (win) => {
1265
+ win.postMessage(
1266
+ {
1267
+ activityDefinition,
1268
+ requestedVariantIndex: ind,
1269
+ },
1270
+ "*",
1271
+ );
1272
+ });
1273
+
1274
+ if (ind > 1) {
1275
+ cy.get("[data-test=previous]").click();
1276
+ }
1277
+
1278
+ let nFromVariant = [2, 5];
1279
+ let lFromVariant = ["a", "e", "g"];
1280
+
1281
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1282
+
1283
+ cy.window().then(async (win) => {
1284
+ let activityData = win.returnActivityData();
1285
+
1286
+ expect(activityData.requestedVariantIndex).eq(ind);
1287
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1288
+ expect(activityData.variantsByPage.length).eq(2);
1289
+ expect(activityData.variantsByPage[0]).eq(
1290
+ ((activityData.variantIndex - 1) % 2) + 1,
1291
+ );
1292
+ expect(activityData.variantsByPage[1]).eq(
1293
+ ((activityData.variantIndex - 1) % 3) + 1,
1294
+ );
1295
+
1296
+ let stateVariables1 = await win.returnAllStateVariables1();
1297
+
1298
+ expect(stateVariables1["/n"].stateValues.value).eq(
1299
+ nFromVariant[activityData.variantsByPage[0] - 1],
1300
+ );
1301
+
1302
+ cy.get("[data-test=next]").click();
1303
+
1304
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1305
+
1306
+ cy.window().then(async (win) => {
1307
+ let stateVariables2 = await win.returnAllStateVariables2();
1308
+
1309
+ expect(stateVariables2["/l"].stateValues.value).eq(
1310
+ lFromVariant[activityData.variantsByPage[1] - 1],
1311
+ );
1312
+ });
1313
+ });
1314
+ }
1315
+ });
1316
+
1317
+ it("Two pages, variants from problem, variant to include", () => {
1318
+ let activityDefinition = `
1319
+ <document type="activity">
1320
+ <order>
1321
+ <page>
1322
+ <problem>
1323
+ <text>a</text>
1324
+ <variantControl numVariants="5" variantsToInclude="b e" />
1325
+ <select assignNames="(n)">
1326
+ <option selectForVariants="a"><number>1</number></option>
1327
+ <option selectForVariants="b"><number>2</number></option>
1328
+ <option selectForVariants="c"><number>3</number></option>
1329
+ <option selectForVariants="d"><number>4</number></option>
1330
+ <option selectForVariants="e"><number>5</number></option>
1331
+ </select>
1332
+ </problem>
1333
+ </page>
1334
+ <page>
1335
+ <problem>
1336
+ <text>b</text>
1337
+ <variantControl uniqueVariants variantsToInclude="a e g" />
1338
+ <selectFromSequence type="letters" from="a" to="g" assignNames="l" />
1339
+ </problem>
1340
+ </page>
1341
+ </order>
1342
+ </document>
1343
+ `;
1344
+
1345
+ for (let ind = 1; ind <= 20; ind += 5) {
1346
+ if (ind > 1) {
1347
+ cy.reload();
1348
+ }
1349
+
1350
+ cy.window().then(async (win) => {
1351
+ win.postMessage(
1352
+ {
1353
+ activityDefinition,
1354
+ requestedVariantIndex: ind,
1355
+ },
1356
+ "*",
1357
+ );
1358
+ });
1359
+
1360
+ if (ind > 1) {
1361
+ cy.get("[data-test=previous]").click();
1362
+ }
1363
+
1364
+ let nFromVariant = [2, 5];
1365
+ let lFromVariant = ["a", "e", "g"];
1366
+
1367
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1368
+
1369
+ cy.window().then(async (win) => {
1370
+ let activityData = win.returnActivityData();
1371
+
1372
+ expect(activityData.requestedVariantIndex).eq(ind);
1373
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1374
+ expect(activityData.variantsByPage.length).eq(2);
1375
+ expect(activityData.variantsByPage[0]).eq(
1376
+ ((activityData.variantIndex - 1) % 2) + 1,
1377
+ );
1378
+ expect(activityData.variantsByPage[1]).eq(
1379
+ ((activityData.variantIndex - 1) % 3) + 1,
1380
+ );
1381
+
1382
+ let stateVariables1 = await win.returnAllStateVariables1();
1383
+
1384
+ expect(stateVariables1["/n"].stateValues.value).eq(
1385
+ nFromVariant[activityData.variantsByPage[0] - 1],
1386
+ );
1387
+
1388
+ cy.get("[data-test=next]").click();
1389
+
1390
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1391
+
1392
+ cy.window().then(async (win) => {
1393
+ let stateVariables2 = await win.returnAllStateVariables2();
1394
+
1395
+ expect(stateVariables2["/l"].stateValues.value).eq(
1396
+ lFromVariant[activityData.variantsByPage[1] - 1],
1397
+ );
1398
+ });
1399
+ });
1400
+ }
1401
+ });
1402
+
1403
+ it("Two pages, variants from document and problem, variants to exclude in problem", () => {
1404
+ let activityDefinition = `
1405
+ <document type="activity">
1406
+ <order>
1407
+ <page>
1408
+ <variantControl uniqueVariants />
1409
+ <problem>
1410
+ <text>a</text>
1411
+ <variantControl numVariants="5" variantsToExclude="a c d" />
1412
+ <select assignNames="(n)">
1413
+ <option selectForVariants="a"><number>1</number></option>
1414
+ <option selectForVariants="b"><number>2</number></option>
1415
+ <option selectForVariants="c"><number>3</number></option>
1416
+ <option selectForVariants="d"><number>4</number></option>
1417
+ <option selectForVariants="e"><number>5</number></option>
1418
+ </select>
1419
+ </problem>
1420
+ </page>
1421
+ <page>
1422
+ <variantControl uniqueVariants />
1423
+ <problem>
1424
+ <text>b</text>
1425
+ <variantControl uniqueVariants variantsToExclude="b c d f" />
1426
+ <selectFromSequence type="letters" from="a" to="g" assignNames="l" />
1427
+ </problem>
1428
+ </page>
1429
+ </order>
1430
+ </document>
1431
+ `;
1432
+
1433
+ for (let ind = 1; ind <= 20; ind += 5) {
1434
+ if (ind > 1) {
1435
+ cy.reload();
1436
+ }
1437
+
1438
+ cy.window().then(async (win) => {
1439
+ win.postMessage(
1440
+ {
1441
+ activityDefinition,
1442
+ requestedVariantIndex: ind,
1443
+ },
1444
+ "*",
1445
+ );
1446
+ });
1447
+
1448
+ if (ind > 1) {
1449
+ cy.get("[data-test=previous]").click();
1450
+ }
1451
+
1452
+ let nFromVariant = [2, 5];
1453
+ let lFromVariant = ["a", "e", "g"];
1454
+
1455
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1456
+
1457
+ cy.window().then(async (win) => {
1458
+ let activityData = win.returnActivityData();
1459
+
1460
+ expect(activityData.requestedVariantIndex).eq(ind);
1461
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1462
+ expect(activityData.variantsByPage.length).eq(2);
1463
+ expect(activityData.variantsByPage[0]).eq(
1464
+ ((activityData.variantIndex - 1) % 2) + 1,
1465
+ );
1466
+ expect(activityData.variantsByPage[1]).eq(
1467
+ ((activityData.variantIndex - 1) % 3) + 1,
1468
+ );
1469
+
1470
+ let stateVariables1 = await win.returnAllStateVariables1();
1471
+
1472
+ expect(stateVariables1["/n"].stateValues.value).eq(
1473
+ nFromVariant[activityData.variantsByPage[0] - 1],
1474
+ );
1475
+
1476
+ cy.get("[data-test=next]").click();
1477
+
1478
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1479
+
1480
+ cy.window().then(async (win) => {
1481
+ let stateVariables2 = await win.returnAllStateVariables2();
1482
+
1483
+ expect(stateVariables2["/l"].stateValues.value).eq(
1484
+ lFromVariant[activityData.variantsByPage[1] - 1],
1485
+ );
1486
+ });
1487
+ });
1488
+ }
1489
+ });
1490
+
1491
+ it("Two pages, variants from document and problem, variants to include in problem", () => {
1492
+ let activityDefinition = `
1493
+ <document type="activity">
1494
+ <order>
1495
+ <page>
1496
+ <variantControl uniqueVariants />
1497
+ <problem>
1498
+ <text>a</text>
1499
+ <variantControl numVariants="5" variantsToInclude="b e" />
1500
+ <select assignNames="(n)">
1501
+ <option selectForVariants="a"><number>1</number></option>
1502
+ <option selectForVariants="b"><number>2</number></option>
1503
+ <option selectForVariants="c"><number>3</number></option>
1504
+ <option selectForVariants="d"><number>4</number></option>
1505
+ <option selectForVariants="e"><number>5</number></option>
1506
+ </select>
1507
+ </problem>
1508
+ </page>
1509
+ <page>
1510
+ <variantControl uniqueVariants />
1511
+ <problem>
1512
+ <text>b</text>
1513
+ <variantControl uniqueVariants variantsToInclude="a e g" />
1514
+ <selectFromSequence type="letters" from="a" to="g" assignNames="l" />
1515
+ </problem>
1516
+ </page>
1517
+ </order>
1518
+ </document>
1519
+ `;
1520
+
1521
+ for (let ind = 1; ind <= 20; ind += 5) {
1522
+ if (ind > 1) {
1523
+ cy.reload();
1524
+ }
1525
+
1526
+ cy.window().then(async (win) => {
1527
+ win.postMessage(
1528
+ {
1529
+ activityDefinition,
1530
+ requestedVariantIndex: ind,
1531
+ },
1532
+ "*",
1533
+ );
1534
+ });
1535
+
1536
+ if (ind > 1) {
1537
+ cy.get("[data-test=previous]").click();
1538
+ }
1539
+
1540
+ let nFromVariant = [2, 5];
1541
+ let lFromVariant = ["a", "e", "g"];
1542
+
1543
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1544
+
1545
+ cy.window().then(async (win) => {
1546
+ let activityData = win.returnActivityData();
1547
+
1548
+ expect(activityData.requestedVariantIndex).eq(ind);
1549
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1550
+ expect(activityData.variantsByPage.length).eq(2);
1551
+ expect(activityData.variantsByPage[0]).eq(
1552
+ ((activityData.variantIndex - 1) % 2) + 1,
1553
+ );
1554
+ expect(activityData.variantsByPage[1]).eq(
1555
+ ((activityData.variantIndex - 1) % 3) + 1,
1556
+ );
1557
+
1558
+ let stateVariables1 = await win.returnAllStateVariables1();
1559
+
1560
+ expect(stateVariables1["/n"].stateValues.value).eq(
1561
+ nFromVariant[activityData.variantsByPage[0] - 1],
1562
+ );
1563
+
1564
+ cy.get("[data-test=next]").click();
1565
+
1566
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1567
+
1568
+ cy.window().then(async (win) => {
1569
+ let stateVariables2 = await win.returnAllStateVariables2();
1570
+
1571
+ expect(stateVariables2["/l"].stateValues.value).eq(
1572
+ lFromVariant[activityData.variantsByPage[1] - 1],
1573
+ );
1574
+ });
1575
+ });
1576
+ }
1577
+ });
1578
+
1579
+ it("Two pages, variants from document and problem, variant to exclude in document and problem", () => {
1580
+ let activityDefinition = `
1581
+ <document type="activity">
1582
+ <order>
1583
+ <page>
1584
+ <variantControl uniqueVariants variantsToExclude="b" />
1585
+ <problem>
1586
+ <text>a</text>
1587
+ <variantControl numVariants="5" variantsToExclude="a d" />
1588
+ <select assignNames="(n)">
1589
+ <option selectForVariants="a"><number>1</number></option>
1590
+ <option selectForVariants="b"><number>2</number></option>
1591
+ <option selectForVariants="c"><number>3</number></option>
1592
+ <option selectForVariants="d"><number>4</number></option>
1593
+ <option selectForVariants="e"><number>5</number></option>
1594
+ </select>
1595
+ </problem>
1596
+ </page>
1597
+ <page>
1598
+ <variantControl uniqueVariants variantsToExclude="c" />
1599
+ <problem>
1600
+ <text>b</text>
1601
+ <variantControl uniqueVariants variantsToExclude="b c d" />
1602
+ <selectFromSequence type="letters" from="a" to="g" assignNames="l" />
1603
+ </problem>
1604
+ </page>
1605
+ </order>
1606
+ </document>
1607
+ `;
1608
+
1609
+ for (let ind = 1; ind <= 20; ind += 5) {
1610
+ if (ind > 1) {
1611
+ cy.reload();
1612
+ }
1613
+
1614
+ cy.window().then(async (win) => {
1615
+ win.postMessage(
1616
+ {
1617
+ activityDefinition,
1618
+ requestedVariantIndex: ind,
1619
+ },
1620
+ "*",
1621
+ );
1622
+ });
1623
+
1624
+ if (ind > 1) {
1625
+ cy.get("[data-test=previous]").click();
1626
+ }
1627
+
1628
+ let nFromVariant = [2, 5];
1629
+ let lFromVariant = ["a", "e", "g"];
1630
+ let docVariantOptions1 = ["a", "c"];
1631
+ let docVariantOptions2 = ["a", "b", "d"];
1632
+
1633
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1634
+
1635
+ cy.window().then(async (win) => {
1636
+ let activityData = win.returnActivityData();
1637
+
1638
+ expect(activityData.requestedVariantIndex).eq(ind);
1639
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1640
+ expect(activityData.variantsByPage.length).eq(2);
1641
+ expect(activityData.variantsByPage[0]).eq(
1642
+ ((activityData.variantIndex - 1) % 2) + 1,
1643
+ );
1644
+ expect(activityData.variantsByPage[1]).eq(
1645
+ ((activityData.variantIndex - 1) % 3) + 1,
1646
+ );
1647
+
1648
+ let stateVariables1 = await win.returnAllStateVariables1();
1649
+
1650
+ expect(stateVariables1["/n"].stateValues.value).eq(
1651
+ nFromVariant[activityData.variantsByPage[0] - 1],
1652
+ );
1653
+ expect(stateVariables1["/_document1"].sharedParameters.variantName).eq(
1654
+ docVariantOptions1[activityData.variantsByPage[0] - 1],
1655
+ );
1656
+
1657
+ cy.get("[data-test=next]").click();
1658
+
1659
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1660
+
1661
+ cy.window().then(async (win) => {
1662
+ let stateVariables2 = await win.returnAllStateVariables2();
1663
+
1664
+ expect(stateVariables2["/l"].stateValues.value).eq(
1665
+ lFromVariant[activityData.variantsByPage[1] - 1],
1666
+ );
1667
+ expect(
1668
+ stateVariables2["/_document1"].sharedParameters.variantName,
1669
+ ).eq(docVariantOptions2[activityData.variantsByPage[1] - 1]);
1670
+ });
1671
+ });
1672
+ }
1673
+ });
1674
+
1675
+ it("Two pages, variants from document and problem, variant to include in document and problem", () => {
1676
+ let activityDefinition = `
1677
+ <document type="activity">
1678
+ <order>
1679
+ <page>
1680
+ <variantControl uniqueVariants variantsToInclude="a c" />
1681
+ <problem>
1682
+ <text>a</text>
1683
+ <variantControl numVariants="5" variantsToInclude="b c e" />
1684
+ <select assignNames="(n)">
1685
+ <option selectForVariants="a"><number>1</number></option>
1686
+ <option selectForVariants="b"><number>2</number></option>
1687
+ <option selectForVariants="c"><number>3</number></option>
1688
+ <option selectForVariants="d"><number>4</number></option>
1689
+ <option selectForVariants="e"><number>5</number></option>
1690
+ </select>
1691
+ </problem>
1692
+ </page>
1693
+ <page>
1694
+ <variantControl uniqueVariants variantsToInclude="a b d" />
1695
+ <problem>
1696
+ <text>b</text>
1697
+ <variantControl uniqueVariants variantsToInclude="a e f g" />
1698
+ <selectFromSequence type="letters" from="a" to="g" assignNames="l" />
1699
+ </problem>
1700
+ </page>
1701
+ </order>
1702
+ </document>
1703
+ `;
1704
+
1705
+ for (let ind = 1; ind <= 20; ind += 5) {
1706
+ if (ind > 1) {
1707
+ cy.reload();
1708
+ }
1709
+
1710
+ cy.window().then(async (win) => {
1711
+ win.postMessage(
1712
+ {
1713
+ activityDefinition,
1714
+ requestedVariantIndex: ind,
1715
+ },
1716
+ "*",
1717
+ );
1718
+ });
1719
+
1720
+ if (ind > 1) {
1721
+ cy.get("[data-test=previous]").click();
1722
+ }
1723
+
1724
+ let nFromVariant = [2, 5];
1725
+ let lFromVariant = ["a", "e", "g"];
1726
+ let docVariantOptions1 = ["a", "c"];
1727
+ let docVariantOptions2 = ["a", "b", "d"];
1728
+
1729
+ cy.get(cesc("#page1\\/_text1")).should("have.text", "a");
1730
+
1731
+ cy.window().then(async (win) => {
1732
+ let activityData = win.returnActivityData();
1733
+
1734
+ expect(activityData.requestedVariantIndex).eq(ind);
1735
+ expect(activityData.variantIndex).eq(((ind - 1) % 1000) + 1);
1736
+ expect(activityData.variantsByPage.length).eq(2);
1737
+ expect(activityData.variantsByPage[0]).eq(
1738
+ ((activityData.variantIndex - 1) % 2) + 1,
1739
+ );
1740
+ expect(activityData.variantsByPage[1]).eq(
1741
+ ((activityData.variantIndex - 1) % 3) + 1,
1742
+ );
1743
+
1744
+ let stateVariables1 = await win.returnAllStateVariables1();
1745
+
1746
+ expect(stateVariables1["/n"].stateValues.value).eq(
1747
+ nFromVariant[activityData.variantsByPage[0] - 1],
1748
+ );
1749
+ expect(stateVariables1["/_document1"].sharedParameters.variantName).eq(
1750
+ docVariantOptions1[activityData.variantsByPage[0] - 1],
1751
+ );
1752
+
1753
+ cy.get("[data-test=next]").click();
1754
+
1755
+ cy.get(cesc("#page2\\/_text1")).should("have.text", "b");
1756
+
1757
+ cy.window().then(async (win) => {
1758
+ let stateVariables2 = await win.returnAllStateVariables2();
1759
+
1760
+ expect(stateVariables2["/l"].stateValues.value).eq(
1761
+ lFromVariant[activityData.variantsByPage[1] - 1],
1762
+ );
1763
+ expect(
1764
+ stateVariables2["/_document1"].sharedParameters.variantName,
1765
+ ).eq(docVariantOptions2[activityData.variantsByPage[1] - 1]);
1766
+ });
1767
+ });
1768
+ }
1769
+ });
1770
+ });