@fluid-experimental/tree 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.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 (572) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +1 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/.vscode/settings.json +1 -1
  4. package/CHANGELOG.md +4 -0
  5. package/api-report/experimental-tree.api.md +4 -15
  6. package/dist/ChangeCompression.d.ts +5 -5
  7. package/dist/ChangeCompression.d.ts.map +1 -1
  8. package/dist/ChangeCompression.js +24 -24
  9. package/dist/ChangeCompression.js.map +1 -1
  10. package/dist/ChangeTypes.d.ts +3 -3
  11. package/dist/ChangeTypes.d.ts.map +1 -1
  12. package/dist/ChangeTypes.js +9 -9
  13. package/dist/ChangeTypes.js.map +1 -1
  14. package/dist/Checkout.d.ts +7 -7
  15. package/dist/Checkout.d.ts.map +1 -1
  16. package/dist/Checkout.js +27 -27
  17. package/dist/Checkout.js.map +1 -1
  18. package/dist/Common.d.ts +2 -2
  19. package/dist/Common.d.ts.map +1 -1
  20. package/dist/Common.js.map +1 -1
  21. package/dist/EagerCheckout.d.ts +3 -3
  22. package/dist/EagerCheckout.d.ts.map +1 -1
  23. package/dist/EagerCheckout.js +2 -2
  24. package/dist/EagerCheckout.js.map +1 -1
  25. package/dist/EditLog.d.ts +4 -6
  26. package/dist/EditLog.d.ts.map +1 -1
  27. package/dist/EditLog.js +9 -9
  28. package/dist/EditLog.js.map +1 -1
  29. package/dist/EditUtilities.d.ts +6 -6
  30. package/dist/EditUtilities.d.ts.map +1 -1
  31. package/dist/EditUtilities.js +28 -28
  32. package/dist/EditUtilities.js.map +1 -1
  33. package/dist/Forest.d.ts +2 -2
  34. package/dist/Forest.d.ts.map +1 -1
  35. package/dist/Forest.js +13 -13
  36. package/dist/Forest.js.map +1 -1
  37. package/dist/HistoryEditFactory.d.ts +3 -3
  38. package/dist/HistoryEditFactory.d.ts.map +1 -1
  39. package/dist/HistoryEditFactory.js +36 -36
  40. package/dist/HistoryEditFactory.js.map +1 -1
  41. package/dist/IdConversion.d.ts +3 -3
  42. package/dist/IdConversion.d.ts.map +1 -1
  43. package/dist/IdConversion.js +23 -23
  44. package/dist/IdConversion.js.map +1 -1
  45. package/dist/InitialTree.d.ts +1 -1
  46. package/dist/InitialTree.d.ts.map +1 -1
  47. package/dist/InitialTree.js +2 -2
  48. package/dist/InitialTree.js.map +1 -1
  49. package/dist/LazyCheckout.d.ts +5 -5
  50. package/dist/LazyCheckout.d.ts.map +1 -1
  51. package/dist/LazyCheckout.js +2 -2
  52. package/dist/LazyCheckout.js.map +1 -1
  53. package/dist/LogViewer.d.ts +7 -7
  54. package/dist/LogViewer.d.ts.map +1 -1
  55. package/dist/LogViewer.js +25 -25
  56. package/dist/LogViewer.js.map +1 -1
  57. package/dist/MergeHealth.d.ts +1 -1
  58. package/dist/MergeHealth.d.ts.map +1 -1
  59. package/dist/MergeHealth.js +32 -32
  60. package/dist/MergeHealth.js.map +1 -1
  61. package/dist/NodeIdUtilities.d.ts +3 -3
  62. package/dist/NodeIdUtilities.d.ts.map +1 -1
  63. package/dist/NodeIdUtilities.js +4 -4
  64. package/dist/NodeIdUtilities.js.map +1 -1
  65. package/dist/PayloadUtilities.d.ts +1 -1
  66. package/dist/PayloadUtilities.d.ts.map +1 -1
  67. package/dist/PayloadUtilities.js.map +1 -1
  68. package/dist/ReconciliationPath.d.ts +3 -3
  69. package/dist/ReconciliationPath.d.ts.map +1 -1
  70. package/dist/ReconciliationPath.js.map +1 -1
  71. package/dist/RevisionValueCache.js +5 -5
  72. package/dist/RevisionValueCache.js.map +1 -1
  73. package/dist/RevisionView.d.ts +5 -5
  74. package/dist/RevisionView.d.ts.map +1 -1
  75. package/dist/RevisionView.js +11 -11
  76. package/dist/RevisionView.js.map +1 -1
  77. package/dist/SerializationUtilities.d.ts +4 -4
  78. package/dist/SerializationUtilities.d.ts.map +1 -1
  79. package/dist/SerializationUtilities.js +5 -5
  80. package/dist/SerializationUtilities.js.map +1 -1
  81. package/dist/SharedTree.d.ts +15 -18
  82. package/dist/SharedTree.d.ts.map +1 -1
  83. package/dist/SharedTree.js +154 -166
  84. package/dist/SharedTree.js.map +1 -1
  85. package/dist/SharedTreeEncoder.d.ts +8 -8
  86. package/dist/SharedTreeEncoder.d.ts.map +1 -1
  87. package/dist/SharedTreeEncoder.js +67 -67
  88. package/dist/SharedTreeEncoder.js.map +1 -1
  89. package/dist/StringInterner.d.ts +1 -1
  90. package/dist/StringInterner.d.ts.map +1 -1
  91. package/dist/StringInterner.js +2 -2
  92. package/dist/StringInterner.js.map +1 -1
  93. package/dist/Summary.d.ts +4 -4
  94. package/dist/Summary.d.ts.map +1 -1
  95. package/dist/Summary.js +2 -2
  96. package/dist/Summary.js.map +1 -1
  97. package/dist/SummaryBackCompatibility.d.ts +3 -3
  98. package/dist/SummaryBackCompatibility.d.ts.map +1 -1
  99. package/dist/SummaryBackCompatibility.js +13 -13
  100. package/dist/SummaryBackCompatibility.js.map +1 -1
  101. package/dist/SummaryTestUtilities.d.ts +2 -2
  102. package/dist/SummaryTestUtilities.d.ts.map +1 -1
  103. package/dist/SummaryTestUtilities.js.map +1 -1
  104. package/dist/Transaction.d.ts +4 -4
  105. package/dist/Transaction.d.ts.map +1 -1
  106. package/dist/Transaction.js +10 -10
  107. package/dist/Transaction.js.map +1 -1
  108. package/dist/TransactionInternal.d.ts +7 -7
  109. package/dist/TransactionInternal.d.ts.map +1 -1
  110. package/dist/TransactionInternal.js +87 -87
  111. package/dist/TransactionInternal.js.map +1 -1
  112. package/dist/TreeCompressor.d.ts +4 -4
  113. package/dist/TreeCompressor.d.ts.map +1 -1
  114. package/dist/TreeCompressor.js +6 -6
  115. package/dist/TreeCompressor.js.map +1 -1
  116. package/dist/TreeNodeHandle.d.ts +3 -3
  117. package/dist/TreeNodeHandle.d.ts.map +1 -1
  118. package/dist/TreeNodeHandle.js +5 -5
  119. package/dist/TreeNodeHandle.js.map +1 -1
  120. package/dist/TreeView.d.ts +3 -3
  121. package/dist/TreeView.d.ts.map +1 -1
  122. package/dist/TreeView.js +10 -10
  123. package/dist/TreeView.js.map +1 -1
  124. package/dist/TreeViewUtilities.d.ts +2 -2
  125. package/dist/TreeViewUtilities.d.ts.map +1 -1
  126. package/dist/TreeViewUtilities.js +3 -3
  127. package/dist/TreeViewUtilities.js.map +1 -1
  128. package/dist/UndoRedoHandler.d.ts +2 -2
  129. package/dist/UndoRedoHandler.d.ts.map +1 -1
  130. package/dist/UndoRedoHandler.js +5 -5
  131. package/dist/UndoRedoHandler.js.map +1 -1
  132. package/dist/UuidUtilities.d.ts +1 -1
  133. package/dist/UuidUtilities.d.ts.map +1 -1
  134. package/dist/UuidUtilities.js +3 -3
  135. package/dist/UuidUtilities.js.map +1 -1
  136. package/dist/id-compressor/AppendOnlySortedMap.js +4 -4
  137. package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -1
  138. package/dist/id-compressor/IdCompressor.d.ts +2 -2
  139. package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
  140. package/dist/id-compressor/IdCompressor.js +78 -78
  141. package/dist/id-compressor/IdCompressor.js.map +1 -1
  142. package/dist/id-compressor/IdRange.d.ts +1 -1
  143. package/dist/id-compressor/IdRange.d.ts.map +1 -1
  144. package/dist/id-compressor/IdRange.js.map +1 -1
  145. package/dist/id-compressor/NumericUuid.d.ts +1 -1
  146. package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
  147. package/dist/id-compressor/NumericUuid.js +6 -6
  148. package/dist/id-compressor/NumericUuid.js.map +1 -1
  149. package/dist/id-compressor/SessionIdNormalizer.d.ts +2 -2
  150. package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  151. package/dist/id-compressor/SessionIdNormalizer.js +14 -14
  152. package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
  153. package/dist/id-compressor/index.d.ts +4 -4
  154. package/dist/id-compressor/index.d.ts.map +1 -1
  155. package/dist/id-compressor/index.js +11 -11
  156. package/dist/id-compressor/index.js.map +1 -1
  157. package/dist/id-compressor/persisted-types/0.0.1.d.ts +1 -1
  158. package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
  159. package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -1
  160. package/dist/id-compressor/persisted-types/index.d.ts +1 -1
  161. package/dist/id-compressor/persisted-types/index.d.ts.map +1 -1
  162. package/dist/id-compressor/persisted-types/index.js.map +1 -1
  163. package/dist/index.d.ts +29 -29
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +73 -73
  166. package/dist/index.js.map +1 -1
  167. package/dist/migration-shim/migrationDeltaHandler.d.ts +1 -1
  168. package/dist/migration-shim/migrationDeltaHandler.d.ts.map +1 -1
  169. package/dist/migration-shim/migrationDeltaHandler.js +5 -8
  170. package/dist/migration-shim/migrationDeltaHandler.js.map +1 -1
  171. package/dist/migration-shim/migrationShim.d.ts +1 -1
  172. package/dist/migration-shim/migrationShim.d.ts.map +1 -1
  173. package/dist/migration-shim/migrationShim.js +1 -1
  174. package/dist/migration-shim/migrationShim.js.map +1 -1
  175. package/dist/migration-shim/migrationShimFactory.d.ts +1 -1
  176. package/dist/migration-shim/migrationShimFactory.d.ts.map +1 -1
  177. package/dist/migration-shim/migrationShimFactory.js.map +1 -1
  178. package/dist/migration-shim/sharedTreeDeltaHandler.d.ts +1 -1
  179. package/dist/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
  180. package/dist/migration-shim/sharedTreeDeltaHandler.js +2 -5
  181. package/dist/migration-shim/sharedTreeDeltaHandler.js.map +1 -1
  182. package/dist/migration-shim/types.d.ts +1 -1
  183. package/dist/migration-shim/types.d.ts.map +1 -1
  184. package/dist/migration-shim/types.js.map +1 -1
  185. package/dist/package.json +3 -0
  186. package/dist/persisted-types/0.0.2.d.ts +1 -1
  187. package/dist/persisted-types/0.0.2.d.ts.map +1 -1
  188. package/dist/persisted-types/0.0.2.js.map +1 -1
  189. package/dist/persisted-types/0.1.1.d.ts +4 -4
  190. package/dist/persisted-types/0.1.1.d.ts.map +1 -1
  191. package/dist/persisted-types/0.1.1.js +13 -13
  192. package/dist/persisted-types/0.1.1.js.map +1 -1
  193. package/dist/persisted-types/index.d.ts +2 -2
  194. package/dist/persisted-types/index.d.ts.map +1 -1
  195. package/dist/persisted-types/index.js +13 -13
  196. package/dist/persisted-types/index.js.map +1 -1
  197. package/dist/tree-alpha.d.ts +5 -8
  198. package/dist/tree-beta.d.ts +5 -1
  199. package/dist/tree-public.d.ts +5 -1
  200. package/dist/tree-untrimmed.d.ts +5 -8
  201. package/dist/tsdoc-metadata.json +1 -1
  202. package/lib/ChangeCompression.d.ts +5 -5
  203. package/lib/ChangeCompression.d.ts.map +1 -1
  204. package/lib/ChangeCompression.js +3 -3
  205. package/lib/ChangeCompression.js.map +1 -1
  206. package/lib/ChangeTypes.d.ts +3 -3
  207. package/lib/ChangeTypes.d.ts.map +1 -1
  208. package/lib/ChangeTypes.js +3 -3
  209. package/lib/ChangeTypes.js.map +1 -1
  210. package/lib/Checkout.d.ts +7 -7
  211. package/lib/Checkout.d.ts.map +1 -1
  212. package/lib/Checkout.js +6 -6
  213. package/lib/Checkout.js.map +1 -1
  214. package/lib/Common.d.ts +2 -2
  215. package/lib/Common.d.ts.map +1 -1
  216. package/lib/Common.js.map +1 -1
  217. package/lib/EagerCheckout.d.ts +3 -3
  218. package/lib/EagerCheckout.d.ts.map +1 -1
  219. package/lib/EagerCheckout.js +1 -1
  220. package/lib/EagerCheckout.js.map +1 -1
  221. package/lib/EditLog.d.ts +4 -6
  222. package/lib/EditLog.d.ts.map +1 -1
  223. package/lib/EditLog.js +1 -1
  224. package/lib/EditLog.js.map +1 -1
  225. package/lib/EditUtilities.d.ts +6 -6
  226. package/lib/EditUtilities.d.ts.map +1 -1
  227. package/lib/EditUtilities.js +7 -7
  228. package/lib/EditUtilities.js.map +1 -1
  229. package/lib/Forest.d.ts +2 -2
  230. package/lib/Forest.d.ts.map +1 -1
  231. package/lib/Forest.js +2 -2
  232. package/lib/Forest.js.map +1 -1
  233. package/lib/HistoryEditFactory.d.ts +3 -3
  234. package/lib/HistoryEditFactory.d.ts.map +1 -1
  235. package/lib/HistoryEditFactory.js +7 -7
  236. package/lib/HistoryEditFactory.js.map +1 -1
  237. package/lib/IdConversion.d.ts +3 -3
  238. package/lib/IdConversion.d.ts.map +1 -1
  239. package/lib/IdConversion.js +4 -4
  240. package/lib/IdConversion.js.map +1 -1
  241. package/lib/InitialTree.d.ts +1 -1
  242. package/lib/InitialTree.d.ts.map +1 -1
  243. package/lib/InitialTree.js +1 -1
  244. package/lib/InitialTree.js.map +1 -1
  245. package/lib/LazyCheckout.d.ts +5 -5
  246. package/lib/LazyCheckout.d.ts.map +1 -1
  247. package/lib/LazyCheckout.js +1 -1
  248. package/lib/LazyCheckout.js.map +1 -1
  249. package/lib/LogViewer.d.ts +7 -7
  250. package/lib/LogViewer.d.ts.map +1 -1
  251. package/lib/LogViewer.js +4 -4
  252. package/lib/LogViewer.js.map +1 -1
  253. package/lib/MergeHealth.d.ts +1 -1
  254. package/lib/MergeHealth.d.ts.map +1 -1
  255. package/lib/MergeHealth.js +5 -5
  256. package/lib/MergeHealth.js.map +1 -1
  257. package/lib/NodeIdUtilities.d.ts +3 -3
  258. package/lib/NodeIdUtilities.d.ts.map +1 -1
  259. package/lib/NodeIdUtilities.js +2 -2
  260. package/lib/NodeIdUtilities.js.map +1 -1
  261. package/lib/PayloadUtilities.d.ts +1 -1
  262. package/lib/PayloadUtilities.d.ts.map +1 -1
  263. package/lib/PayloadUtilities.js.map +1 -1
  264. package/lib/ReconciliationPath.d.ts +3 -3
  265. package/lib/ReconciliationPath.d.ts.map +1 -1
  266. package/lib/ReconciliationPath.js.map +1 -1
  267. package/lib/RevisionValueCache.js +1 -1
  268. package/lib/RevisionValueCache.js.map +1 -1
  269. package/lib/RevisionView.d.ts +5 -5
  270. package/lib/RevisionView.d.ts.map +1 -1
  271. package/lib/RevisionView.js +3 -3
  272. package/lib/RevisionView.js.map +1 -1
  273. package/lib/SerializationUtilities.d.ts +4 -4
  274. package/lib/SerializationUtilities.d.ts.map +1 -1
  275. package/lib/SerializationUtilities.js +1 -1
  276. package/lib/SerializationUtilities.js.map +1 -1
  277. package/lib/SharedTree.d.ts +15 -18
  278. package/lib/SharedTree.d.ts.map +1 -1
  279. package/lib/SharedTree.js +28 -40
  280. package/lib/SharedTree.js.map +1 -1
  281. package/lib/SharedTreeEncoder.d.ts +8 -8
  282. package/lib/SharedTreeEncoder.d.ts.map +1 -1
  283. package/lib/SharedTreeEncoder.js +12 -12
  284. package/lib/SharedTreeEncoder.js.map +1 -1
  285. package/lib/StringInterner.d.ts +1 -1
  286. package/lib/StringInterner.d.ts.map +1 -1
  287. package/lib/StringInterner.js +1 -1
  288. package/lib/StringInterner.js.map +1 -1
  289. package/lib/Summary.d.ts +4 -4
  290. package/lib/Summary.d.ts.map +1 -1
  291. package/lib/Summary.js +1 -1
  292. package/lib/Summary.js.map +1 -1
  293. package/lib/SummaryBackCompatibility.d.ts +3 -3
  294. package/lib/SummaryBackCompatibility.d.ts.map +1 -1
  295. package/lib/SummaryBackCompatibility.js +3 -3
  296. package/lib/SummaryBackCompatibility.js.map +1 -1
  297. package/lib/SummaryTestUtilities.d.ts +2 -2
  298. package/lib/SummaryTestUtilities.d.ts.map +1 -1
  299. package/lib/SummaryTestUtilities.js.map +1 -1
  300. package/lib/Transaction.d.ts +4 -4
  301. package/lib/Transaction.d.ts.map +1 -1
  302. package/lib/Transaction.js +5 -5
  303. package/lib/Transaction.js.map +1 -1
  304. package/lib/TransactionInternal.d.ts +7 -7
  305. package/lib/TransactionInternal.d.ts.map +1 -1
  306. package/lib/TransactionInternal.js +5 -5
  307. package/lib/TransactionInternal.js.map +1 -1
  308. package/lib/TreeCompressor.d.ts +4 -4
  309. package/lib/TreeCompressor.d.ts.map +1 -1
  310. package/lib/TreeCompressor.js +2 -2
  311. package/lib/TreeCompressor.js.map +1 -1
  312. package/lib/TreeNodeHandle.d.ts +3 -3
  313. package/lib/TreeNodeHandle.d.ts.map +1 -1
  314. package/lib/TreeNodeHandle.js +1 -1
  315. package/lib/TreeNodeHandle.js.map +1 -1
  316. package/lib/TreeView.d.ts +3 -3
  317. package/lib/TreeView.d.ts.map +1 -1
  318. package/lib/TreeView.js +3 -3
  319. package/lib/TreeView.js.map +1 -1
  320. package/lib/TreeViewUtilities.d.ts +2 -2
  321. package/lib/TreeViewUtilities.d.ts.map +1 -1
  322. package/lib/TreeViewUtilities.js +1 -1
  323. package/lib/TreeViewUtilities.js.map +1 -1
  324. package/lib/UndoRedoHandler.d.ts +2 -2
  325. package/lib/UndoRedoHandler.d.ts.map +1 -1
  326. package/lib/UndoRedoHandler.js +2 -2
  327. package/lib/UndoRedoHandler.js.map +1 -1
  328. package/lib/UuidUtilities.d.ts +1 -1
  329. package/lib/UuidUtilities.d.ts.map +1 -1
  330. package/lib/UuidUtilities.js +1 -1
  331. package/lib/UuidUtilities.js.map +1 -1
  332. package/lib/id-compressor/AppendOnlySortedMap.js +1 -1
  333. package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -1
  334. package/lib/id-compressor/IdCompressor.d.ts +2 -2
  335. package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
  336. package/lib/id-compressor/IdCompressor.js +6 -6
  337. package/lib/id-compressor/IdCompressor.js.map +1 -1
  338. package/lib/id-compressor/IdRange.d.ts +1 -1
  339. package/lib/id-compressor/IdRange.d.ts.map +1 -1
  340. package/lib/id-compressor/IdRange.js.map +1 -1
  341. package/lib/id-compressor/NumericUuid.d.ts +1 -1
  342. package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
  343. package/lib/id-compressor/NumericUuid.js +2 -2
  344. package/lib/id-compressor/NumericUuid.js.map +1 -1
  345. package/lib/id-compressor/SessionIdNormalizer.d.ts +2 -2
  346. package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  347. package/lib/id-compressor/SessionIdNormalizer.js +2 -2
  348. package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
  349. package/lib/id-compressor/index.d.ts +4 -4
  350. package/lib/id-compressor/index.d.ts.map +1 -1
  351. package/lib/id-compressor/index.js +3 -3
  352. package/lib/id-compressor/index.js.map +1 -1
  353. package/lib/id-compressor/persisted-types/0.0.1.d.ts +1 -1
  354. package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
  355. package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -1
  356. package/lib/id-compressor/persisted-types/index.d.ts +1 -1
  357. package/lib/id-compressor/persisted-types/index.d.ts.map +1 -1
  358. package/lib/id-compressor/persisted-types/index.js.map +1 -1
  359. package/lib/index.d.ts +29 -29
  360. package/lib/index.d.ts.map +1 -1
  361. package/lib/index.js +22 -22
  362. package/lib/index.js.map +1 -1
  363. package/lib/migration-shim/migrationDeltaHandler.d.ts +1 -1
  364. package/lib/migration-shim/migrationDeltaHandler.d.ts.map +1 -1
  365. package/lib/migration-shim/migrationDeltaHandler.js +5 -8
  366. package/lib/migration-shim/migrationDeltaHandler.js.map +1 -1
  367. package/lib/migration-shim/migrationShim.d.ts +1 -1
  368. package/lib/migration-shim/migrationShim.d.ts.map +1 -1
  369. package/lib/migration-shim/migrationShim.js +1 -1
  370. package/lib/migration-shim/migrationShim.js.map +1 -1
  371. package/lib/migration-shim/migrationShimFactory.d.ts +1 -1
  372. package/lib/migration-shim/migrationShimFactory.d.ts.map +1 -1
  373. package/lib/migration-shim/migrationShimFactory.js.map +1 -1
  374. package/lib/migration-shim/sharedTreeDeltaHandler.d.ts +1 -1
  375. package/lib/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
  376. package/lib/migration-shim/sharedTreeDeltaHandler.js +2 -5
  377. package/lib/migration-shim/sharedTreeDeltaHandler.js.map +1 -1
  378. package/lib/migration-shim/types.d.ts +1 -1
  379. package/lib/migration-shim/types.d.ts.map +1 -1
  380. package/lib/migration-shim/types.js.map +1 -1
  381. package/lib/persisted-types/0.0.2.d.ts +1 -1
  382. package/lib/persisted-types/0.0.2.d.ts.map +1 -1
  383. package/lib/persisted-types/0.0.2.js.map +1 -1
  384. package/lib/persisted-types/0.1.1.d.ts +4 -4
  385. package/lib/persisted-types/0.1.1.d.ts.map +1 -1
  386. package/lib/persisted-types/0.1.1.js +2 -2
  387. package/lib/persisted-types/0.1.1.js.map +1 -1
  388. package/lib/persisted-types/index.d.ts +2 -2
  389. package/lib/persisted-types/index.d.ts.map +1 -1
  390. package/lib/persisted-types/index.js +2 -2
  391. package/lib/persisted-types/index.js.map +1 -1
  392. package/lib/test/AppendOnlySortedMap.perf.tests.js +2 -2
  393. package/lib/test/AppendOnlySortedMap.perf.tests.js.map +1 -1
  394. package/lib/test/AppendOnlySortedMap.tests.js +2 -2
  395. package/lib/test/AppendOnlySortedMap.tests.js.map +1 -1
  396. package/lib/test/ChangeCompression.tests.js +9 -9
  397. package/lib/test/ChangeCompression.tests.js.map +1 -1
  398. package/lib/test/Checkout.tests.d.ts +1 -1
  399. package/lib/test/Checkout.tests.d.ts.map +1 -1
  400. package/lib/test/Checkout.tests.js +2 -2
  401. package/lib/test/Checkout.tests.js.map +1 -1
  402. package/lib/test/Common.tests.js +1 -1
  403. package/lib/test/Common.tests.js.map +1 -1
  404. package/lib/test/EagerCheckout.tests.js +4 -4
  405. package/lib/test/EagerCheckout.tests.js.map +1 -1
  406. package/lib/test/Edit.tests.js +2 -2
  407. package/lib/test/Edit.tests.js.map +1 -1
  408. package/lib/test/EditLog.perf.tests.js +4 -4
  409. package/lib/test/EditLog.perf.tests.js.map +1 -1
  410. package/lib/test/EditLog.tests.js +3 -3
  411. package/lib/test/EditLog.tests.js.map +1 -1
  412. package/lib/test/EditUtilities.tests.js +6 -6
  413. package/lib/test/EditUtilities.tests.js.map +1 -1
  414. package/lib/test/Forest.perf.tests.js +4 -4
  415. package/lib/test/Forest.perf.tests.js.map +1 -1
  416. package/lib/test/Forest.tests.js +2 -2
  417. package/lib/test/Forest.tests.js.map +1 -1
  418. package/lib/test/GenericTransaction.tests.js +3 -3
  419. package/lib/test/GenericTransaction.tests.js.map +1 -1
  420. package/lib/test/HistoryEditFactory.tests.js +4 -4
  421. package/lib/test/HistoryEditFactory.tests.js.map +1 -1
  422. package/lib/test/IdCompressor.perf.tests.js +4 -4
  423. package/lib/test/IdCompressor.perf.tests.js.map +1 -1
  424. package/lib/test/IdCompressor.tests.js +7 -7
  425. package/lib/test/IdCompressor.tests.js.map +1 -1
  426. package/lib/test/IdConversion.tests.js +3 -3
  427. package/lib/test/IdConversion.tests.js.map +1 -1
  428. package/lib/test/LazyCheckout.tests.js +4 -4
  429. package/lib/test/LazyCheckout.tests.js.map +1 -1
  430. package/lib/test/LogViewer.tests.js +12 -12
  431. package/lib/test/LogViewer.tests.js.map +1 -1
  432. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +6 -6
  433. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -1
  434. package/lib/test/NumericUuid.perf.tests.js +3 -3
  435. package/lib/test/NumericUuid.perf.tests.js.map +1 -1
  436. package/lib/test/NumericUuid.tests.js +4 -4
  437. package/lib/test/NumericUuid.tests.js.map +1 -1
  438. package/lib/test/RevisionValueCache.tests.js +2 -2
  439. package/lib/test/RevisionValueCache.tests.js.map +1 -1
  440. package/lib/test/RevisionView.tests.js +6 -6
  441. package/lib/test/RevisionView.tests.js.map +1 -1
  442. package/lib/test/SessionIdNormalizer.tests.js +3 -3
  443. package/lib/test/SessionIdNormalizer.tests.js.map +1 -1
  444. package/lib/test/SharedTree.fuzz.tests.js +1 -1
  445. package/lib/test/SharedTree.fuzz.tests.js.map +1 -1
  446. package/lib/test/SharedTree.perf.tests.js +2 -2
  447. package/lib/test/SharedTree.perf.tests.js.map +1 -1
  448. package/lib/test/SharedTree.tests.js +7 -7
  449. package/lib/test/SharedTree.tests.js.map +1 -1
  450. package/lib/test/StringInterner.tests.js +1 -1
  451. package/lib/test/StringInterner.tests.js.map +1 -1
  452. package/lib/test/Summary.tests.d.ts +2 -2
  453. package/lib/test/Summary.tests.d.ts.map +1 -1
  454. package/lib/test/Summary.tests.js +14 -14
  455. package/lib/test/Summary.tests.js.map +1 -1
  456. package/lib/test/Transaction.tests.js +5 -5
  457. package/lib/test/Transaction.tests.js.map +1 -1
  458. package/lib/test/TransactionInternal.tests.js +7 -7
  459. package/lib/test/TransactionInternal.tests.js.map +1 -1
  460. package/lib/test/TreeCompression.tests.js +8 -8
  461. package/lib/test/TreeCompression.tests.js.map +1 -1
  462. package/lib/test/TreeView.tests.js +3 -3
  463. package/lib/test/TreeView.tests.js.map +1 -1
  464. package/lib/test/UndoRedoHandler.tests.js +2 -2
  465. package/lib/test/UndoRedoHandler.tests.js.map +1 -1
  466. package/lib/test/fuzz/Generators.d.ts +1 -1
  467. package/lib/test/fuzz/Generators.d.ts.map +1 -1
  468. package/lib/test/fuzz/Generators.js +4 -4
  469. package/lib/test/fuzz/Generators.js.map +1 -1
  470. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +1 -1
  471. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -1
  472. package/lib/test/fuzz/SharedTreeFuzzTests.js +5 -5
  473. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
  474. package/lib/test/fuzz/Types.d.ts +6 -6
  475. package/lib/test/fuzz/Types.d.ts.map +1 -1
  476. package/lib/test/fuzz/Types.js.map +1 -1
  477. package/lib/test/utilities/IdCompressorTestUtilities.d.ts +6 -6
  478. package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -1
  479. package/lib/test/utilities/IdCompressorTestUtilities.js +6 -6
  480. package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -1
  481. package/lib/test/utilities/MockTransaction.d.ts +4 -4
  482. package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
  483. package/lib/test/utilities/MockTransaction.js +3 -3
  484. package/lib/test/utilities/MockTransaction.js.map +1 -1
  485. package/lib/test/utilities/PendingLocalStateTests.d.ts +1 -1
  486. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -1
  487. package/lib/test/utilities/PendingLocalStateTests.js +5 -5
  488. package/lib/test/utilities/PendingLocalStateTests.js.map +1 -1
  489. package/lib/test/utilities/SharedTreeTests.d.ts +2 -2
  490. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  491. package/lib/test/utilities/SharedTreeTests.js +22 -22
  492. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  493. package/lib/test/utilities/SharedTreeVersioningTests.d.ts +1 -1
  494. package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -1
  495. package/lib/test/utilities/SharedTreeVersioningTests.js +10 -10
  496. package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -1
  497. package/lib/test/utilities/SummaryLoadPerfTests.js +6 -6
  498. package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -1
  499. package/lib/test/utilities/SummarySizeTests.d.ts +1 -1
  500. package/lib/test/utilities/SummarySizeTests.d.ts.map +1 -1
  501. package/lib/test/utilities/SummarySizeTests.js +5 -5
  502. package/lib/test/utilities/SummarySizeTests.js.map +1 -1
  503. package/lib/test/utilities/TestNode.d.ts +6 -6
  504. package/lib/test/utilities/TestNode.d.ts.map +1 -1
  505. package/lib/test/utilities/TestNode.js +5 -5
  506. package/lib/test/utilities/TestNode.js.map +1 -1
  507. package/lib/test/utilities/TestUtilities.d.ts +12 -12
  508. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  509. package/lib/test/utilities/TestUtilities.js +18 -19
  510. package/lib/test/utilities/TestUtilities.js.map +1 -1
  511. package/lib/test/utilities/UndoRedoTests.d.ts +2 -2
  512. package/lib/test/utilities/UndoRedoTests.d.ts.map +1 -1
  513. package/lib/test/utilities/UndoRedoTests.js +7 -7
  514. package/lib/test/utilities/UndoRedoTests.js.map +1 -1
  515. package/package.json +57 -31
  516. package/src/ChangeCompression.ts +7 -7
  517. package/src/ChangeTypes.ts +5 -5
  518. package/src/Checkout.ts +13 -13
  519. package/src/Common.ts +2 -2
  520. package/src/EagerCheckout.ts +3 -3
  521. package/src/EditLog.ts +6 -7
  522. package/src/EditUtilities.ts +10 -10
  523. package/src/Forest.ts +4 -4
  524. package/src/HistoryEditFactory.ts +11 -11
  525. package/src/IdConversion.ts +4 -4
  526. package/src/InitialTree.ts +3 -3
  527. package/src/LazyCheckout.ts +5 -5
  528. package/src/LogViewer.ts +8 -8
  529. package/src/MergeHealth.ts +6 -6
  530. package/src/NodeIdUtilities.ts +4 -4
  531. package/src/PayloadUtilities.ts +1 -1
  532. package/src/ReconciliationPath.ts +3 -3
  533. package/src/RevisionValueCache.ts +1 -1
  534. package/src/RevisionView.ts +7 -7
  535. package/src/SerializationUtilities.ts +5 -5
  536. package/src/SharedTree.ts +34 -54
  537. package/src/SharedTreeEncoder.ts +15 -15
  538. package/src/StringInterner.ts +2 -2
  539. package/src/Summary.ts +5 -5
  540. package/src/SummaryBackCompatibility.ts +10 -5
  541. package/src/SummaryTestUtilities.ts +3 -3
  542. package/src/Transaction.ts +8 -8
  543. package/src/TransactionInternal.ts +8 -8
  544. package/src/TreeCompressor.ts +6 -6
  545. package/src/TreeNodeHandle.ts +4 -4
  546. package/src/TreeView.ts +4 -4
  547. package/src/TreeViewUtilities.ts +3 -3
  548. package/src/UndoRedoHandler.ts +4 -4
  549. package/src/UuidUtilities.ts +2 -2
  550. package/src/id-compressor/AppendOnlySortedMap.ts +1 -1
  551. package/src/id-compressor/IdCompressor.ts +8 -8
  552. package/src/id-compressor/IdRange.ts +1 -1
  553. package/src/id-compressor/NumericUuid.ts +3 -3
  554. package/src/id-compressor/SessionIdNormalizer.ts +4 -4
  555. package/src/id-compressor/index.ts +4 -4
  556. package/src/id-compressor/persisted-types/0.0.1.ts +1 -1
  557. package/src/id-compressor/persisted-types/index.ts +1 -1
  558. package/src/index.ts +29 -29
  559. package/src/migration-shim/migrationDeltaHandler.ts +9 -10
  560. package/src/migration-shim/migrationShim.ts +7 -5
  561. package/src/migration-shim/migrationShimFactory.ts +4 -1
  562. package/src/migration-shim/sharedTreeDeltaHandler.ts +7 -6
  563. package/src/migration-shim/types.ts +1 -1
  564. package/src/persisted-types/0.0.2.ts +1 -1
  565. package/src/persisted-types/0.1.1.ts +4 -4
  566. package/src/persisted-types/index.ts +2 -2
  567. package/tsconfig.esnext.json +1 -2
  568. package/tsconfig.json +3 -0
  569. package/lib/test/Attach.tests.d.ts +0 -6
  570. package/lib/test/Attach.tests.d.ts.map +0 -1
  571. package/lib/test/Attach.tests.js +0 -52
  572. package/lib/test/Attach.tests.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SharedTreeVersioningTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeVersioningTests.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 'assert';\nimport { ITelemetryBaseEvent } from '@fluidframework/core-interfaces';\nimport { LoaderHeader } from '@fluidframework/container-definitions';\nimport { MockFluidDataStoreRuntime, validateAssertionError } from '@fluidframework/test-runtime-utils';\nimport { expect } from 'chai';\nimport { StableRange, StablePlace, BuildNode, Change } from '../../ChangeTypes';\nimport { Mutable } from '../../Common';\nimport { EditLog } from '../../EditLog';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { SharedTreeDiagnosticEvent } from '../../EventTypes';\nimport { NodeId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { SharedTreeOpType, SharedTreeUpdateOp, TreeNodeSequence, WriteFormat } from '../../persisted-types';\nimport { SharedTree } from '../../SharedTree';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { nilUuid } from '../../UuidUtilities';\nimport { applyTestEdits } from '../Summary.tests';\nimport { buildLeaf } from './TestNode';\nimport {\n\tapplyNoop,\n\tsetUpLocalServerTestSharedTree,\n\tsetUpTestTree,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n\tspyOnSubmittedOps,\n\ttestTrait,\n\twaitForSummary,\n} from './TestUtilities';\n\nfunction spyOnVersionChanges(tree: SharedTree): WriteFormat[] {\n\tconst versions: WriteFormat[] = [];\n\ttree.on(SharedTreeDiagnosticEvent.WriteVersionChanged, (version) => versions.push(version));\n\treturn versions;\n}\n/**\n * Runs a test suite for operations on `SharedTree` that depend on correct versioning.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeVersioningTests(\n\ttitle: string,\n\tsetUpTestSharedTree: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents\n) {\n\tdescribe(title, () => {\n\t\tconst oldVersion = WriteFormat.v0_0_2;\n\t\tconst newVersion = WriteFormat.v0_1_1;\n\t\tconst treeOptions = { localMode: false, writeFormat: oldVersion };\n\t\tconst secondTreeOptions = {\n\t\t\tid: 'secondTestSharedTree',\n\t\t\tlocalMode: false,\n\t\t\twriteFormat: newVersion,\n\t\t};\n\n\t\tit('defaults to latest version if no version is specified when creating factory', () => {\n\t\t\tconst sharedTree = SharedTree.getFactory().create(new MockFluidDataStoreRuntime(), 'SharedTree');\n\t\t\tconst writeFormats = Object.values(WriteFormat);\n\t\t\texpect(sharedTree.getWriteFormat()).to.equal(writeFormats[writeFormats.length - 1]);\n\t\t});\n\n\t\tit('only processes edit ops if they have the same version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The newer tree should have ignored the first edit\n\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\t\t});\n\n\t\tit('resubmits ops concurrent to an update op using the new format', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tconst rootStableId = testTree.stable.identifier;\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\ttree.applyEdit(...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right)));\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify even though one edit was applied, 2 edit ops were sent due to the version upgrade.\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\n\t\t\t// Verify both trees apply the updated op.\n\t\t\tconst handle = new TreeNodeHandle(tree.currentView, tree.convertToNodeId(rootStableId));\n\t\t\texpect(handle.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t\tconst handle2 = new TreeNodeHandle(newerTree.currentView, newerTree.convertToNodeId(rootStableId));\n\t\t\texpect(handle2.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle2.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t});\n\n\t\tit('throws if an edit op with a newer version than the write version is received', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit and expect it to throw\n\t\t\tapplyNoop(newerTree);\n\t\t\tassert.throws(\n\t\t\t\t() => containerRuntimeFactory.processAllMessages(),\n\t\t\t\t(e: Error) =>\n\t\t\t\t\tvalidateAssertionError(e, 'Newer op version received by a client that has yet to be updated.')\n\t\t\t);\n\t\t});\n\n\t\tit('ignores duplicate update ops', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\t\t\tconst { tree: newerTree2 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\t\t\tconst { tree: newerTree3 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\t\t\tconst versions2 = spyOnVersionChanges(newerTree2);\n\t\t\tconst versions3 = spyOnVersionChanges(newerTree3);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tnewerTree2.loadSummary(summary);\n\t\t\tnewerTree3.loadSummary(summary);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Each tree should have processed a version update once\n\t\t\texpect(versions).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions2).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions3).to.deep.equal([oldVersion, newVersion]);\n\t\t});\n\n\t\tit('maintains custom EditLog and LogViewer callbacks when updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\tlet editAdded = 0;\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\t(newerTree.edits as EditLog).registerEditAddedHandler(() => editAdded++);\n\n\t\t\texpect(versions).to.have.length(1);\n\t\t\texpect(versions[0]).to.equal(oldVersion);\n\n\t\t\t// Update occurs after the handler is added to the old edit log\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(versions).to.have.length(2);\n\t\t\texpect(versions[1]).to.equal(newVersion);\n\n\t\t\tconst additionalEdits = 5;\n\t\t\tfor (let i = 0; i < additionalEdits; i++) {\n\t\t\t\tapplyNoop(newerTree);\n\t\t\t}\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The edit added handler should run twice for each additional edit (once when applying locally and once when applying the sequenced edit)\n\t\t\texpect(editAdded).to.equal(additionalEdits * 2);\n\t\t});\n\n\t\tit('begins writing the new version only after updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst ops = spyOnSubmittedOps(newerContainerRuntimeFactory);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tapplyNoop(newerTree);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\tapplyNoop(newerTree);\n\n\t\t\texpect(ops.length).to.equal(4);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\t\t\t// Because the first op was submitted before the Update message was sequenced, it should use\n\t\t\t// the same write format as the loaded summary.\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t\texpect(ops[3].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('Existing client can update to a write version higher than the initialized write version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst versions = spyOnVersionChanges(tree);\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\t// Apply another arbitrary edit to the initial tree, which should now be using the new write version.\n\t\t\tapplyNoop(tree);\n\n\t\t\texpect(versions).to.eql([newVersion]);\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[0].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('New client can update to a write version higher than the initialized version on summary load', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a tree with older write version; it should recognize the document is already using\n\t\t\t// the new write version and use that instead.\n\t\t\tconst { tree: olderTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: oldVersion,\n\t\t\t});\n\n\t\t\tolderTree.loadSummary(summary);\n\t\t\tapplyNoop(olderTree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(ops.length).to.equal(2);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([SharedTreeOpType.Edit, SharedTreeOpType.Edit]);\n\t\t\texpect(ops.map((op) => op.version)).to.eql([newVersion, newVersion]);\n\t\t});\n\n\t\tit('can load a 0.1.1 summary and access the current view', () => {\n\t\t\t// This is a regression test for the logic initializing SharedTree's EditLog from a summary.\n\t\t\t// The 0.1.1 format omits `currentTree`, but EditLog should still tolerate synchronous access\n\t\t\t// of the first edit in the session (which is a single insert containing that tree).\n\t\t\tconst options: SharedTreeTestingOptions = {\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t\tlocalMode: false,\n\t\t\t};\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(options);\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst { tree: newTree } = setUpTestSharedTree({ containerRuntimeFactory, ...options });\n\t\t\tnewTree.loadSummary(summary);\n\t\t\texpect(newTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(() => newTree.currentView).to.not.throw();\n\t\t});\n\n\t\tit('upgrades properly when no edits are sent', async () => {\n\t\t\t// Starts in 0.0.2 (so no upgrade)\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\t\t});\n\n\t\tit('generates unique IDs after upgrading from 0.0.2', async () => {\n\t\t\tconst idCount = 100;\n\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tapplyTestEdits(tree);\n\n\t\t\tconst nodeIds = new Set<NodeId>();\n\t\t\tconst stableIds = new Set<StableNodeId>();\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\tnodeIds.add(id);\n\t\t\t\tstableIds.add(tree.convertToStableNodeId(id));\n\t\t\t}\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tawait setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\t// No IDs should be generated that were already generated before the update\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\texpect(nodeIds.has(id)).to.be.false;\n\t\t\t\texpect(stableIds.has(tree.convertToStableNodeId(id))).to.be.false;\n\t\t\t}\n\t\t\texpect(tree.equals(tree)).to.be.true;\n\t\t});\n\n\t\tit('converts IDs correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst idCount = 10;\n\t\t\tconst ids: [NodeId, StableNodeId][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree1.generateNodeId();\n\t\t\t\tids.push([id, tree1.convertToStableNodeId(id)]);\n\t\t\t}\n\n\t\t\t// Use some of the IDs in edits, but leave others unused.\n\t\t\t// They should all be valid and usable after upgrade.\n\t\t\tconst builds: Mutable<TreeNodeSequence<BuildNode>> = [];\n\t\t\tfor (let i = 1; i < ids.length; i += 2) {\n\t\t\t\tbuilds.push(buildLeaf(ids[i][0], i));\n\t\t\t}\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\tbuilds,\n\t\t\t\t\tStablePlace.atEndOf({ parent: tree1.currentView.root, label: 'foo' as TraitLabel })\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\t// To be removed ADO:5464\n\t\t\t\tfeatureGates: {\n\t\t\t\t\t'Fluid.Container.ForceWriteConnection': true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tconst view = tree1.currentView;\n\t\t\tfor (let i = 0; i < ids.length; i++) {\n\t\t\t\tconst [nodeIdBefore, stableIdBefore] = ids[i];\n\t\t\t\texpect(tree1.convertToStableNodeId(nodeIdBefore)).to.equal(stableIdBefore);\n\t\t\t\tif (i % 2 === 0) {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.false;\n\t\t\t\t} else {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.true;\n\t\t\t\t\tconst node = view.getViewNode(nodeIdBefore);\n\t\t\t\t\texpect(node.payload).to.equal(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\n\t\t\t// https://dev.azure.com/fluidframework/internal/_workitems/edit/3347\n\t\t\tconst events = testObjectProvider.logger.reportAndClearTrackedEvents();\n\t\t\texpect(events.unexpectedErrors.length).to.equal(1);\n\t\t\texpect(events.unexpectedErrors[0].eventName).to.equal(\n\t\t\t\t'fluid:telemetry:ContainerRuntime:Outbox:ReferenceSequenceNumberMismatch'\n\t\t\t);\n\t\t});\n\n\t\tit('interns strings correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst {\n\t\t\t\ttestObjectProvider,\n\t\t\t\ttree: tree1,\n\t\t\t\tcontainer,\n\t\t\t} = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t});\n\n\t\t\tconst internedDefinition = 'internedDefinition';\n\n\t\t\tconst id = tree1.generateNodeId();\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: id },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\t\t\ttree1.applyEdit(Change.delete(StableRange.only(id)));\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tconst summaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\theaders: { [LoaderHeader.version]: summaryVersion },\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: tree1.generateNodeId() },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(areRevisionViewsSemanticallyEqual(tree1.currentView, tree1, tree2.currentView, tree2)).to.be.true;\n\t\t}).timeout(10000);\n\n\t\tit('attributes all pre-upgrade IDs to the nil UUID after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst attributionId = tree.attributionId;\n\t\t\texpect(attributionId).to.equal(nilUuid);\n\t\t\tconst nodeId = tree.generateNodeId();\n\t\t\tconst stableNodeId = tree.convertToStableNodeId(nodeId);\n\n\t\t\ttree.applyEdit(Change.insertTree(buildLeaf(nodeId), StablePlace.atStartOf(testTrait(tree.currentView))));\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\t// To be removed ADO:5464\n\t\t\t\tfeatureGates: {\n\t\t\t\t\t'Fluid.Container.ForceWriteConnection': true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree.attributeNodeId(nodeId)).to.equal(attributionId);\n\t\t\texpect(tree2.attributeNodeId(tree2.convertToNodeId(stableNodeId))).to.equal(attributionId);\n\n\t\t\t// https://dev.azure.com/fluidframework/internal/_workitems/edit/3347\n\t\t\tconst events = testObjectProvider.logger.reportAndClearTrackedEvents();\n\t\t\texpect(events.unexpectedErrors.length).to.equal(1);\n\t\t\texpect(events.unexpectedErrors[0].eventName).to.equal(\n\t\t\t\t'fluid:telemetry:ContainerRuntime:Outbox:ReferenceSequenceNumberMismatch'\n\t\t\t);\n\t\t});\n\n\t\tdescribe('telemetry', () => {\n\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\tconst logger = { send: (event) => events.push(event) };\n\t\t\tbeforeEach(() => {\n\t\t\t\tevents.length = 0;\n\t\t\t});\n\n\t\t\tit('emits RequestVersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\texpect(\n\t\t\t\t\tevents.some(\n\t\t\t\t\t\t(event) =>\n\t\t\t\t\t\t\tevent.eventName === 'SharedTree:RequestVersionUpdate' &&\n\t\t\t\t\t\t\tevent.versionTo === newVersion &&\n\t\t\t\t\t\t\tevent.versionFrom === oldVersion &&\n\t\t\t\t\t\t\tevent.category === 'generic'\n\t\t\t\t\t)\n\t\t\t\t).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits VersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\tconst matchesVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_end' &&\n\t\t\t\t\tevent.version === newVersion &&\n\t\t\t\t\tevent.category === 'performance' &&\n\t\t\t\t\ttypeof event.duration === 'number';\n\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(false);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits error events on VersionUpdate failure', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst op: SharedTreeUpdateOp = {\n\t\t\t\t\ttype: SharedTreeOpType.Update,\n\t\t\t\t\tversion: newVersion,\n\t\t\t\t};\n\t\t\t\tcontainerRuntimeFactory.pushMessage({ contents: op });\n\t\t\t\t(tree.edits as EditLog).getLocalEdits = () => {\n\t\t\t\t\tthrow new Error('Simulated issue in update');\n\t\t\t\t};\n\t\t\t\tconst matchesFailedVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_cancel' &&\n\t\t\t\t\tevent.category === 'error' &&\n\t\t\t\t\tevent.error === 'Simulated issue in update';\n\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(false);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => containerRuntimeFactory.processAllMessages(),\n\t\t\t\t\t(e: Error) => validateAssertionError(e, /Simulated issue in update/)\n\t\t\t\t);\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(true);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"SharedTreeVersioningTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeVersioningTests.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 'assert';\nimport { ITelemetryBaseEvent } from '@fluidframework/core-interfaces';\nimport { LoaderHeader } from '@fluidframework/container-definitions';\nimport { MockFluidDataStoreRuntime, validateAssertionError } from '@fluidframework/test-runtime-utils';\nimport { expect } from 'chai';\nimport { StableRange, StablePlace, BuildNode, Change } from '../../ChangeTypes.js';\nimport { Mutable } from '../../Common.js';\nimport { EditLog } from '../../EditLog.js';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities.js';\nimport { SharedTreeDiagnosticEvent } from '../../EventTypes.js';\nimport { NodeId, StableNodeId, TraitLabel } from '../../Identifiers.js';\nimport { SharedTreeOpType, SharedTreeUpdateOp, TreeNodeSequence, WriteFormat } from '../../persisted-types/index.js';\nimport { SharedTree } from '../../SharedTree.js';\nimport { TreeNodeHandle } from '../../TreeNodeHandle.js';\nimport { nilUuid } from '../../UuidUtilities.js';\nimport { applyTestEdits } from '../Summary.tests.js';\nimport { buildLeaf } from './TestNode.js';\nimport {\n\tapplyNoop,\n\tsetUpLocalServerTestSharedTree,\n\tsetUpTestTree,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n\tspyOnSubmittedOps,\n\ttestTrait,\n\twaitForSummary,\n} from './TestUtilities.js';\n\nfunction spyOnVersionChanges(tree: SharedTree): WriteFormat[] {\n\tconst versions: WriteFormat[] = [];\n\ttree.on(SharedTreeDiagnosticEvent.WriteVersionChanged, (version) => versions.push(version));\n\treturn versions;\n}\n/**\n * Runs a test suite for operations on `SharedTree` that depend on correct versioning.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeVersioningTests(\n\ttitle: string,\n\tsetUpTestSharedTree: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents\n) {\n\tdescribe(title, () => {\n\t\tconst oldVersion = WriteFormat.v0_0_2;\n\t\tconst newVersion = WriteFormat.v0_1_1;\n\t\tconst treeOptions = { localMode: false, writeFormat: oldVersion };\n\t\tconst secondTreeOptions = {\n\t\t\tid: 'secondTestSharedTree',\n\t\t\tlocalMode: false,\n\t\t\twriteFormat: newVersion,\n\t\t};\n\n\t\tit('defaults to latest version if no version is specified when creating factory', () => {\n\t\t\tconst sharedTree = SharedTree.getFactory().create(new MockFluidDataStoreRuntime(), 'SharedTree');\n\t\t\tconst writeFormats = Object.values(WriteFormat);\n\t\t\texpect(sharedTree.getWriteFormat()).to.equal(writeFormats[writeFormats.length - 1]);\n\t\t});\n\n\t\tit('only processes edit ops if they have the same version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The newer tree should have ignored the first edit\n\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\t\t});\n\n\t\tit('resubmits ops concurrent to an update op using the new format', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tconst rootStableId = testTree.stable.identifier;\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\ttree.applyEdit(...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right)));\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify even though one edit was applied, 2 edit ops were sent due to the version upgrade.\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\n\t\t\t// Verify both trees apply the updated op.\n\t\t\tconst handle = new TreeNodeHandle(tree.currentView, tree.convertToNodeId(rootStableId));\n\t\t\texpect(handle.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t\tconst handle2 = new TreeNodeHandle(newerTree.currentView, newerTree.convertToNodeId(rootStableId));\n\t\t\texpect(handle2.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle2.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t});\n\n\t\tit('throws if an edit op with a newer version than the write version is received', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit and expect it to throw\n\t\t\tapplyNoop(newerTree);\n\t\t\tassert.throws(\n\t\t\t\t() => containerRuntimeFactory.processAllMessages(),\n\t\t\t\t(e: Error) =>\n\t\t\t\t\tvalidateAssertionError(e, 'Newer op version received by a client that has yet to be updated.')\n\t\t\t);\n\t\t});\n\n\t\tit('ignores duplicate update ops', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\t\t\tconst { tree: newerTree2 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\t\t\tconst { tree: newerTree3 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\t\t\tconst versions2 = spyOnVersionChanges(newerTree2);\n\t\t\tconst versions3 = spyOnVersionChanges(newerTree3);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tnewerTree2.loadSummary(summary);\n\t\t\tnewerTree3.loadSummary(summary);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Each tree should have processed a version update once\n\t\t\texpect(versions).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions2).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions3).to.deep.equal([oldVersion, newVersion]);\n\t\t});\n\n\t\tit('maintains custom EditLog and LogViewer callbacks when updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\tlet editAdded = 0;\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\t(newerTree.edits as EditLog).registerEditAddedHandler(() => editAdded++);\n\n\t\t\texpect(versions).to.have.length(1);\n\t\t\texpect(versions[0]).to.equal(oldVersion);\n\n\t\t\t// Update occurs after the handler is added to the old edit log\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(versions).to.have.length(2);\n\t\t\texpect(versions[1]).to.equal(newVersion);\n\n\t\t\tconst additionalEdits = 5;\n\t\t\tfor (let i = 0; i < additionalEdits; i++) {\n\t\t\t\tapplyNoop(newerTree);\n\t\t\t}\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The edit added handler should run twice for each additional edit (once when applying locally and once when applying the sequenced edit)\n\t\t\texpect(editAdded).to.equal(additionalEdits * 2);\n\t\t});\n\n\t\tit('begins writing the new version only after updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst ops = spyOnSubmittedOps(newerContainerRuntimeFactory);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tapplyNoop(newerTree);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\tapplyNoop(newerTree);\n\n\t\t\texpect(ops.length).to.equal(4);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\t\t\t// Because the first op was submitted before the Update message was sequenced, it should use\n\t\t\t// the same write format as the loaded summary.\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t\texpect(ops[3].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('Existing client can update to a write version higher than the initialized write version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst versions = spyOnVersionChanges(tree);\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\t// Apply another arbitrary edit to the initial tree, which should now be using the new write version.\n\t\t\tapplyNoop(tree);\n\n\t\t\texpect(versions).to.eql([newVersion]);\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[0].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('New client can update to a write version higher than the initialized version on summary load', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a tree with older write version; it should recognize the document is already using\n\t\t\t// the new write version and use that instead.\n\t\t\tconst { tree: olderTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: oldVersion,\n\t\t\t});\n\n\t\t\tolderTree.loadSummary(summary);\n\t\t\tapplyNoop(olderTree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(ops.length).to.equal(2);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([SharedTreeOpType.Edit, SharedTreeOpType.Edit]);\n\t\t\texpect(ops.map((op) => op.version)).to.eql([newVersion, newVersion]);\n\t\t});\n\n\t\tit('can load a 0.1.1 summary and access the current view', () => {\n\t\t\t// This is a regression test for the logic initializing SharedTree's EditLog from a summary.\n\t\t\t// The 0.1.1 format omits `currentTree`, but EditLog should still tolerate synchronous access\n\t\t\t// of the first edit in the session (which is a single insert containing that tree).\n\t\t\tconst options: SharedTreeTestingOptions = {\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t\tlocalMode: false,\n\t\t\t};\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(options);\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst { tree: newTree } = setUpTestSharedTree({ containerRuntimeFactory, ...options });\n\t\t\tnewTree.loadSummary(summary);\n\t\t\texpect(newTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(() => newTree.currentView).to.not.throw();\n\t\t});\n\n\t\tit('upgrades properly when no edits are sent', async () => {\n\t\t\t// Starts in 0.0.2 (so no upgrade)\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\t\t});\n\n\t\tit('generates unique IDs after upgrading from 0.0.2', async () => {\n\t\t\tconst idCount = 100;\n\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tapplyTestEdits(tree);\n\n\t\t\tconst nodeIds = new Set<NodeId>();\n\t\t\tconst stableIds = new Set<StableNodeId>();\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\tnodeIds.add(id);\n\t\t\t\tstableIds.add(tree.convertToStableNodeId(id));\n\t\t\t}\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tawait setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\t// No IDs should be generated that were already generated before the update\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\texpect(nodeIds.has(id)).to.be.false;\n\t\t\t\texpect(stableIds.has(tree.convertToStableNodeId(id))).to.be.false;\n\t\t\t}\n\t\t\texpect(tree.equals(tree)).to.be.true;\n\t\t});\n\n\t\tit('converts IDs correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst idCount = 10;\n\t\t\tconst ids: [NodeId, StableNodeId][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree1.generateNodeId();\n\t\t\t\tids.push([id, tree1.convertToStableNodeId(id)]);\n\t\t\t}\n\n\t\t\t// Use some of the IDs in edits, but leave others unused.\n\t\t\t// They should all be valid and usable after upgrade.\n\t\t\tconst builds: Mutable<TreeNodeSequence<BuildNode>> = [];\n\t\t\tfor (let i = 1; i < ids.length; i += 2) {\n\t\t\t\tbuilds.push(buildLeaf(ids[i][0], i));\n\t\t\t}\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\tbuilds,\n\t\t\t\t\tStablePlace.atEndOf({ parent: tree1.currentView.root, label: 'foo' as TraitLabel })\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\t// To be removed ADO:5464\n\t\t\t\tfeatureGates: {\n\t\t\t\t\t'Fluid.Container.ForceWriteConnection': true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tconst view = tree1.currentView;\n\t\t\tfor (let i = 0; i < ids.length; i++) {\n\t\t\t\tconst [nodeIdBefore, stableIdBefore] = ids[i];\n\t\t\t\texpect(tree1.convertToStableNodeId(nodeIdBefore)).to.equal(stableIdBefore);\n\t\t\t\tif (i % 2 === 0) {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.false;\n\t\t\t\t} else {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.true;\n\t\t\t\t\tconst node = view.getViewNode(nodeIdBefore);\n\t\t\t\t\texpect(node.payload).to.equal(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\n\t\t\t// https://dev.azure.com/fluidframework/internal/_workitems/edit/3347\n\t\t\tconst events = testObjectProvider.logger.reportAndClearTrackedEvents();\n\t\t\texpect(events.unexpectedErrors.length).to.equal(1);\n\t\t\texpect(events.unexpectedErrors[0].eventName).to.equal(\n\t\t\t\t'fluid:telemetry:ContainerRuntime:Outbox:ReferenceSequenceNumberMismatch'\n\t\t\t);\n\t\t});\n\n\t\tit('interns strings correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst {\n\t\t\t\ttestObjectProvider,\n\t\t\t\ttree: tree1,\n\t\t\t\tcontainer,\n\t\t\t} = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t});\n\n\t\t\tconst internedDefinition = 'internedDefinition';\n\n\t\t\tconst id = tree1.generateNodeId();\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: id },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\t\t\ttree1.applyEdit(Change.delete(StableRange.only(id)));\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tconst summaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\theaders: { [LoaderHeader.version]: summaryVersion },\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: tree1.generateNodeId() },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(areRevisionViewsSemanticallyEqual(tree1.currentView, tree1, tree2.currentView, tree2)).to.be.true;\n\t\t}).timeout(10000);\n\n\t\tit('attributes all pre-upgrade IDs to the nil UUID after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst attributionId = tree.attributionId;\n\t\t\texpect(attributionId).to.equal(nilUuid);\n\t\t\tconst nodeId = tree.generateNodeId();\n\t\t\tconst stableNodeId = tree.convertToStableNodeId(nodeId);\n\n\t\t\ttree.applyEdit(Change.insertTree(buildLeaf(nodeId), StablePlace.atStartOf(testTrait(tree.currentView))));\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\t// To be removed ADO:5464\n\t\t\t\tfeatureGates: {\n\t\t\t\t\t'Fluid.Container.ForceWriteConnection': true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree.attributeNodeId(nodeId)).to.equal(attributionId);\n\t\t\texpect(tree2.attributeNodeId(tree2.convertToNodeId(stableNodeId))).to.equal(attributionId);\n\n\t\t\t// https://dev.azure.com/fluidframework/internal/_workitems/edit/3347\n\t\t\tconst events = testObjectProvider.logger.reportAndClearTrackedEvents();\n\t\t\texpect(events.unexpectedErrors.length).to.equal(1);\n\t\t\texpect(events.unexpectedErrors[0].eventName).to.equal(\n\t\t\t\t'fluid:telemetry:ContainerRuntime:Outbox:ReferenceSequenceNumberMismatch'\n\t\t\t);\n\t\t});\n\n\t\tdescribe('telemetry', () => {\n\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\tconst logger = { send: (event) => events.push(event) };\n\t\t\tbeforeEach(() => {\n\t\t\t\tevents.length = 0;\n\t\t\t});\n\n\t\t\tit('emits RequestVersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\texpect(\n\t\t\t\t\tevents.some(\n\t\t\t\t\t\t(event) =>\n\t\t\t\t\t\t\tevent.eventName === 'SharedTree:RequestVersionUpdate' &&\n\t\t\t\t\t\t\tevent.versionTo === newVersion &&\n\t\t\t\t\t\t\tevent.versionFrom === oldVersion &&\n\t\t\t\t\t\t\tevent.category === 'generic'\n\t\t\t\t\t)\n\t\t\t\t).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits VersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\tconst matchesVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_end' &&\n\t\t\t\t\tevent.version === newVersion &&\n\t\t\t\t\tevent.category === 'performance' &&\n\t\t\t\t\ttypeof event.duration === 'number';\n\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(false);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits error events on VersionUpdate failure', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst op: SharedTreeUpdateOp = {\n\t\t\t\t\ttype: SharedTreeOpType.Update,\n\t\t\t\t\tversion: newVersion,\n\t\t\t\t};\n\t\t\t\tcontainerRuntimeFactory.pushMessage({ contents: op });\n\t\t\t\t(tree.edits as EditLog).getLocalEdits = () => {\n\t\t\t\t\tthrow new Error('Simulated issue in update');\n\t\t\t\t};\n\t\t\t\tconst matchesFailedVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_cancel' &&\n\t\t\t\t\tevent.category === 'error' &&\n\t\t\t\t\tevent.error === 'Simulated issue in update';\n\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(false);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => containerRuntimeFactory.processAllMessages(),\n\t\t\t\t\t(e: Error) => validateAssertionError(e, /Simulated issue in update/)\n\t\t\t\t);\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(true);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
@@ -6,12 +6,12 @@ import { join } from 'path';
6
6
  import * as fs from 'fs';
7
7
  import { takeAsync } from '@fluid-private/stochastic-test-utils';
8
8
  import { benchmark, BenchmarkType } from '@fluid-tools/benchmark';
9
- import { WriteFormat } from '../../persisted-types';
10
- import { performFuzzActions } from '../fuzz/SharedTreeFuzzTests';
11
- import { makeOpGenerator } from '../fuzz/Generators';
12
- import { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';
13
- import { setUpLocalServerTestSharedTree, setUpTestSharedTree, testDocumentsPathBase } from './TestUtilities';
14
- import { expectAssert } from './TestCommon';
9
+ import { WriteFormat } from '../../persisted-types/index.js';
10
+ import { performFuzzActions } from '../fuzz/SharedTreeFuzzTests.js';
11
+ import { makeOpGenerator } from '../fuzz/Generators.js';
12
+ import { areRevisionViewsSemanticallyEqual } from '../../EditUtilities.js';
13
+ import { setUpLocalServerTestSharedTree, setUpTestSharedTree, testDocumentsPathBase } from './TestUtilities.js';
14
+ import { expectAssert } from './TestCommon.js';
15
15
  const directory = join(testDocumentsPathBase, 'summary-load-perf-tests');
16
16
  /**
17
17
  * Runs a test suite for summary load perf on `SharedTree`.
@@ -1 +1 @@
1
- {"version":3,"file":"SummaryLoadPerfTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SummaryLoadPerfTests.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 { join } from 'path';\nimport * as fs from 'fs';\nimport { takeAsync } from '@fluid-private/stochastic-test-utils';\nimport { benchmark, BenchmarkType } from '@fluid-tools/benchmark';\nimport { SharedTree } from '../../SharedTree';\nimport { WriteFormat } from '../../persisted-types';\nimport { performFuzzActions } from '../fuzz/SharedTreeFuzzTests';\nimport { makeOpGenerator } from '../fuzz/Generators';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { setUpLocalServerTestSharedTree, setUpTestSharedTree, testDocumentsPathBase } from './TestUtilities';\nimport { expectAssert } from './TestCommon';\n\nconst directory = join(testDocumentsPathBase, 'summary-load-perf-tests');\n\n/**\n * Runs a test suite for summary load perf on `SharedTree`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSummaryLoadPerfTests(title: string): void {\n\tdescribe(title, () => {\n\t\t// Re-enable this test for an easy way to write the test summary files to disk\n\t\tit.skip('save files to disk', async () => {\n\t\t\tawait writeSummaryTestTrees();\n\t\t});\n\n\t\tconst {\n\t\t\tsummaryFileWithHistory_0_0_2,\n\t\t\tsummaryFileNoHistory_0_0_2,\n\t\t\tsummaryFileWithHistory_0_1_1,\n\t\t\tsummaryFileNoHistory_0_1_1,\n\t\t\t// blobsFile: string;\n\t\t} = loadSummaryTestFiles();\n\n\t\tconst tests = [\n\t\t\t{ title: 'load 0.0.2 format without history', file: summaryFileNoHistory_0_0_2 },\n\t\t\t{ title: 'load 0.0.2 format with history', file: summaryFileWithHistory_0_0_2 },\n\t\t\t{ title: 'load 0.1.1 format without history', file: summaryFileNoHistory_0_1_1 },\n\t\t\t{ title: 'load 0.1.1 format with history', file: summaryFileWithHistory_0_1_1 },\n\t\t];\n\n\t\tfor (const { title, file } of tests) {\n\t\t\tbenchmark({\n\t\t\t\ttype: BenchmarkType.Measurement,\n\t\t\t\ttitle,\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\tconst { tree } = setUpTestSharedTree({ writeFormat: WriteFormat.v0_0_2 });\n\t\t\t\t\ttree.loadSerializedSummary(file);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t});\n}\n\nasync function generateRandomTree(\n\tseed: number,\n\tmaxTreeSize: number,\n\twriteFormat: WriteFormat,\n\tsummarizeHistory: boolean\n): Promise<SharedTree> {\n\tconst generator = takeAsync(\n\t\t1000,\n\t\tmakeOpGenerator({\n\t\t\teditConfig: { maxTreeSize },\n\t\t\tjoinConfig: {\n\t\t\t\twriteFormat: [writeFormat],\n\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\tmaximumActiveCollaborators: 2,\n\t\t\t\tmaximumPassiveCollaborators: 0,\n\t\t\t},\n\t\t})\n\t);\n\tconst { testObjectProvider } = await performFuzzActions(generator, seed, true);\n\tconst { tree: finalTree } = await setUpLocalServerTestSharedTree({\n\t\ttestObjectProvider,\n\t\tsummarizeHistory,\n\t\twriteFormat,\n\t});\n\tawait testObjectProvider.ensureSynchronized();\n\treturn finalTree;\n}\n\nasync function writeSummaryTestTrees(): Promise<void> {\n\tif (!fs.existsSync(directory)) {\n\t\tfs.mkdirSync(directory);\n\t}\n\n\tconst seed = 24601;\n\tconst tree002 = await generateRandomTree(seed, 1000, WriteFormat.v0_0_2, true);\n\tconst tree011 = await generateRandomTree(seed, 1000, WriteFormat.v0_1_1, true);\n\tconst tree002NoHistory = await generateRandomTree(seed, 1000, WriteFormat.v0_0_2, false);\n\tconst tree011NoHistory = await generateRandomTree(seed, 1000, WriteFormat.v0_1_1, false);\n\n\texpectAssert(areRevisionViewsSemanticallyEqual(tree002.currentView, tree002, tree011.currentView, tree011));\n\texpectAssert(\n\t\tareRevisionViewsSemanticallyEqual(tree002.currentView, tree002, tree002NoHistory.currentView, tree002NoHistory)\n\t);\n\texpectAssert(\n\t\tareRevisionViewsSemanticallyEqual(tree011.currentView, tree011, tree011NoHistory.currentView, tree011NoHistory)\n\t);\n\tconst { promises: fsP } = fs;\n\tawait fsP.writeFile(join(directory, 'summary-0-0-2.json'), tree002.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-0-1-1.json'), tree011.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-no-history-0-0-2.json'), tree002NoHistory.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-no-history-0-1-1.json'), tree011NoHistory.saveSerializedSummary());\n}\n\nfunction loadSummaryTestFiles(): {\n\tsummaryFileWithHistory_0_0_2: string;\n\tsummaryFileNoHistory_0_0_2: string;\n\tsummaryFileWithHistory_0_1_1: string;\n\tsummaryFileNoHistory_0_1_1: string;\n} {\n\tconst readFile = (name: string): string => {\n\t\tconst contents = fs.readFileSync(join(directory, name), 'utf-8');\n\t\t// Round-trip the file so that performance testing summary doesn't require parsing unnecessary/unrealistic whitespace\n\t\treturn JSON.stringify(JSON.parse(contents));\n\t};\n\tconst summaryFileWithHistory_0_0_2 = readFile('summary-0-0-2.json');\n\tconst summaryFileNoHistory_0_0_2 = readFile('summary-no-history-0-0-2.json');\n\tconst summaryFileWithHistory_0_1_1 = readFile('summary-0-1-1.json');\n\tconst summaryFileNoHistory_0_1_1 = readFile('summary-no-history-0-1-1.json');\n\n\t// Note: We don't bother writing/reading a \"blobs\" file for this test suite because loading a serialized summary\n\t// with history should never involve attempting to get any of those blobs.\n\t// This *is* a fair comparison from a perf perspective b/c the whole point of chunking edit history is to decrease\n\t// summary size for potentially unused edit information.\n\n\treturn {\n\t\tsummaryFileWithHistory_0_0_2,\n\t\tsummaryFileNoHistory_0_0_2,\n\t\tsummaryFileWithHistory_0_1_1,\n\t\tsummaryFileNoHistory_0_1_1,\n\t};\n}\n"]}
1
+ {"version":3,"file":"SummaryLoadPerfTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SummaryLoadPerfTests.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 { join } from 'path';\nimport * as fs from 'fs';\nimport { takeAsync } from '@fluid-private/stochastic-test-utils';\nimport { benchmark, BenchmarkType } from '@fluid-tools/benchmark';\nimport { SharedTree } from '../../SharedTree.js';\nimport { WriteFormat } from '../../persisted-types/index.js';\nimport { performFuzzActions } from '../fuzz/SharedTreeFuzzTests.js';\nimport { makeOpGenerator } from '../fuzz/Generators.js';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities.js';\nimport { setUpLocalServerTestSharedTree, setUpTestSharedTree, testDocumentsPathBase } from './TestUtilities.js';\nimport { expectAssert } from './TestCommon.js';\n\nconst directory = join(testDocumentsPathBase, 'summary-load-perf-tests');\n\n/**\n * Runs a test suite for summary load perf on `SharedTree`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSummaryLoadPerfTests(title: string): void {\n\tdescribe(title, () => {\n\t\t// Re-enable this test for an easy way to write the test summary files to disk\n\t\tit.skip('save files to disk', async () => {\n\t\t\tawait writeSummaryTestTrees();\n\t\t});\n\n\t\tconst {\n\t\t\tsummaryFileWithHistory_0_0_2,\n\t\t\tsummaryFileNoHistory_0_0_2,\n\t\t\tsummaryFileWithHistory_0_1_1,\n\t\t\tsummaryFileNoHistory_0_1_1,\n\t\t\t// blobsFile: string;\n\t\t} = loadSummaryTestFiles();\n\n\t\tconst tests = [\n\t\t\t{ title: 'load 0.0.2 format without history', file: summaryFileNoHistory_0_0_2 },\n\t\t\t{ title: 'load 0.0.2 format with history', file: summaryFileWithHistory_0_0_2 },\n\t\t\t{ title: 'load 0.1.1 format without history', file: summaryFileNoHistory_0_1_1 },\n\t\t\t{ title: 'load 0.1.1 format with history', file: summaryFileWithHistory_0_1_1 },\n\t\t];\n\n\t\tfor (const { title, file } of tests) {\n\t\t\tbenchmark({\n\t\t\t\ttype: BenchmarkType.Measurement,\n\t\t\t\ttitle,\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\tconst { tree } = setUpTestSharedTree({ writeFormat: WriteFormat.v0_0_2 });\n\t\t\t\t\ttree.loadSerializedSummary(file);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t});\n}\n\nasync function generateRandomTree(\n\tseed: number,\n\tmaxTreeSize: number,\n\twriteFormat: WriteFormat,\n\tsummarizeHistory: boolean\n): Promise<SharedTree> {\n\tconst generator = takeAsync(\n\t\t1000,\n\t\tmakeOpGenerator({\n\t\t\teditConfig: { maxTreeSize },\n\t\t\tjoinConfig: {\n\t\t\t\twriteFormat: [writeFormat],\n\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\tmaximumActiveCollaborators: 2,\n\t\t\t\tmaximumPassiveCollaborators: 0,\n\t\t\t},\n\t\t})\n\t);\n\tconst { testObjectProvider } = await performFuzzActions(generator, seed, true);\n\tconst { tree: finalTree } = await setUpLocalServerTestSharedTree({\n\t\ttestObjectProvider,\n\t\tsummarizeHistory,\n\t\twriteFormat,\n\t});\n\tawait testObjectProvider.ensureSynchronized();\n\treturn finalTree;\n}\n\nasync function writeSummaryTestTrees(): Promise<void> {\n\tif (!fs.existsSync(directory)) {\n\t\tfs.mkdirSync(directory);\n\t}\n\n\tconst seed = 24601;\n\tconst tree002 = await generateRandomTree(seed, 1000, WriteFormat.v0_0_2, true);\n\tconst tree011 = await generateRandomTree(seed, 1000, WriteFormat.v0_1_1, true);\n\tconst tree002NoHistory = await generateRandomTree(seed, 1000, WriteFormat.v0_0_2, false);\n\tconst tree011NoHistory = await generateRandomTree(seed, 1000, WriteFormat.v0_1_1, false);\n\n\texpectAssert(areRevisionViewsSemanticallyEqual(tree002.currentView, tree002, tree011.currentView, tree011));\n\texpectAssert(\n\t\tareRevisionViewsSemanticallyEqual(tree002.currentView, tree002, tree002NoHistory.currentView, tree002NoHistory)\n\t);\n\texpectAssert(\n\t\tareRevisionViewsSemanticallyEqual(tree011.currentView, tree011, tree011NoHistory.currentView, tree011NoHistory)\n\t);\n\tconst { promises: fsP } = fs;\n\tawait fsP.writeFile(join(directory, 'summary-0-0-2.json'), tree002.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-0-1-1.json'), tree011.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-no-history-0-0-2.json'), tree002NoHistory.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-no-history-0-1-1.json'), tree011NoHistory.saveSerializedSummary());\n}\n\nfunction loadSummaryTestFiles(): {\n\tsummaryFileWithHistory_0_0_2: string;\n\tsummaryFileNoHistory_0_0_2: string;\n\tsummaryFileWithHistory_0_1_1: string;\n\tsummaryFileNoHistory_0_1_1: string;\n} {\n\tconst readFile = (name: string): string => {\n\t\tconst contents = fs.readFileSync(join(directory, name), 'utf-8');\n\t\t// Round-trip the file so that performance testing summary doesn't require parsing unnecessary/unrealistic whitespace\n\t\treturn JSON.stringify(JSON.parse(contents));\n\t};\n\tconst summaryFileWithHistory_0_0_2 = readFile('summary-0-0-2.json');\n\tconst summaryFileNoHistory_0_0_2 = readFile('summary-no-history-0-0-2.json');\n\tconst summaryFileWithHistory_0_1_1 = readFile('summary-0-1-1.json');\n\tconst summaryFileNoHistory_0_1_1 = readFile('summary-no-history-0-1-1.json');\n\n\t// Note: We don't bother writing/reading a \"blobs\" file for this test suite because loading a serialized summary\n\t// with history should never involve attempting to get any of those blobs.\n\t// This *is* a fair comparison from a perf perspective b/c the whole point of chunking edit history is to decrease\n\t// summary size for potentially unused edit information.\n\n\treturn {\n\t\tsummaryFileWithHistory_0_0_2,\n\t\tsummaryFileNoHistory_0_0_2,\n\t\tsummaryFileWithHistory_0_1_1,\n\t\tsummaryFileNoHistory_0_1_1,\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 { LocalServerSharedTreeTestingComponents, LocalServerSharedTreeTestingOptions } from './TestUtilities';
5
+ import { LocalServerSharedTreeTestingComponents, LocalServerSharedTreeTestingOptions } from './TestUtilities.js';
6
6
  /**
7
7
  * Runs a test suite for summaries on `SharedTree` that verifies their sizes do not exceed the defined limits.
8
8
  * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.
@@ -1 +1 @@
1
- {"version":3,"file":"SummarySizeTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SummarySizeTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EACN,sCAAsC,EACtC,mCAAmC,EAEnC,MAAM,iBAAiB,CAAC;AAwFzB;;;GAGG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,MAAM,EACb,8BAA8B,EAAE,CAC/B,OAAO,EAAE,mCAAmC,KACxC,OAAO,CAAC,sCAAsC,CAAC,QAuDpD"}
1
+ {"version":3,"file":"SummarySizeTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SummarySizeTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EACN,sCAAsC,EACtC,mCAAmC,EAEnC,MAAM,oBAAoB,CAAC;AAwF5B;;;GAGG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,MAAM,EACb,8BAA8B,EAAE,CAC/B,OAAO,EAAE,mCAAmC,KACxC,OAAO,CAAC,sCAAsC,CAAC,QAuDpD"}
@@ -4,11 +4,11 @@
4
4
  */
5
5
  import { IsoBuffer } from '@fluid-internal/client-utils';
6
6
  import { expect } from 'chai';
7
- import { fail } from '../../Common';
8
- import { Change, StablePlace, StableRange } from '../../ChangeTypes';
9
- import { revert } from '../../HistoryEditFactory';
10
- import { IdCompressor } from '../../id-compressor';
11
- import { setUpTestTree, } from './TestUtilities';
7
+ import { fail } from '../../Common.js';
8
+ import { Change, StablePlace, StableRange } from '../../ChangeTypes.js';
9
+ import { revert } from '../../HistoryEditFactory.js';
10
+ import { IdCompressor } from '../../id-compressor/index.js';
11
+ import { setUpTestTree, } from './TestUtilities.js';
12
12
  /**
13
13
  * Summary size tests where `edits` are applied and checked against the `expectedSize`.
14
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"SummarySizeTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SummarySizeTests.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 { IsoBuffer } from '@fluid-internal/client-utils';\nimport { TestObjectProvider } from '@fluidframework/test-utils';\nimport { expect } from 'chai';\nimport { fail } from '../../Common';\nimport { Definition, EditId, SessionId, TraitLabel } from '../../Identifiers';\nimport { Change, StablePlace, StableRange } from '../../ChangeTypes';\nimport { SharedTree } from '../../SharedTree';\nimport { ChangeInternal, ChangeNode, Edit, TraitMap } from '../../persisted-types';\nimport { revert } from '../../HistoryEditFactory';\nimport { IdCompressor } from '../../id-compressor';\nimport { TestTree } from './TestNode';\nimport {\n\tLocalServerSharedTreeTestingComponents,\n\tLocalServerSharedTreeTestingOptions,\n\tsetUpTestTree,\n} from './TestUtilities';\n\n/**\n * An entry into the summarySizeTests list.\n */\ninterface SummarySizeTestEntry {\n\t/** Helper to obtain the list of edits to apply to the SharedTree. */\n\tedits: (testTree: TestTree) => Change[][];\n\t/** Expected size of the summary of the SharedTree after applying the `edits`. */\n\texpectedSize: number;\n\t/** Description for the test and the edits applied. */\n\tdescription: string;\n\t/** Flag to determine whether to revert the applied edits or not. */\n\trevertEdits?: boolean;\n}\n\n/**\n * Summary size tests where `edits` are applied and checked against the `expectedSize`.\n */\nconst summarySizeTests: SummarySizeTestEntry[] = [\n\t{\n\t\tedits: (testTree) => [\n\t\t\tChange.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.right.traitLocation)),\n\t\t],\n\t\texpectedSize: 1163,\n\t\tdescription: 'when inserting a node',\n\t},\n\t{\n\t\tedits: (testTree) => {\n\t\t\tconst edits: Change[][] = [];\n\t\t\tfor (let i = 0; i < 50; i++) {\n\t\t\t\tedits.push(Change.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.right.traitLocation)));\n\t\t\t}\n\t\t\treturn edits;\n\t\t},\n\t\texpectedSize: 12924,\n\t\tdescription: 'with 50 inserts',\n\t},\n\t{\n\t\tedits: (testTree) => {\n\t\t\tconst node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\treturn [\n\t\t\t\tChange.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.right.traitLocation)),\n\t\t\t\t[Change.setPayload(node.identifier, 10)],\n\t\t\t];\n\t\t},\n\t\texpectedSize: 1302,\n\t\tdescription: 'when inserting and setting a node',\n\t},\n\t{\n\t\tedits: (testTree) => {\n\t\t\tconst node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\treturn [\n\t\t\t\tChange.insertTree(node, StablePlace.atEndOf(testTree.right.traitLocation)),\n\t\t\t\t[Change.delete(StableRange.only(node))],\n\t\t\t];\n\t\t},\n\t\texpectedSize: 1355,\n\t\tdescription: 'when inserting and deleting a node',\n\t},\n\t{\n\t\tedits: (testTree) => [\n\t\t\tChange.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.right.traitLocation)),\n\t\t],\n\t\texpectedSize: 1355,\n\t\tdescription: 'when inserting and reverting a node',\n\t\trevertEdits: true,\n\t},\n\t{\n\t\tedits: (testTree) => [\n\t\t\tChange.insertTree(makeLargeTestTree(testTree), StablePlace.atStartOf(testTree.right.traitLocation)),\n\t\t],\n\t\texpectedSize: 77067,\n\t\tdescription: 'when inserting a large tree',\n\t},\n\t{\n\t\tedits: (testTree) => {\n\t\t\tconst largeTree = makeLargeTestTree(testTree);\n\t\t\treturn [\n\t\t\t\tChange.insertTree(largeTree, StablePlace.atStartOf(testTree.right.traitLocation)),\n\t\t\t\tChange.move(StableRange.only(largeTree), StablePlace.atEndOf(testTree.left.traitLocation)),\n\t\t\t];\n\t\t},\n\t\texpectedSize: 77375,\n\t\tdescription: 'when inserting and moving a large tree',\n\t},\n];\n\n/**\n * Runs a test suite for summaries on `SharedTree` that verifies their sizes do not exceed the defined limits.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSummarySizeTests(\n\ttitle: string,\n\tsetUpLocalServerTestSharedTree: (\n\t\toptions: LocalServerSharedTreeTestingOptions\n\t) => Promise<LocalServerSharedTreeTestingComponents>\n) {\n\tdescribe(title, () => {\n\t\tconst setupEditId = '9406d301-7449-48a5-b2ea-9be637b0c6e4' as EditId;\n\n\t\tlet tree: SharedTree;\n\t\tlet testTree: TestTree;\n\t\tlet testObjectProvider: TestObjectProvider;\n\n\t\t// Resets the tree before each test\n\t\tbeforeEach(async () => {\n\t\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\t\tsetupEditId,\n\t\t\t});\n\t\t\ttree = testingComponents.tree;\n\t\t\ttestTree = setUpTestTree(tree);\n\t\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\t\t});\n\n\t\tasync function checkSummarySize(\n\t\t\tchanges: Change[][],\n\t\t\texpectedSummarySize: number,\n\t\t\trevertEdits = false\n\t\t): Promise<void> {\n\t\t\tconst edits = changes.map((e) => tree.applyEdit(...e));\n\n\t\t\tif (revertEdits) {\n\t\t\t\tfor (let i = changes.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst editIndex = tree.edits.getIndexOfId(edits[i].id);\n\t\t\t\t\tconst edit =\n\t\t\t\t\t\t(tree.edits.tryGetEditAtIndex(editIndex) as unknown as Edit<ChangeInternal>) ??\n\t\t\t\t\t\tfail('edit not found');\n\t\t\t\t\tconst reverted = revert(edit.changes, tree.logViewer.getRevisionViewInMemory(editIndex));\n\t\t\t\t\tif (reverted !== undefined) {\n\t\t\t\t\t\ttree.applyEditInternal(reverted);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Wait for the ops to to be submitted and processed across the containers.\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\tconst summary = tree.saveSerializedSummary();\n\t\t\tconst summarySize = IsoBuffer.from(summary).byteLength;\n\n\t\t\t// TODO: make lte when 0.1.1 is settled\n\t\t\texpect(summarySize).to.equal(expectedSummarySize);\n\t\t}\n\n\t\tfor (const { edits, expectedSize, description, revertEdits } of summarySizeTests) {\n\t\t\tit(`does not exceed ${expectedSize} ${description}`, async () => {\n\t\t\t\tawait checkSummarySize(edits(testTree), expectedSize, revertEdits);\n\t\t\t});\n\t\t}\n\t});\n}\n\nfunction makeLargeTestTree(testTree: TestTree, nodesPerTrait = 10, traitsPerLevel = 2, levels = 2): ChangeNode {\n\tconst specialSession = '9f858704-89f6-4923-abf3-14fc986e717f' as SessionId;\n\t// ensure uuids for traits and definitions are stable\n\tconst compressor = new IdCompressor(specialSession, 0);\n\tconst uuidv4 = (): string => compressor.decompress(compressor.generateCompressedId());\n\tconst definition = uuidv4() as Definition;\n\n\tconst traitLabels: TraitLabel[] = [];\n\tfor (let i = 0; i < traitsPerLevel; i++) {\n\t\ttraitLabels.push(uuidv4() as TraitLabel);\n\t}\n\n\treturn {\n\t\tdefinition,\n\t\tidentifier: testTree.generateNodeId(),\n\t\ttraits: generateTraits(testTree, definition, traitLabels, nodesPerTrait, levels),\n\t};\n}\n\nfunction generateTraits(\n\ttestTree: TestTree,\n\tdefinition: Definition,\n\ttraitLabels: TraitLabel[],\n\tnodesPerTrait: number,\n\ttotalLevels: number,\n\tlevel = 0\n): TraitMap<ChangeNode> {\n\tconst traits = {};\n\n\ttraitLabels.forEach((label) => {\n\t\ttraits[label] = Array.from(Array(nodesPerTrait).keys()).map(() => {\n\t\t\treturn {\n\t\t\t\tdefinition,\n\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\ttraits:\n\t\t\t\t\tlevel < totalLevels\n\t\t\t\t\t\t? generateTraits(testTree, definition, traitLabels, nodesPerTrait, totalLevels, level + 1)\n\t\t\t\t\t\t: {},\n\t\t\t};\n\t\t});\n\t});\n\n\treturn traits;\n}\n"]}
1
+ {"version":3,"file":"SummarySizeTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SummarySizeTests.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 { IsoBuffer } from '@fluid-internal/client-utils';\nimport { TestObjectProvider } from '@fluidframework/test-utils';\nimport { expect } from 'chai';\nimport { fail } from '../../Common.js';\nimport { Definition, EditId, SessionId, TraitLabel } from '../../Identifiers.js';\nimport { Change, StablePlace, StableRange } from '../../ChangeTypes.js';\nimport { SharedTree } from '../../SharedTree.js';\nimport { ChangeInternal, ChangeNode, Edit, TraitMap } from '../../persisted-types/index.js';\nimport { revert } from '../../HistoryEditFactory.js';\nimport { IdCompressor } from '../../id-compressor/index.js';\nimport { TestTree } from './TestNode.js';\nimport {\n\tLocalServerSharedTreeTestingComponents,\n\tLocalServerSharedTreeTestingOptions,\n\tsetUpTestTree,\n} from './TestUtilities.js';\n\n/**\n * An entry into the summarySizeTests list.\n */\ninterface SummarySizeTestEntry {\n\t/** Helper to obtain the list of edits to apply to the SharedTree. */\n\tedits: (testTree: TestTree) => Change[][];\n\t/** Expected size of the summary of the SharedTree after applying the `edits`. */\n\texpectedSize: number;\n\t/** Description for the test and the edits applied. */\n\tdescription: string;\n\t/** Flag to determine whether to revert the applied edits or not. */\n\trevertEdits?: boolean;\n}\n\n/**\n * Summary size tests where `edits` are applied and checked against the `expectedSize`.\n */\nconst summarySizeTests: SummarySizeTestEntry[] = [\n\t{\n\t\tedits: (testTree) => [\n\t\t\tChange.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.right.traitLocation)),\n\t\t],\n\t\texpectedSize: 1163,\n\t\tdescription: 'when inserting a node',\n\t},\n\t{\n\t\tedits: (testTree) => {\n\t\t\tconst edits: Change[][] = [];\n\t\t\tfor (let i = 0; i < 50; i++) {\n\t\t\t\tedits.push(Change.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.right.traitLocation)));\n\t\t\t}\n\t\t\treturn edits;\n\t\t},\n\t\texpectedSize: 12924,\n\t\tdescription: 'with 50 inserts',\n\t},\n\t{\n\t\tedits: (testTree) => {\n\t\t\tconst node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\treturn [\n\t\t\t\tChange.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.right.traitLocation)),\n\t\t\t\t[Change.setPayload(node.identifier, 10)],\n\t\t\t];\n\t\t},\n\t\texpectedSize: 1302,\n\t\tdescription: 'when inserting and setting a node',\n\t},\n\t{\n\t\tedits: (testTree) => {\n\t\t\tconst node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\treturn [\n\t\t\t\tChange.insertTree(node, StablePlace.atEndOf(testTree.right.traitLocation)),\n\t\t\t\t[Change.delete(StableRange.only(node))],\n\t\t\t];\n\t\t},\n\t\texpectedSize: 1355,\n\t\tdescription: 'when inserting and deleting a node',\n\t},\n\t{\n\t\tedits: (testTree) => [\n\t\t\tChange.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.right.traitLocation)),\n\t\t],\n\t\texpectedSize: 1355,\n\t\tdescription: 'when inserting and reverting a node',\n\t\trevertEdits: true,\n\t},\n\t{\n\t\tedits: (testTree) => [\n\t\t\tChange.insertTree(makeLargeTestTree(testTree), StablePlace.atStartOf(testTree.right.traitLocation)),\n\t\t],\n\t\texpectedSize: 77067,\n\t\tdescription: 'when inserting a large tree',\n\t},\n\t{\n\t\tedits: (testTree) => {\n\t\t\tconst largeTree = makeLargeTestTree(testTree);\n\t\t\treturn [\n\t\t\t\tChange.insertTree(largeTree, StablePlace.atStartOf(testTree.right.traitLocation)),\n\t\t\t\tChange.move(StableRange.only(largeTree), StablePlace.atEndOf(testTree.left.traitLocation)),\n\t\t\t];\n\t\t},\n\t\texpectedSize: 77375,\n\t\tdescription: 'when inserting and moving a large tree',\n\t},\n];\n\n/**\n * Runs a test suite for summaries on `SharedTree` that verifies their sizes do not exceed the defined limits.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSummarySizeTests(\n\ttitle: string,\n\tsetUpLocalServerTestSharedTree: (\n\t\toptions: LocalServerSharedTreeTestingOptions\n\t) => Promise<LocalServerSharedTreeTestingComponents>\n) {\n\tdescribe(title, () => {\n\t\tconst setupEditId = '9406d301-7449-48a5-b2ea-9be637b0c6e4' as EditId;\n\n\t\tlet tree: SharedTree;\n\t\tlet testTree: TestTree;\n\t\tlet testObjectProvider: TestObjectProvider;\n\n\t\t// Resets the tree before each test\n\t\tbeforeEach(async () => {\n\t\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\t\tsetupEditId,\n\t\t\t});\n\t\t\ttree = testingComponents.tree;\n\t\t\ttestTree = setUpTestTree(tree);\n\t\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\t\t});\n\n\t\tasync function checkSummarySize(\n\t\t\tchanges: Change[][],\n\t\t\texpectedSummarySize: number,\n\t\t\trevertEdits = false\n\t\t): Promise<void> {\n\t\t\tconst edits = changes.map((e) => tree.applyEdit(...e));\n\n\t\t\tif (revertEdits) {\n\t\t\t\tfor (let i = changes.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst editIndex = tree.edits.getIndexOfId(edits[i].id);\n\t\t\t\t\tconst edit =\n\t\t\t\t\t\t(tree.edits.tryGetEditAtIndex(editIndex) as unknown as Edit<ChangeInternal>) ??\n\t\t\t\t\t\tfail('edit not found');\n\t\t\t\t\tconst reverted = revert(edit.changes, tree.logViewer.getRevisionViewInMemory(editIndex));\n\t\t\t\t\tif (reverted !== undefined) {\n\t\t\t\t\t\ttree.applyEditInternal(reverted);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Wait for the ops to to be submitted and processed across the containers.\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\tconst summary = tree.saveSerializedSummary();\n\t\t\tconst summarySize = IsoBuffer.from(summary).byteLength;\n\n\t\t\t// TODO: make lte when 0.1.1 is settled\n\t\t\texpect(summarySize).to.equal(expectedSummarySize);\n\t\t}\n\n\t\tfor (const { edits, expectedSize, description, revertEdits } of summarySizeTests) {\n\t\t\tit(`does not exceed ${expectedSize} ${description}`, async () => {\n\t\t\t\tawait checkSummarySize(edits(testTree), expectedSize, revertEdits);\n\t\t\t});\n\t\t}\n\t});\n}\n\nfunction makeLargeTestTree(testTree: TestTree, nodesPerTrait = 10, traitsPerLevel = 2, levels = 2): ChangeNode {\n\tconst specialSession = '9f858704-89f6-4923-abf3-14fc986e717f' as SessionId;\n\t// ensure uuids for traits and definitions are stable\n\tconst compressor = new IdCompressor(specialSession, 0);\n\tconst uuidv4 = (): string => compressor.decompress(compressor.generateCompressedId());\n\tconst definition = uuidv4() as Definition;\n\n\tconst traitLabels: TraitLabel[] = [];\n\tfor (let i = 0; i < traitsPerLevel; i++) {\n\t\ttraitLabels.push(uuidv4() as TraitLabel);\n\t}\n\n\treturn {\n\t\tdefinition,\n\t\tidentifier: testTree.generateNodeId(),\n\t\ttraits: generateTraits(testTree, definition, traitLabels, nodesPerTrait, levels),\n\t};\n}\n\nfunction generateTraits(\n\ttestTree: TestTree,\n\tdefinition: Definition,\n\ttraitLabels: TraitLabel[],\n\tnodesPerTrait: number,\n\ttotalLevels: number,\n\tlevel = 0\n): TraitMap<ChangeNode> {\n\tconst traits = {};\n\n\ttraitLabels.forEach((label) => {\n\t\ttraits[label] = Array.from(Array(nodesPerTrait).keys()).map(() => {\n\t\t\treturn {\n\t\t\t\tdefinition,\n\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\ttraits:\n\t\t\t\t\tlevel < totalLevels\n\t\t\t\t\t\t? generateTraits(testTree, definition, traitLabels, nodesPerTrait, totalLevels, level + 1)\n\t\t\t\t\t\t: {},\n\t\t\t};\n\t\t});\n\t});\n\n\treturn traits;\n}\n"]}
@@ -2,12 +2,12 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { BuildTreeNode } from '../../ChangeTypes';
6
- import { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers';
7
- import { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';
8
- import { BuildNodeInternal, ChangeNode, Payload, TraitLocationInternal_0_0_2, TraitMap, TreeNode } from '../../persisted-types';
9
- import { RevisionView } from '../../RevisionView';
10
- import { TraitLocation } from '../../TreeView';
5
+ import { BuildTreeNode } from '../../ChangeTypes.js';
6
+ import { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers.js';
7
+ import { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities.js';
8
+ import { BuildNodeInternal, ChangeNode, Payload, TraitLocationInternal_0_0_2, TraitMap, TreeNode } from '../../persisted-types/index.js';
9
+ import { RevisionView } from '../../RevisionView.js';
10
+ import { TraitLocation } from '../../TreeView.js';
11
11
  /** A legacy format of a `TestNode` */
12
12
  export type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;
13
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TestNode.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3G,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACN,iBAAiB,EACjB,UAAU,EACV,OAAO,EAEP,2BAA2B,EAC3B,QAAQ,EACR,QAAQ,EACR,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CAAE,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACvD,MAAM,EAAE,2BAA2B,CAAC;IACpC,iFAAiF;IACjF,SAAS,CAAC,WAAW,EAAE,eAAe,GAAG,iBAAiB,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3D,2DAA2D;IAC3D,UAAU,EAAE,UAAU,CAAC;IACvB,oDAAoD;IACpD,aAAa,EAAE,iBAAiB,CAAC;IACjC,mCAAmC;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,cAAc,CAAC;IACvB,4EAA4E;IAC5E,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,CAAC;IAClD,wCAAwC;IACxC,YAAY,IAAI,UAAU,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAS,SAAQ,QAAQ,EAAE,aAAa,EAAE,gBAAgB,CAAC,aAAa,CAAC;IACzF,0BAA0B;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,2BAA2B;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IACtE,8FAA8F;IAC9F,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/D;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;CACjG;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAY7C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAZlC,gBAAuB,UAAU,aAAwB;IACzD,gBAAuB,UAAU,aAAwD;IACzF,gBAAuB,cAAc,aAAwB;IAC7D,gBAAuB,eAAe,aAAyB;IAE/D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,SAAgB,IAAI,EAAE,QAAQ,CAAC;IAC/B,SAAgB,KAAK,EAAE,QAAQ,CAAC;IAChC,SAAgB,mBAAmB,MAAC;gBAGlB,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,CAAC,aAAa,CAAC,EAClE,mBAAmB,UAAO;IAoF3B,IAAW,UAAU,IAAI,UAAU,CAElC;IAED,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAEtC;IAED,IAAW,UAAU,IAAI,UAAU,CAElC;IAED,IAAW,aAAa,IAAI,iBAAiB,CAE5C;IAED,IAAW,IAAI,IAAI,YAAY,CAE9B;IAED,IAAW,MAAM,mBAEhB;IAEM,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM;IAIjD,YAAY,IAAI,UAAU;IAI1B,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC;IAErE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;IAM9D,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAIhG,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAIzC,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY;IAI/C,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM;IAIzC,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS;IAI/D,IAAI,cAAc,IAAI,SAAS,CAE9B;IAED,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAG7C,uBAAuB,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM;CAGxE;AAED,+CAA+C;AAC/C,qBAAa,kBAAkB,CAAC,CAAC,SAAS,QAAQ,CAAE,YAAW,QAAQ;IACtE,OAAO,CAAC,SAAS,CAAC,CAAI;gBAEH,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI;IAUtE,OAAO,KAAK,QAAQ,GAOnB;IAED,IAAW,IAAI,IAAI,QAAQ,CAE1B;IAED,IAAW,KAAK,IAAI,QAAQ,CAE3B;IAED,IAAW,UAAU,IAAI,UAAU,CAElC;IAED,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAEtC;IAED,IAAW,UAAU,IAAI,UAAU,CAElC;IAED,IAAW,aAAa,IAAI,iBAAiB,CAE5C;IAED,IAAW,IAAI,IAAI,YAAY,CAE9B;IAED,IAAW,MAAM,IAAI,cAAc,CAElC;IAEM,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM;IAIjD,YAAY,IAAI,UAAU;IAI1B,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;IAK9D,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAIhG,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAIhD,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY;IAI/C,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM;IAIzC,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS;IAIxD,IAAI,cAAc,IAAI,SAAS,CAE9B;IAED,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAI7C,uBAAuB,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM;CAGxE;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AACtF,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;AAY/E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAChC,aAAa,EAAE,aAAa,EAC5B,EAAE,CAAC,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,GACf,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAO/C"}
1
+ {"version":3,"file":"TestNode.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common';
6
- import { convertTreeNodes } from '../../EditUtilities';
7
- import { convertNodeDataIds } from '../../IdConversion';
8
- import { initialTree } from '../../InitialTree';
9
- import { RevisionView } from '../../RevisionView';
5
+ import { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common.js';
6
+ import { convertTreeNodes } from '../../EditUtilities.js';
7
+ import { convertNodeDataIds } from '../../IdConversion.js';
8
+ import { initialTree } from '../../InitialTree.js';
9
+ import { RevisionView } from '../../RevisionView.js';
10
10
  /**
11
11
  * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two
12
12
  * different instances of `SimpleTestTree` are never equivalent.
@@ -1 +1 @@
1
- {"version":3,"file":"TestNode.js","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.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 { BuildTreeNode } from '../../ChangeTypes';\nimport { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common';\nimport { convertTreeNodes } from '../../EditUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { initialTree } from '../../InitialTree';\nimport { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport {\n\tBuildNodeInternal,\n\tChangeNode,\n\tPayload,\n\tTraitLocationInternal,\n\tTraitLocationInternal_0_0_2,\n\tTraitMap,\n\tTreeNode,\n} from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport { TraitLocation } from '../../TreeView';\n\n/** A legacy format of a `TestNode` */\nexport type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;\n\n/**\n * A node with no children\n */\nexport type LeafNode<T> = Omit<T, 'traits'> & { traits: Record<string, never> };\n\n/**\n * Test extension of {@link TraitLocation} which can be converted to stable or legacy formats\n */\nexport interface TestTraitLocation extends TraitLocation {\n\tstable: TraitLocationInternal_0_0_2;\n\t/** Translate this location into the equivalent location in another ID context */\n\ttranslate(idConverter: NodeIdConverter): TestTraitLocation;\n}\n\n/**\n * An object containing useful properties for analyzing a node within a test context.\n */\nexport interface TestNode extends TreeNode<TestNode, NodeId> {\n\t/** The label of the trait under which this node resides */\n\ttraitLabel: TraitLabel;\n\t/** The trait location at which this node resides */\n\ttraitLocation: TestTraitLocation;\n\t/** A revision view of this node */\n\tview: RevisionView;\n\t/** A version of this tree with stable IDs */\n\tstable: TestNode_0_0_2;\n\t/** Translate this node's ID into the equivalent ID in another ID context */\n\ttranslateId(idConverter: NodeIdConverter): NodeId;\n\t/** Express this tree as a ChangeNode */\n\ttoChangeNode(): ChangeNode;\n}\n\n/**\n * A small tree of `TestNode`s consisting of a root/parent node, a \"left\" child and a \"right\" child. This is a useful tree for initializing\n * tests as it makes it ergonomic to retrieve various properties of the tree. Note that it only represents the initial state of the tree,\n * it does not update even if the SharedTree that it was the initial state for is mutated.\n */\nexport interface TestTree extends TestNode, NodeIdContext, NodeIdNormalizer<OpSpaceNodeId> {\n\t/** The left child node */\n\tleft: TestNode;\n\t/** The right child node */\n\tright: TestNode;\n\t/** Create an arbitrary unparented node with the given payload, if specified */\n\tbuildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\t/** Create an arbitrary unparented node with the given identifier and payload, if specified */\n\tbuildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\t/**\n\t * Generates a leaf node for use in internal build changes.\n\t * If no `id` is explicitly provided, one will be generated.\n\t * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n\t */\n\tbuildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>>;\n}\n\n/**\n * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two\n * different instances of `SimpleTestTree` are never equivalent.\n */\nexport class SimpleTestTree implements TestTree {\n\tpublic static readonly definition = 'node' as Definition;\n\tpublic static readonly traitLabel = 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel;\n\tpublic static readonly leftTraitLabel = 'left' as TraitLabel;\n\tpublic static readonly rightTraitLabel = 'right' as TraitLabel;\n\n\tprivate readonly root: TestNode;\n\tpublic readonly left: TestNode;\n\tpublic readonly right: TestNode;\n\tpublic readonly expensiveValidation;\n\n\tpublic constructor(\n\t\tprivate readonly nodeIdContext: NodeIdContext,\n\t\tprivate readonly nodeIdNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\texpensiveValidation = true\n\t) {\n\t\tconst leftIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rightIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rootIdentifier = nodeIdContext.generateNodeId();\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.left = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: leftIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.leftTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.leftTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.leftTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(leftIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.left, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tthis.right = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rightIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.rightTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.rightTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.rightTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rightIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.right, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tconst rootParent = nodeIdContext.convertToNodeId(initialTree.identifier);\n\t\tthis.root = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rootIdentifier,\n\t\t\ttraits: {\n\t\t\t\t[SimpleTestTree.leftTraitLabel]: [this.left],\n\t\t\t\t[SimpleTestTree.rightTraitLabel]: [this.right],\n\t\t\t},\n\t\t\ttraitLabel: SimpleTestTree.traitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tlabel: SimpleTestTree.traitLabel,\n\t\t\t\tparent: rootParent,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.traitLabel, rootParent, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rootIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.root, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.root.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.root.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.root.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.root.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.root.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.root.view;\n\t}\n\n\tpublic get stable() {\n\t\treturn this.root.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.root.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\treturn id === undefined ? buildLeaf(undefined, payload) : buildLeaf(id, payload);\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn buildLeafInternal(this, id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.nodeIdContext.generateNodeId(override);\n\t}\n\n\tpublic convertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.nodeIdContext.convertToStableNodeId(id);\n\t}\n\n\tpublic tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToStableNodeId(id);\n\t}\n\n\tpublic convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.nodeIdContext.convertToNodeId(id);\n\t}\n\n\tpublic tryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.nodeIdNormalizer.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToOpSpace(id);\n\t}\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** A TestTree which resets before each test */\nexport class RefreshingTestTree<T extends TestTree> implements TestTree {\n\tprivate _testTree?: T;\n\n\tpublic constructor(createTestTree: () => T, fn?: (testTree: T) => void) {\n\t\tbeforeEach(() => {\n\t\t\tthis._testTree = createTestTree();\n\t\t\tfn?.(this._testTree);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tthis._testTree = undefined;\n\t\t});\n\t}\n\n\tprivate get testTree(): T {\n\t\treturn (\n\t\t\tthis._testTree ??\n\t\t\tfail(\n\t\t\t\t'RefreshingTestTree should be created within a describe() block and should only be read within it() blocks'\n\t\t\t)\n\t\t);\n\t}\n\n\tpublic get left(): TestNode {\n\t\treturn this.testTree.left;\n\t}\n\n\tpublic get right(): TestNode {\n\t\treturn this.testTree.right;\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.testTree.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.testTree.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.testTree.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.testTree.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.testTree.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.testTree.view;\n\t}\n\n\tpublic get stable(): TestNode_0_0_2 {\n\t\treturn this.testTree.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.testTree.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this.testTree, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\treturn id === undefined ? this.testTree.buildLeaf(undefined, payload) : this.testTree.buildLeaf(id, payload);\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn this.testTree.buildLeafInternal(id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.testTree.generateNodeId(override);\n\t}\n\n\tconvertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\ttryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\tconvertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.testTree.convertToNodeId(id);\n\t}\n\n\ttryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.testTree.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.testTree.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.testTree.normalizeToOpSpace(id);\n\t}\n\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.testTree.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** Create a new node with an automatically generated ID and the given payload */\nexport function buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\tconst node: LeafNode<BuildTreeNode> = {\n\t\tdefinition: SimpleTestTree.definition,\n\t\ttraits: {},\n\t};\n\tsetPropertyIfDefined(id, node, 'identifier');\n\tsetPropertyIfDefined(payload, node, 'payload');\n\treturn node;\n}\n\n/**\n * Generates a leaf {@link ChangeNode}.\n * If no `id` is explicitly provided, one will be generated.\n * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n */\nexport function buildLeafInternal(\n\tnodeIdContext: NodeIdContext,\n\tid?: NodeId,\n\tpayload?: Payload\n): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\tconst leaf = buildLeaf(undefined, payload);\n\treturn {\n\t\tdefinition: leaf.definition as Definition,\n\t\tidentifier: id ?? nodeIdContext.generateNodeId(),\n\t\ttraits: {},\n\t};\n}\n\n/** Translate an ID in one context to an ID in another */\nfunction translateId(id: NodeId, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(id));\n}\n\nfunction translateTraitLocation(\n\tlabel: TraitLabel,\n\tparentId: NodeId,\n\tfrom: NodeIdConverter,\n\tto: NodeIdConverter\n): TestTraitLocation {\n\treturn {\n\t\tlabel,\n\t\tparent: translateId(parentId, from, to),\n\t\tget stable() {\n\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, to));\n\t\t},\n\t\ttranslate: (idManager) => translateTraitLocation(label, parentId, to, idManager),\n\t};\n}\n\nfunction convertToTestNode_0_0_2(node: TestNode, idConverter: NodeIdConverter): TestNode_0_0_2 {\n\t// This is equivalent to calling tryConvertToChangeNode_0_0_2 but that causes lint to stack overflow\n\treturn convertTreeNodes<TestNode, TestNode_0_0_2>(node, (nodeData) =>\n\t\tconvertNodeDataIds(nodeData, (id) => idConverter.convertToStableNodeId(id))\n\t);\n}\n\nfunction convertToTraitLocation_0_0_2(\n\ttraitLocation: TraitLocationInternal,\n\tidConverter: NodeIdConverter\n): TraitLocationInternal_0_0_2 {\n\tconst parent = idConverter.convertToStableNodeId(traitLocation.parent);\n\treturn {\n\t\tlabel: traitLocation.label,\n\t\tparent,\n\t};\n}\n"]}
1
+ {"version":3,"file":"TestNode.js","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.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 { BuildTreeNode } from '../../ChangeTypes.js';\nimport { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common.js';\nimport { convertTreeNodes } from '../../EditUtilities.js';\nimport { convertNodeDataIds } from '../../IdConversion.js';\nimport { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers.js';\nimport { initialTree } from '../../InitialTree.js';\nimport { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities.js';\nimport {\n\tBuildNodeInternal,\n\tChangeNode,\n\tPayload,\n\tTraitLocationInternal,\n\tTraitLocationInternal_0_0_2,\n\tTraitMap,\n\tTreeNode,\n} from '../../persisted-types/index.js';\nimport { RevisionView } from '../../RevisionView.js';\nimport { TraitLocation } from '../../TreeView.js';\n\n/** A legacy format of a `TestNode` */\nexport type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;\n\n/**\n * A node with no children\n */\nexport type LeafNode<T> = Omit<T, 'traits'> & { traits: Record<string, never> };\n\n/**\n * Test extension of {@link TraitLocation} which can be converted to stable or legacy formats\n */\nexport interface TestTraitLocation extends TraitLocation {\n\tstable: TraitLocationInternal_0_0_2;\n\t/** Translate this location into the equivalent location in another ID context */\n\ttranslate(idConverter: NodeIdConverter): TestTraitLocation;\n}\n\n/**\n * An object containing useful properties for analyzing a node within a test context.\n */\nexport interface TestNode extends TreeNode<TestNode, NodeId> {\n\t/** The label of the trait under which this node resides */\n\ttraitLabel: TraitLabel;\n\t/** The trait location at which this node resides */\n\ttraitLocation: TestTraitLocation;\n\t/** A revision view of this node */\n\tview: RevisionView;\n\t/** A version of this tree with stable IDs */\n\tstable: TestNode_0_0_2;\n\t/** Translate this node's ID into the equivalent ID in another ID context */\n\ttranslateId(idConverter: NodeIdConverter): NodeId;\n\t/** Express this tree as a ChangeNode */\n\ttoChangeNode(): ChangeNode;\n}\n\n/**\n * A small tree of `TestNode`s consisting of a root/parent node, a \"left\" child and a \"right\" child. This is a useful tree for initializing\n * tests as it makes it ergonomic to retrieve various properties of the tree. Note that it only represents the initial state of the tree,\n * it does not update even if the SharedTree that it was the initial state for is mutated.\n */\nexport interface TestTree extends TestNode, NodeIdContext, NodeIdNormalizer<OpSpaceNodeId> {\n\t/** The left child node */\n\tleft: TestNode;\n\t/** The right child node */\n\tright: TestNode;\n\t/** Create an arbitrary unparented node with the given payload, if specified */\n\tbuildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\t/** Create an arbitrary unparented node with the given identifier and payload, if specified */\n\tbuildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\t/**\n\t * Generates a leaf node for use in internal build changes.\n\t * If no `id` is explicitly provided, one will be generated.\n\t * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n\t */\n\tbuildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>>;\n}\n\n/**\n * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two\n * different instances of `SimpleTestTree` are never equivalent.\n */\nexport class SimpleTestTree implements TestTree {\n\tpublic static readonly definition = 'node' as Definition;\n\tpublic static readonly traitLabel = 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel;\n\tpublic static readonly leftTraitLabel = 'left' as TraitLabel;\n\tpublic static readonly rightTraitLabel = 'right' as TraitLabel;\n\n\tprivate readonly root: TestNode;\n\tpublic readonly left: TestNode;\n\tpublic readonly right: TestNode;\n\tpublic readonly expensiveValidation;\n\n\tpublic constructor(\n\t\tprivate readonly nodeIdContext: NodeIdContext,\n\t\tprivate readonly nodeIdNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\texpensiveValidation = true\n\t) {\n\t\tconst leftIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rightIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rootIdentifier = nodeIdContext.generateNodeId();\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.left = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: leftIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.leftTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.leftTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.leftTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(leftIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.left, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tthis.right = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rightIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.rightTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.rightTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.rightTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rightIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.right, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tconst rootParent = nodeIdContext.convertToNodeId(initialTree.identifier);\n\t\tthis.root = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rootIdentifier,\n\t\t\ttraits: {\n\t\t\t\t[SimpleTestTree.leftTraitLabel]: [this.left],\n\t\t\t\t[SimpleTestTree.rightTraitLabel]: [this.right],\n\t\t\t},\n\t\t\ttraitLabel: SimpleTestTree.traitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tlabel: SimpleTestTree.traitLabel,\n\t\t\t\tparent: rootParent,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.traitLabel, rootParent, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rootIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.root, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.root.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.root.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.root.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.root.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.root.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.root.view;\n\t}\n\n\tpublic get stable() {\n\t\treturn this.root.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.root.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\treturn id === undefined ? buildLeaf(undefined, payload) : buildLeaf(id, payload);\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn buildLeafInternal(this, id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.nodeIdContext.generateNodeId(override);\n\t}\n\n\tpublic convertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.nodeIdContext.convertToStableNodeId(id);\n\t}\n\n\tpublic tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToStableNodeId(id);\n\t}\n\n\tpublic convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.nodeIdContext.convertToNodeId(id);\n\t}\n\n\tpublic tryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.nodeIdNormalizer.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToOpSpace(id);\n\t}\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** A TestTree which resets before each test */\nexport class RefreshingTestTree<T extends TestTree> implements TestTree {\n\tprivate _testTree?: T;\n\n\tpublic constructor(createTestTree: () => T, fn?: (testTree: T) => void) {\n\t\tbeforeEach(() => {\n\t\t\tthis._testTree = createTestTree();\n\t\t\tfn?.(this._testTree);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tthis._testTree = undefined;\n\t\t});\n\t}\n\n\tprivate get testTree(): T {\n\t\treturn (\n\t\t\tthis._testTree ??\n\t\t\tfail(\n\t\t\t\t'RefreshingTestTree should be created within a describe() block and should only be read within it() blocks'\n\t\t\t)\n\t\t);\n\t}\n\n\tpublic get left(): TestNode {\n\t\treturn this.testTree.left;\n\t}\n\n\tpublic get right(): TestNode {\n\t\treturn this.testTree.right;\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.testTree.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.testTree.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.testTree.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.testTree.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.testTree.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.testTree.view;\n\t}\n\n\tpublic get stable(): TestNode_0_0_2 {\n\t\treturn this.testTree.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.testTree.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this.testTree, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\treturn id === undefined ? this.testTree.buildLeaf(undefined, payload) : this.testTree.buildLeaf(id, payload);\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn this.testTree.buildLeafInternal(id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.testTree.generateNodeId(override);\n\t}\n\n\tconvertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\ttryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\tconvertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.testTree.convertToNodeId(id);\n\t}\n\n\ttryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.testTree.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.testTree.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.testTree.normalizeToOpSpace(id);\n\t}\n\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.testTree.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** Create a new node with an automatically generated ID and the given payload */\nexport function buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\tconst node: LeafNode<BuildTreeNode> = {\n\t\tdefinition: SimpleTestTree.definition,\n\t\ttraits: {},\n\t};\n\tsetPropertyIfDefined(id, node, 'identifier');\n\tsetPropertyIfDefined(payload, node, 'payload');\n\treturn node;\n}\n\n/**\n * Generates a leaf {@link ChangeNode}.\n * If no `id` is explicitly provided, one will be generated.\n * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n */\nexport function buildLeafInternal(\n\tnodeIdContext: NodeIdContext,\n\tid?: NodeId,\n\tpayload?: Payload\n): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\tconst leaf = buildLeaf(undefined, payload);\n\treturn {\n\t\tdefinition: leaf.definition as Definition,\n\t\tidentifier: id ?? nodeIdContext.generateNodeId(),\n\t\ttraits: {},\n\t};\n}\n\n/** Translate an ID in one context to an ID in another */\nfunction translateId(id: NodeId, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(id));\n}\n\nfunction translateTraitLocation(\n\tlabel: TraitLabel,\n\tparentId: NodeId,\n\tfrom: NodeIdConverter,\n\tto: NodeIdConverter\n): TestTraitLocation {\n\treturn {\n\t\tlabel,\n\t\tparent: translateId(parentId, from, to),\n\t\tget stable() {\n\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, to));\n\t\t},\n\t\ttranslate: (idManager) => translateTraitLocation(label, parentId, to, idManager),\n\t};\n}\n\nfunction convertToTestNode_0_0_2(node: TestNode, idConverter: NodeIdConverter): TestNode_0_0_2 {\n\t// This is equivalent to calling tryConvertToChangeNode_0_0_2 but that causes lint to stack overflow\n\treturn convertTreeNodes<TestNode, TestNode_0_0_2>(node, (nodeData) =>\n\t\tconvertNodeDataIds(nodeData, (id) => idConverter.convertToStableNodeId(id))\n\t);\n}\n\nfunction convertToTraitLocation_0_0_2(\n\ttraitLocation: TraitLocationInternal,\n\tidConverter: NodeIdConverter\n): TraitLocationInternal_0_0_2 {\n\tconst parent = idConverter.convertToStableNodeId(traitLocation.parent);\n\treturn {\n\t\tlabel: traitLocation.label,\n\t\tparent,\n\t};\n}\n"]}