@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,2143 @@
1
+ import me from "math-expressions";
2
+ import { cesc, cesc2 } from "../../../../src/utils/url";
3
+
4
+ function nInDOM(n) {
5
+ if (n < 0) {
6
+ return `−${Math.abs(n)}`;
7
+ } else {
8
+ return String(n);
9
+ }
10
+ }
11
+
12
+ describe("Rectangle Tag Tests", function () {
13
+ beforeEach(() => {
14
+ cy.clearIndexedDB();
15
+ cy.visit("/src/Tools/cypressTest/");
16
+ });
17
+
18
+ it("rectangle with no parameters (gives unit square)", () => {
19
+ setupScene({
20
+ rectangleProperties: "",
21
+ rectangleChildren: "",
22
+ });
23
+
24
+ runTests({
25
+ v0x: 0,
26
+ v0y: 0,
27
+ v2x: 1,
28
+ v2y: 1,
29
+ cornerDependencyState: 1,
30
+ });
31
+ });
32
+
33
+ it("rectangle with only height", () => {
34
+ setupScene({
35
+ rectangleProperties: 'height="-3"',
36
+ rectangleChildren: "",
37
+ });
38
+
39
+ runTests({
40
+ v0x: 0,
41
+ v0y: 0,
42
+ v2x: 1,
43
+ v2y: -3,
44
+ cornerDependencyState: 1,
45
+ });
46
+ });
47
+
48
+ it("rectangle with only width and height", () => {
49
+ setupScene({
50
+ rectangleProperties: 'width="3" height="5"',
51
+ rectangleChildren: "",
52
+ });
53
+
54
+ runTests({
55
+ v0x: 0,
56
+ v0y: 0,
57
+ v2x: 3,
58
+ v2y: 5,
59
+ cornerDependencyState: 1,
60
+ });
61
+ });
62
+
63
+ it("rectangle with only center", () => {
64
+ setupScene({
65
+ rectangleProperties: 'center="(-1,5)"',
66
+ rectangleChildren: "",
67
+ });
68
+
69
+ runTests({
70
+ v0x: -1.5,
71
+ v0y: 4.5,
72
+ v2x: -0.5,
73
+ v2y: 5.5,
74
+ cornerDependencyState: 0,
75
+ });
76
+ });
77
+
78
+ it("rectangle with only center and width", () => {
79
+ setupScene({
80
+ rectangleProperties: 'width="-2" center="(-4,2)"',
81
+ rectangleChildren: "",
82
+ });
83
+
84
+ runTests({
85
+ v0x: -3,
86
+ v0y: 1.5,
87
+ v2x: -5,
88
+ v2y: 2.5,
89
+ cornerDependencyState: 0,
90
+ });
91
+ });
92
+
93
+ it("rectangle with only 1 vertex", () => {
94
+ setupScene({
95
+ rectangleProperties: 'vertices="(2,3)"',
96
+ rectangleChildren: "",
97
+ });
98
+
99
+ runTests({
100
+ v0x: 2,
101
+ v0y: 3,
102
+ v2x: 3,
103
+ v2y: 4,
104
+ cornerDependencyState: 1,
105
+ });
106
+ });
107
+
108
+ it("rectangle with only 1 vertex and height", () => {
109
+ setupScene({
110
+ rectangleProperties: 'height="6" vertices="(-3,4)"',
111
+ rectangleChildren: "",
112
+ });
113
+
114
+ runTests({
115
+ v0x: -3,
116
+ v0y: 4,
117
+ v2x: -2,
118
+ v2y: 10,
119
+ cornerDependencyState: 1,
120
+ });
121
+ });
122
+
123
+ it("rectangle with center, width and height", () => {
124
+ setupScene({
125
+ rectangleProperties: 'width="6" height="-3" center="(-3,-4)"',
126
+ rectangleChildren: "",
127
+ });
128
+
129
+ runTests({
130
+ v0x: -6,
131
+ v0y: -2.5,
132
+ v2x: 0,
133
+ v2y: -5.5,
134
+ cornerDependencyState: 0,
135
+ });
136
+ });
137
+
138
+ it("rectangle with vertex, width and height", () => {
139
+ setupScene({
140
+ rectangleProperties: 'width="7" height="4" vertices="(-1,2)"',
141
+ rectangleChildren: "",
142
+ });
143
+
144
+ runTests({
145
+ v0x: -1,
146
+ v0y: 2,
147
+ v2x: 6,
148
+ v2y: 6,
149
+ cornerDependencyState: 1,
150
+ });
151
+ });
152
+
153
+ it("rectangle with 1 vertex and center", () => {
154
+ setupScene({
155
+ rectangleProperties: 'vertices="(-2,-4)" center="(1,-1)"',
156
+ rectangleChildren: "",
157
+ });
158
+
159
+ runTests({
160
+ v0x: -2,
161
+ v0y: -4,
162
+ v2x: 4,
163
+ v2y: 2,
164
+ cornerDependencyState: 2,
165
+ });
166
+ });
167
+
168
+ it("rectangle with 2 vertices", () => {
169
+ setupScene({
170
+ rectangleProperties: 'vertices="(-5,-9) (-1,-2)"',
171
+ rectangleChildren: "",
172
+ });
173
+
174
+ runTests({
175
+ v0x: -5,
176
+ v0y: -9,
177
+ v2x: -1,
178
+ v2y: -2,
179
+ cornerDependencyState: 0,
180
+ });
181
+ });
182
+
183
+ it("copy rectangle and overwrite attributes", () => {
184
+ cy.window().then(async (win) => {
185
+ win.postMessage(
186
+ {
187
+ doenetML: `
188
+ <text>a</text>
189
+
190
+ <group newNamespace name="g1" >
191
+ <sideBySide widths="25% 25% 25% 25%" >
192
+ <graph width="180" height="180">
193
+ <rectangle name="r1" />
194
+ </graph>
195
+ <graph width="180" height="180">
196
+ <copy target="r1" vertices="(3,4)" assignNames="r2" styleNumber="2" />
197
+ </graph>
198
+ <graph width="180" height="180">
199
+ <copy target="r2" width="5" assignNames="r3" styleNumber="3" />
200
+ </graph>
201
+ <graph width="180" height="180">
202
+ <copy target="r3" center="(4,5)" assignNames="r4" styleNumber="4" />
203
+ </graph>
204
+ </sideBySide>
205
+ </group>
206
+
207
+ <copy target="g1" assignNames="g2" />
208
+
209
+
210
+ `,
211
+ },
212
+ "*",
213
+ );
214
+ });
215
+
216
+ cy.get(cesc("#\\/_text1")).should("have.text", "a"); // to wait for page to load
217
+
218
+ async function checkTransformedRectangleValues({
219
+ stateVariables,
220
+ v0x1,
221
+ v0y1,
222
+ v2x1,
223
+ v2y1,
224
+ v0x2,
225
+ v0y2,
226
+ v2x2,
227
+ v2y2,
228
+ v2x3,
229
+ v2x4,
230
+ v2y4,
231
+ }) {
232
+ checkRectangleValues(
233
+ {
234
+ rectangleNames: ["/g1/r1", "/g2/r1"],
235
+ },
236
+ {
237
+ v0x: v0x1,
238
+ v0y: v0y1,
239
+ v2x: v2x1,
240
+ v2y: v2y1,
241
+ },
242
+ stateVariables,
243
+ );
244
+
245
+ checkRectangleValues(
246
+ {
247
+ rectangleNames: ["/g1/r2", "/g2/r2"],
248
+ },
249
+ {
250
+ v0x: v0x2,
251
+ v0y: v0y2,
252
+ v2x: v2x2,
253
+ v2y: v2y2,
254
+ },
255
+ stateVariables,
256
+ );
257
+
258
+ checkRectangleValues(
259
+ {
260
+ rectangleNames: ["/g1/r3", "/g2/r3"],
261
+ },
262
+ {
263
+ v0x: v0x2,
264
+ v0y: v0y2,
265
+ v2x: v2x3,
266
+ v2y: v2y2,
267
+ },
268
+ stateVariables,
269
+ );
270
+
271
+ checkRectangleValues(
272
+ {
273
+ rectangleNames: ["/g1/r4", "/g2/r4"],
274
+ },
275
+ {
276
+ v0x: v0x2,
277
+ v0y: v0y2,
278
+ v2x: v2x4,
279
+ v2y: v2y4,
280
+ },
281
+ stateVariables,
282
+ );
283
+ }
284
+
285
+ let v0x1 = 0,
286
+ v0y1 = 0,
287
+ v2x1 = 1,
288
+ v2y1 = 1,
289
+ v0x2 = 3,
290
+ v0y2 = 4,
291
+ v2x2 = 4,
292
+ v2y2 = 5,
293
+ v2x3 = 8,
294
+ v2x4 = 5,
295
+ v2y4 = 6;
296
+ cy.window().then(async (win) => {
297
+ let stateVariables = await win.returnAllStateVariables1();
298
+
299
+ await checkTransformedRectangleValues({
300
+ stateVariables,
301
+ v0x1,
302
+ v0y1,
303
+ v2x1,
304
+ v2y1,
305
+ v0x2,
306
+ v0y2,
307
+ v2x2,
308
+ v2y2,
309
+ v2x3,
310
+ v2x4,
311
+ v2y4,
312
+ });
313
+ });
314
+
315
+ cy.log("shift g1/r1");
316
+
317
+ cy.window().then(async (win) => {
318
+ let dx = -2;
319
+ let dy = 4;
320
+
321
+ v0x1 += dx;
322
+ v0y1 += dy;
323
+ v2x1 += dx;
324
+ v2y1 += dy;
325
+
326
+ await win.callAction1({
327
+ actionName: "movePolygon",
328
+ componentName: "/g1/r1",
329
+ args: {
330
+ pointCoords: { 0: [v0x1, v0y1], 2: [v2x1, v2y1] },
331
+ },
332
+ });
333
+
334
+ let stateVariables = await win.returnAllStateVariables1();
335
+ await checkTransformedRectangleValues({
336
+ stateVariables,
337
+ v0x1,
338
+ v0y1,
339
+ v2x1,
340
+ v2y1,
341
+ v0x2,
342
+ v0y2,
343
+ v2x2,
344
+ v2y2,
345
+ v2x3,
346
+ v2x4,
347
+ v2y4,
348
+ });
349
+ });
350
+
351
+ cy.log("move vertex 0 of g2/r1");
352
+
353
+ cy.window().then(async (win) => {
354
+ v0x1 = 1;
355
+ v0y1 = 8;
356
+
357
+ let width = v2x1 - v0x1;
358
+ let height = v2y1 - v0y1;
359
+
360
+ v2x2 = v0x2 + width;
361
+ v2y2 = v0y2 + height;
362
+
363
+ await win.callAction1({
364
+ actionName: "movePolygon",
365
+ componentName: "/g2/r1",
366
+ args: {
367
+ pointCoords: { 0: [v0x1, v0y1] },
368
+ },
369
+ });
370
+
371
+ let stateVariables = await win.returnAllStateVariables1();
372
+ await checkTransformedRectangleValues({
373
+ stateVariables,
374
+ v0x1,
375
+ v0y1,
376
+ v2x1,
377
+ v2y1,
378
+ v0x2,
379
+ v0y2,
380
+ v2x2,
381
+ v2y2,
382
+ v2x3,
383
+ v2x4,
384
+ v2y4,
385
+ });
386
+ });
387
+
388
+ cy.log("move vertex 1 of g1/r2");
389
+
390
+ cy.window().then(async (win) => {
391
+ let center4x = (v2x4 + v0x2) / 2;
392
+ let center4y = (v2y4 + v0y2) / 2;
393
+
394
+ let width3 = v2x3 - v0x2;
395
+
396
+ v0x2 = -5;
397
+ v0y2 = -2;
398
+
399
+ let width = v2x2 - v0x2;
400
+ let height = v2y2 - v0y2;
401
+
402
+ v2x1 = v0x1 + width;
403
+ v2y1 = v0y1 + height;
404
+
405
+ v2x3 = v0x2 + width3;
406
+
407
+ v2x4 = 2 * center4x - v0x2;
408
+ v2y4 = 2 * center4y - v0y2;
409
+
410
+ await win.callAction1({
411
+ actionName: "movePolygon",
412
+ componentName: "/g1/r2",
413
+ args: {
414
+ pointCoords: { 0: [v0x2, v0y2] },
415
+ },
416
+ });
417
+
418
+ let stateVariables = await win.returnAllStateVariables1();
419
+ await checkTransformedRectangleValues({
420
+ stateVariables,
421
+ v0x1,
422
+ v0y1,
423
+ v2x1,
424
+ v2y1,
425
+ v0x2,
426
+ v0y2,
427
+ v2x2,
428
+ v2y2,
429
+ v2x3,
430
+ v2x4,
431
+ v2y4,
432
+ });
433
+ });
434
+
435
+ cy.log("move vertex 2 of g2/r2");
436
+
437
+ cy.window().then(async (win) => {
438
+ let center4x = (v2x4 + v0x2) / 2;
439
+ let center4y = (v2y4 + v0y2) / 2;
440
+
441
+ let width3 = v2x3 - v0x2;
442
+
443
+ v2x2 = -3;
444
+ v0y2 = 3;
445
+
446
+ let width = v2x2 - v0x2;
447
+ let height = v2y2 - v0y2;
448
+
449
+ v2x1 = v0x1 + width;
450
+ v2y1 = v0y1 + height;
451
+
452
+ // v2x3 = v0x2 + width3;
453
+
454
+ // v2x4 = 2 * center4x - v0x2;
455
+ v2y4 = 2 * center4y - v0y2;
456
+
457
+ await win.callAction1({
458
+ actionName: "movePolygon",
459
+ componentName: "/g2/r2",
460
+ args: {
461
+ pointCoords: { 1: [v2x2, v0y2] },
462
+ },
463
+ });
464
+
465
+ let stateVariables = await win.returnAllStateVariables1();
466
+ await checkTransformedRectangleValues({
467
+ stateVariables,
468
+ v0x1,
469
+ v0y1,
470
+ v2x1,
471
+ v2y1,
472
+ v0x2,
473
+ v0y2,
474
+ v2x2,
475
+ v2y2,
476
+ v2x3,
477
+ v2x4,
478
+ v2y4,
479
+ });
480
+ });
481
+
482
+ cy.log("move vertex 3 of g1/r3");
483
+
484
+ cy.window().then(async (win) => {
485
+ let center4x = (v2x4 + v0x2) / 2;
486
+ let center4y = (v2y4 + v0y2) / 2;
487
+
488
+ let width3 = v2x3 - v0x2;
489
+
490
+ v2x3 = -8;
491
+ v2y2 = -6;
492
+
493
+ let width = v2x2 - v0x2;
494
+ let height = v2y2 - v0y2;
495
+
496
+ // v2x1 = v0x1 + width;
497
+ v2y1 = v0y1 + height;
498
+
499
+ // v2x3 = v0x2 + width3;
500
+
501
+ // v2x4 = 2 * center4x - v0x2;
502
+ // v2y4 = 2 * center4y - v0y2;
503
+
504
+ await win.callAction1({
505
+ actionName: "movePolygon",
506
+ componentName: "/g1/r3",
507
+ args: {
508
+ pointCoords: { 2: [v2x3, v2y2] },
509
+ },
510
+ });
511
+
512
+ let stateVariables = await win.returnAllStateVariables1();
513
+ await checkTransformedRectangleValues({
514
+ stateVariables,
515
+ v0x1,
516
+ v0y1,
517
+ v2x1,
518
+ v2y1,
519
+ v0x2,
520
+ v0y2,
521
+ v2x2,
522
+ v2y2,
523
+ v2x3,
524
+ v2x4,
525
+ v2y4,
526
+ });
527
+ });
528
+
529
+ cy.log("move vertex 4 of g2/r3");
530
+
531
+ cy.window().then(async (win) => {
532
+ let center4x = (v2x4 + v0x2) / 2;
533
+ let center4y = (v2y4 + v0y2) / 2;
534
+
535
+ // let width3 = v2x3 - v0x2;
536
+
537
+ let width = v2x2 - v0x2;
538
+
539
+ v0x2 = 7;
540
+ v2y2 = -5;
541
+
542
+ let height = v2y2 - v0y2;
543
+
544
+ v2x2 = v0x2 + width;
545
+
546
+ v2x1 = v0x1 + width;
547
+ v2y1 = v0y1 + height;
548
+
549
+ // v2x3 = v0x2 + width3;
550
+
551
+ v2x4 = 2 * center4x - v0x2;
552
+ // v2y4 = 2 * center4y - v0y2;
553
+
554
+ await win.callAction1({
555
+ actionName: "movePolygon",
556
+ componentName: "/g2/r3",
557
+ args: {
558
+ pointCoords: { 3: [v0x2, v2y2] },
559
+ },
560
+ });
561
+
562
+ let stateVariables = await win.returnAllStateVariables1();
563
+ await checkTransformedRectangleValues({
564
+ stateVariables,
565
+ v0x1,
566
+ v0y1,
567
+ v2x1,
568
+ v2y1,
569
+ v0x2,
570
+ v0y2,
571
+ v2x2,
572
+ v2y2,
573
+ v2x3,
574
+ v2x4,
575
+ v2y4,
576
+ });
577
+ });
578
+
579
+ cy.log("move vertex 2 of g1/r4");
580
+
581
+ cy.window().then(async (win) => {
582
+ let center4x = (v2x4 + v0x2) / 2;
583
+ let center4y = (v2y4 + v0y2) / 2;
584
+
585
+ // let width3 = v2x3 - v0x2;
586
+
587
+ let width = v2x2 - v0x2;
588
+ let height = v2y2 - v0y2;
589
+
590
+ v2x4 = -9;
591
+ v0y2 = 8;
592
+
593
+ v2y2 = v0y2 + height;
594
+
595
+ // v2x1 = v0x1 + width;
596
+ // v2y1 = v0y1 + height;
597
+
598
+ // v2x3 = v0x2 + width3;
599
+
600
+ // v2x4 = 2 * center4x - v0x2;
601
+ // v2y4 = 2 * center4y - v0y2;
602
+
603
+ await win.callAction1({
604
+ actionName: "movePolygon",
605
+ componentName: "/g1/r4",
606
+ args: {
607
+ pointCoords: { 1: [v2x4, v0y2] },
608
+ },
609
+ });
610
+
611
+ let stateVariables = await win.returnAllStateVariables1();
612
+ await checkTransformedRectangleValues({
613
+ stateVariables,
614
+ v0x1,
615
+ v0y1,
616
+ v2x1,
617
+ v2y1,
618
+ v0x2,
619
+ v0y2,
620
+ v2x2,
621
+ v2y2,
622
+ v2x3,
623
+ v2x4,
624
+ v2y4,
625
+ });
626
+ });
627
+
628
+ cy.log("move vertex 3 of g2/r4");
629
+
630
+ cy.window().then(async (win) => {
631
+ let center4x = (v2x4 + v0x2) / 2;
632
+ let center4y = (v2y4 + v0y2) / 2;
633
+
634
+ // let width3 = v2x3 - v0x2;
635
+
636
+ let width = v2x2 - v0x2;
637
+ let height = v2y2 - v0y2;
638
+
639
+ v2x4 = 2;
640
+ v2y4 = -5;
641
+
642
+ // v2y2 = v0y2 + height;
643
+
644
+ // v2x1 = v0x1 + width;
645
+ // v2y1 = v0y1 + height;
646
+
647
+ // v2x3 = v0x2 + width3;
648
+
649
+ // v2x4 = 2 * center4x - v0x2;
650
+ // v2y4 = 2 * center4y - v0y2;
651
+
652
+ await win.callAction1({
653
+ actionName: "movePolygon",
654
+ componentName: "/g1/r4",
655
+ args: {
656
+ pointCoords: { 2: [v2x4, v2y4] },
657
+ },
658
+ });
659
+
660
+ let stateVariables = await win.returnAllStateVariables1();
661
+ await checkTransformedRectangleValues({
662
+ stateVariables,
663
+ v0x1,
664
+ v0y1,
665
+ v2x1,
666
+ v2y1,
667
+ v0x2,
668
+ v0y2,
669
+ v2x2,
670
+ v2y2,
671
+ v2x3,
672
+ v2x4,
673
+ v2y4,
674
+ });
675
+ });
676
+ });
677
+
678
+ it("copy propIndex of vertices", () => {
679
+ cy.window().then(async (win) => {
680
+ win.postMessage(
681
+ {
682
+ doenetML: `
683
+ <text>a</text>
684
+ <graph>
685
+ <rectangle vertices="(2,-3) (3,4)" />
686
+ </graph>
687
+
688
+ <p><mathinput name="n" /></p>
689
+
690
+ <p><copy prop="vertices" target="_rectangle1" propIndex="$n" assignNames="P1 P2 P3 P4" /></p>
691
+
692
+ <p><copy prop="vertex2" target="_rectangle1" propIndex="$n" assignNames="x" /></p>
693
+ `,
694
+ },
695
+ "*",
696
+ );
697
+ });
698
+
699
+ cy.get(cesc("#\\/_text1")).should("have.text", "a"); // to wait for page to load
700
+
701
+ let t1x = 2,
702
+ t1y = -3;
703
+ let t2x = 3,
704
+ t2y = -3;
705
+ let t3x = 3,
706
+ t3y = 4;
707
+ let t4x = 2,
708
+ t4y = 4;
709
+
710
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should("not.exist");
711
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
712
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
713
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
714
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should("not.exist");
715
+
716
+ cy.get(cesc("#\\/n") + " textarea").type("1{enter}", { force: true });
717
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should(
718
+ "contain.text",
719
+ `(${nInDOM(t1x)},${nInDOM(t1y)})`,
720
+ );
721
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
722
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
723
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
724
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should(
725
+ "contain.text",
726
+ `${nInDOM(t2x)}`,
727
+ );
728
+
729
+ cy.get(cesc("#\\/n") + " textarea").type("{end}{backspace}2{enter}", {
730
+ force: true,
731
+ });
732
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should(
733
+ "contain.text",
734
+ `(${nInDOM(t2x)},${nInDOM(t2y)})`,
735
+ );
736
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
737
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
738
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
739
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should(
740
+ "contain.text",
741
+ `${nInDOM(t2y)}`,
742
+ );
743
+
744
+ cy.get(cesc("#\\/n") + " textarea").type("{end}{backspace}3{enter}", {
745
+ force: true,
746
+ });
747
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should(
748
+ "contain.text",
749
+ `(${nInDOM(t3x)},${nInDOM(t3y)})`,
750
+ );
751
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
752
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
753
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
754
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should("not.exist");
755
+
756
+ cy.get(cesc("#\\/n") + " textarea").type("{end}{backspace}4{enter}", {
757
+ force: true,
758
+ });
759
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should(
760
+ "contain.text",
761
+ `(${nInDOM(t4x)},${nInDOM(t4y)})`,
762
+ );
763
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
764
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
765
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
766
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should("not.exist");
767
+
768
+ cy.get(cesc("#\\/n") + " textarea").type("{end}{backspace}5{enter}", {
769
+ force: true,
770
+ });
771
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should("not.exist");
772
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
773
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
774
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
775
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should("not.exist");
776
+ });
777
+
778
+ it("copy propIndex of vertices, dot and array notation", () => {
779
+ cy.window().then(async (win) => {
780
+ win.postMessage(
781
+ {
782
+ doenetML: `
783
+ <text>a</text>
784
+ <graph>
785
+ <rectangle vertices="(2,-3) (3,4)" />
786
+ </graph>
787
+
788
+ <p><mathinput name="n" /></p>
789
+
790
+ <p><copy source="_rectangle1.vertices[$n]" assignNames="P1 P2 P3 P4" /></p>
791
+
792
+ <p><copy source="_rectangle1.vertex2[$n]" assignNames="x" /></p>
793
+
794
+ <p><copy source="_rectangle1.vertices[2][$n]" assignNames="xa" /></p>
795
+ `,
796
+ },
797
+ "*",
798
+ );
799
+ });
800
+
801
+ cy.get(cesc("#\\/_text1")).should("have.text", "a"); // to wait for page to load
802
+
803
+ let t1x = 2,
804
+ t1y = -3;
805
+ let t2x = 3,
806
+ t2y = -3;
807
+ let t3x = 3,
808
+ t3y = 4;
809
+ let t4x = 2,
810
+ t4y = 4;
811
+
812
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should("not.exist");
813
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
814
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
815
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
816
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should("not.exist");
817
+ cy.get(cesc("#\\/xa") + " .mjx-mrow").should("not.exist");
818
+
819
+ cy.get(cesc("#\\/n") + " textarea").type("1{enter}", { force: true });
820
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should(
821
+ "contain.text",
822
+ `(${nInDOM(t1x)},${nInDOM(t1y)})`,
823
+ );
824
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
825
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
826
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
827
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should(
828
+ "contain.text",
829
+ `${nInDOM(t2x)}`,
830
+ );
831
+ cy.get(cesc("#\\/xa") + " .mjx-mrow").should(
832
+ "contain.text",
833
+ `${nInDOM(t2x)}`,
834
+ );
835
+
836
+ cy.get(cesc("#\\/n") + " textarea").type("{end}{backspace}2{enter}", {
837
+ force: true,
838
+ });
839
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should(
840
+ "contain.text",
841
+ `(${nInDOM(t2x)},${nInDOM(t2y)})`,
842
+ );
843
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
844
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
845
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
846
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should(
847
+ "contain.text",
848
+ `${nInDOM(t2y)}`,
849
+ );
850
+ cy.get(cesc("#\\/xa") + " .mjx-mrow").should(
851
+ "contain.text",
852
+ `${nInDOM(t2y)}`,
853
+ );
854
+
855
+ cy.get(cesc("#\\/n") + " textarea").type("{end}{backspace}3{enter}", {
856
+ force: true,
857
+ });
858
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should(
859
+ "contain.text",
860
+ `(${nInDOM(t3x)},${nInDOM(t3y)})`,
861
+ );
862
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
863
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
864
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
865
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should("not.exist");
866
+ cy.get(cesc("#\\/xa") + " .mjx-mrow").should("not.exist");
867
+
868
+ cy.get(cesc("#\\/n") + " textarea").type("{end}{backspace}4{enter}", {
869
+ force: true,
870
+ });
871
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should(
872
+ "contain.text",
873
+ `(${nInDOM(t4x)},${nInDOM(t4y)})`,
874
+ );
875
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
876
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
877
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
878
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should("not.exist");
879
+ cy.get(cesc("#\\/xa") + " .mjx-mrow").should("not.exist");
880
+
881
+ cy.get(cesc("#\\/n") + " textarea").type("{end}{backspace}5{enter}", {
882
+ force: true,
883
+ });
884
+ cy.get(cesc("#\\/P1") + " .mjx-mrow").should("not.exist");
885
+ cy.get(cesc("#\\/P2") + " .mjx-mrow").should("not.exist");
886
+ cy.get(cesc("#\\/P3") + " .mjx-mrow").should("not.exist");
887
+ cy.get(cesc("#\\/P4") + " .mjx-mrow").should("not.exist");
888
+ cy.get(cesc("#\\/x") + " .mjx-mrow").should("not.exist");
889
+ cy.get(cesc("#\\/xa") + " .mjx-mrow").should("not.exist");
890
+ });
891
+
892
+ it("draggable, vertices draggable", () => {
893
+ cy.window().then(async (win) => {
894
+ win.postMessage(
895
+ {
896
+ doenetML: `
897
+ <graph>
898
+ <rectangle vertices="(1,3) (5,7)" name="p" draggable="$draggable" verticesDraggable="$verticesDraggable" />
899
+ </graph>
900
+ <p>To wait: <booleaninput name="bi" /> <boolean copySource="bi" name="bi2" /></p>
901
+ <p>draggable: <booleaninput name="draggable" /> <boolean copySource="p.draggable" name="d2" /></p>
902
+ <p>vertices draggable: <booleaninput name="verticesDraggable" /> <boolean copySource="p.verticesDraggable" name="vd2" /></p>
903
+ <p name="pvert">corner vertices: $p.vertex1 $p.vertex3</p>
904
+ `,
905
+ },
906
+ "*",
907
+ );
908
+ });
909
+
910
+ cy.get(cesc("#\\/d2")).should("have.text", "false");
911
+ cy.get(cesc("#\\/vd2")).should("have.text", "false");
912
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
913
+ .eq(0)
914
+ .should("have.text", "(1,3)");
915
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
916
+ .eq(2)
917
+ .should("have.text", "(5,7)");
918
+
919
+ cy.window().then(async (win) => {
920
+ let stateVariables = await win.returnAllStateVariables1();
921
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([1, 3]);
922
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([5, 7]);
923
+ expect(stateVariables["/p"].stateValues.draggable).eq(false);
924
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(false);
925
+ });
926
+
927
+ cy.log("cannot move single vertex");
928
+ cy.window().then(async (win) => {
929
+ await win.callAction1({
930
+ actionName: "movePolygon",
931
+ componentName: "/p",
932
+ args: {
933
+ pointCoords: { 0: [4, 7] },
934
+ },
935
+ });
936
+ });
937
+
938
+ // wait for core to process click
939
+ cy.get(cesc("#\\/bi")).click();
940
+ cy.get(cesc("#\\/bi2")).should("have.text", "true");
941
+
942
+ cy.get(cesc("#\\/d2")).should("have.text", "false");
943
+ cy.get(cesc("#\\/vd2")).should("have.text", "false");
944
+
945
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
946
+ .eq(0)
947
+ .should("have.text", "(1,3)");
948
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
949
+ .eq(2)
950
+ .should("have.text", "(5,7)");
951
+
952
+ cy.window().then(async (win) => {
953
+ let stateVariables = await win.returnAllStateVariables1();
954
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([1, 3]);
955
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([5, 7]);
956
+ expect(stateVariables["/p"].stateValues.draggable).eq(false);
957
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(false);
958
+ });
959
+
960
+ cy.log("cannot move all vertices");
961
+ cy.window().then(async (win) => {
962
+ await win.callAction1({
963
+ actionName: "movePolygon",
964
+ componentName: "/p",
965
+ args: {
966
+ pointCoords: [
967
+ [4, 7],
968
+ [8, 10],
969
+ [1, 9],
970
+ [3, 2],
971
+ ],
972
+ },
973
+ });
974
+ });
975
+
976
+ // wait for core to process click
977
+ cy.get(cesc("#\\/bi")).click();
978
+ cy.get(cesc("#\\/bi2")).should("have.text", "false");
979
+
980
+ cy.get(cesc("#\\/d2")).should("have.text", "false");
981
+ cy.get(cesc("#\\/vd2")).should("have.text", "false");
982
+
983
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
984
+ .eq(0)
985
+ .should("have.text", "(1,3)");
986
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
987
+ .eq(2)
988
+ .should("have.text", "(5,7)");
989
+
990
+ cy.window().then(async (win) => {
991
+ let stateVariables = await win.returnAllStateVariables1();
992
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([1, 3]);
993
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([5, 7]);
994
+ expect(stateVariables["/p"].stateValues.draggable).eq(false);
995
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(false);
996
+ });
997
+
998
+ cy.log("only vertices draggable");
999
+
1000
+ cy.get(cesc("#\\/verticesDraggable")).click();
1001
+ cy.get(cesc("#\\/vd2")).should("have.text", "true");
1002
+
1003
+ cy.log("can move single vertex");
1004
+ cy.window().then(async (win) => {
1005
+ await win.callAction1({
1006
+ actionName: "movePolygon",
1007
+ componentName: "/p",
1008
+ args: {
1009
+ pointCoords: { 0: [4, 7] },
1010
+ },
1011
+ });
1012
+ });
1013
+
1014
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow").should("contain.text", "(4,7)");
1015
+
1016
+ cy.get(cesc("#\\/d2")).should("have.text", "false");
1017
+ cy.get(cesc("#\\/vd2")).should("have.text", "true");
1018
+
1019
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1020
+ .eq(0)
1021
+ .should("have.text", "(4,7)");
1022
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1023
+ .eq(2)
1024
+ .should("have.text", "(5,7)");
1025
+
1026
+ cy.window().then(async (win) => {
1027
+ let stateVariables = await win.returnAllStateVariables1();
1028
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([4, 7]);
1029
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([5, 7]);
1030
+ expect(stateVariables["/p"].stateValues.draggable).eq(false);
1031
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(true);
1032
+ });
1033
+
1034
+ cy.log("cannot move all vertices");
1035
+ cy.window().then(async (win) => {
1036
+ await win.callAction1({
1037
+ actionName: "movePolygon",
1038
+ componentName: "/p",
1039
+ args: {
1040
+ pointCoords: [
1041
+ [3, 8],
1042
+ [8, 10],
1043
+ [1, 9],
1044
+ [3, 2],
1045
+ ],
1046
+ },
1047
+ });
1048
+ });
1049
+
1050
+ // wait for core to process click
1051
+ cy.get(cesc("#\\/bi")).click();
1052
+ cy.get(cesc("#\\/bi2")).should("have.text", "true");
1053
+
1054
+ cy.get(cesc("#\\/d2")).should("have.text", "false");
1055
+ cy.get(cesc("#\\/vd2")).should("have.text", "true");
1056
+
1057
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1058
+ .eq(0)
1059
+ .should("have.text", "(4,7)");
1060
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1061
+ .eq(2)
1062
+ .should("have.text", "(5,7)");
1063
+
1064
+ cy.window().then(async (win) => {
1065
+ let stateVariables = await win.returnAllStateVariables1();
1066
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([4, 7]);
1067
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([5, 7]);
1068
+ expect(stateVariables["/p"].stateValues.draggable).eq(false);
1069
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(true);
1070
+ });
1071
+
1072
+ cy.log("vertices and polygon draggable");
1073
+
1074
+ cy.get(cesc("#\\/draggable")).click();
1075
+ cy.get(cesc("#\\/d2")).should("have.text", "true");
1076
+
1077
+ cy.log("can move single vertex");
1078
+ cy.window().then(async (win) => {
1079
+ await win.callAction1({
1080
+ actionName: "movePolygon",
1081
+ componentName: "/p",
1082
+ args: {
1083
+ pointCoords: { 2: [-3, 2] },
1084
+ },
1085
+ });
1086
+ });
1087
+
1088
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow").should("contain.text", "(−3,2)");
1089
+
1090
+ cy.get(cesc("#\\/d2")).should("have.text", "true");
1091
+ cy.get(cesc("#\\/vd2")).should("have.text", "true");
1092
+
1093
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1094
+ .eq(0)
1095
+ .should("have.text", "(4,7)");
1096
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1097
+ .eq(2)
1098
+ .should("have.text", "(−3,2)");
1099
+
1100
+ cy.window().then(async (win) => {
1101
+ let stateVariables = await win.returnAllStateVariables1();
1102
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([4, 7]);
1103
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([-3, 2]);
1104
+ expect(stateVariables["/p"].stateValues.draggable).eq(true);
1105
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(true);
1106
+ });
1107
+
1108
+ cy.log("can move all vertices");
1109
+ cy.window().then(async (win) => {
1110
+ await win.callAction1({
1111
+ actionName: "movePolygon",
1112
+ componentName: "/p",
1113
+ args: {
1114
+ pointCoords: [
1115
+ [3, 8],
1116
+ [5, 8],
1117
+ [5, 1],
1118
+ [3, 1],
1119
+ ],
1120
+ },
1121
+ });
1122
+ });
1123
+
1124
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow").should("contain.text", "(3,8)");
1125
+
1126
+ cy.get(cesc("#\\/d2")).should("have.text", "true");
1127
+ cy.get(cesc("#\\/vd2")).should("have.text", "true");
1128
+
1129
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1130
+ .eq(0)
1131
+ .should("have.text", "(3,8)");
1132
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1133
+ .eq(2)
1134
+ .should("have.text", "(5,1)");
1135
+
1136
+ cy.window().then(async (win) => {
1137
+ let stateVariables = await win.returnAllStateVariables1();
1138
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([3, 8]);
1139
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([5, 1]);
1140
+ expect(stateVariables["/p"].stateValues.draggable).eq(true);
1141
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(true);
1142
+ });
1143
+
1144
+ cy.log("polygon but not vertices draggable");
1145
+
1146
+ cy.get(cesc("#\\/verticesDraggable")).click();
1147
+ cy.get(cesc("#\\/vd2")).should("have.text", "false");
1148
+
1149
+ cy.log("cannot move single vertex");
1150
+ cy.window().then(async (win) => {
1151
+ await win.callAction1({
1152
+ actionName: "movePolygon",
1153
+ componentName: "/p",
1154
+ args: {
1155
+ pointCoords: { 2: [9, 3] },
1156
+ },
1157
+ });
1158
+ });
1159
+
1160
+ // wait for core to process click
1161
+ cy.get(cesc("#\\/bi")).click();
1162
+ cy.get(cesc("#\\/bi2")).should("have.text", "false");
1163
+
1164
+ cy.get(cesc("#\\/d2")).should("have.text", "true");
1165
+ cy.get(cesc("#\\/vd2")).should("have.text", "false");
1166
+
1167
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1168
+ .eq(0)
1169
+ .should("have.text", "(3,8)");
1170
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1171
+ .eq(2)
1172
+ .should("have.text", "(5,1)");
1173
+
1174
+ cy.window().then(async (win) => {
1175
+ let stateVariables = await win.returnAllStateVariables1();
1176
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([3, 8]);
1177
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([5, 1]);
1178
+ expect(stateVariables["/p"].stateValues.draggable).eq(true);
1179
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(false);
1180
+ });
1181
+
1182
+ cy.log("can move all vertices");
1183
+ cy.window().then(async (win) => {
1184
+ await win.callAction1({
1185
+ actionName: "movePolygon",
1186
+ componentName: "/p",
1187
+ args: {
1188
+ pointCoords: [
1189
+ [-4, 1],
1190
+ [3, 1],
1191
+ [3, 7],
1192
+ [-4, 7],
1193
+ ],
1194
+ },
1195
+ });
1196
+ });
1197
+
1198
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow").should("contain.text", "(−4,1)");
1199
+
1200
+ cy.get(cesc("#\\/d2")).should("have.text", "true");
1201
+ cy.get(cesc("#\\/vd2")).should("have.text", "false");
1202
+
1203
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1204
+ .eq(0)
1205
+ .should("have.text", "(−4,1)");
1206
+ cy.get(cesc("#\\/pvert") + " .mjx-mrow")
1207
+ .eq(2)
1208
+ .should("have.text", "(3,7)");
1209
+
1210
+ cy.window().then(async (win) => {
1211
+ let stateVariables = await win.returnAllStateVariables1();
1212
+ expect(stateVariables["/p"].stateValues.vertices[0]).eqls([-4, 1]);
1213
+ expect(stateVariables["/p"].stateValues.vertices[2]).eqls([3, 7]);
1214
+ expect(stateVariables["/p"].stateValues.draggable).eq(true);
1215
+ expect(stateVariables["/p"].stateValues.verticesDraggable).eq(false);
1216
+ });
1217
+ });
1218
+
1219
+ it("single vertex constrained to grid", () => {
1220
+ cy.window().then(async (win) => {
1221
+ win.postMessage(
1222
+ {
1223
+ doenetML: `
1224
+ <graph>
1225
+ <point name="P">(1,3)
1226
+ <constraints>
1227
+ <constrainToGrid dx="3" dy="2" />
1228
+ </constraints>
1229
+ </point>
1230
+ <rectangle vertices="$P" name="p" />
1231
+ </graph>
1232
+ <p name="pvert">corner vertices: $p.vertex1{assignNames="v1"} $p.vertex3{assignNames="v3"}</p>
1233
+ `,
1234
+ },
1235
+ "*",
1236
+ );
1237
+ });
1238
+
1239
+ cy.get(cesc2("#/v1") + " .mjx-mrow")
1240
+ .eq(0)
1241
+ .should("have.text", "(0,4)");
1242
+ cy.get(cesc2("#/v3") + " .mjx-mrow")
1243
+ .eq(0)
1244
+ .should("have.text", "(1,5)");
1245
+
1246
+ cy.log("move rectangle");
1247
+ cy.window().then(async (win) => {
1248
+ await win.callAction1({
1249
+ actionName: "movePolygon",
1250
+ componentName: "/p",
1251
+ args: {
1252
+ pointCoords: [
1253
+ [8, 9],
1254
+ [9, 9],
1255
+ [9, 10],
1256
+ [8, 10],
1257
+ ],
1258
+ },
1259
+ });
1260
+ });
1261
+
1262
+ cy.get(cesc2("#/v1") + " .mjx-mrow").should("contain.text", "(9,10)");
1263
+
1264
+ cy.get(cesc2("#/v1") + " .mjx-mrow")
1265
+ .eq(0)
1266
+ .should("have.text", "(9,10)");
1267
+ cy.get(cesc2("#/v3") + " .mjx-mrow")
1268
+ .eq(0)
1269
+ .should("have.text", "(10,11)");
1270
+ });
1271
+
1272
+ it("two vertices, first vertex constrained to grid", () => {
1273
+ cy.window().then(async (win) => {
1274
+ win.postMessage(
1275
+ {
1276
+ doenetML: `
1277
+ <graph>
1278
+ <point name="P">(1,3)
1279
+ <constraints>
1280
+ <constrainToGrid dx="3" dy="2" />
1281
+ </constraints>
1282
+ </point>
1283
+ <point name="Q">(6,5)</point>
1284
+ <rectangle vertices="$P $Q" name="p" />
1285
+ </graph>
1286
+ <p name="pvert">corner vertices: $p.vertex1{assignNames="v1"} $p.vertex3{assignNames="v3"}</p>
1287
+ `,
1288
+ },
1289
+ "*",
1290
+ );
1291
+ });
1292
+
1293
+ cy.get(cesc2("#/v1") + " .mjx-mrow")
1294
+ .eq(0)
1295
+ .should("have.text", "(0,4)");
1296
+ cy.get(cesc2("#/v3") + " .mjx-mrow")
1297
+ .eq(0)
1298
+ .should("have.text", "(6,5)");
1299
+
1300
+ cy.log("move rectangle");
1301
+ cy.window().then(async (win) => {
1302
+ await win.callAction1({
1303
+ actionName: "movePolygon",
1304
+ componentName: "/p",
1305
+ args: {
1306
+ pointCoords: [
1307
+ [-8, -9],
1308
+ [-2, -9],
1309
+ [-2, -8],
1310
+ [-8, -8],
1311
+ ],
1312
+ },
1313
+ });
1314
+ });
1315
+
1316
+ cy.get(cesc2("#/v1") + " .mjx-mrow").should("contain.text", "(−9,−8)");
1317
+
1318
+ cy.get(cesc2("#/v1") + " .mjx-mrow")
1319
+ .eq(0)
1320
+ .should("have.text", "(−9,−8)");
1321
+ cy.get(cesc2("#/v3") + " .mjx-mrow")
1322
+ .eq(0)
1323
+ .should("have.text", "(−3,−7)");
1324
+ });
1325
+
1326
+ it("center and vertex, vertex constrained to grid", () => {
1327
+ cy.window().then(async (win) => {
1328
+ win.postMessage(
1329
+ {
1330
+ doenetML: `
1331
+ <graph>
1332
+ <point name="P">(1,3)
1333
+ <constraints>
1334
+ <constrainToGrid dx="3" dy="2" />
1335
+ </constraints>
1336
+ </point>
1337
+ <point name="Q">(6,5)</point>
1338
+ <rectangle vertices="$P" center="$Q" name="p" />
1339
+ </graph>
1340
+ <p name="pvert">corner vertices: $p.vertex1{assignNames="v1"} $p.vertex3{assignNames="v3"}</p>
1341
+ `,
1342
+ },
1343
+ "*",
1344
+ );
1345
+ });
1346
+
1347
+ cy.get(cesc2("#/v1") + " .mjx-mrow")
1348
+ .eq(0)
1349
+ .should("have.text", "(0,4)");
1350
+ cy.get(cesc2("#/v3") + " .mjx-mrow")
1351
+ .eq(0)
1352
+ .should("have.text", "(12,6)");
1353
+
1354
+ cy.log("move rectangle");
1355
+ cy.window().then(async (win) => {
1356
+ await win.callAction1({
1357
+ actionName: "movePolygon",
1358
+ componentName: "/p",
1359
+ args: {
1360
+ pointCoords: [
1361
+ [-8, -9],
1362
+ [4, -9],
1363
+ [4, -7],
1364
+ [-8, -7],
1365
+ ],
1366
+ },
1367
+ });
1368
+ });
1369
+
1370
+ cy.get(cesc2("#/v1") + " .mjx-mrow").should("contain.text", "(−9,−8)");
1371
+
1372
+ cy.get(cesc2("#/v1") + " .mjx-mrow")
1373
+ .eq(0)
1374
+ .should("have.text", "(−9,−8)");
1375
+ cy.get(cesc2("#/v3") + " .mjx-mrow")
1376
+ .eq(0)
1377
+ .should("have.text", "(3,−6)");
1378
+ });
1379
+
1380
+ it("center and vertex, center constrained to grid", () => {
1381
+ cy.window().then(async (win) => {
1382
+ win.postMessage(
1383
+ {
1384
+ doenetML: `
1385
+ <graph>
1386
+ <point name="P">(1,3)</point>
1387
+ <point name="Q">(6,5)
1388
+ <constraints>
1389
+ <constrainToGrid dx="3" dy="2" />
1390
+ </constraints>
1391
+ </point>
1392
+ <rectangle vertices="$P" center="$Q" name="p" />
1393
+ </graph>
1394
+ <p name="pvert">corner vertices: $p.vertex1{assignNames="v1"} $p.vertex3{assignNames="v3"}</p>
1395
+ `,
1396
+ },
1397
+ "*",
1398
+ );
1399
+ });
1400
+
1401
+ cy.get(cesc2("#/v1") + " .mjx-mrow")
1402
+ .eq(0)
1403
+ .should("have.text", "(1,3)");
1404
+ cy.get(cesc2("#/v3") + " .mjx-mrow")
1405
+ .eq(0)
1406
+ .should("have.text", "(11,9)");
1407
+
1408
+ cy.log("move rectangle");
1409
+ cy.window().then(async (win) => {
1410
+ await win.callAction1({
1411
+ actionName: "movePolygon",
1412
+ componentName: "/p",
1413
+ args: {
1414
+ pointCoords: [
1415
+ [-9, -8],
1416
+ [1, -8],
1417
+ [1, -2],
1418
+ [-9, -2],
1419
+ ],
1420
+ },
1421
+ });
1422
+ });
1423
+ cy.get(cesc2("#/v1") + " .mjx-mrow").should("contain.text", "(−8,−7)");
1424
+
1425
+ cy.get(cesc2("#/v1") + " .mjx-mrow")
1426
+ .eq(0)
1427
+ .should("have.text", "(−8,−7)");
1428
+ cy.get(cesc2("#/v3") + " .mjx-mrow")
1429
+ .eq(0)
1430
+ .should("have.text", "(2,−1)");
1431
+ });
1432
+ });
1433
+
1434
+ function setupScene({ rectangleProperties, rectangleChildren }) {
1435
+ cy.window().then(async (win) => {
1436
+ win.postMessage(
1437
+ {
1438
+ doenetML:
1439
+ `
1440
+ <text>a</text>
1441
+
1442
+ <graph>
1443
+ <rectangle ` +
1444
+ rectangleProperties +
1445
+ `>
1446
+ ` +
1447
+ rectangleChildren +
1448
+ `
1449
+ </rectangle>
1450
+ </graph>
1451
+
1452
+ <graph>
1453
+ <copy name="centerPoint" target="_rectangle1" prop="center"/>
1454
+ <copy name="v1" target="_rectangle1" prop="vertex1"/>
1455
+ <copy name="v2" target="_rectangle1" prop="vertex2"/>
1456
+ <copy name="v3" target="_rectangle1" prop="vertex3"/>
1457
+ <copy name="v4" target="_rectangle1" prop="vertex4"/>
1458
+ </graph>
1459
+
1460
+ <mathinput bindValueTo="$(_rectangle1.width)" />
1461
+ <mathinput bindValueTo="$(_rectangle1.height)" />
1462
+
1463
+ <graph name="graph3">
1464
+ <copy name="rectangleCopy" target="_rectangle1"/>
1465
+ </graph>
1466
+
1467
+ <copy name="graph4" target="graph3" />
1468
+ `,
1469
+ },
1470
+ "*",
1471
+ );
1472
+ });
1473
+ }
1474
+
1475
+ function runTests({ v0x, v0y, v2x, v2y, cornerDependencyState }) {
1476
+ cy.get(cesc("#\\/_text1")).should("have.text", "a"); // to wait for page to load
1477
+
1478
+ cy.window().then(async (win) => {
1479
+ let stateVariables = await win.returnAllStateVariables1();
1480
+
1481
+ let rectangleName = "/_rectangle1";
1482
+ let centerPointName =
1483
+ stateVariables["/centerPoint"].replacements[0].componentName;
1484
+ let v0Name = stateVariables["/v1"].replacements[0].componentName;
1485
+ let v1Name = stateVariables["/v2"].replacements[0].componentName;
1486
+ let v2Name = stateVariables["/v3"].replacements[0].componentName;
1487
+ let v3Name = stateVariables["/v4"].replacements[0].componentName;
1488
+ let rectangleCopyName =
1489
+ stateVariables["/rectangleCopy"].replacements[0].componentName;
1490
+ let rectangleCopy2Name =
1491
+ stateVariables[stateVariables["/graph4"].replacements[0].componentName]
1492
+ .activeChildren[0].componentName;
1493
+ let widthInputName = "/_mathinput1";
1494
+ let heightInputName = "/_mathinput2";
1495
+
1496
+ let inputs = {
1497
+ rectangleNames: [rectangleName, rectangleCopyName, rectangleCopy2Name],
1498
+ vertexNames: [v0Name, v1Name, v2Name, v3Name],
1499
+ widthInputName,
1500
+ heightInputName,
1501
+ centerPointName,
1502
+ };
1503
+
1504
+ cy.window().then(async (win) => {
1505
+ checkRectangleValues(
1506
+ inputs,
1507
+ {
1508
+ v0x,
1509
+ v0y,
1510
+ v2x,
1511
+ v2y,
1512
+ },
1513
+ stateVariables,
1514
+ );
1515
+ });
1516
+
1517
+ cy.log("move rectangle points individually");
1518
+ cy.window().then(async (win) => {
1519
+ await win.callAction1({
1520
+ actionName: "movePolygon",
1521
+ componentName: rectangleName,
1522
+ args: {
1523
+ pointCoords: { 0: [2, -1] },
1524
+ },
1525
+ });
1526
+
1527
+ stateVariables = await win.returnAllStateVariables1();
1528
+ checkRectangleValues(
1529
+ inputs,
1530
+ {
1531
+ v0x: 2,
1532
+ v0y: -1,
1533
+ v2x,
1534
+ v2y,
1535
+ },
1536
+ stateVariables,
1537
+ );
1538
+
1539
+ await win.callAction1({
1540
+ actionName: "movePolygon",
1541
+ componentName: rectangleName,
1542
+ args: {
1543
+ pointCoords: { 1: [0, 2] },
1544
+ },
1545
+ });
1546
+ stateVariables = await win.returnAllStateVariables1();
1547
+ checkRectangleValues(
1548
+ inputs,
1549
+ {
1550
+ v0x: 2,
1551
+ v0y: 2,
1552
+ v2x: 0,
1553
+ v2y,
1554
+ },
1555
+ stateVariables,
1556
+ );
1557
+
1558
+ await win.callAction1({
1559
+ actionName: "movePolygon",
1560
+ componentName: rectangleName,
1561
+ args: {
1562
+ pointCoords: { 2: [-4, -5] },
1563
+ },
1564
+ });
1565
+ stateVariables = await win.returnAllStateVariables1();
1566
+ checkRectangleValues(
1567
+ inputs,
1568
+ {
1569
+ v0x: 2,
1570
+ v0y: 2,
1571
+ v2x: -4,
1572
+ v2y: -5,
1573
+ },
1574
+ stateVariables,
1575
+ );
1576
+
1577
+ await win.callAction1({
1578
+ actionName: "movePolygon",
1579
+ componentName: rectangleName,
1580
+ args: {
1581
+ pointCoords: { 3: [3, 4] },
1582
+ },
1583
+ });
1584
+ stateVariables = await win.returnAllStateVariables1();
1585
+ checkRectangleValues(
1586
+ inputs,
1587
+ {
1588
+ v0x: 3,
1589
+ v0y: 2,
1590
+ v2x: -4,
1591
+ v2y: 4,
1592
+ },
1593
+ stateVariables,
1594
+ );
1595
+ });
1596
+
1597
+ cy.log("move rectangle points together");
1598
+ cy.window().then(async (win) => {
1599
+ await win.callAction1({
1600
+ actionName: "movePolygon",
1601
+ componentName: rectangleName,
1602
+ args: {
1603
+ pointCoords: {
1604
+ 0: [4, 3],
1605
+ 1: [-3, 3],
1606
+ 2: [-3, 5],
1607
+ 3: [4, 5],
1608
+ },
1609
+ },
1610
+ });
1611
+ stateVariables = await win.returnAllStateVariables1();
1612
+ checkRectangleValues(
1613
+ inputs,
1614
+ {
1615
+ v0x: 4,
1616
+ v0y: 3,
1617
+ v2x: -3,
1618
+ v2y: 5,
1619
+ },
1620
+ stateVariables,
1621
+ );
1622
+ });
1623
+
1624
+ cy.log("move center point");
1625
+ cy.window().then(async (win) => {
1626
+ await win.callAction1({
1627
+ actionName: "movePoint",
1628
+ componentName: centerPointName,
1629
+ args: { x: 0, y: 0 },
1630
+ });
1631
+ stateVariables = await win.returnAllStateVariables1();
1632
+ checkRectangleValues(
1633
+ inputs,
1634
+ {
1635
+ v0x: 3.5,
1636
+ v0y: -1,
1637
+ v2x: -3.5,
1638
+ v2y: 1,
1639
+ },
1640
+ stateVariables,
1641
+ );
1642
+ });
1643
+
1644
+ cy.log("move copied vertices");
1645
+ cy.window().then(async (win) => {
1646
+ if (cornerDependencyState === 0) {
1647
+ // natural behaviour
1648
+
1649
+ await win.callAction1({
1650
+ actionName: "movePoint",
1651
+ componentName: v0Name,
1652
+ args: { x: 0, y: 0 },
1653
+ });
1654
+ stateVariables = await win.returnAllStateVariables1();
1655
+ checkRectangleValues(
1656
+ inputs,
1657
+ {
1658
+ v0x: 0,
1659
+ v0y: 0,
1660
+ v2x: -3.5,
1661
+ v2y: 1,
1662
+ },
1663
+ stateVariables,
1664
+ );
1665
+
1666
+ await win.callAction1({
1667
+ actionName: "movePoint",
1668
+ componentName: v1Name,
1669
+ args: { x: 1, y: -1 },
1670
+ });
1671
+ stateVariables = await win.returnAllStateVariables1();
1672
+ checkRectangleValues(
1673
+ inputs,
1674
+ {
1675
+ v0x: 0,
1676
+ v0y: -1,
1677
+ v2x: 1,
1678
+ v2y: 1,
1679
+ },
1680
+ stateVariables,
1681
+ );
1682
+
1683
+ await win.callAction1({
1684
+ actionName: "movePoint",
1685
+ componentName: v2Name,
1686
+ args: { x: 2.25, y: 2.25 },
1687
+ });
1688
+ stateVariables = await win.returnAllStateVariables1();
1689
+ checkRectangleValues(
1690
+ inputs,
1691
+ {
1692
+ v0x: 0,
1693
+ v0y: -1,
1694
+ v2x: 2.25,
1695
+ v2y: 2.25,
1696
+ },
1697
+ stateVariables,
1698
+ );
1699
+
1700
+ await win.callAction1({
1701
+ actionName: "movePoint",
1702
+ componentName: v3Name,
1703
+ args: { x: -1, y: -5 },
1704
+ });
1705
+ stateVariables = await win.returnAllStateVariables1();
1706
+ checkRectangleValues(
1707
+ inputs,
1708
+ {
1709
+ v0x: -1,
1710
+ v0y: -1,
1711
+ v2x: 2.25,
1712
+ v2y: -5,
1713
+ },
1714
+ stateVariables,
1715
+ );
1716
+ } else if (cornerDependencyState === 1) {
1717
+ // corner, width and height
1718
+
1719
+ await win.callAction1({
1720
+ actionName: "movePoint",
1721
+ componentName: v0Name,
1722
+ args: { x: 0, y: 0 },
1723
+ });
1724
+ stateVariables = await win.returnAllStateVariables1();
1725
+ checkRectangleValues(
1726
+ inputs,
1727
+ {
1728
+ v0x: 0,
1729
+ v0y: 0,
1730
+ v2x: -7,
1731
+ v2y: 2,
1732
+ },
1733
+ stateVariables,
1734
+ );
1735
+
1736
+ await win.callAction1({
1737
+ actionName: "movePoint",
1738
+ componentName: v1Name,
1739
+ args: { x: 1, y: -1 },
1740
+ });
1741
+ stateVariables = await win.returnAllStateVariables1();
1742
+ checkRectangleValues(
1743
+ inputs,
1744
+ {
1745
+ v0x: 0,
1746
+ v0y: -1,
1747
+ v2x: 1,
1748
+ v2y: 1,
1749
+ },
1750
+ stateVariables,
1751
+ );
1752
+
1753
+ await win.callAction1({
1754
+ actionName: "movePoint",
1755
+ componentName: v2Name,
1756
+ args: { x: 2.25, y: 2.25 },
1757
+ });
1758
+ stateVariables = await win.returnAllStateVariables1();
1759
+ checkRectangleValues(
1760
+ inputs,
1761
+ {
1762
+ v0x: 0,
1763
+ v0y: -1,
1764
+ v2x: 2.25,
1765
+ v2y: 2.25,
1766
+ },
1767
+ stateVariables,
1768
+ );
1769
+
1770
+ await win.callAction1({
1771
+ actionName: "movePoint",
1772
+ componentName: v3Name,
1773
+ args: { x: -1, y: -5 },
1774
+ });
1775
+ stateVariables = await win.returnAllStateVariables1();
1776
+ checkRectangleValues(
1777
+ inputs,
1778
+ {
1779
+ v0x: -1,
1780
+ v0y: -1,
1781
+ v2x: 1.25,
1782
+ v2y: -5,
1783
+ },
1784
+ stateVariables,
1785
+ );
1786
+ } else if (cornerDependencyState === 2) {
1787
+ //TODO: corner and center
1788
+
1789
+ await win.callAction1({
1790
+ actionName: "movePoint",
1791
+ componentName: v0Name,
1792
+ args: { x: 0, y: 0 },
1793
+ });
1794
+ stateVariables = await win.returnAllStateVariables1();
1795
+ checkRectangleValues(
1796
+ inputs,
1797
+ {
1798
+ v0x: 0,
1799
+ v0y: 0,
1800
+ v2x: 0,
1801
+ v2y: 0,
1802
+ },
1803
+ stateVariables,
1804
+ );
1805
+
1806
+ await win.callAction1({
1807
+ actionName: "movePoint",
1808
+ componentName: v1Name,
1809
+ args: { x: 1, y: -1 },
1810
+ });
1811
+ stateVariables = await win.returnAllStateVariables1();
1812
+ checkRectangleValues(
1813
+ inputs,
1814
+ {
1815
+ v0x: 0,
1816
+ v0y: -1,
1817
+ v2x: 1,
1818
+ v2y: 1,
1819
+ },
1820
+ stateVariables,
1821
+ );
1822
+
1823
+ await win.callAction1({
1824
+ actionName: "movePoint",
1825
+ componentName: v2Name,
1826
+ args: { x: 2.25, y: 2.25 },
1827
+ });
1828
+ stateVariables = await win.returnAllStateVariables1();
1829
+ checkRectangleValues(
1830
+ inputs,
1831
+ {
1832
+ v0x: 0,
1833
+ v0y: -1,
1834
+ v2x: 2.25,
1835
+ v2y: 2.25,
1836
+ },
1837
+ stateVariables,
1838
+ );
1839
+
1840
+ await win.callAction1({
1841
+ actionName: "movePoint",
1842
+ componentName: v3Name,
1843
+ args: { x: -1, y: -5 },
1844
+ });
1845
+ stateVariables = await win.returnAllStateVariables1();
1846
+ checkRectangleValues(
1847
+ inputs,
1848
+ {
1849
+ v0x: -1,
1850
+ v0y: -1,
1851
+ v2x: 3.25,
1852
+ v2y: -5,
1853
+ },
1854
+ stateVariables,
1855
+ );
1856
+ }
1857
+ });
1858
+
1859
+ cy.log("rectangleCopy together");
1860
+ cy.window().then(async (win) => {
1861
+ await win.callAction1({
1862
+ actionName: "movePolygon",
1863
+ componentName: rectangleCopyName,
1864
+ args: {
1865
+ pointCoords: {
1866
+ 0: [0, 0],
1867
+ 1: [1, 0],
1868
+ 2: [1, 1],
1869
+ 3: [0, 1],
1870
+ },
1871
+ },
1872
+ });
1873
+ stateVariables = await win.returnAllStateVariables1();
1874
+ checkRectangleValues(
1875
+ inputs,
1876
+ {
1877
+ v0x: 0,
1878
+ v0y: 0,
1879
+ v2x: 1,
1880
+ v2y: 1,
1881
+ },
1882
+ stateVariables,
1883
+ );
1884
+ });
1885
+
1886
+ cy.log("rectangleCopy individually");
1887
+ cy.window().then(async (win) => {
1888
+ await win.callAction1({
1889
+ actionName: "movePolygon",
1890
+ componentName: rectangleCopyName,
1891
+ args: {
1892
+ pointCoords: { 0: [2, -1] },
1893
+ },
1894
+ });
1895
+ stateVariables = await win.returnAllStateVariables1();
1896
+ checkRectangleValues(
1897
+ inputs,
1898
+ {
1899
+ v0x: 2,
1900
+ v0y: -1,
1901
+ v2x: 1,
1902
+ v2y: 1,
1903
+ },
1904
+ stateVariables,
1905
+ );
1906
+
1907
+ await win.callAction1({
1908
+ actionName: "movePolygon",
1909
+ componentName: rectangleCopyName,
1910
+ args: {
1911
+ pointCoords: { 1: [0, 2] },
1912
+ },
1913
+ });
1914
+ stateVariables = await win.returnAllStateVariables1();
1915
+ checkRectangleValues(
1916
+ inputs,
1917
+ {
1918
+ v0x: 2,
1919
+ v0y: 2,
1920
+ v2x: 0,
1921
+ v2y: 1,
1922
+ },
1923
+ stateVariables,
1924
+ );
1925
+
1926
+ await win.callAction1({
1927
+ actionName: "movePolygon",
1928
+ componentName: rectangleCopyName,
1929
+ args: {
1930
+ pointCoords: { 2: [-4, -5] },
1931
+ },
1932
+ });
1933
+ stateVariables = await win.returnAllStateVariables1();
1934
+ checkRectangleValues(
1935
+ inputs,
1936
+ {
1937
+ v0x: 2,
1938
+ v0y: 2,
1939
+ v2x: -4,
1940
+ v2y: -5,
1941
+ },
1942
+ stateVariables,
1943
+ );
1944
+
1945
+ await win.callAction1({
1946
+ actionName: "movePolygon",
1947
+ componentName: rectangleCopyName,
1948
+ args: {
1949
+ pointCoords: { 3: [3, 4] },
1950
+ },
1951
+ });
1952
+ stateVariables = await win.returnAllStateVariables1();
1953
+ checkRectangleValues(
1954
+ inputs,
1955
+ {
1956
+ v0x: 3,
1957
+ v0y: 2,
1958
+ v2x: -4,
1959
+ v2y: 4,
1960
+ },
1961
+ stateVariables,
1962
+ );
1963
+ });
1964
+
1965
+ cy.log("rectangleCopy2 together");
1966
+ cy.window().then(async (win) => {
1967
+ await win.callAction1({
1968
+ actionName: "movePolygon",
1969
+ componentName: rectangleCopy2Name,
1970
+ args: {
1971
+ pointCoords: {
1972
+ 0: [0, 0],
1973
+ 1: [1, 0],
1974
+ 2: [1, 1],
1975
+ 3: [0, 1],
1976
+ },
1977
+ },
1978
+ });
1979
+ stateVariables = await win.returnAllStateVariables1();
1980
+ checkRectangleValues(
1981
+ inputs,
1982
+ {
1983
+ v0x: 0,
1984
+ v0y: 0,
1985
+ v2x: 1,
1986
+ v2y: 1,
1987
+ },
1988
+ stateVariables,
1989
+ );
1990
+ });
1991
+
1992
+ cy.log("rectangleCopy2 individually");
1993
+ cy.window().then(async (win) => {
1994
+ await win.callAction1({
1995
+ actionName: "movePolygon",
1996
+ componentName: rectangleCopy2Name,
1997
+ args: {
1998
+ pointCoords: { 0: [2, -1] },
1999
+ },
2000
+ });
2001
+ stateVariables = await win.returnAllStateVariables1();
2002
+ checkRectangleValues(
2003
+ inputs,
2004
+ {
2005
+ v0x: 2,
2006
+ v0y: -1,
2007
+ v2x: 1,
2008
+ v2y: 1,
2009
+ },
2010
+ stateVariables,
2011
+ );
2012
+
2013
+ await win.callAction1({
2014
+ actionName: "movePolygon",
2015
+ componentName: rectangleCopy2Name,
2016
+ args: {
2017
+ pointCoords: { 1: [0, 2] },
2018
+ },
2019
+ });
2020
+ stateVariables = await win.returnAllStateVariables1();
2021
+ checkRectangleValues(
2022
+ inputs,
2023
+ {
2024
+ v0x: 2,
2025
+ v0y: 2,
2026
+ v2x: 0,
2027
+ v2y: 1,
2028
+ },
2029
+ stateVariables,
2030
+ );
2031
+
2032
+ await win.callAction1({
2033
+ actionName: "movePolygon",
2034
+ componentName: rectangleCopy2Name,
2035
+ args: {
2036
+ pointCoords: { 2: [-4, -5] },
2037
+ },
2038
+ });
2039
+ stateVariables = await win.returnAllStateVariables1();
2040
+ checkRectangleValues(
2041
+ inputs,
2042
+ {
2043
+ v0x: 2,
2044
+ v0y: 2,
2045
+ v2x: -4,
2046
+ v2y: -5,
2047
+ },
2048
+ stateVariables,
2049
+ );
2050
+
2051
+ await win.callAction1({
2052
+ actionName: "movePolygon",
2053
+ componentName: rectangleCopy2Name,
2054
+ args: {
2055
+ pointCoords: { 3: [3, 4] },
2056
+ },
2057
+ });
2058
+ stateVariables = await win.returnAllStateVariables1();
2059
+ checkRectangleValues(
2060
+ inputs,
2061
+ {
2062
+ v0x: 3,
2063
+ v0y: 2,
2064
+ v2x: -4,
2065
+ v2y: 4,
2066
+ },
2067
+ stateVariables,
2068
+ );
2069
+
2070
+ // reset polygon
2071
+ await win.callAction1({
2072
+ actionName: "movePolygon",
2073
+ componentName: rectangleName,
2074
+ args: {
2075
+ pointCoords: {
2076
+ 0: [0, 0],
2077
+ 1: [1, 0],
2078
+ 2: [1, 1],
2079
+ 3: [0, 1],
2080
+ },
2081
+ },
2082
+ });
2083
+ });
2084
+ });
2085
+ }
2086
+
2087
+ function checkRectangleValues(
2088
+ {
2089
+ rectangleNames,
2090
+ vertexNames,
2091
+ widthInputName,
2092
+ heightInputName,
2093
+ centerPointName,
2094
+ },
2095
+ { v0x, v0y, v2x, v2y },
2096
+ stateVariables,
2097
+ ) {
2098
+ let vertexCoords = [
2099
+ [v0x, v0y],
2100
+ [v2x, v0y],
2101
+ [v2x, v2y],
2102
+ [v0x, v2y],
2103
+ ];
2104
+ let centerCoords = [(v0x + v2x) / 2, (v0y + v2y) / 2];
2105
+ let widthValue = Math.abs(v2x - v0x);
2106
+ let heightValue = Math.abs(v2y - v0y);
2107
+
2108
+ for (let rectangleName of rectangleNames) {
2109
+ let rectangle = stateVariables[rectangleName];
2110
+ expect(
2111
+ rectangle.stateValues.vertices.map((x) =>
2112
+ x.map((y) => me.fromAst(y).evaluate_to_constant()),
2113
+ ),
2114
+ ).eqls(vertexCoords);
2115
+ expect(
2116
+ rectangle.stateValues.center.map((x) =>
2117
+ me.fromAst(x).evaluate_to_constant(),
2118
+ ),
2119
+ ).eqls(centerCoords);
2120
+ expect(rectangle.stateValues.width).eq(widthValue);
2121
+ expect(rectangle.stateValues.height).eq(heightValue);
2122
+ }
2123
+
2124
+ if (vertexNames) {
2125
+ for (let [index, vertexName] of vertexNames.entries()) {
2126
+ let vertex = stateVariables[vertexName];
2127
+ expect(
2128
+ vertex.stateValues.xs.map((x) => me.fromAst(x).evaluate_to_constant()),
2129
+ ).eqls(vertexCoords[index]);
2130
+ }
2131
+ }
2132
+
2133
+ if (centerPointName) {
2134
+ let centerPoint = stateVariables[centerPointName];
2135
+ expect(
2136
+ centerPoint.stateValues.xs.map((x) =>
2137
+ me.fromAst(x).evaluate_to_constant(),
2138
+ ),
2139
+ ).eqls(centerCoords);
2140
+ }
2141
+ // expect(widthInput.stateValues.value.tree).eq(widthValue);
2142
+ // expect(heightInput.stateValues.value.tree).eq(heightValue);
2143
+ }