@fluidframework/merge-tree 2.53.0 → 2.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/api-report/{merge-tree.legacy.alpha.api.md → merge-tree.legacy.beta.api.md} +62 -62
  3. package/dist/attributionCollection.d.ts +7 -12
  4. package/dist/attributionCollection.d.ts.map +1 -1
  5. package/dist/attributionCollection.js.map +1 -1
  6. package/dist/attributionPolicy.d.ts +1 -1
  7. package/dist/attributionPolicy.d.ts.map +1 -1
  8. package/dist/attributionPolicy.js.map +1 -1
  9. package/dist/client.d.ts +11 -11
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js.map +1 -1
  12. package/dist/collections/index.d.ts +1 -1
  13. package/dist/collections/index.d.ts.map +1 -1
  14. package/dist/collections/index.js.map +1 -1
  15. package/dist/endOfTreeSegment.d.ts +4 -4
  16. package/dist/endOfTreeSegment.d.ts.map +1 -1
  17. package/dist/endOfTreeSegment.js.map +1 -1
  18. package/dist/index.d.ts +16 -16
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/localReference.d.ts +6 -9
  22. package/dist/localReference.d.ts.map +1 -1
  23. package/dist/localReference.js +1 -2
  24. package/dist/localReference.js.map +1 -1
  25. package/dist/mergeTree.d.ts +9 -10
  26. package/dist/mergeTree.d.ts.map +1 -1
  27. package/dist/mergeTree.js.map +1 -1
  28. package/dist/mergeTreeDeltaCallback.d.ts +12 -20
  29. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  30. package/dist/mergeTreeDeltaCallback.js +1 -2
  31. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  32. package/dist/mergeTreeNodeWalk.d.ts +1 -1
  33. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  34. package/dist/mergeTreeNodeWalk.js.map +1 -1
  35. package/dist/mergeTreeNodes.d.ts +14 -21
  36. package/dist/mergeTreeNodes.d.ts.map +1 -1
  37. package/dist/mergeTreeNodes.js +4 -8
  38. package/dist/mergeTreeNodes.js.map +1 -1
  39. package/dist/mergeTreeTracking.d.ts +6 -10
  40. package/dist/mergeTreeTracking.d.ts.map +1 -1
  41. package/dist/mergeTreeTracking.js +2 -4
  42. package/dist/mergeTreeTracking.js.map +1 -1
  43. package/dist/opBuilder.d.ts +3 -3
  44. package/dist/opBuilder.d.ts.map +1 -1
  45. package/dist/opBuilder.js.map +1 -1
  46. package/dist/ops.d.ts +17 -34
  47. package/dist/ops.d.ts.map +1 -1
  48. package/dist/ops.js +2 -4
  49. package/dist/ops.js.map +1 -1
  50. package/dist/partialLengths.d.ts +2 -2
  51. package/dist/partialLengths.d.ts.map +1 -1
  52. package/dist/partialLengths.js.map +1 -1
  53. package/dist/properties.d.ts +2 -4
  54. package/dist/properties.d.ts.map +1 -1
  55. package/dist/properties.js.map +1 -1
  56. package/dist/referencePositions.d.ts +6 -9
  57. package/dist/referencePositions.d.ts.map +1 -1
  58. package/dist/referencePositions.js +2 -4
  59. package/dist/referencePositions.js.map +1 -1
  60. package/dist/revertibles.d.ts +11 -16
  61. package/dist/revertibles.d.ts.map +1 -1
  62. package/dist/revertibles.js +3 -6
  63. package/dist/revertibles.js.map +1 -1
  64. package/dist/segmentGroupCollection.d.ts +1 -1
  65. package/dist/segmentGroupCollection.d.ts.map +1 -1
  66. package/dist/segmentGroupCollection.js.map +1 -1
  67. package/dist/segmentInfos.d.ts +1 -1
  68. package/dist/segmentInfos.d.ts.map +1 -1
  69. package/dist/segmentInfos.js.map +1 -1
  70. package/dist/segmentPropertiesManager.d.ts +1 -1
  71. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  72. package/dist/segmentPropertiesManager.js.map +1 -1
  73. package/dist/sequencePlace.d.ts +4 -8
  74. package/dist/sequencePlace.d.ts.map +1 -1
  75. package/dist/sequencePlace.js +2 -4
  76. package/dist/sequencePlace.js.map +1 -1
  77. package/dist/snapshotChunks.d.ts +6 -6
  78. package/dist/snapshotChunks.d.ts.map +1 -1
  79. package/dist/snapshotChunks.js.map +1 -1
  80. package/dist/snapshotLoader.d.ts +6 -6
  81. package/dist/snapshotLoader.d.ts.map +1 -1
  82. package/dist/snapshotLoader.js.map +1 -1
  83. package/dist/snapshotV1.d.ts +8 -8
  84. package/dist/snapshotV1.d.ts.map +1 -1
  85. package/dist/snapshotV1.js.map +1 -1
  86. package/dist/snapshotlegacy.d.ts +6 -6
  87. package/dist/snapshotlegacy.d.ts.map +1 -1
  88. package/dist/snapshotlegacy.js.map +1 -1
  89. package/dist/sortedSegmentSet.d.ts +2 -2
  90. package/dist/sortedSegmentSet.d.ts.map +1 -1
  91. package/dist/sortedSegmentSet.js.map +1 -1
  92. package/dist/test/Removal.perf.spec.js.map +1 -1
  93. package/dist/test/attributionCollection.perf.spec.js.map +1 -1
  94. package/dist/test/attributionCollection.spec.js.map +1 -1
  95. package/dist/test/attributionPolicy.spec.js.map +1 -1
  96. package/dist/test/beastTest.spec.d.ts +1 -1
  97. package/dist/test/beastTest.spec.d.ts.map +1 -1
  98. package/dist/test/beastTest.spec.js.map +1 -1
  99. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  100. package/dist/test/client.apis.spec.js.map +1 -1
  101. package/dist/test/client.applyMsg.spec.js.map +1 -1
  102. package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
  103. package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  104. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  105. package/dist/test/client.attributionFarm.spec.d.ts +1 -1
  106. package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
  107. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  108. package/dist/test/client.conflictFarm.spec.d.ts +1 -1
  109. package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
  110. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  111. package/dist/test/client.localReference.spec.js.map +1 -1
  112. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  113. package/dist/test/client.obliterateFarm.spec.d.ts +1 -1
  114. package/dist/test/client.obliterateFarm.spec.d.ts.map +1 -1
  115. package/dist/test/client.obliterateFarm.spec.js.map +1 -1
  116. package/dist/test/client.rebasePosition.spec.js.map +1 -1
  117. package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
  118. package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
  119. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  120. package/dist/test/client.replay.spec.js.map +1 -1
  121. package/dist/test/client.rollback.spec.js.map +1 -1
  122. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  123. package/dist/test/clientTestHelper.d.ts +1 -1
  124. package/dist/test/clientTestHelper.d.ts.map +1 -1
  125. package/dist/test/clientTestHelper.js.map +1 -1
  126. package/dist/test/index.d.ts +4 -4
  127. package/dist/test/index.d.ts.map +1 -1
  128. package/dist/test/index.js.map +1 -1
  129. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  130. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  131. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  132. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  133. package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
  134. package/dist/test/mergeTreeOperationRunner.d.ts +5 -5
  135. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  136. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  137. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
  138. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
  139. package/dist/test/obliterateOperations.js.map +1 -1
  140. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  141. package/dist/test/revertibleFarm.spec.js.map +1 -1
  142. package/dist/test/revertibles.spec.js.map +1 -1
  143. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  144. package/dist/test/snapshot.spec.js.map +1 -1
  145. package/dist/test/snapshot.utils.d.ts +4 -4
  146. package/dist/test/snapshot.utils.d.ts.map +1 -1
  147. package/dist/test/snapshot.utils.js.map +1 -1
  148. package/dist/test/snapshotlegacy.spec.js.map +1 -1
  149. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  150. package/dist/test/testClient.d.ts +9 -9
  151. package/dist/test/testClient.d.ts.map +1 -1
  152. package/dist/test/testClient.js.map +1 -1
  153. package/dist/test/testClientLogger.d.ts +2 -2
  154. package/dist/test/testClientLogger.d.ts.map +1 -1
  155. package/dist/test/testClientLogger.js.map +1 -1
  156. package/dist/test/testSerializer.d.ts +2 -2
  157. package/dist/test/testSerializer.d.ts.map +1 -1
  158. package/dist/test/testSerializer.js.map +1 -1
  159. package/dist/test/testServer.d.ts +2 -2
  160. package/dist/test/testServer.d.ts.map +1 -1
  161. package/dist/test/testServer.js.map +1 -1
  162. package/dist/test/testUtils.d.ts +3 -3
  163. package/dist/test/testUtils.d.ts.map +1 -1
  164. package/dist/test/testUtils.js.map +1 -1
  165. package/dist/test/text.d.ts +1 -1
  166. package/dist/test/text.d.ts.map +1 -1
  167. package/dist/test/text.js.map +1 -1
  168. package/dist/test/wordUnitTests.spec.js.map +1 -1
  169. package/dist/textSegment.d.ts +4 -6
  170. package/dist/textSegment.d.ts.map +1 -1
  171. package/dist/textSegment.js +1 -2
  172. package/dist/textSegment.js.map +1 -1
  173. package/dist/zamboni.d.ts +1 -1
  174. package/dist/zamboni.d.ts.map +1 -1
  175. package/dist/zamboni.js.map +1 -1
  176. package/lib/attributionCollection.d.ts +7 -12
  177. package/lib/attributionCollection.d.ts.map +1 -1
  178. package/lib/attributionCollection.js.map +1 -1
  179. package/lib/attributionPolicy.d.ts +1 -1
  180. package/lib/attributionPolicy.d.ts.map +1 -1
  181. package/lib/attributionPolicy.js.map +1 -1
  182. package/lib/client.d.ts +11 -11
  183. package/lib/client.d.ts.map +1 -1
  184. package/lib/client.js.map +1 -1
  185. package/lib/collections/index.d.ts +1 -1
  186. package/lib/collections/index.d.ts.map +1 -1
  187. package/lib/collections/index.js.map +1 -1
  188. package/lib/endOfTreeSegment.d.ts +4 -4
  189. package/lib/endOfTreeSegment.d.ts.map +1 -1
  190. package/lib/endOfTreeSegment.js.map +1 -1
  191. package/lib/index.d.ts +16 -16
  192. package/lib/index.d.ts.map +1 -1
  193. package/lib/index.js.map +1 -1
  194. package/lib/localReference.d.ts +6 -9
  195. package/lib/localReference.d.ts.map +1 -1
  196. package/lib/localReference.js +1 -2
  197. package/lib/localReference.js.map +1 -1
  198. package/lib/mergeTree.d.ts +9 -10
  199. package/lib/mergeTree.d.ts.map +1 -1
  200. package/lib/mergeTree.js.map +1 -1
  201. package/lib/mergeTreeDeltaCallback.d.ts +12 -20
  202. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  203. package/lib/mergeTreeDeltaCallback.js +1 -2
  204. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  205. package/lib/mergeTreeNodeWalk.d.ts +1 -1
  206. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  207. package/lib/mergeTreeNodeWalk.js.map +1 -1
  208. package/lib/mergeTreeNodes.d.ts +14 -21
  209. package/lib/mergeTreeNodes.d.ts.map +1 -1
  210. package/lib/mergeTreeNodes.js +4 -8
  211. package/lib/mergeTreeNodes.js.map +1 -1
  212. package/lib/mergeTreeTracking.d.ts +6 -10
  213. package/lib/mergeTreeTracking.d.ts.map +1 -1
  214. package/lib/mergeTreeTracking.js +2 -4
  215. package/lib/mergeTreeTracking.js.map +1 -1
  216. package/lib/opBuilder.d.ts +3 -3
  217. package/lib/opBuilder.d.ts.map +1 -1
  218. package/lib/opBuilder.js.map +1 -1
  219. package/lib/ops.d.ts +17 -34
  220. package/lib/ops.d.ts.map +1 -1
  221. package/lib/ops.js +2 -4
  222. package/lib/ops.js.map +1 -1
  223. package/lib/partialLengths.d.ts +2 -2
  224. package/lib/partialLengths.d.ts.map +1 -1
  225. package/lib/partialLengths.js.map +1 -1
  226. package/lib/properties.d.ts +2 -4
  227. package/lib/properties.d.ts.map +1 -1
  228. package/lib/properties.js.map +1 -1
  229. package/lib/referencePositions.d.ts +6 -9
  230. package/lib/referencePositions.d.ts.map +1 -1
  231. package/lib/referencePositions.js +2 -4
  232. package/lib/referencePositions.js.map +1 -1
  233. package/lib/revertibles.d.ts +11 -16
  234. package/lib/revertibles.d.ts.map +1 -1
  235. package/lib/revertibles.js +4 -7
  236. package/lib/revertibles.js.map +1 -1
  237. package/lib/segmentGroupCollection.d.ts +1 -1
  238. package/lib/segmentGroupCollection.d.ts.map +1 -1
  239. package/lib/segmentGroupCollection.js.map +1 -1
  240. package/lib/segmentInfos.d.ts +1 -1
  241. package/lib/segmentInfos.d.ts.map +1 -1
  242. package/lib/segmentInfos.js.map +1 -1
  243. package/lib/segmentPropertiesManager.d.ts +1 -1
  244. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  245. package/lib/segmentPropertiesManager.js.map +1 -1
  246. package/lib/sequencePlace.d.ts +4 -8
  247. package/lib/sequencePlace.d.ts.map +1 -1
  248. package/lib/sequencePlace.js +2 -4
  249. package/lib/sequencePlace.js.map +1 -1
  250. package/lib/snapshotChunks.d.ts +6 -6
  251. package/lib/snapshotChunks.d.ts.map +1 -1
  252. package/lib/snapshotChunks.js.map +1 -1
  253. package/lib/snapshotLoader.d.ts +6 -6
  254. package/lib/snapshotLoader.d.ts.map +1 -1
  255. package/lib/snapshotLoader.js.map +1 -1
  256. package/lib/snapshotV1.d.ts +8 -8
  257. package/lib/snapshotV1.d.ts.map +1 -1
  258. package/lib/snapshotV1.js.map +1 -1
  259. package/lib/snapshotlegacy.d.ts +6 -6
  260. package/lib/snapshotlegacy.d.ts.map +1 -1
  261. package/lib/snapshotlegacy.js.map +1 -1
  262. package/lib/sortedSegmentSet.d.ts +2 -2
  263. package/lib/sortedSegmentSet.d.ts.map +1 -1
  264. package/lib/sortedSegmentSet.js.map +1 -1
  265. package/lib/test/Removal.perf.spec.js.map +1 -1
  266. package/lib/test/attributionCollection.perf.spec.js.map +1 -1
  267. package/lib/test/attributionCollection.spec.js.map +1 -1
  268. package/lib/test/attributionPolicy.spec.js.map +1 -1
  269. package/lib/test/beastTest.spec.d.ts +1 -1
  270. package/lib/test/beastTest.spec.d.ts.map +1 -1
  271. package/lib/test/beastTest.spec.js.map +1 -1
  272. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  273. package/lib/test/client.apis.spec.js.map +1 -1
  274. package/lib/test/client.applyMsg.spec.js.map +1 -1
  275. package/lib/test/client.applyStashedOpFarm.spec.d.ts +1 -1
  276. package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  277. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
  278. package/lib/test/client.attributionFarm.spec.d.ts +1 -1
  279. package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
  280. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  281. package/lib/test/client.conflictFarm.spec.d.ts +1 -1
  282. package/lib/test/client.conflictFarm.spec.d.ts.map +1 -1
  283. package/lib/test/client.conflictFarm.spec.js.map +1 -1
  284. package/lib/test/client.localReference.spec.js.map +1 -1
  285. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  286. package/lib/test/client.obliterateFarm.spec.d.ts +1 -1
  287. package/lib/test/client.obliterateFarm.spec.d.ts.map +1 -1
  288. package/lib/test/client.obliterateFarm.spec.js.map +1 -1
  289. package/lib/test/client.rebasePosition.spec.js.map +1 -1
  290. package/lib/test/client.reconnectFarm.spec.d.ts +1 -1
  291. package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -1
  292. package/lib/test/client.reconnectFarm.spec.js.map +1 -1
  293. package/lib/test/client.replay.spec.js.map +1 -1
  294. package/lib/test/client.rollback.spec.js.map +1 -1
  295. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  296. package/lib/test/clientTestHelper.d.ts +1 -1
  297. package/lib/test/clientTestHelper.d.ts.map +1 -1
  298. package/lib/test/clientTestHelper.js.map +1 -1
  299. package/lib/test/index.d.ts +4 -4
  300. package/lib/test/index.d.ts.map +1 -1
  301. package/lib/test/index.js.map +1 -1
  302. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  303. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  304. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  305. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  306. package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
  307. package/lib/test/mergeTreeOperationRunner.d.ts +5 -5
  308. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  309. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  310. package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
  311. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
  312. package/lib/test/obliterateOperations.js.map +1 -1
  313. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  314. package/lib/test/revertibleFarm.spec.js.map +1 -1
  315. package/lib/test/revertibles.spec.js.map +1 -1
  316. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  317. package/lib/test/snapshot.spec.js.map +1 -1
  318. package/lib/test/snapshot.utils.d.ts +4 -4
  319. package/lib/test/snapshot.utils.d.ts.map +1 -1
  320. package/lib/test/snapshot.utils.js.map +1 -1
  321. package/lib/test/snapshotlegacy.spec.js.map +1 -1
  322. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  323. package/lib/test/testClient.d.ts +9 -9
  324. package/lib/test/testClient.d.ts.map +1 -1
  325. package/lib/test/testClient.js.map +1 -1
  326. package/lib/test/testClientLogger.d.ts +2 -2
  327. package/lib/test/testClientLogger.d.ts.map +1 -1
  328. package/lib/test/testClientLogger.js.map +1 -1
  329. package/lib/test/testSerializer.d.ts +2 -2
  330. package/lib/test/testSerializer.d.ts.map +1 -1
  331. package/lib/test/testSerializer.js.map +1 -1
  332. package/lib/test/testServer.d.ts +2 -2
  333. package/lib/test/testServer.d.ts.map +1 -1
  334. package/lib/test/testServer.js.map +1 -1
  335. package/lib/test/testUtils.d.ts +3 -3
  336. package/lib/test/testUtils.d.ts.map +1 -1
  337. package/lib/test/testUtils.js.map +1 -1
  338. package/lib/test/text.d.ts +1 -1
  339. package/lib/test/text.d.ts.map +1 -1
  340. package/lib/test/text.js.map +1 -1
  341. package/lib/test/wordUnitTests.spec.js.map +1 -1
  342. package/lib/textSegment.d.ts +4 -6
  343. package/lib/textSegment.d.ts.map +1 -1
  344. package/lib/textSegment.js +1 -2
  345. package/lib/textSegment.js.map +1 -1
  346. package/lib/zamboni.d.ts +1 -1
  347. package/lib/zamboni.d.ts.map +1 -1
  348. package/lib/zamboni.js.map +1 -1
  349. package/package.json +17 -17
  350. package/src/attributionCollection.ts +7 -12
  351. package/src/attributionPolicy.ts +8 -8
  352. package/src/client.ts +24 -24
  353. package/src/collections/index.ts +11 -11
  354. package/src/endOfTreeSegment.ts +4 -8
  355. package/src/index.ts +54 -54
  356. package/src/localReference.ts +8 -11
  357. package/src/mergeTree.ts +19 -20
  358. package/src/mergeTreeDeltaCallback.ts +12 -20
  359. package/src/mergeTreeNodeWalk.ts +1 -1
  360. package/src/mergeTreeNodes.ts +15 -22
  361. package/src/mergeTreeTracking.ts +6 -10
  362. package/src/opBuilder.ts +8 -8
  363. package/src/ops.ts +17 -34
  364. package/src/partialLengths.ts +4 -4
  365. package/src/properties.ts +2 -4
  366. package/src/referencePositions.ts +6 -9
  367. package/src/revertibles.ts +15 -16
  368. package/src/segmentGroupCollection.ts +1 -1
  369. package/src/segmentInfos.ts +2 -2
  370. package/src/segmentPropertiesManager.ts +1 -1
  371. package/src/sequencePlace.ts +4 -8
  372. package/src/snapshotChunks.ts +6 -6
  373. package/src/snapshotLoader.ts +11 -11
  374. package/src/snapshotV1.ts +13 -13
  375. package/src/snapshotlegacy.ts +8 -8
  376. package/src/sortedSegmentSet.ts +2 -2
  377. package/src/textSegment.ts +4 -6
  378. package/src/zamboni.ts +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"Removal.perf.spec.js","sourceRoot":"","sources":["../../src/test/Removal.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\n\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport {\n\tMergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\ndescribe(\"MergeTree remove\", () => {\n\tlet summary: ISummaryTree;\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\t// baseline summary benchmark to compare to other remove tests. such a\n\t\t// comparison should give a (rough) sense of overhead caused by summary\n\t\t// loading\n\t\ttitle: \"baseline summary load\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tawait loadSnapshot(summary);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove large range of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tfor (const length of [10, 100, 1000]) {\n\t\tbenchmark({\n\t\t\ttype: BenchmarkType.Measurement,\n\t\t\ttitle: \"remove large range of large tree with undo-redo\",\n\t\t\tcategory: \"remove\",\n\t\t\tbefore: () => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < length / 2; i++) {\n\t\t\t\t\tstr.append(\"a\", true);\n\t\t\t\t\tstr.appendMarker(true);\n\t\t\t\t}\n\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tsummary = str.getSummary();\n\t\t\t},\n\t\t\tbenchmarkFnAsync: async () => {\n\t\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\tstr.on(\"delta\", (_op, delta) => {\n\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t\t});\n\n\t\t\t\tconst op = str.removeRangeLocal(0, length - 1);\n\t\t\t\tstr.applyMsg(\n\t\t\t\t\tstr.makeOpMessage(\n\t\t\t\t\t\top,\n\t\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\t\tstr.longClientId,\n\t\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove start of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove middle of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t499,\n\t\t\t\t501,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove end of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t999,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n});\n"]}
1
+ {"version":3,"file":"Removal.perf.spec.js","sourceRoot":"","sources":["../../src/test/Removal.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\n\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\ndescribe(\"MergeTree remove\", () => {\n\tlet summary: ISummaryTree;\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\t// baseline summary benchmark to compare to other remove tests. such a\n\t\t// comparison should give a (rough) sense of overhead caused by summary\n\t\t// loading\n\t\ttitle: \"baseline summary load\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tawait loadSnapshot(summary);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove large range of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tfor (const length of [10, 100, 1000]) {\n\t\tbenchmark({\n\t\t\ttype: BenchmarkType.Measurement,\n\t\t\ttitle: \"remove large range of large tree with undo-redo\",\n\t\t\tcategory: \"remove\",\n\t\t\tbefore: () => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < length / 2; i++) {\n\t\t\t\t\tstr.append(\"a\", true);\n\t\t\t\t\tstr.appendMarker(true);\n\t\t\t\t}\n\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tsummary = str.getSummary();\n\t\t\t},\n\t\t\tbenchmarkFnAsync: async () => {\n\t\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\tstr.on(\"delta\", (_op, delta) => {\n\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t\t});\n\n\t\t\t\tconst op = str.removeRangeLocal(0, length - 1);\n\t\t\t\tstr.applyMsg(\n\t\t\t\t\tstr.makeOpMessage(\n\t\t\t\t\t\top,\n\t\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\t\tstr.longClientId,\n\t\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove start of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove middle of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t499,\n\t\t\t\t501,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove end of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t999,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"attributionCollection.perf.spec.js","sourceRoot":"","sources":["../../src/test/attributionCollection.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tIAttributionCollection,\n\tAttributionCollection as NewAttributionCollection,\n\tSerializedAttributionCollection,\n} from \"../attributionCollection.js\";\nimport { ISegment } from \"../mergeTreeNodes.js\";\nimport { TextSegmentGranularity } from \"../textSegment.js\";\n\ninterface IAttributionCollectionCtor {\n\tnew (length: number, key?: AttributionKey): IAttributionCollection<AttributionKey>;\n\n\tserializeAttributionCollections(\n\t\tsegments: Iterable<{\n\t\t\tattribution?: IAttributionCollection<AttributionKey>;\n\t\t\tcachedLength: number;\n\t\t}>,\n\t): SerializedAttributionCollection;\n\n\tpopulateAttributionCollections(\n\t\tsegments: Iterable<Partial<ISegment>>,\n\t\tsummary: SerializedAttributionCollection,\n\t): void;\n}\n\nfunction getCollectionSizes(\n\tctor: IAttributionCollectionCtor,\n\tbaseSuiteType: BenchmarkType,\n): {\n\tname: string;\n\tcollection: IAttributionCollection<AttributionKey>;\n\ttype: BenchmarkType;\n}[] {\n\tconst singleKeyCollection = new ctor(5, { type: \"op\", seq: 42 });\n\tconst tenKeyCollection = new ctor(2, { type: \"op\", seq: 0 });\n\tfor (let i = 1; i < 10; i++) {\n\t\ttenKeyCollection.append(new ctor(3 * i, { type: \"op\", seq: i }));\n\t}\n\tconst maxSizeCollection = new ctor(1, { type: \"op\", seq: 0 });\n\tfor (let i = 1; i < TextSegmentGranularity; i++) {\n\t\tmaxSizeCollection.append(new ctor(1, { type: \"op\", seq: i }));\n\t}\n\treturn [\n\t\t{ name: \"one key\", collection: singleKeyCollection, type: BenchmarkType.Diagnostic },\n\t\t{ name: \"ten keys\", collection: tenKeyCollection, type: baseSuiteType },\n\t\t{ name: \"maximum keys\", collection: maxSizeCollection, type: BenchmarkType.Diagnostic },\n\t];\n}\n\nfunction runAttributionCollectionSuite(\n\tctor: IAttributionCollectionCtor,\n\tsuiteBaseType: BenchmarkType,\n): void {\n\tconst collectionTestCases = getCollectionSizes(ctor, suiteBaseType);\n\tfor (const { name, collection, type } of collectionTestCases) {\n\t\tdescribe(`using a collection with ${name}`, () => {\n\t\t\tconst { length } = collection;\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset at the start\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(0),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset at the end\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(length - 1),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset in the middle\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(length / 2),\n\t\t\t\ttype: BenchmarkType.Diagnostic,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from start to end\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(0),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from start to mid\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(0, length / 2),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from mid to end\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(length / 2, length - 1),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAll\",\n\t\t\t\tbenchmarkFn: () => collection.getAll(),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"clone\",\n\t\t\t\tbenchmarkFn: () => collection.clone(),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"split + append in the middle\",\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\tconst split = collection.splitAt(length / 2);\n\t\t\t\t\tcollection.append(split);\n\t\t\t\t},\n\t\t\t\ttype,\n\t\t\t});\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttitle: \"construction\",\n\t\tbenchmarkFn: () => new ctor(42, { type: \"op\", seq: 5 }),\n\t\ttype: suiteBaseType,\n\t});\n\n\tconst segmentsToSerialize = collectionTestCases.map(({ collection }) => ({\n\t\tattribution: collection,\n\t\tcachedLength: collection.length,\n\t}));\n\n\tbenchmark({\n\t\ttitle: \"serializing\",\n\t\tbenchmarkFn: () => ctor.serializeAttributionCollections(segmentsToSerialize),\n\t\ttype: suiteBaseType,\n\t});\n\n\tconst summary = ctor.serializeAttributionCollections(segmentsToSerialize);\n\tconst segments: Partial<ISegment>[] = Array.from({ length: 9 }, () => ({\n\t\tcachedLength: Math.floor(summary.length / 10),\n\t})) as ISegment[];\n\tsegments.push({\n\t\tcachedLength: summary.length - 9 * Math.floor(summary.length / 10),\n\t} satisfies Partial<ISegment>);\n\tbenchmark({\n\t\ttitle: \"deserialize into 10 segments\",\n\t\tbenchmarkFn: () => {\n\t\t\tctor.populateAttributionCollections(segments, summary);\n\t\t},\n\t\ttype: suiteBaseType,\n\t});\n}\n\ndescribe(\"IAttributionCollection perf\", () => {\n\t// There was a RedBlack tree based implementation for the collection entries, but the linear array based one won due to constant\n\t// factors/memory characteristics, so just kept the array based one.\n\tdescribe(\"list-based implementation\", () => {\n\t\trunAttributionCollectionSuite(NewAttributionCollection, BenchmarkType.Measurement);\n\t});\n});\n"]}
1
+ {"version":3,"file":"attributionCollection.perf.spec.js","sourceRoot":"","sources":["../../src/test/attributionCollection.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport type { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\ttype IAttributionCollection,\n\tAttributionCollection as NewAttributionCollection,\n\ttype SerializedAttributionCollection,\n} from \"../attributionCollection.js\";\nimport type { ISegment } from \"../mergeTreeNodes.js\";\nimport { TextSegmentGranularity } from \"../textSegment.js\";\n\ninterface IAttributionCollectionCtor {\n\tnew (length: number, key?: AttributionKey): IAttributionCollection<AttributionKey>;\n\n\tserializeAttributionCollections(\n\t\tsegments: Iterable<{\n\t\t\tattribution?: IAttributionCollection<AttributionKey>;\n\t\t\tcachedLength: number;\n\t\t}>,\n\t): SerializedAttributionCollection;\n\n\tpopulateAttributionCollections(\n\t\tsegments: Iterable<Partial<ISegment>>,\n\t\tsummary: SerializedAttributionCollection,\n\t): void;\n}\n\nfunction getCollectionSizes(\n\tctor: IAttributionCollectionCtor,\n\tbaseSuiteType: BenchmarkType,\n): {\n\tname: string;\n\tcollection: IAttributionCollection<AttributionKey>;\n\ttype: BenchmarkType;\n}[] {\n\tconst singleKeyCollection = new ctor(5, { type: \"op\", seq: 42 });\n\tconst tenKeyCollection = new ctor(2, { type: \"op\", seq: 0 });\n\tfor (let i = 1; i < 10; i++) {\n\t\ttenKeyCollection.append(new ctor(3 * i, { type: \"op\", seq: i }));\n\t}\n\tconst maxSizeCollection = new ctor(1, { type: \"op\", seq: 0 });\n\tfor (let i = 1; i < TextSegmentGranularity; i++) {\n\t\tmaxSizeCollection.append(new ctor(1, { type: \"op\", seq: i }));\n\t}\n\treturn [\n\t\t{ name: \"one key\", collection: singleKeyCollection, type: BenchmarkType.Diagnostic },\n\t\t{ name: \"ten keys\", collection: tenKeyCollection, type: baseSuiteType },\n\t\t{ name: \"maximum keys\", collection: maxSizeCollection, type: BenchmarkType.Diagnostic },\n\t];\n}\n\nfunction runAttributionCollectionSuite(\n\tctor: IAttributionCollectionCtor,\n\tsuiteBaseType: BenchmarkType,\n): void {\n\tconst collectionTestCases = getCollectionSizes(ctor, suiteBaseType);\n\tfor (const { name, collection, type } of collectionTestCases) {\n\t\tdescribe(`using a collection with ${name}`, () => {\n\t\t\tconst { length } = collection;\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset at the start\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(0),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset at the end\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(length - 1),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAtOffset in the middle\",\n\t\t\t\tbenchmarkFn: () => collection.getAtOffset(length / 2),\n\t\t\t\ttype: BenchmarkType.Diagnostic,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from start to end\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(0),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from start to mid\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(0, length / 2),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getKeysInOffsetRange from mid to end\",\n\t\t\t\tbenchmarkFn: () => collection.getKeysInOffsetRange(length / 2, length - 1),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"getAll\",\n\t\t\t\tbenchmarkFn: () => collection.getAll(),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"clone\",\n\t\t\t\tbenchmarkFn: () => collection.clone(),\n\t\t\t\ttype,\n\t\t\t});\n\n\t\t\tbenchmark({\n\t\t\t\ttitle: \"split + append in the middle\",\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\tconst split = collection.splitAt(length / 2);\n\t\t\t\t\tcollection.append(split);\n\t\t\t\t},\n\t\t\t\ttype,\n\t\t\t});\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttitle: \"construction\",\n\t\tbenchmarkFn: () => new ctor(42, { type: \"op\", seq: 5 }),\n\t\ttype: suiteBaseType,\n\t});\n\n\tconst segmentsToSerialize = collectionTestCases.map(({ collection }) => ({\n\t\tattribution: collection,\n\t\tcachedLength: collection.length,\n\t}));\n\n\tbenchmark({\n\t\ttitle: \"serializing\",\n\t\tbenchmarkFn: () => ctor.serializeAttributionCollections(segmentsToSerialize),\n\t\ttype: suiteBaseType,\n\t});\n\n\tconst summary = ctor.serializeAttributionCollections(segmentsToSerialize);\n\tconst segments: Partial<ISegment>[] = Array.from({ length: 9 }, () => ({\n\t\tcachedLength: Math.floor(summary.length / 10),\n\t})) as ISegment[];\n\tsegments.push({\n\t\tcachedLength: summary.length - 9 * Math.floor(summary.length / 10),\n\t} satisfies Partial<ISegment>);\n\tbenchmark({\n\t\ttitle: \"deserialize into 10 segments\",\n\t\tbenchmarkFn: () => {\n\t\t\tctor.populateAttributionCollections(segments, summary);\n\t\t},\n\t\ttype: suiteBaseType,\n\t});\n}\n\ndescribe(\"IAttributionCollection perf\", () => {\n\t// There was a RedBlack tree based implementation for the collection entries, but the linear array based one won due to constant\n\t// factors/memory characteristics, so just kept the array based one.\n\tdescribe(\"list-based implementation\", () => {\n\t\trunAttributionCollectionSuite(NewAttributionCollection, BenchmarkType.Measurement);\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"attributionCollection.spec.js","sourceRoot":"","sources":["../../src/test/attributionCollection.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oCAAoC;AAEpC,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAGN,uBAAuB,EACvB,UAAU,EACV,kBAAkB,EAClB,IAAI,GACJ,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EACN,qBAAqB,GAErB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,WAAW,EAAY,MAAM,sBAAsB,CAAC;AAG7D,MAAM,KAAK,GAAG,CAAC,GAAW,EAAkB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AACrE,MAAM,WAAW,GAAmB,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AAEhE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACtC,MAAM,yBAAyB,GAAG,CAAC,EAClC,MAAM,EACN,GAAG,GAIH,EAAyB,EAAE;QAC3B,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3D,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,UAAU,CAAC;IACnB,CAAC,CAAC;IAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC7B,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;YACpD,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAE5D,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;gBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzD,CAAC;YACF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;gBAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;YACtD,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5D,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;gBACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzD,CAAC;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzD,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACxD,MAAM,UAAU,GAAG,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACtE,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACrE,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACtC,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;YACpD,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAE5D,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;gBAChE,MAAM,CAAC,SAAS,CACf,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAClC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAChC,OAAO,CACP,CAAC;gBACF,MAAM,CAAC,SAAS,CACf,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAClC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAChC,QAAQ,CACR,CAAC;gBACF,MAAM,CAAC,SAAS,CACf,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,EACrC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAChC,OAAO,CACP,CAAC;gBACF,MAAM,CAAC,SAAS,CACf,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,EACrC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAChC,QAAQ,CACR,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;gBAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;YACtD,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5D,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;gBACtC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;oBACzD,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;iBAC5C,CAAC,CAAC;gBACH,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;oBACzD,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;iBAC5C,CAAC,CAAC;gBACH,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;oBACzD,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;iBAC5C,CAAC,CAAC;gBACH,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;oBACzD,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;iBAC5C,CAAC,CAAC;gBACH,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE;oBACpD,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC3C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;iBAC5C,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACxD,MAAM,UAAU,GAAG,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACtE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE;gBACtE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;aAC9B,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACzB,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;YAC/C,IAAI,UAAiC,CAAC;YACtC,UAAU,CAAC,GAAG,EAAE;gBACf,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtD,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC5D,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;gBACvC,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;oBAC1C,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;oBAC9B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;iBAC9B,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACnC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;oBAC/C,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;oBAC9B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;iBAC9B,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBACnC,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;oBAC1C,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;oBAC9B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;iBAC9B,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACnC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClF,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACnD,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7E,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YAC1B,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACtD,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnE,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9C,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;aACrC,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACnD,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;aACrC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC5C,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7E,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;gBAC1C,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC9B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;aAC9B,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YAClD,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,MAAM,kBAAkB,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACpE,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACrF,UAAU,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YACjE,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7E,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;YACjC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;gBACjD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBACpE,QAAQ,CAAC,MAAM,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;gBACpE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE;oBACnC,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;oBAChC,QAAQ,EAAE;wBACT,GAAG,EAAE;4BACJ;gCACC,MAAM,EAAE,CAAC;gCACT,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;6BACf;4BACD;gCACC,MAAM,EAAE,CAAC;gCACT,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;6BACf;yBACD;qBACD;iBACD,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;gBACtD,MAAM,QAAQ,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACpD,QAAQ,CAAC,MAAM,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;gBACpE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE;oBACnC,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;oBAChC,QAAQ,EAAE;wBACT,GAAG,EAAE;4BACJ;gCACC,MAAM,EAAE,CAAC;gCACT,GAAG,EAAE,IAAI;6BACT;4BACD;gCACC,MAAM,EAAE,CAAC;gCACT,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;6BACf;yBACD;qBACD;iBACD,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;gBAC5D,MAAM,QAAQ,GAAG,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBACpE,QAAQ,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBACpD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE;oBACnC,MAAM,EAAE,CAAC;oBACT,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;oBAChC,QAAQ,EAAE;wBACT,GAAG,EAAE;4BACJ;gCACC,MAAM,EAAE,CAAC;gCACT,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;6BACf;4BACD;gCACC,MAAM,EAAE,CAAC;gCACT,GAAG,EAAE,IAAI;6BACT;yBACD;qBACD;iBACD,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACnD,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACzE,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC7D,MAAM,QAAQ,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAe,CAAC;YAC1E,qBAAqB,CAAC,8BAA8B,CAAC,QAAQ,EAAE;gBAC9D,MAAM,EAAE,CAAC;gBACT,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;aACtB,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE;gBACxD,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC7B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE;gBACxD,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC7B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;aAC7B,CAAC,CAAC;YAEH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACjE,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YAClE,MAAM,QAAQ,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAe,CAAC;YAC1E,qBAAqB,CAAC,8BAA8B,CAAC,QAAQ,EAAE;gBAC9D,MAAM,EAAE,CAAC;gBACT,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;aACtB,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE;gBACxD,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC7B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE;gBACxD,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC7B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC7B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;aAC7B,CAAC,CAAC;YAEH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACjE,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAAG;gBAChB;oBACC,WAAW,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnD,YAAY,EAAE,CAAC;iBACf;gBACD;oBACC,WAAW,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnD,YAAY,EAAE,CAAC;iBACf;aACwB,CAAC;YAC3B,MAAM,IAAI,GAAG,qBAAqB,CAAC,+BAA+B,CAAC,QAAQ,CAAC,CAAC;YAC7E,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;gBACtB,cAAc,EAAE,CAAC,CAAC,CAAC;gBACnB,IAAI,EAAE,CAAC,CAAC,CAAC;gBACT,MAAM,EAAE,CAAC;aACT,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+EAA+E,EAAE,GAAG,EAAE;QAC9F,yEAAyE;QACzE,MAAM,GAAG,GAAG,CAAC,MAAc,EAAY,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAa,CAAC;QACjF,MAAM,SAAS,GAIT;YACL;gBACC,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE;oBACL,MAAM,EAAE,CAAC;oBACT,cAAc,EAAE,CAAC,CAAC,CAAC;oBACnB,IAAI,EAAE,CAAC,EAAE,CAAC;iBACV;gBACD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAClB;YACD;gBACC,IAAI,EAAE,kCAAkC;gBACxC,IAAI,EAAE;oBACL,MAAM,EAAE,CAAC;oBACT,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;iBAClB;gBACD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAClB;YACD;gBACC,IAAI,EAAE,gCAAgC;gBACtC,IAAI,EAAE;oBACL,MAAM,EAAE,CAAC;oBACT,cAAc,EAAE,CAAC,CAAC,CAAC;oBACnB,IAAI,EAAE,CAAC,CAAC,CAAC;iBACT;gBACD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;aAC1B;YACD;gBACC,IAAI,EAAE,qCAAqC;gBAC3C,IAAI,EAAE;oBACL,MAAM,EAAE,CAAC;oBACT,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtB,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;iBACZ;gBACD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;aAC1B;YACD;gBACC,IAAI,EAAE,2BAA2B;gBACjC,IAAI,EAAE;oBACL,MAAM,EAAE,CAAC;oBACT,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtB,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC;iBACtB;gBACD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;aAC1B;YACD;gBACC,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE;oBACL,MAAM,EAAE,CAAC;oBACT,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtB,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC;oBACf,QAAQ,EAAE;wBACT,GAAG,EAAE;4BACJ,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;4BACzB,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;yBAClB;qBACD;iBACD;gBACD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;aAC1B;SACD,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,SAAS,EAAE,CAAC;YAClD,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;gBACb,qBAAqB,CAAC,8BAA8B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACrE,MAAM,CAAC,SAAS,CACf,qBAAqB,CAAC,+BAA+B,CAAC,QAAQ,CAAC,EAC/D,IAAI,CACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACzC,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,MAAM,kBAAkB,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;YAChC,UAAU,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;gBAC1C,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC9B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;aAC9B,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YAC1B,MAAM,UAAU,GAAG,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACrE,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;YAChC,UAAU,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACnD,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC7B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;aAC7B,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACxB,IAAI,UAAiC,CAAC;QACtC,UAAU,CAAC,GAAG,EAAE;YACf,UAAU,GAAG,IAAI,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAChD,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,CAAC,SAAS,CACf,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAChC,SAAS,EACT,yCAAyC,CACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,SAAS,CACf,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAChC,KAAK,CAAC,EAAE,CAAC,EACT,+CAA+C,CAC/C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACtE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YAClD,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACtC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;YACjF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAsBvE,MAAM,OAAQ,SAAQ,WAAW;YAEhC,YAAmB,MAAc;gBAChC,KAAK,EAAE,CAAC;gBAFO,SAAI,GAAG,SAAS,CAAC;gBAGhC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC5B,CAAC;YAEM,YAAY;gBAIlB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9D,CAAC;YAEM,KAAK;gBACX,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACpB,OAAO,GAAG,CAAC;YACZ,CAAC;YAES,oBAAoB,CAAC,GAAW;gBACzC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;oBACb,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;oBACzD,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;oBACxB,OAAO,WAAW,CAAC;gBACpB,CAAC;YACF,CAAC;SACD;QAED,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YACtC,MAAM,YAAY,GAAG,GAAG,CAAC;YACzB,EAAE,CAAC,0CAA0C,IAAI,EAAE,EAAE,GAAG,EAAE;gBACzD,MAAM,sBAAsB,GAAG,CAAC,MAAe,EAAyB,EAAE,CACzE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;gBAEtF,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC9C,MAAM,eAAe,GAAmC,IAAI,CAC3D,YAAY,EACZ,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;oBACd,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACrC,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAC3C,MAAM,EACN,sBAAsB,CAAC,MAAM,CAAC,CAC9B,CAAC;oBACF,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;4BACvC,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gCACnB,UAAU,CAAC,MAAM,CAChB,OAAO,EACP,IAAI,qBAAqB,CAAC,MAAM,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CACjE,CAAC;4BACH,CAAC;wBACF,CAAC;oBACF,CAAC;oBACD,OAAO;wBACN,IAAI,EAAE,QAAQ;wBACd,UAAU;qBACV,CAAC;gBACH,CAAC,CACD,CAAC;gBAEF,MAAM,YAAY,GAAG,kBAAkB,CACtC,eAAe,EACf;oBACC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;wBACjC,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;wBAC3B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;wBAC3C,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC;wBAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACnB,OAAO,KAAK,CAAC;oBACd,CAAC;iBACD,EACD,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1C,CAAC;gBAEF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,+BAA+B,CACrE,YAAY,CAAC,QAAQ,CACrB,CAAC;gBAEF,MAAM,KAAK,GAAkC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;oBACrE,MAAM,YAAY,GAAG,QAAQ;yBAC3B,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;yBAChD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBAExB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;oBACtE,OAAO;wBACN,IAAI,EAAE,OAAO;wBACb,QAAQ;wBACR,MAAM;qBACN,CAAC;gBACH,CAAC,CAAC;gBACF,MAAM,MAAM,GAAmC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;oBACvE,OAAO;wBACN,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;qBAChD,CAAC;gBACH,CAAC,CAAC;gBACF,MAAM,UAAU,GAAG,kBAAkB,CACpC,IAAI,CACH,YAAY;gBACZ,8EAA8E;gBAC9E,gDAAgD;gBAChD,uBAAuB,CAAoC;oBAC1D,CAAC,KAAK,EAAE,CAAC,CAAC;oBACV,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC3D,CAAC,CACF,EACD;oBACC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;wBACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;wBAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBACpD,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;wBAC/B,QAAQ,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;wBAC3C,OAAO,KAAK,CAAC;oBACd,CAAC;oBACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;wBAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;wBAC3B,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;wBAClD,QAAQ,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;wBACjC,OAAO,KAAK,CAAC;oBACd,CAAC;iBACD,EACD,YAAY,CACZ,CAAC;gBAEF,MAAM,CAAC,SAAS,CACf,qBAAqB,CAAC,+BAA+B,CAAC,UAAU,CAAC,QAAQ,CAAC,EAC1E,QAAQ,CACR,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable unicorn/no-null */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\tGenerator,\n\tIRandom,\n\tcreateWeightedGenerator,\n\tmakeRandom,\n\tperformFuzzActions,\n\ttake,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tAttributionCollection,\n\tSerializedAttributionCollection,\n} from \"../attributionCollection.js\";\nimport { BaseSegment, ISegment } from \"../mergeTreeNodes.js\";\nimport type { PropertySet } from \"../properties.js\";\n\nconst opKey = (seq: number): AttributionKey => ({ type: \"op\", seq });\nconst detachedKey: AttributionKey = { type: \"detached\", id: 0 };\n\ndescribe(\"AttributionCollection\", () => {\n\tconst makeCollectionWithChannel = ({\n\t\tlength,\n\t\tseq,\n\t}: {\n\t\tlength: number;\n\t\tseq: number;\n\t}): AttributionCollection => {\n\t\tconst collection = new AttributionCollection(length, null);\n\t\tcollection.update(\"foo\", new AttributionCollection(length, opKey(seq)));\n\t\treturn collection;\n\t};\n\n\tdescribe(\".getAtOffset\", () => {\n\t\tdescribe(\"on a collection with a single entry\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\n\t\t\tit(\"returns the entry for offsets within the length range\", () => {\n\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(100));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"throws for queries outside the range\", () => {\n\t\t\t\tassert.throws(() => collection.getAtOffset(-1));\n\t\t\t\tassert.throws(() => collection.getAtOffset(5));\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"on a collection with multiple entries\", () => {\n\t\t\tconst collection = new AttributionCollection(3, opKey(100));\n\t\t\tcollection.append(new AttributionCollection(5, opKey(101)));\n\t\t\tit(\"returns the correct entries\", () => {\n\t\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(100));\n\t\t\t\t}\n\n\t\t\t\tfor (let i = 3; i < 8; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(101));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tit(\"works on collections with entries in channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 3, seq: 300 });\n\t\t\tfor (const offset of [0, 1, 2]) {\n\t\t\t\tassert.deepEqual(collection.getAtOffset(offset, \"foo\"), opKey(300));\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\".getKeysInOffsetRange\", () => {\n\t\tdescribe(\"on a collection with a single entry\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\n\t\t\tit(\"returns the entry for offsets within the length range\", () => {\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(1),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"first\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"second\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(1, 4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"third\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(0, 4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"fourth\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"throws for queries outside the range\", () => {\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(-1));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(7));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(0, -1));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(1, 7));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(2, 1));\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"on a collection with multiple entries\", () => {\n\t\t\tconst collection = new AttributionCollection(10, opKey(10));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(20)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(30)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(40)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(50)));\n\n\t\t\tit(\"returns the correct entries\", () => {\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 25), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 19), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 49), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 40), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(0), [\n\t\t\t\t\t{ offset: 0, key: { type: \"op\", seq: 10 } },\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\n\t\tit(\"works on collections with entries in channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 3, seq: 300 });\n\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(1, undefined, \"foo\"), [\n\t\t\t\t{ offset: 0, key: opKey(300) },\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\".splitAt\", () => {\n\t\tdescribe(\"on a collection with 3 entries\", () => {\n\t\t\tlet collection: AttributionCollection;\n\t\t\tbeforeEach(() => {\n\t\t\t\tcollection = new AttributionCollection(3, opKey(100));\n\t\t\t\tcollection.append(new AttributionCollection(2, opKey(101)));\n\t\t\t\tcollection.append(new AttributionCollection(1, opKey(102)));\n\t\t\t});\n\n\t\t\tit(\"can split on non-breakpoints\", () => {\n\t\t\t\tconst splitCollection = collection.splitAt(4);\n\t\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t\t{ offset: 3, key: opKey(101) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(collection.length, 4);\n\t\t\t\tassert.deepEqual(splitCollection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(101) },\n\t\t\t\t\t{ offset: 1, key: opKey(102) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(splitCollection.length, 2);\n\t\t\t});\n\n\t\t\tit(\"can split on breakpoints\", () => {\n\t\t\t\tconst splitCollection = collection.splitAt(5);\n\t\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t\t{ offset: 3, key: opKey(101) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(collection.length, 5);\n\t\t\t\tassert.deepEqual(splitCollection.getAll().root, [{ offset: 0, key: opKey(102) }]);\n\t\t\t\tassert.equal(splitCollection.length, 1);\n\t\t\t});\n\t\t});\n\n\t\tit(\"can split collection with a single value\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\t\t\tconst splitCollection = collection.splitAt(3);\n\t\t\tassert.equal(collection.length, 3);\n\t\t\tassert.equal(splitCollection.length, 2);\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tassert.deepEqual(splitCollection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t});\n\n\t\tit(\"splits channels\", () => {\n\t\t\tconst collection = new AttributionCollection(5, null);\n\t\t\tcollection.update(\"foo\", new AttributionCollection(5, opKey(100)));\n\t\t\tconst splitCollection = collection.splitAt(2);\n\t\t\tassert.deepEqual(collection.getAll().channels, {\n\t\t\t\tfoo: [{ offset: 0, key: opKey(100) }],\n\t\t\t});\n\t\t\tassert.deepEqual(splitCollection.getAll().channels, {\n\t\t\t\tfoo: [{ offset: 0, key: opKey(100) }],\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\".append\", () => {\n\t\tit(\"modifies the receiving collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tcollection.append(new AttributionCollection(1, opKey(101)));\n\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t{ offset: 2, key: opKey(101) },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"does not modify the argument collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tconst appendedCollection = new AttributionCollection(1, opKey(101));\n\t\t\tassert.deepEqual(appendedCollection.getAll().root, [{ offset: 0, key: opKey(101) }]);\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(appendedCollection.getAll().root, [{ offset: 0, key: opKey(101) }]);\n\t\t});\n\n\t\tit(\"coalesces referentially equal values at the join point\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tcollection.append(new AttributionCollection(7, opKey(100)));\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tassert.equal(collection.length, 9);\n\t\t});\n\n\t\tdescribe(\"appends channels\", () => {\n\t\t\tit(\"when both collections have the channel\", () => {\n\t\t\t\tconst appender = makeCollectionWithChannel({ length: 2, seq: 100 });\n\t\t\t\tappender.append(makeCollectionWithChannel({ length: 5, seq: 200 }));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: opKey(100),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: opKey(200),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"when only appended collection has a channel\", () => {\n\t\t\t\tconst appender = new AttributionCollection(2, null);\n\t\t\t\tappender.append(makeCollectionWithChannel({ length: 5, seq: 200 }));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: opKey(200),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"when only segment being appended to has a channel\", () => {\n\t\t\t\tconst appender = makeCollectionWithChannel({ length: 2, seq: 100 });\n\t\t\t\tappender.append(new AttributionCollection(5, null));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: opKey(100),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\".channelNames\", () => {\n\t\tit(\"is empty when collection has no channels\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tassert.deepEqual(collection.channelNames, []);\n\t\t});\n\n\t\tit(\"returns all channels with content for collection with channels\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2));\n\t\t\tcollection.update(\"bar\", new AttributionCollection(2));\n\t\t\tassert.deepEqual(collection.channelNames, [\"foo\", \"bar\"]);\n\t\t});\n\t});\n\n\tdescribe(\".populateAttributionCollections\", () => {\n\t\tit(\"correctly splits segment boundaries on breakpoints\", () => {\n\t\t\tconst segments = [{ cachedLength: 5 }, { cachedLength: 4 }] as ISegment[];\n\t\t\tAttributionCollection.populateAttributionCollections(segments, {\n\t\t\t\tlength: 9,\n\t\t\t\tposBreakpoints: [0, 2, 5, 7],\n\t\t\t\tseqs: [10, 12, 15, 17],\n\t\t\t});\n\t\t\tassert.deepEqual(segments[0].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(10) },\n\t\t\t\t{ offset: 2, key: opKey(12) },\n\t\t\t]);\n\n\t\t\tassert.deepEqual(segments[1].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(15) },\n\t\t\t\t{ offset: 2, key: opKey(17) },\n\t\t\t]);\n\n\t\t\tfor (const segment of segments) {\n\t\t\t\tassert.equal(segment.attribution?.length, segment.cachedLength);\n\t\t\t}\n\t\t});\n\n\t\tit(\"correctly splits segment boundaries between breakpoints\", () => {\n\t\t\tconst segments = [{ cachedLength: 4 }, { cachedLength: 5 }] as ISegment[];\n\t\t\tAttributionCollection.populateAttributionCollections(segments, {\n\t\t\t\tlength: 9,\n\t\t\t\tposBreakpoints: [0, 2, 5, 7],\n\t\t\t\tseqs: [10, 12, 15, 17],\n\t\t\t});\n\t\t\tassert.deepEqual(segments[0].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(10) },\n\t\t\t\t{ offset: 2, key: opKey(12) },\n\t\t\t]);\n\n\t\t\tassert.deepEqual(segments[1].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(12) },\n\t\t\t\t{ offset: 1, key: opKey(15) },\n\t\t\t\t{ offset: 3, key: opKey(17) },\n\t\t\t]);\n\n\t\t\tfor (const segment of segments) {\n\t\t\t\tassert.equal(segment.attribution?.length, segment.cachedLength);\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\"serializeAttributionCollections\", () => {\n\t\tit(\"combines equal values on endpoints\", () => {\n\t\t\tconst segments = [\n\t\t\t\t{\n\t\t\t\t\tattribution: new AttributionCollection(4, opKey(0)),\n\t\t\t\t\tcachedLength: 4,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tattribution: new AttributionCollection(5, opKey(0)),\n\t\t\t\t\tcachedLength: 5,\n\t\t\t\t},\n\t\t\t] as unknown as ISegment[];\n\t\t\tconst blob = AttributionCollection.serializeAttributionCollections(segments);\n\t\t\tassert.deepEqual(blob, {\n\t\t\t\tposBreakpoints: [0],\n\t\t\t\tseqs: [0],\n\t\t\t\tlength: 9,\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"serializeAttributionCollections and populateAttributionCollections round-trip\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst seg = (length: number): ISegment => ({ cachedLength: length }) as ISegment;\n\t\tconst testCases: {\n\t\t\tname: string;\n\t\t\tblob: SerializedAttributionCollection;\n\t\t\tsegments: ISegment[];\n\t\t}[] = [\n\t\t\t{\n\t\t\t\tname: \"single key\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 3,\n\t\t\t\t\tposBreakpoints: [0],\n\t\t\t\t\tseqs: [51],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"several keys on a single segment\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 1, 3, 5],\n\t\t\t\t\tseqs: [1, 2, 3, 4],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(7)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"key spanning multiple segments\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0],\n\t\t\t\t\tseqs: [1],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"key and segment boundary that align\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 3],\n\t\t\t\t\tseqs: [0, 1],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"detached attribution keys\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 3],\n\t\t\t\t\tseqs: [1, detachedKey],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"entry with channels\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 5],\n\t\t\t\t\tseqs: [3, null],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: {\n\t\t\t\t\t\t\tposBreakpoints: [0, 3, 5],\n\t\t\t\t\t\t\tseqs: [4, null, 5],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t];\n\n\t\tfor (const { name, blob, segments } of testCases) {\n\t\t\tit(name, () => {\n\t\t\t\tAttributionCollection.populateAttributionCollections(segments, blob);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tAttributionCollection.serializeAttributionCollections(segments),\n\t\t\t\t\tblob,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\".clone\", () => {\n\t\tit(\"copies the original collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tconst appendedCollection = new AttributionCollection(1, opKey(101));\n\t\t\tconst copy = collection.clone();\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t{ offset: 2, key: opKey(101) },\n\t\t\t]);\n\t\t\tassert.deepEqual(copy.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t});\n\n\t\tit(\"copies channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 2, seq: 25 });\n\t\t\tconst appendedCollection = makeCollectionWithChannel({ length: 3, seq: 26 });\n\t\t\tconst copy = collection.clone();\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(collection.getAll().channels?.foo, [\n\t\t\t\t{ offset: 0, key: opKey(25) },\n\t\t\t\t{ offset: 2, key: opKey(26) },\n\t\t\t]);\n\t\t\tassert.deepEqual(copy.getAll().channels?.foo, [{ offset: 0, key: opKey(25) }]);\n\t\t});\n\t});\n\n\tdescribe(\".update\", () => {\n\t\tlet collection: AttributionCollection;\n\t\tbeforeEach(() => {\n\t\t\tcollection = new AttributionCollection(2, null);\n\t\t\tcollection.update(\"bar\", new AttributionCollection(2, opKey(10)));\n\t\t\tassert.deepEqual(\n\t\t\t\tcollection.getAtOffset(0, \"foo\"),\n\t\t\t\tundefined,\n\t\t\t\t\"channel should be undefined on creation\",\n\t\t\t);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tassert.deepEqual(\n\t\t\t\tcollection.getAtOffset(0, \"bar\"),\n\t\t\t\topKey(10),\n\t\t\t\t\"update should never modify unrelated channels\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"creates a new channel when updating from an undefined state\", () => {\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(5)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0, \"foo\"), opKey(5));\n\t\t});\n\n\t\tit(\"overrides earlier calls with later ones\", () => {\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(3)));\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(5)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0, \"foo\"), opKey(5));\n\t\t});\n\n\t\tit(\"can update the root channel\", () => {\n\t\t\tcollection.update(undefined, new AttributionCollection(2, opKey(3)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0), opKey(3));\n\t\t});\n\n\t\tit(\"doesn't tolerate updates to channels having inconsistent length fields\", () => {\n\t\t\tassert.throws(() => collection.update(\"foo\", new AttributionCollection(3, null)));\n\t\t});\n\t});\n\n\tdescribe(\"serialized structure is independent of segment lengths\", () => {\n\t\tinterface State {\n\t\t\trandom: IRandom;\n\t\t\tsegments: ISegment[];\n\t\t}\n\n\t\tinterface InsertAction {\n\t\t\ttype: \"insert\";\n\t\t\tcollection: AttributionCollection;\n\t\t}\n\n\t\tinterface SplitAction {\n\t\t\ttype: \"split\";\n\t\t\tsegIndex: number;\n\t\t\toffset: number;\n\t\t}\n\n\t\tinterface AppendAction {\n\t\t\ttype: \"append\";\n\t\t\tsegIndex: number;\n\t\t}\n\n\t\tclass Segment extends BaseSegment {\n\t\t\tpublic readonly type = \"testSeg\";\n\t\t\tpublic constructor(length: number) {\n\t\t\t\tsuper();\n\t\t\t\tthis.cachedLength = length;\n\t\t\t}\n\n\t\t\tpublic toJSONObject(): {\n\t\t\t\tlength: number;\n\t\t\t\tprops: PropertySet | undefined;\n\t\t\t} {\n\t\t\t\treturn { length: this.cachedLength, props: this.properties };\n\t\t\t}\n\n\t\t\tpublic clone(): ISegment {\n\t\t\t\tconst seg = new Segment(this.cachedLength);\n\t\t\t\tthis.cloneInto(seg);\n\t\t\t\treturn seg;\n\t\t\t}\n\n\t\t\tprotected createSplitSegmentAt(pos: number): BaseSegment | undefined {\n\t\t\t\tif (pos > 0) {\n\t\t\t\t\tconst leafSegment = new Segment(this.cachedLength - pos);\n\t\t\t\t\tthis.cachedLength = pos;\n\t\t\t\t\treturn leafSegment;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let seed = 0; seed < 10; seed++) {\n\t\t\tconst segmentCount = 100;\n\t\t\tit(`with randomly generated segments, seed ${seed}`, () => {\n\t\t\t\tconst generateAttributionKey = (random: IRandom): AttributionKey | null =>\n\t\t\t\t\trandom.bool(0.8) ? opKey(random.integer(0, 10)) : random.bool() ? detachedKey : null;\n\n\t\t\t\tconst channelNamePool = [\"ch1\", \"ch2\", \"ch3\"];\n\t\t\t\tconst insertGenerator: Generator<InsertAction, State> = take(\n\t\t\t\t\tsegmentCount,\n\t\t\t\t\t({ random }) => {\n\t\t\t\t\t\tconst length = random.integer(1, 20);\n\t\t\t\t\t\tconst collection = new AttributionCollection(\n\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\tgenerateAttributionKey(random),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (random.bool(0.25)) {\n\t\t\t\t\t\t\tfor (const channel of channelNamePool) {\n\t\t\t\t\t\t\t\tif (random.bool()) {\n\t\t\t\t\t\t\t\t\tcollection.update(\n\t\t\t\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t\t\t\t\tnew AttributionCollection(length, generateAttributionKey(random)),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst initialState = performFuzzActions<InsertAction, State>(\n\t\t\t\t\tinsertGenerator,\n\t\t\t\t\t{\n\t\t\t\t\t\tinsert: (state, { collection }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tconst seg = new Segment(collection.length);\n\t\t\t\t\t\t\tseg.attribution = collection;\n\t\t\t\t\t\t\tsegments.push(seg);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{ random: makeRandom(seed), segments: [] },\n\t\t\t\t);\n\n\t\t\t\tconst expected = AttributionCollection.serializeAttributionCollections(\n\t\t\t\t\tinitialState.segments,\n\t\t\t\t);\n\n\t\t\t\tconst split: Generator<SplitAction, State> = ({ segments, random }) => {\n\t\t\t\t\tconst validIndices = segments\n\t\t\t\t\t\t.map((seg, i) => (seg.cachedLength > 1 ? i : -1))\n\t\t\t\t\t\t.filter((i) => i >= 0);\n\n\t\t\t\t\tconst segIndex = random.pick(validIndices);\n\t\t\t\t\tconst offset = random.integer(1, segments[segIndex].cachedLength - 1);\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"split\",\n\t\t\t\t\t\tsegIndex,\n\t\t\t\t\t\toffset,\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst append: Generator<AppendAction, State> = ({ random, segments }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"append\",\n\t\t\t\t\t\tsegIndex: random.integer(0, segments.length - 2),\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst finalState = performFuzzActions<SplitAction | AppendAction, State>(\n\t\t\t\t\ttake(\n\t\t\t\t\t\tsegmentCount,\n\t\t\t\t\t\t// Note: if playing around with constants in this test, it may be necessary to\n\t\t\t\t\t\t// introduce acceptance criteria here for split.\n\t\t\t\t\t\tcreateWeightedGenerator<SplitAction | AppendAction, State>([\n\t\t\t\t\t\t\t[split, 1],\n\t\t\t\t\t\t\t[append, 1, ({ segments }): boolean => segments.length > 1],\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tsplit: (state, { segIndex, offset }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tconst splitSeg = segments[segIndex].splitAt(offset);\n\t\t\t\t\t\t\tassert(splitSeg !== undefined);\n\t\t\t\t\t\t\tsegments.splice(segIndex + 1, 0, splitSeg);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tappend: (state, { segIndex }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tsegments[segIndex].append(segments[segIndex + 1]);\n\t\t\t\t\t\t\tsegments.splice(segIndex + 1, 1);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tinitialState,\n\t\t\t\t);\n\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tAttributionCollection.serializeAttributionCollections(finalState.segments),\n\t\t\t\t\texpected,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
1
+ {"version":3,"file":"attributionCollection.spec.js","sourceRoot":"","sources":["../../src/test/attributionCollection.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable unicorn/no-null */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\ttype Generator,\n\ttype IRandom,\n\tcreateWeightedGenerator,\n\tmakeRandom,\n\tperformFuzzActions,\n\ttake,\n} from \"@fluid-private/stochastic-test-utils\";\nimport type { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tAttributionCollection,\n\ttype SerializedAttributionCollection,\n} from \"../attributionCollection.js\";\nimport { BaseSegment, type ISegment } from \"../mergeTreeNodes.js\";\nimport type { PropertySet } from \"../properties.js\";\n\nconst opKey = (seq: number): AttributionKey => ({ type: \"op\", seq });\nconst detachedKey: AttributionKey = { type: \"detached\", id: 0 };\n\ndescribe(\"AttributionCollection\", () => {\n\tconst makeCollectionWithChannel = ({\n\t\tlength,\n\t\tseq,\n\t}: {\n\t\tlength: number;\n\t\tseq: number;\n\t}): AttributionCollection => {\n\t\tconst collection = new AttributionCollection(length, null);\n\t\tcollection.update(\"foo\", new AttributionCollection(length, opKey(seq)));\n\t\treturn collection;\n\t};\n\n\tdescribe(\".getAtOffset\", () => {\n\t\tdescribe(\"on a collection with a single entry\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\n\t\t\tit(\"returns the entry for offsets within the length range\", () => {\n\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(100));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"throws for queries outside the range\", () => {\n\t\t\t\tassert.throws(() => collection.getAtOffset(-1));\n\t\t\t\tassert.throws(() => collection.getAtOffset(5));\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"on a collection with multiple entries\", () => {\n\t\t\tconst collection = new AttributionCollection(3, opKey(100));\n\t\t\tcollection.append(new AttributionCollection(5, opKey(101)));\n\t\t\tit(\"returns the correct entries\", () => {\n\t\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(100));\n\t\t\t\t}\n\n\t\t\t\tfor (let i = 3; i < 8; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(101));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tit(\"works on collections with entries in channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 3, seq: 300 });\n\t\t\tfor (const offset of [0, 1, 2]) {\n\t\t\t\tassert.deepEqual(collection.getAtOffset(offset, \"foo\"), opKey(300));\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\".getKeysInOffsetRange\", () => {\n\t\tdescribe(\"on a collection with a single entry\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\n\t\t\tit(\"returns the entry for offsets within the length range\", () => {\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(1),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"first\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"second\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(1, 4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"third\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(0, 4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"fourth\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"throws for queries outside the range\", () => {\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(-1));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(7));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(0, -1));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(1, 7));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(2, 1));\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"on a collection with multiple entries\", () => {\n\t\t\tconst collection = new AttributionCollection(10, opKey(10));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(20)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(30)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(40)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(50)));\n\n\t\t\tit(\"returns the correct entries\", () => {\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 25), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 19), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 49), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 40), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(0), [\n\t\t\t\t\t{ offset: 0, key: { type: \"op\", seq: 10 } },\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\n\t\tit(\"works on collections with entries in channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 3, seq: 300 });\n\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(1, undefined, \"foo\"), [\n\t\t\t\t{ offset: 0, key: opKey(300) },\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\".splitAt\", () => {\n\t\tdescribe(\"on a collection with 3 entries\", () => {\n\t\t\tlet collection: AttributionCollection;\n\t\t\tbeforeEach(() => {\n\t\t\t\tcollection = new AttributionCollection(3, opKey(100));\n\t\t\t\tcollection.append(new AttributionCollection(2, opKey(101)));\n\t\t\t\tcollection.append(new AttributionCollection(1, opKey(102)));\n\t\t\t});\n\n\t\t\tit(\"can split on non-breakpoints\", () => {\n\t\t\t\tconst splitCollection = collection.splitAt(4);\n\t\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t\t{ offset: 3, key: opKey(101) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(collection.length, 4);\n\t\t\t\tassert.deepEqual(splitCollection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(101) },\n\t\t\t\t\t{ offset: 1, key: opKey(102) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(splitCollection.length, 2);\n\t\t\t});\n\n\t\t\tit(\"can split on breakpoints\", () => {\n\t\t\t\tconst splitCollection = collection.splitAt(5);\n\t\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t\t{ offset: 3, key: opKey(101) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(collection.length, 5);\n\t\t\t\tassert.deepEqual(splitCollection.getAll().root, [{ offset: 0, key: opKey(102) }]);\n\t\t\t\tassert.equal(splitCollection.length, 1);\n\t\t\t});\n\t\t});\n\n\t\tit(\"can split collection with a single value\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\t\t\tconst splitCollection = collection.splitAt(3);\n\t\t\tassert.equal(collection.length, 3);\n\t\t\tassert.equal(splitCollection.length, 2);\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tassert.deepEqual(splitCollection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t});\n\n\t\tit(\"splits channels\", () => {\n\t\t\tconst collection = new AttributionCollection(5, null);\n\t\t\tcollection.update(\"foo\", new AttributionCollection(5, opKey(100)));\n\t\t\tconst splitCollection = collection.splitAt(2);\n\t\t\tassert.deepEqual(collection.getAll().channels, {\n\t\t\t\tfoo: [{ offset: 0, key: opKey(100) }],\n\t\t\t});\n\t\t\tassert.deepEqual(splitCollection.getAll().channels, {\n\t\t\t\tfoo: [{ offset: 0, key: opKey(100) }],\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\".append\", () => {\n\t\tit(\"modifies the receiving collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tcollection.append(new AttributionCollection(1, opKey(101)));\n\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t{ offset: 2, key: opKey(101) },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"does not modify the argument collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tconst appendedCollection = new AttributionCollection(1, opKey(101));\n\t\t\tassert.deepEqual(appendedCollection.getAll().root, [{ offset: 0, key: opKey(101) }]);\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(appendedCollection.getAll().root, [{ offset: 0, key: opKey(101) }]);\n\t\t});\n\n\t\tit(\"coalesces referentially equal values at the join point\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tcollection.append(new AttributionCollection(7, opKey(100)));\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tassert.equal(collection.length, 9);\n\t\t});\n\n\t\tdescribe(\"appends channels\", () => {\n\t\t\tit(\"when both collections have the channel\", () => {\n\t\t\t\tconst appender = makeCollectionWithChannel({ length: 2, seq: 100 });\n\t\t\t\tappender.append(makeCollectionWithChannel({ length: 5, seq: 200 }));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: opKey(100),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: opKey(200),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"when only appended collection has a channel\", () => {\n\t\t\t\tconst appender = new AttributionCollection(2, null);\n\t\t\t\tappender.append(makeCollectionWithChannel({ length: 5, seq: 200 }));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: opKey(200),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"when only segment being appended to has a channel\", () => {\n\t\t\t\tconst appender = makeCollectionWithChannel({ length: 2, seq: 100 });\n\t\t\t\tappender.append(new AttributionCollection(5, null));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: opKey(100),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\".channelNames\", () => {\n\t\tit(\"is empty when collection has no channels\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tassert.deepEqual(collection.channelNames, []);\n\t\t});\n\n\t\tit(\"returns all channels with content for collection with channels\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2));\n\t\t\tcollection.update(\"bar\", new AttributionCollection(2));\n\t\t\tassert.deepEqual(collection.channelNames, [\"foo\", \"bar\"]);\n\t\t});\n\t});\n\n\tdescribe(\".populateAttributionCollections\", () => {\n\t\tit(\"correctly splits segment boundaries on breakpoints\", () => {\n\t\t\tconst segments = [{ cachedLength: 5 }, { cachedLength: 4 }] as ISegment[];\n\t\t\tAttributionCollection.populateAttributionCollections(segments, {\n\t\t\t\tlength: 9,\n\t\t\t\tposBreakpoints: [0, 2, 5, 7],\n\t\t\t\tseqs: [10, 12, 15, 17],\n\t\t\t});\n\t\t\tassert.deepEqual(segments[0].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(10) },\n\t\t\t\t{ offset: 2, key: opKey(12) },\n\t\t\t]);\n\n\t\t\tassert.deepEqual(segments[1].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(15) },\n\t\t\t\t{ offset: 2, key: opKey(17) },\n\t\t\t]);\n\n\t\t\tfor (const segment of segments) {\n\t\t\t\tassert.equal(segment.attribution?.length, segment.cachedLength);\n\t\t\t}\n\t\t});\n\n\t\tit(\"correctly splits segment boundaries between breakpoints\", () => {\n\t\t\tconst segments = [{ cachedLength: 4 }, { cachedLength: 5 }] as ISegment[];\n\t\t\tAttributionCollection.populateAttributionCollections(segments, {\n\t\t\t\tlength: 9,\n\t\t\t\tposBreakpoints: [0, 2, 5, 7],\n\t\t\t\tseqs: [10, 12, 15, 17],\n\t\t\t});\n\t\t\tassert.deepEqual(segments[0].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(10) },\n\t\t\t\t{ offset: 2, key: opKey(12) },\n\t\t\t]);\n\n\t\t\tassert.deepEqual(segments[1].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(12) },\n\t\t\t\t{ offset: 1, key: opKey(15) },\n\t\t\t\t{ offset: 3, key: opKey(17) },\n\t\t\t]);\n\n\t\t\tfor (const segment of segments) {\n\t\t\t\tassert.equal(segment.attribution?.length, segment.cachedLength);\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\"serializeAttributionCollections\", () => {\n\t\tit(\"combines equal values on endpoints\", () => {\n\t\t\tconst segments = [\n\t\t\t\t{\n\t\t\t\t\tattribution: new AttributionCollection(4, opKey(0)),\n\t\t\t\t\tcachedLength: 4,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tattribution: new AttributionCollection(5, opKey(0)),\n\t\t\t\t\tcachedLength: 5,\n\t\t\t\t},\n\t\t\t] as unknown as ISegment[];\n\t\t\tconst blob = AttributionCollection.serializeAttributionCollections(segments);\n\t\t\tassert.deepEqual(blob, {\n\t\t\t\tposBreakpoints: [0],\n\t\t\t\tseqs: [0],\n\t\t\t\tlength: 9,\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"serializeAttributionCollections and populateAttributionCollections round-trip\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst seg = (length: number): ISegment => ({ cachedLength: length }) as ISegment;\n\t\tconst testCases: {\n\t\t\tname: string;\n\t\t\tblob: SerializedAttributionCollection;\n\t\t\tsegments: ISegment[];\n\t\t}[] = [\n\t\t\t{\n\t\t\t\tname: \"single key\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 3,\n\t\t\t\t\tposBreakpoints: [0],\n\t\t\t\t\tseqs: [51],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"several keys on a single segment\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 1, 3, 5],\n\t\t\t\t\tseqs: [1, 2, 3, 4],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(7)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"key spanning multiple segments\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0],\n\t\t\t\t\tseqs: [1],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"key and segment boundary that align\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 3],\n\t\t\t\t\tseqs: [0, 1],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"detached attribution keys\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 3],\n\t\t\t\t\tseqs: [1, detachedKey],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"entry with channels\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 5],\n\t\t\t\t\tseqs: [3, null],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: {\n\t\t\t\t\t\t\tposBreakpoints: [0, 3, 5],\n\t\t\t\t\t\t\tseqs: [4, null, 5],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t];\n\n\t\tfor (const { name, blob, segments } of testCases) {\n\t\t\tit(name, () => {\n\t\t\t\tAttributionCollection.populateAttributionCollections(segments, blob);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tAttributionCollection.serializeAttributionCollections(segments),\n\t\t\t\t\tblob,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\".clone\", () => {\n\t\tit(\"copies the original collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tconst appendedCollection = new AttributionCollection(1, opKey(101));\n\t\t\tconst copy = collection.clone();\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t{ offset: 2, key: opKey(101) },\n\t\t\t]);\n\t\t\tassert.deepEqual(copy.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t});\n\n\t\tit(\"copies channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 2, seq: 25 });\n\t\t\tconst appendedCollection = makeCollectionWithChannel({ length: 3, seq: 26 });\n\t\t\tconst copy = collection.clone();\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(collection.getAll().channels?.foo, [\n\t\t\t\t{ offset: 0, key: opKey(25) },\n\t\t\t\t{ offset: 2, key: opKey(26) },\n\t\t\t]);\n\t\t\tassert.deepEqual(copy.getAll().channels?.foo, [{ offset: 0, key: opKey(25) }]);\n\t\t});\n\t});\n\n\tdescribe(\".update\", () => {\n\t\tlet collection: AttributionCollection;\n\t\tbeforeEach(() => {\n\t\t\tcollection = new AttributionCollection(2, null);\n\t\t\tcollection.update(\"bar\", new AttributionCollection(2, opKey(10)));\n\t\t\tassert.deepEqual(\n\t\t\t\tcollection.getAtOffset(0, \"foo\"),\n\t\t\t\tundefined,\n\t\t\t\t\"channel should be undefined on creation\",\n\t\t\t);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tassert.deepEqual(\n\t\t\t\tcollection.getAtOffset(0, \"bar\"),\n\t\t\t\topKey(10),\n\t\t\t\t\"update should never modify unrelated channels\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"creates a new channel when updating from an undefined state\", () => {\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(5)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0, \"foo\"), opKey(5));\n\t\t});\n\n\t\tit(\"overrides earlier calls with later ones\", () => {\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(3)));\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(5)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0, \"foo\"), opKey(5));\n\t\t});\n\n\t\tit(\"can update the root channel\", () => {\n\t\t\tcollection.update(undefined, new AttributionCollection(2, opKey(3)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0), opKey(3));\n\t\t});\n\n\t\tit(\"doesn't tolerate updates to channels having inconsistent length fields\", () => {\n\t\t\tassert.throws(() => collection.update(\"foo\", new AttributionCollection(3, null)));\n\t\t});\n\t});\n\n\tdescribe(\"serialized structure is independent of segment lengths\", () => {\n\t\tinterface State {\n\t\t\trandom: IRandom;\n\t\t\tsegments: ISegment[];\n\t\t}\n\n\t\tinterface InsertAction {\n\t\t\ttype: \"insert\";\n\t\t\tcollection: AttributionCollection;\n\t\t}\n\n\t\tinterface SplitAction {\n\t\t\ttype: \"split\";\n\t\t\tsegIndex: number;\n\t\t\toffset: number;\n\t\t}\n\n\t\tinterface AppendAction {\n\t\t\ttype: \"append\";\n\t\t\tsegIndex: number;\n\t\t}\n\n\t\tclass Segment extends BaseSegment {\n\t\t\tpublic readonly type = \"testSeg\";\n\t\t\tpublic constructor(length: number) {\n\t\t\t\tsuper();\n\t\t\t\tthis.cachedLength = length;\n\t\t\t}\n\n\t\t\tpublic toJSONObject(): {\n\t\t\t\tlength: number;\n\t\t\t\tprops: PropertySet | undefined;\n\t\t\t} {\n\t\t\t\treturn { length: this.cachedLength, props: this.properties };\n\t\t\t}\n\n\t\t\tpublic clone(): ISegment {\n\t\t\t\tconst seg = new Segment(this.cachedLength);\n\t\t\t\tthis.cloneInto(seg);\n\t\t\t\treturn seg;\n\t\t\t}\n\n\t\t\tprotected createSplitSegmentAt(pos: number): BaseSegment | undefined {\n\t\t\t\tif (pos > 0) {\n\t\t\t\t\tconst leafSegment = new Segment(this.cachedLength - pos);\n\t\t\t\t\tthis.cachedLength = pos;\n\t\t\t\t\treturn leafSegment;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let seed = 0; seed < 10; seed++) {\n\t\t\tconst segmentCount = 100;\n\t\t\tit(`with randomly generated segments, seed ${seed}`, () => {\n\t\t\t\tconst generateAttributionKey = (random: IRandom): AttributionKey | null =>\n\t\t\t\t\trandom.bool(0.8) ? opKey(random.integer(0, 10)) : random.bool() ? detachedKey : null;\n\n\t\t\t\tconst channelNamePool = [\"ch1\", \"ch2\", \"ch3\"];\n\t\t\t\tconst insertGenerator: Generator<InsertAction, State> = take(\n\t\t\t\t\tsegmentCount,\n\t\t\t\t\t({ random }) => {\n\t\t\t\t\t\tconst length = random.integer(1, 20);\n\t\t\t\t\t\tconst collection = new AttributionCollection(\n\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\tgenerateAttributionKey(random),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (random.bool(0.25)) {\n\t\t\t\t\t\t\tfor (const channel of channelNamePool) {\n\t\t\t\t\t\t\t\tif (random.bool()) {\n\t\t\t\t\t\t\t\t\tcollection.update(\n\t\t\t\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t\t\t\t\tnew AttributionCollection(length, generateAttributionKey(random)),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst initialState = performFuzzActions<InsertAction, State>(\n\t\t\t\t\tinsertGenerator,\n\t\t\t\t\t{\n\t\t\t\t\t\tinsert: (state, { collection }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tconst seg = new Segment(collection.length);\n\t\t\t\t\t\t\tseg.attribution = collection;\n\t\t\t\t\t\t\tsegments.push(seg);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{ random: makeRandom(seed), segments: [] },\n\t\t\t\t);\n\n\t\t\t\tconst expected = AttributionCollection.serializeAttributionCollections(\n\t\t\t\t\tinitialState.segments,\n\t\t\t\t);\n\n\t\t\t\tconst split: Generator<SplitAction, State> = ({ segments, random }) => {\n\t\t\t\t\tconst validIndices = segments\n\t\t\t\t\t\t.map((seg, i) => (seg.cachedLength > 1 ? i : -1))\n\t\t\t\t\t\t.filter((i) => i >= 0);\n\n\t\t\t\t\tconst segIndex = random.pick(validIndices);\n\t\t\t\t\tconst offset = random.integer(1, segments[segIndex].cachedLength - 1);\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"split\",\n\t\t\t\t\t\tsegIndex,\n\t\t\t\t\t\toffset,\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst append: Generator<AppendAction, State> = ({ random, segments }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"append\",\n\t\t\t\t\t\tsegIndex: random.integer(0, segments.length - 2),\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst finalState = performFuzzActions<SplitAction | AppendAction, State>(\n\t\t\t\t\ttake(\n\t\t\t\t\t\tsegmentCount,\n\t\t\t\t\t\t// Note: if playing around with constants in this test, it may be necessary to\n\t\t\t\t\t\t// introduce acceptance criteria here for split.\n\t\t\t\t\t\tcreateWeightedGenerator<SplitAction | AppendAction, State>([\n\t\t\t\t\t\t\t[split, 1],\n\t\t\t\t\t\t\t[append, 1, ({ segments }): boolean => segments.length > 1],\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tsplit: (state, { segIndex, offset }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tconst splitSeg = segments[segIndex].splitAt(offset);\n\t\t\t\t\t\t\tassert(splitSeg !== undefined);\n\t\t\t\t\t\t\tsegments.splice(segIndex + 1, 0, splitSeg);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tappend: (state, { segIndex }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tsegments[segIndex].append(segments[segIndex + 1]);\n\t\t\t\t\t\t\tsegments.splice(segIndex + 1, 1);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tinitialState,\n\t\t\t\t);\n\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tAttributionCollection.serializeAttributionCollections(finalState.segments),\n\t\t\t\t\texpected,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"attributionPolicy.spec.js","sourceRoot":"","sources":["../../src/test/attributionPolicy.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\nconst local: AttributionKey = { type: \"local\" };\n\ndescribe(\"Attribution Policy\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\tlet seq: number = 0;\n\tbeforeEach(() => {\n\t\tseq = 0;\n\t});\n\n\tfunction runInsertVerificationTests(): void {\n\t\tit(\"attributes segments inserted locally\", () => {\n\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\");\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [local, local, local]);\n\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"attributes segments inserted remotely\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"attributes insertion in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", undefined);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\t}\n\n\tfunction runAnnotateVerificationTests(): void {\n\t\tit(\"attributes local property changes\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tconst annotateOp = client.annotateRangeLocal(1, 2, { foo: 1 });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, local, undefined]);\n\t\t\tclient.applyMsg(client.makeOpMessage(annotateOp, ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t});\n\n\t\tit(\"attributes remote property changes\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t});\n\n\t\tit(\"uses LWW semantics for conflicting attribution of props\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tconst localPropChange = client.annotateRangeLocal(1, 2, { foo: 1 });\n\t\t\tclient.annotateRangeRemote(0, 2, { foo: 2 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tconst firstRemoteAnnotateSeq = seq;\n\t\t\tassert.equal(client.getPropertiesAtPosition(0)?.foo, 2);\n\t\t\tassert.equal(client.getPropertiesAtPosition(1)?.foo, 1);\n\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [\n\t\t\t\tfirstRemoteAnnotateSeq,\n\t\t\t\tlocal,\n\t\t\t\tundefined,\n\t\t\t]);\n\t\t\tclient.applyMsg(client.makeOpMessage(localPropChange, ++seq, seq - 1, localUserLongId));\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(\"foo\"),\n\t\t\t\t[firstRemoteAnnotateSeq, seq, undefined],\n\t\t\t\t\"property change should have been attributed to the winning, local op\",\n\t\t\t);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 3 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(\"foo\"),\n\t\t\t\t[firstRemoteAnnotateSeq, seq, undefined],\n\t\t\t\t\"second property change should have been attributed to a remote change\",\n\t\t\t);\n\t\t});\n\n\t\tdescribe(\"attributes properties set on a segment at insertion time\", () => {\n\t\t\tit(\"for remote insertions\", () => {\n\t\t\t\tclient.insertTextRemote(0, \"123\", { foo: \"bar\" }, ++seq, seq - 1, remoteUserLongId);\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [1, 1, 1]);\n\t\t\t});\n\n\t\t\tit(\"for local insertions\", () => {\n\t\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\", { foo: \"bar\" });\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [local, local, local]);\n\t\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [1, 1, 1]);\n\t\t\t});\n\t\t});\n\n\t\tit(\"attributes annotation in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", undefined);\n\t\t\tclient.annotateRangeLocal(0, 1, { foo: \"bar\" });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\n\t\tit(\"attributes annotation on insertion in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", { foo: \"bar\" });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\t}\n\n\tdescribe(\"using insert-only attribution\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createInsertOnlyAttributionPolicy,\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunInsertVerificationTests();\n\n\t\tit(\"ignores local property changes\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq),\n\t\t\t);\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"ignores remote property changes\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\t});\n\n\tdescribe(\"using foo-property-only attribution\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunAnnotateVerificationTests();\n\n\t\tit(\"ignores segments inserted locally\", () => {\n\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\");\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, undefined, undefined]);\n\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, undefined, undefined]);\n\t\t});\n\n\t\tit(\"ignores segments inserted remotely\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [undefined, undefined, undefined]);\n\t\t});\n\n\t\tit(\"can correctly combine segment attribution on append\", () => {\n\t\t\tclient.insertTextRemote(\n\t\t\t\t0,\n\t\t\t\t\"1\",\n\t\t\t\t{ foo: \"bar\", bar: 1 },\n\t\t\t\t++seq,\n\t\t\t\tseq - 1,\n\t\t\t\tremoteUserLongId,\n\t\t\t);\n\t\t\tclient.insertTextRemote(1, \"2\", { bar: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\t// Null is used to represent deleting a property, since undefined will not be sent over the wire.\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tclient.annotateRangeRemote(0, 1, { foo: null }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.updateMinSeq(seq);\n\t\t\tlet segmentCount = 0;\n\t\t\tclient.walkSegments(() => {\n\t\t\t\tsegmentCount++;\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\tassert.equal(segmentCount, 1);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [seq, undefined]);\n\t\t});\n\t});\n\n\tdescribe(\"using an attribution policy which tracks insertion and annotation\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAndInsertionAttributionPolicyFactory(\"foo\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunAnnotateVerificationTests();\n\n\t\trunInsertVerificationTests();\n\t});\n\n\tdescribe(\"using an attribution policy which tracks annotation of multiple properties\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\", \"bar\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\tit(\"attributes local property change on ack\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq),\n\t\t\t);\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"bar\"), [3, 3, 3]);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"attributionPolicy.spec.js","sourceRoot":"","sources":["../../src/test/attributionPolicy.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport type { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\nconst local: AttributionKey = { type: \"local\" };\n\ndescribe(\"Attribution Policy\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\tlet seq: number = 0;\n\tbeforeEach(() => {\n\t\tseq = 0;\n\t});\n\n\tfunction runInsertVerificationTests(): void {\n\t\tit(\"attributes segments inserted locally\", () => {\n\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\");\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [local, local, local]);\n\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"attributes segments inserted remotely\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"attributes insertion in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", undefined);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\t}\n\n\tfunction runAnnotateVerificationTests(): void {\n\t\tit(\"attributes local property changes\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tconst annotateOp = client.annotateRangeLocal(1, 2, { foo: 1 });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, local, undefined]);\n\t\t\tclient.applyMsg(client.makeOpMessage(annotateOp, ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t});\n\n\t\tit(\"attributes remote property changes\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t});\n\n\t\tit(\"uses LWW semantics for conflicting attribution of props\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tconst localPropChange = client.annotateRangeLocal(1, 2, { foo: 1 });\n\t\t\tclient.annotateRangeRemote(0, 2, { foo: 2 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tconst firstRemoteAnnotateSeq = seq;\n\t\t\tassert.equal(client.getPropertiesAtPosition(0)?.foo, 2);\n\t\t\tassert.equal(client.getPropertiesAtPosition(1)?.foo, 1);\n\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [\n\t\t\t\tfirstRemoteAnnotateSeq,\n\t\t\t\tlocal,\n\t\t\t\tundefined,\n\t\t\t]);\n\t\t\tclient.applyMsg(client.makeOpMessage(localPropChange, ++seq, seq - 1, localUserLongId));\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(\"foo\"),\n\t\t\t\t[firstRemoteAnnotateSeq, seq, undefined],\n\t\t\t\t\"property change should have been attributed to the winning, local op\",\n\t\t\t);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 3 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(\"foo\"),\n\t\t\t\t[firstRemoteAnnotateSeq, seq, undefined],\n\t\t\t\t\"second property change should have been attributed to a remote change\",\n\t\t\t);\n\t\t});\n\n\t\tdescribe(\"attributes properties set on a segment at insertion time\", () => {\n\t\t\tit(\"for remote insertions\", () => {\n\t\t\t\tclient.insertTextRemote(0, \"123\", { foo: \"bar\" }, ++seq, seq - 1, remoteUserLongId);\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [1, 1, 1]);\n\t\t\t});\n\n\t\t\tit(\"for local insertions\", () => {\n\t\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\", { foo: \"bar\" });\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [local, local, local]);\n\t\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [1, 1, 1]);\n\t\t\t});\n\t\t});\n\n\t\tit(\"attributes annotation in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", undefined);\n\t\t\tclient.annotateRangeLocal(0, 1, { foo: \"bar\" });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\n\t\tit(\"attributes annotation on insertion in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", { foo: \"bar\" });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\t}\n\n\tdescribe(\"using insert-only attribution\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createInsertOnlyAttributionPolicy,\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunInsertVerificationTests();\n\n\t\tit(\"ignores local property changes\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq),\n\t\t\t);\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"ignores remote property changes\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\t});\n\n\tdescribe(\"using foo-property-only attribution\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunAnnotateVerificationTests();\n\n\t\tit(\"ignores segments inserted locally\", () => {\n\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\");\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, undefined, undefined]);\n\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, undefined, undefined]);\n\t\t});\n\n\t\tit(\"ignores segments inserted remotely\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [undefined, undefined, undefined]);\n\t\t});\n\n\t\tit(\"can correctly combine segment attribution on append\", () => {\n\t\t\tclient.insertTextRemote(\n\t\t\t\t0,\n\t\t\t\t\"1\",\n\t\t\t\t{ foo: \"bar\", bar: 1 },\n\t\t\t\t++seq,\n\t\t\t\tseq - 1,\n\t\t\t\tremoteUserLongId,\n\t\t\t);\n\t\t\tclient.insertTextRemote(1, \"2\", { bar: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\t// Null is used to represent deleting a property, since undefined will not be sent over the wire.\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tclient.annotateRangeRemote(0, 1, { foo: null }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.updateMinSeq(seq);\n\t\t\tlet segmentCount = 0;\n\t\t\tclient.walkSegments(() => {\n\t\t\t\tsegmentCount++;\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\tassert.equal(segmentCount, 1);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [seq, undefined]);\n\t\t});\n\t});\n\n\tdescribe(\"using an attribution policy which tracks insertion and annotation\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAndInsertionAttributionPolicyFactory(\"foo\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunAnnotateVerificationTests();\n\n\t\trunInsertVerificationTests();\n\t});\n\n\tdescribe(\"using an attribution policy which tracks annotation of multiple properties\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\", \"bar\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\tit(\"attributes local property change on ack\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq),\n\t\t\t);\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"bar\"), [3, 3, 3]);\n\t\t});\n\t});\n});\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IRandom } from "@fluid-private/stochastic-test-utils";
5
+ import { type IRandom } from "@fluid-private/stochastic-test-utils";
6
6
  import { TestClient } from "./testClient.js";
7
7
  export declare function simpleTest(): void;
8
8
  export declare function integerTest1(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"beastTest.spec.d.ts","sourceRoot":"","sources":["../../src/test/beastTest.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,OAAO,EAAc,MAAM,sCAAsC,CAAC;AAoC3E,OAAO,EAAE,UAAU,EAA2B,MAAM,iBAAiB,CAAC;AAmHtE,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAcD,wBAAgB,YAAY,IAAI,MAAM,CAsCrC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAoDhC;AAwED,wBAAgB,cAAc,IAAI,IAAI,CAwBrC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CA8EzC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAgM7C;AAID,wBAAgB,QAAQ,CAAC,OAAO,UAAO,GAAG;IACzC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClE,cAAc,EAAE,MAAM,IAAI,CAAC;CAC3B,CAqpBA;AAYD,qBAAa,UAAU;IACtB,MAAM,EAAE,OAAO,CAAC;;IAKhB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAI7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CA+BrC;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC;AACjD;;;;;;;GAOG;AACH,qBAAa,YAAY;IAOhB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,YAAY,EAAE;IAPhC,GAAG,SAAK;IACR,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAsB;IACjD,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,MAAM,CAAC,QAAQ,aAAoB;gBAG3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EAAE;IAGhC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IA2C/D,MAAM,CAAC,gBAAgB,IAAI,YAAY;IAKvC,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,EAAE;IAuB9D,MAAM,CAAC,iBAAiB,IAAI,YAAY;IAOxC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;IAUxD,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;CAGxD"}
1
+ {"version":3,"file":"beastTest.spec.d.ts","sourceRoot":"","sources":["../../src/test/beastTest.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,sCAAsC,CAAC;AAoChF,OAAO,EAAE,UAAU,EAA2B,MAAM,iBAAiB,CAAC;AAmHtE,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAcD,wBAAgB,YAAY,IAAI,MAAM,CAsCrC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAoDhC;AAwED,wBAAgB,cAAc,IAAI,IAAI,CAwBrC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CA8EzC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAgM7C;AAID,wBAAgB,QAAQ,CAAC,OAAO,UAAO,GAAG;IACzC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClE,cAAc,EAAE,MAAM,IAAI,CAAC;CAC3B,CAqpBA;AAYD,qBAAa,UAAU;IACtB,MAAM,EAAE,OAAO,CAAC;;IAKhB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAI7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CA+BrC;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC;AACjD;;;;;;;GAOG;AACH,qBAAa,YAAY;IAOhB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,YAAY,EAAE;IAPhC,GAAG,SAAK;IACR,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAsB;IACjD,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,MAAM,CAAC,QAAQ,aAAoB;gBAG3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EAAE;IAGhC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IA2C/D,MAAM,CAAC,gBAAgB,IAAI,YAAY;IAKvC,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,EAAE;IAuB9D,MAAM,CAAC,iBAAiB,IAAI,YAAY;IAOxC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;IAUxD,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;CAGxD"}