@fluidframework/map 2.0.0-rc.1.0.6 → 2.0.0-rc.2.0.1

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 (132) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +10 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +11 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/map.api.md +14 -57
  8. package/dist/directory.d.ts +10 -50
  9. package/dist/directory.d.ts.map +1 -1
  10. package/dist/directory.js +76 -164
  11. package/dist/directory.js.map +1 -1
  12. package/dist/index.d.ts +45 -4
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +43 -8
  15. package/dist/index.js.map +1 -1
  16. package/dist/interfaces.d.ts.map +1 -1
  17. package/dist/interfaces.js.map +1 -1
  18. package/dist/internalInterfaces.d.ts +2 -2
  19. package/dist/internalInterfaces.d.ts.map +1 -1
  20. package/dist/internalInterfaces.js.map +1 -1
  21. package/dist/localValues.d.ts +3 -5
  22. package/dist/localValues.d.ts.map +1 -1
  23. package/dist/localValues.js +9 -8
  24. package/dist/localValues.js.map +1 -1
  25. package/dist/map-alpha.d.ts +31 -116
  26. package/dist/map-beta.d.ts +24 -105
  27. package/dist/map-public.d.ts +24 -105
  28. package/dist/map-untrimmed.d.ts +31 -116
  29. package/dist/map.d.ts +4 -23
  30. package/dist/map.d.ts.map +1 -1
  31. package/dist/map.js +6 -29
  32. package/dist/map.js.map +1 -1
  33. package/dist/mapKernel.d.ts +3 -4
  34. package/dist/mapKernel.d.ts.map +1 -1
  35. package/dist/mapKernel.js +30 -35
  36. package/dist/mapKernel.js.map +1 -1
  37. package/dist/package.json +3 -0
  38. package/dist/packageVersion.d.ts +1 -1
  39. package/dist/packageVersion.js +1 -1
  40. package/dist/packageVersion.js.map +1 -1
  41. package/dist/tsdoc-metadata.json +1 -1
  42. package/lib/{directory.d.mts → directory.d.ts} +11 -51
  43. package/lib/directory.d.ts.map +1 -0
  44. package/lib/{directory.mjs → directory.js} +77 -165
  45. package/lib/directory.js.map +1 -0
  46. package/lib/index.d.ts +61 -0
  47. package/lib/index.d.ts.map +1 -0
  48. package/lib/index.js +55 -0
  49. package/lib/index.js.map +1 -0
  50. package/lib/{interfaces.d.mts → interfaces.d.ts} +1 -1
  51. package/lib/interfaces.d.ts.map +1 -0
  52. package/lib/{interfaces.mjs → interfaces.js} +1 -1
  53. package/lib/interfaces.js.map +1 -0
  54. package/lib/{internalInterfaces.d.mts → internalInterfaces.d.ts} +3 -3
  55. package/lib/internalInterfaces.d.ts.map +1 -0
  56. package/lib/{internalInterfaces.mjs → internalInterfaces.js} +1 -1
  57. package/lib/internalInterfaces.js.map +1 -0
  58. package/lib/{localValues.d.mts → localValues.d.ts} +4 -6
  59. package/lib/localValues.d.ts.map +1 -0
  60. package/lib/{localValues.mjs → localValues.js} +10 -9
  61. package/lib/localValues.js.map +1 -0
  62. package/lib/{map-alpha.d.mts → map-alpha.d.ts} +43 -116
  63. package/lib/{map-beta.d.mts → map-beta.d.ts} +36 -105
  64. package/lib/{map-public.d.mts → map-public.d.ts} +36 -105
  65. package/lib/{map-untrimmed.d.mts → map-untrimmed.d.ts} +43 -116
  66. package/lib/{map.d.mts → map.d.ts} +5 -24
  67. package/lib/map.d.ts.map +1 -0
  68. package/lib/{map.mjs → map.js} +5 -28
  69. package/lib/map.js.map +1 -0
  70. package/lib/{mapKernel.d.mts → mapKernel.d.ts} +4 -5
  71. package/lib/mapKernel.d.ts.map +1 -0
  72. package/lib/{mapKernel.mjs → mapKernel.js} +32 -37
  73. package/lib/mapKernel.js.map +1 -0
  74. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  75. package/lib/packageVersion.d.ts.map +1 -0
  76. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  77. package/lib/packageVersion.js.map +1 -0
  78. package/lib/test/memory/directory.spec.js +71 -0
  79. package/lib/test/memory/directory.spec.js.map +1 -0
  80. package/lib/test/memory/map.spec.js +71 -0
  81. package/lib/test/memory/map.spec.js.map +1 -0
  82. package/lib/test/mocha/directory.order.spec.js +422 -0
  83. package/lib/test/mocha/directory.order.spec.js.map +1 -0
  84. package/lib/test/mocha/directory.snapshot.spec.js +111 -0
  85. package/lib/test/mocha/directory.snapshot.spec.js.map +1 -0
  86. package/lib/test/mocha/directory.spec.js +1406 -0
  87. package/lib/test/mocha/directory.spec.js.map +1 -0
  88. package/lib/test/mocha/directoryEquivalenceUtils.js +36 -0
  89. package/lib/test/mocha/directoryEquivalenceUtils.js.map +1 -0
  90. package/lib/test/mocha/directoryFuzzTests.spec.js +337 -0
  91. package/lib/test/mocha/directoryFuzzTests.spec.js.map +1 -0
  92. package/lib/test/mocha/dirname.cjs +16 -0
  93. package/lib/test/mocha/dirname.cjs.map +1 -0
  94. package/lib/test/mocha/map.fuzz.spec.js +114 -0
  95. package/lib/test/mocha/map.fuzz.spec.js.map +1 -0
  96. package/lib/test/mocha/map.spec.js +685 -0
  97. package/lib/test/mocha/map.spec.js.map +1 -0
  98. package/lib/test/mocha/rebasing.spec.js +158 -0
  99. package/lib/test/mocha/rebasing.spec.js.map +1 -0
  100. package/lib/test/mocha/reconnection.spec.js +327 -0
  101. package/lib/test/mocha/reconnection.spec.js.map +1 -0
  102. package/lib/test/types/validateMapPrevious.generated.js +66 -0
  103. package/lib/test/types/validateMapPrevious.generated.js.map +1 -0
  104. package/package.json +55 -52
  105. package/src/directory.ts +122 -217
  106. package/src/index.ts +57 -4
  107. package/src/interfaces.ts +2 -2
  108. package/src/internalInterfaces.ts +2 -2
  109. package/src/localValues.ts +14 -9
  110. package/src/map.ts +7 -32
  111. package/src/mapKernel.ts +40 -42
  112. package/src/packageVersion.ts +1 -1
  113. package/tsconfig.cjs.json +7 -0
  114. package/tsconfig.json +2 -5
  115. package/lib/directory.d.mts.map +0 -1
  116. package/lib/directory.mjs.map +0 -1
  117. package/lib/index.d.mts +0 -9
  118. package/lib/index.d.mts.map +0 -1
  119. package/lib/index.mjs +0 -8
  120. package/lib/index.mjs.map +0 -1
  121. package/lib/interfaces.d.mts.map +0 -1
  122. package/lib/interfaces.mjs.map +0 -1
  123. package/lib/internalInterfaces.d.mts.map +0 -1
  124. package/lib/internalInterfaces.mjs.map +0 -1
  125. package/lib/localValues.d.mts.map +0 -1
  126. package/lib/localValues.mjs.map +0 -1
  127. package/lib/map.d.mts.map +0 -1
  128. package/lib/map.mjs.map +0 -1
  129. package/lib/mapKernel.d.mts.map +0 -1
  130. package/lib/mapKernel.mjs.map +0 -1
  131. package/lib/packageVersion.d.mts.map +0 -1
  132. package/lib/packageVersion.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.spec.js","sourceRoot":"","sources":["../../../src/test/mocha/map.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { ISummaryBlob } from \"@fluidframework/protocol-definitions\";\nimport { IGCTestProvider, runGCTests } from \"@fluid-private/test-dds-utils\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockSharedObjectServices,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ISerializableValue, IValueChanged } from \"../../interfaces.js\";\nimport {\n\tIMapSetOperation,\n\tIMapDeleteOperation,\n\tIMapClearOperation,\n\tIMapKeyEditLocalOpMetadata,\n\tIMapClearLocalOpMetadata,\n\tMapLocalOpMetadata,\n} from \"../../internalInterfaces.js\";\nimport { MapFactory, SharedMap } from \"../../map.js\";\nimport { IMapOperation } from \"../../mapKernel.js\";\n\nfunction createConnectedMap(id: string, runtimeFactory: MockContainerRuntimeFactory): SharedMap {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tconst containerRuntime = runtimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\tconst map = new SharedMap(id, dataStoreRuntime, MapFactory.Attributes);\n\tmap.connect(services);\n\treturn map;\n}\n\nfunction createLocalMap(id: string): SharedMap {\n\tconst map = new SharedMap(id, new MockFluidDataStoreRuntime(), MapFactory.Attributes);\n\treturn map;\n}\n\nclass TestSharedMap extends SharedMap {\n\tprivate lastMetadata?: MapLocalOpMetadata;\n\tpublic testApplyStashedOp(content: IMapOperation): MapLocalOpMetadata | undefined {\n\t\tthis.lastMetadata = undefined;\n\t\tthis.applyStashedOp(content);\n\t\treturn this.lastMetadata;\n\t}\n\n\tpublic submitLocalMessage(op: IMapOperation, localOpMetadata: unknown): void {\n\t\tthis.lastMetadata = localOpMetadata as MapLocalOpMetadata;\n\t\tsuper.submitLocalMessage(op, localOpMetadata);\n\t}\n}\n\ndescribe(\"Map\", () => {\n\tdescribe(\"Local state\", () => {\n\t\tlet map: SharedMap;\n\n\t\tbeforeEach(\"createLocalMap\", async () => {\n\t\t\tmap = createLocalMap(\"testMap\");\n\t\t});\n\n\t\tdescribe(\"API\", () => {\n\t\t\tit(\"Can create a new map\", () => {\n\t\t\t\tassert.ok(map, \"could not create a new map\");\n\t\t\t});\n\n\t\t\tit(\"Can set and get map data\", async () => {\n\t\t\t\tmap.set(\"testKey\", \"testValue\");\n\t\t\t\tmap.set(\"testKey2\", \"testValue2\");\n\t\t\t\tassert.equal(map.get(\"testKey\"), \"testValue\", \"could not retrieve set key 1\");\n\t\t\t\tassert.equal(map.get(\"testKey2\"), \"testValue2\", \"could not retrieve set key 2\");\n\t\t\t});\n\n\t\t\tit(\"should fire correct map events\", async () => {\n\t\t\t\tconst dummyMap = map;\n\t\t\t\tlet valueChangedExpected = true;\n\t\t\t\tlet clearExpected = false;\n\t\t\t\tlet previousValue: unknown;\n\n\t\t\t\tdummyMap.on(\"op\", (arg1, arg2, arg3) => {\n\t\t\t\t\tassert.fail(\"shouldn't receive an op event\");\n\t\t\t\t});\n\t\t\t\tdummyMap.on(\"valueChanged\", (changed, local, target) => {\n\t\t\t\t\tassert.equal(valueChangedExpected, true, \"valueChange event not expected\");\n\t\t\t\t\tvalueChangedExpected = false;\n\n\t\t\t\t\tassert.equal(changed.key, \"marco\");\n\t\t\t\t\tassert.equal(changed.previousValue, previousValue);\n\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"local should be true for local action for valueChanged event\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tdummyMap,\n\t\t\t\t\t\t\"target should be the map for valueChanged event\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tdummyMap.on(\"clear\", (local, target) => {\n\t\t\t\t\tassert.equal(clearExpected, true, \"clear event not expected\");\n\t\t\t\t\tclearExpected = false;\n\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tlocal,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"local should be true for local action for clear event\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(target, dummyMap, \"target should be the map for clear event\");\n\t\t\t\t});\n\t\t\t\tdummyMap.on(\"error\", (error) => {\n\t\t\t\t\t// propagate error in the event handlers\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\n\t\t\t\t// Test set\n\t\t\t\tpreviousValue = undefined;\n\t\t\t\tdummyMap.set(\"marco\", \"polo\");\n\t\t\t\tassert.equal(valueChangedExpected, false, \"missing valueChanged event\");\n\n\t\t\t\t// Test delete\n\t\t\t\tpreviousValue = \"polo\";\n\t\t\t\tvalueChangedExpected = true;\n\t\t\t\tdummyMap.delete(\"marco\");\n\t\t\t\tassert.equal(valueChangedExpected, false, \"missing valueChanged event\");\n\n\t\t\t\t// Test clear\n\t\t\t\tclearExpected = true;\n\t\t\t\tdummyMap.clear();\n\t\t\t\tassert.equal(clearExpected, false, \"missing clear event\");\n\t\t\t});\n\n\t\t\tit(\"Should return undefined when a key does not exist in the map\", () => {\n\t\t\t\tassert.equal(\n\t\t\t\t\tmap.get(\"missing\"),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"get() did not return undefined for missing key\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Should reject undefined and null key sets\", () => {\n\t\t\t\tassert.throws(() => {\n\t\t\t\t\tmap.set(undefined as unknown as string, \"one\");\n\t\t\t\t}, \"Should throw for key of undefined\");\n\t\t\t\tassert.throws(() => {\n\t\t\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\t\t\tmap.set(null as unknown as string, \"two\");\n\t\t\t\t}, \"Should throw for key of null\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Serialize\", () => {\n\t\t\tit(\"Should serialize the map as a JSON object\", () => {\n\t\t\t\tmap.set(\"first\", \"second\");\n\t\t\t\tmap.set(\"third\", \"fourth\");\n\t\t\t\tmap.set(\"fifth\", \"sixth\");\n\t\t\t\tconst subMap = createLocalMap(\"subMap\");\n\t\t\t\tmap.set(\"object\", subMap.handle);\n\n\t\t\t\tconst summaryContent = (map.getAttachSummary().summary.tree.header as ISummaryBlob)\n\t\t\t\t\t.content;\n\t\t\t\tconst subMapHandleUrl = subMap.handle.absolutePath;\n\t\t\t\tassert.equal(\n\t\t\t\t\tsummaryContent,\n\t\t\t\t\t`{\"blobs\":[],\"content\":{\"first\":{\"type\":\"Plain\",\"value\":\"second\"},\"third\":{\"type\":\"Plain\",\"value\":\"fourth\"},\"fifth\":{\"type\":\"Plain\",\"value\":\"sixth\"},\"object\":{\"type\":\"Plain\",\"value\":{\"type\":\"__fluid_handle__\",\"url\":\"${subMapHandleUrl}\"}}}}`,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Should serialize an undefined value\", () => {\n\t\t\t\tmap.set(\"first\", \"second\");\n\t\t\t\tmap.set(\"third\", \"fourth\");\n\t\t\t\tmap.set(\"fifth\", undefined);\n\t\t\t\tassert.ok(map.has(\"fifth\"));\n\t\t\t\tconst subMap = createLocalMap(\"subMap\");\n\t\t\t\tmap.set(\"object\", subMap.handle);\n\n\t\t\t\tconst summaryContent = (map.getAttachSummary().summary.tree.header as ISummaryBlob)\n\t\t\t\t\t.content;\n\t\t\t\tconst subMapHandleUrl = subMap.handle.absolutePath;\n\t\t\t\tassert.equal(\n\t\t\t\t\tsummaryContent,\n\t\t\t\t\t`{\"blobs\":[],\"content\":{\"first\":{\"type\":\"Plain\",\"value\":\"second\"},\"third\":{\"type\":\"Plain\",\"value\":\"fourth\"},\"fifth\":{\"type\":\"Plain\"},\"object\":{\"type\":\"Plain\",\"value\":{\"type\":\"__fluid_handle__\",\"url\":\"${subMapHandleUrl}\"}}}}`,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Should serialize an object with nested handles\", async () => {\n\t\t\t\tconst subMap = createLocalMap(\"subMap\");\n\t\t\t\tconst subMap2 = createLocalMap(\"subMap2\");\n\t\t\t\tconst containingObject = {\n\t\t\t\t\tsubMapHandle: subMap.handle,\n\t\t\t\t\tnestedObj: {\n\t\t\t\t\t\tsubMap2Handle: subMap2.handle,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tmap.set(\"object\", containingObject);\n\n\t\t\t\tconst subMapHandleUrl = subMap.handle.absolutePath;\n\t\t\t\tconst subMap2HandleUrl = subMap2.handle.absolutePath;\n\t\t\t\tconst summaryContent = (map.getAttachSummary().summary.tree.header as ISummaryBlob)\n\t\t\t\t\t.content;\n\t\t\t\tassert.equal(\n\t\t\t\t\tsummaryContent,\n\t\t\t\t\t`{\"blobs\":[],\"content\":{\"object\":{\"type\":\"Plain\",\"value\":{\"subMapHandle\":{\"type\":\"__fluid_handle__\",\"url\":\"${subMapHandleUrl}\"},\"nestedObj\":{\"subMap2Handle\":{\"type\":\"__fluid_handle__\",\"url\":\"${subMap2HandleUrl}\"}}}}}}`,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"can load old serialization format\", async () => {\n\t\t\t\tmap.set(\"key\", \"value\");\n\n\t\t\t\tconst content = JSON.stringify({\n\t\t\t\t\tkey: {\n\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\tvalue: \"value\",\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst services = new MockSharedObjectServices({ header: content });\n\t\t\t\tconst factory = new MapFactory();\n\t\t\t\tconst loadedMap = await factory.load(\n\t\t\t\t\tnew MockFluidDataStoreRuntime(),\n\t\t\t\t\t\"mapId\",\n\t\t\t\t\tservices,\n\t\t\t\t\tfactory.attributes,\n\t\t\t\t);\n\t\t\t\tassert(loadedMap.get(\"key\") === \"value\");\n\t\t\t});\n\n\t\t\tit(\"new serialization format for small maps\", async () => {\n\t\t\t\tmap.set(\"key\", \"value\");\n\n\t\t\t\tconst summaryTree = map.getAttachSummary().summary;\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tObject.keys(summaryTree.tree).length,\n\t\t\t\t\t1,\n\t\t\t\t\t\"summary tree should only have one blob\",\n\t\t\t\t);\n\t\t\t\tconst summaryContent = (summaryTree.tree.header as ISummaryBlob)?.content;\n\t\t\t\tconst expectedContent = JSON.stringify({\n\t\t\t\t\tblobs: [],\n\t\t\t\t\tcontent: {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\tvalue: \"value\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsummaryContent,\n\t\t\t\t\texpectedContent,\n\t\t\t\t\t\"The summary content is not as expected\",\n\t\t\t\t);\n\n\t\t\t\tconst services = new MockSharedObjectServices({ header: summaryContent });\n\t\t\t\tconst factory = new MapFactory();\n\t\t\t\tconst loadedMap = await factory.load(\n\t\t\t\t\tnew MockFluidDataStoreRuntime(),\n\t\t\t\t\t\"mapId\",\n\t\t\t\t\tservices,\n\t\t\t\t\tfactory.attributes,\n\t\t\t\t);\n\t\t\t\tassert(loadedMap.get(\"key\") === \"value\");\n\t\t\t});\n\n\t\t\tit(\"new serialization format for big maps\", async () => {\n\t\t\t\tmap.set(\"key\", \"value\");\n\n\t\t\t\t// 40K char string\n\t\t\t\tlet longString = \"01234567890\";\n\t\t\t\tfor (let i = 0; i < 12; i++) {\n\t\t\t\t\tlongString = longString + longString;\n\t\t\t\t}\n\t\t\t\tmap.set(\"longValue\", longString);\n\t\t\t\tmap.set(\"zzz\", \"the end\");\n\n\t\t\t\tconst summaryTree = map.getAttachSummary().summary;\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tObject.keys(summaryTree.tree).length,\n\t\t\t\t\t2,\n\t\t\t\t\t\"There should be 2 entries in the summary tree\",\n\t\t\t\t);\n\t\t\t\tconst expectedContent1 = JSON.stringify({\n\t\t\t\t\tblobs: [\"blob0\"],\n\t\t\t\t\tcontent: {\n\t\t\t\t\t\tkey: {\n\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\tvalue: \"value\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tzzz: {\n\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\tvalue: \"the end\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tconst expectedContent2 = JSON.stringify({\n\t\t\t\t\tlongValue: {\n\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\tvalue: longString,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst header = summaryTree.tree.header as ISummaryBlob;\n\t\t\t\tconst blob0 = summaryTree.tree.blob0 as ISummaryBlob;\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\theader?.content,\n\t\t\t\t\texpectedContent1,\n\t\t\t\t\t\"header content is not as expected\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tblob0?.content,\n\t\t\t\t\texpectedContent2,\n\t\t\t\t\t\"blob0 content is not as expected\",\n\t\t\t\t);\n\n\t\t\t\tconst services = new MockSharedObjectServices({\n\t\t\t\t\theader: header.content,\n\t\t\t\t\tblob0: blob0.content,\n\t\t\t\t});\n\t\t\t\tconst factory = new MapFactory();\n\t\t\t\tconst loadedMap = await factory.load(\n\t\t\t\t\tnew MockFluidDataStoreRuntime(),\n\t\t\t\t\t\"mapId\",\n\t\t\t\t\tservices,\n\t\t\t\t\tfactory.attributes,\n\t\t\t\t);\n\t\t\t\tassert(loadedMap.get(\"key\") === \"value\");\n\t\t\t\tassert(loadedMap.get(\"longValue\") === longString);\n\t\t\t\tassert(loadedMap.get(\"zzz\") === \"the end\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Op processing\", () => {\n\t\t\t/**\n\t\t\t * These tests test the scenario found in the following bug:\n\t\t\t * {@link https://github.com/microsoft/FluidFramework/issues/2400}\n\t\t\t *\n\t\t\t * - A SharedMap in local state set a key.\n\t\t\t *\n\t\t\t * - A second SharedMap is then created from the snapshot of the first one.\n\t\t\t *\n\t\t\t * - The second SharedMap sets a new value to the same key.\n\t\t\t *\n\t\t\t * - The expected behavior is that the first SharedMap updates the key with the new value. But in the bug\n\t\t\t * the first SharedMap stores the key in its pending state even though it does not send out an op. So,\n\t\t\t * when it gets a remote op with the same key, it ignores it as it has a pending set with the same key.\n\t\t\t */\n\t\t\tit(\"should correctly process a set operation sent in local state\", async () => {\n\t\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\t\t\tconst map1 = new SharedMap(\"testMap1\", dataStoreRuntime1, MapFactory.Attributes);\n\n\t\t\t\t// Set a key in local state.\n\t\t\t\tconst key = \"testKey\";\n\t\t\t\tconst value = \"testValue\";\n\t\t\t\tmap1.set(key, value);\n\n\t\t\t\t// Load a new SharedMap in connected state from the snapshot of the first one.\n\t\t\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\t\tconst containerRuntime2 =\n\t\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\t\tconst services2 = MockSharedObjectServices.createFromSummary(\n\t\t\t\t\tmap1.getAttachSummary().summary,\n\t\t\t\t);\n\t\t\t\tservices2.deltaConnection = dataStoreRuntime2.createDeltaConnection();\n\n\t\t\t\tconst map2 = new SharedMap(\"testMap2\", dataStoreRuntime2, MapFactory.Attributes);\n\t\t\t\tawait map2.load(services2);\n\n\t\t\t\t// Now connect the first SharedMap\n\t\t\t\tdataStoreRuntime1.setAttachState(AttachState.Attached);\n\t\t\t\tconst containerRuntime1 =\n\t\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\t\tconst services1 = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t\t\t};\n\t\t\t\tmap1.connect(services1);\n\n\t\t\t\t// Verify that both the maps have the key.\n\t\t\t\tassert.equal(map1.get(key), value, \"The first map does not have the key\");\n\t\t\t\tassert.equal(map2.get(key), value, \"The second map does not have the key\");\n\n\t\t\t\t// Set a new value for the same key in the second SharedMap.\n\t\t\t\tconst newValue = \"newValue\";\n\t\t\t\tmap2.set(key, newValue);\n\n\t\t\t\t// Process the message.\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify that both the maps have the new value.\n\t\t\t\tassert.equal(map1.get(key), newValue, \"The first map did not get the new value\");\n\t\t\t\tassert.equal(map2.get(key), newValue, \"The second map did not get the new value\");\n\t\t\t});\n\n\t\t\tit(\"metadata op\", async () => {\n\t\t\t\tconst serializable: ISerializableValue = { type: \"Plain\", value: \"value\" };\n\t\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\t\t\tconst op: IMapSetOperation = { type: \"set\", key: \"key\", value: serializable };\n\t\t\t\tconst map1 = new TestSharedMap(\n\t\t\t\t\t\"testMap1\",\n\t\t\t\t\tdataStoreRuntime1,\n\t\t\t\t\tMapFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\t\tmap1.connect({\n\t\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t\t\t});\n\t\t\t\tlet metadata = map1.testApplyStashedOp(op);\n\t\t\t\tassert.equal(metadata?.type, \"add\");\n\t\t\t\tassert.equal(metadata.pendingMessageId, 0);\n\t\t\t\tconst editMetadata = map1.testApplyStashedOp(op) as IMapKeyEditLocalOpMetadata;\n\t\t\t\tassert.equal(editMetadata.type, \"edit\");\n\t\t\t\tassert.equal(editMetadata.pendingMessageId, 1);\n\t\t\t\tassert.equal(editMetadata.previousValue.value, \"value\");\n\t\t\t\tconst serializable2: ISerializableValue = { type: \"Plain\", value: \"value2\" };\n\t\t\t\tconst op2: IMapSetOperation = { type: \"set\", key: \"key2\", value: serializable2 };\n\t\t\t\tmetadata = map1.testApplyStashedOp(op2);\n\t\t\t\tassert.equal(metadata?.type, \"add\");\n\t\t\t\tassert.equal(metadata.pendingMessageId, 2);\n\t\t\t\tconst op3: IMapDeleteOperation = { type: \"delete\", key: \"key2\" };\n\t\t\t\tmetadata = map1.testApplyStashedOp(op3) as IMapKeyEditLocalOpMetadata;\n\t\t\t\tassert.equal(metadata.type, \"edit\");\n\t\t\t\tassert.equal(metadata.pendingMessageId, 3);\n\t\t\t\tassert.equal(metadata.previousValue.value, \"value2\");\n\t\t\t\tconst op4: IMapClearOperation = { type: \"clear\" };\n\t\t\t\tmetadata = map1.testApplyStashedOp(op4) as IMapClearLocalOpMetadata;\n\t\t\t\tassert.equal(metadata.pendingMessageId, 4);\n\t\t\t\tassert.equal(metadata.type, \"clear\");\n\t\t\t\tassert.equal(metadata.previousMap?.get(\"key\")?.value, \"value\");\n\t\t\t\tassert.equal(metadata.previousMap?.has(\"key2\"), false);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Connected state\", () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tlet map1: SharedMap;\n\t\tlet map2: SharedMap;\n\n\t\tbeforeEach(\"createConnectedMaps\", async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\t// Create the first map\n\t\t\tmap1 = createConnectedMap(\"map1\", containerRuntimeFactory);\n\t\t\t// Create and connect a second map\n\t\t\tmap2 = createConnectedMap(\"map2\", containerRuntimeFactory);\n\t\t});\n\n\t\tdescribe(\"API\", () => {\n\t\t\tdescribe(\".get()\", () => {\n\t\t\t\tit(\"Should be able to retrieve a key\", () => {\n\t\t\t\t\tconst value = \"value\";\n\t\t\t\t\tmap1.set(\"test\", value);\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\t// Verify the local SharedMap\n\t\t\t\t\tassert.equal(map1.get(\"test\"), value, \"could not retrieve key\");\n\n\t\t\t\t\t// Verify the remote SharedMap\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap2.get(\"test\"),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\"could not retrieve key from the remote map\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\".has()\", () => {\n\t\t\t\tit(\"Should return false when a key is not in the map\", () => {\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap1.has(\"notInSet\"),\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\"has() did not return false for missing key\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should return true when a key is in the map\", () => {\n\t\t\t\t\tmap1.set(\"inSet\", \"value\");\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\t// Verify the local SharedMap\n\t\t\t\t\tassert.equal(map1.has(\"inSet\"), true, \"could not find the key\");\n\n\t\t\t\t\t// Verify the remote SharedMap\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap2.has(\"inSet\"),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"could not find the key in the remote map\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\".set()\", () => {\n\t\t\t\tit(\"Should set a key to a value\", () => {\n\t\t\t\t\tconst value = \"value\";\n\t\t\t\t\tmap1.set(\"test\", value);\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\t// Verify the local SharedMap\n\t\t\t\t\tassert.equal(map1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\t\tassert.equal(map1.get(\"test\"), value, \"could not get the set key\");\n\n\t\t\t\t\t// Verify the remote SharedMap\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap2.has(\"test\"),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"could not find the set key in remote map\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap2.get(\"test\"),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\"could not get the set key from remote map\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should be able to set a shared object handle as a key\", () => {\n\t\t\t\t\tconst subMap = createLocalMap(\"subMap\");\n\t\t\t\t\tmap1.set(\"test\", subMap.handle);\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\t// Verify the local SharedMap\n\t\t\t\t\tconst localSubMap = map1.get<IFluidHandle>(\"test\");\n\t\t\t\t\tassert(localSubMap);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tlocalSubMap.absolutePath,\n\t\t\t\t\t\tsubMap.handle.absolutePath,\n\t\t\t\t\t\t\"could not get the handle's path\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Verify the remote SharedMap\n\t\t\t\t\tconst remoteSubMap = map2.get<IFluidHandle>(\"test\");\n\t\t\t\t\tassert(remoteSubMap);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tremoteSubMap.absolutePath,\n\t\t\t\t\t\tsubMap.handle.absolutePath,\n\t\t\t\t\t\t\"could not get the handle's path in remote map\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should be able to set and retrieve a plain object with nested handles\", async () => {\n\t\t\t\t\tconst subMap = createLocalMap(\"subMap\");\n\t\t\t\t\tconst subMap2 = createLocalMap(\"subMap2\");\n\t\t\t\t\tconst containingObject = {\n\t\t\t\t\t\tsubMapHandle: subMap.handle,\n\t\t\t\t\t\tnestedObj: {\n\t\t\t\t\t\t\tsubMap2Handle: subMap2.handle,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tmap1.set(\"object\", containingObject);\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\tconst retrieved = map1.get(\"object\") as typeof containingObject;\n\t\t\t\t\tconst retrievedSubMap: unknown = await retrieved.subMapHandle.get();\n\t\t\t\t\tassert.equal(retrievedSubMap, subMap, \"could not get nested map 1\");\n\t\t\t\t\tconst retrievedSubMap2: unknown = await retrieved.nestedObj.subMap2Handle.get();\n\t\t\t\t\tassert.equal(retrievedSubMap2, subMap2, \"could not get nested map 2\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Shouldn't clear value remotely if there is pending set\", () => {\n\t\t\t\t\tconst valuesChanged: IValueChanged[] = [];\n\t\t\t\t\tlet clearCount = 0;\n\n\t\t\t\t\tmap1.on(\"valueChanged\", (changed, local, target) => {\n\t\t\t\t\t\tvaluesChanged.push(changed);\n\t\t\t\t\t});\n\t\t\t\t\tmap1.on(\"clear\", (local, target) => {\n\t\t\t\t\t\tclearCount++;\n\t\t\t\t\t});\n\n\t\t\t\t\tmap2.set(\"map2key\", \"value2\");\n\t\t\t\t\tmap2.clear();\n\t\t\t\t\tmap1.set(\"map1Key\", \"value1\");\n\t\t\t\t\tmap2.clear();\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(2);\n\n\t\t\t\t\tassert.equal(valuesChanged.length, 3);\n\t\t\t\t\tassert.equal(valuesChanged[0].key, \"map1Key\");\n\t\t\t\t\tassert.equal(valuesChanged[0].previousValue, undefined);\n\t\t\t\t\tassert.equal(valuesChanged[1].key, \"map2key\");\n\t\t\t\t\tassert.equal(valuesChanged[1].previousValue, undefined);\n\t\t\t\t\tassert.equal(valuesChanged[2].key, \"map1Key\");\n\t\t\t\t\tassert.equal(valuesChanged[2].previousValue, undefined);\n\t\t\t\t\tassert.equal(clearCount, 1);\n\t\t\t\t\tassert.equal(map1.size, 1);\n\t\t\t\t\tassert.equal(map1.get(\"map1Key\"), \"value1\");\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(2);\n\n\t\t\t\t\tassert.equal(valuesChanged.length, 3);\n\t\t\t\t\tassert.equal(clearCount, 2);\n\t\t\t\t\tassert.equal(map1.size, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"Shouldn't keep the old pending set after a local clear\", () => {\n\t\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t\t\tmap1.clear();\n\t\t\t\t\tmap1.set(\"1\", 2);\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\tassert.equal(map1.get(\"1\"), 2);\n\t\t\t\t\tassert.equal(map1.get(\"2\"), undefined);\n\t\t\t\t\tassert.equal(map1.get(\"3\"), undefined);\n\t\t\t\t\tassert.equal(map2.get(\"1\"), 2);\n\t\t\t\t\tassert.equal(map2.get(\"2\"), undefined);\n\t\t\t\t\tassert.equal(map2.get(\"3\"), undefined);\n\t\t\t\t});\n\n\t\t\t\tit(\"Shouldn't overwrite value if there is pending set\", () => {\n\t\t\t\t\tconst value1 = \"value1\";\n\t\t\t\t\tconst pending1 = \"pending1\";\n\t\t\t\t\tconst pending2 = \"pending2\";\n\t\t\t\t\tmap1.set(\"test\", value1);\n\t\t\t\t\tmap2.set(\"test\", pending1);\n\t\t\t\t\tmap2.set(\"test\", pending2);\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t\t// Verify the SharedMap with processed message\n\t\t\t\t\tassert.equal(map1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\t\tassert.equal(map1.get(\"test\"), value1, \"could not get the set key\");\n\n\t\t\t\t\t// Verify the SharedMap with 2 pending messages\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap2.has(\"test\"),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"could not find the set key in pending map\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap2.get(\"test\"),\n\t\t\t\t\t\tpending2,\n\t\t\t\t\t\t\"could not get the set key from pending map\",\n\t\t\t\t\t);\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t\t// Verify the SharedMap gets updated from remote\n\t\t\t\t\tassert.equal(map1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\t\tassert.equal(map1.get(\"test\"), pending1, \"could not get the set key\");\n\n\t\t\t\t\t// Verify the SharedMap with 1 pending message\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap2.has(\"test\"),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"could not find the set key in pending map\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap2.get(\"test\"),\n\t\t\t\t\t\tpending2,\n\t\t\t\t\t\t\"could not get the set key from pending map\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Shouldn't set values when pending clear\", () => {\n\t\t\t\t\tconst key = \"test\";\n\t\t\t\t\tmap1.set(key, \"map1value1\");\n\t\t\t\t\tmap2.set(key, \"map2value2\");\n\t\t\t\t\tmap2.clear();\n\t\t\t\t\tmap2.set(key, \"map2value3\");\n\t\t\t\t\tmap2.clear();\n\n\t\t\t\t\t// map1.set(key, \"map1value1\");\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t\t// Verify the SharedMap with processed message\n\t\t\t\t\tassert.equal(map1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\t\tassert.equal(map1.get(\"test\"), \"map1value1\", \"could not get the set key\");\n\n\t\t\t\t\t// Verify the SharedMap with 2 pending clears\n\t\t\t\t\tassert.equal(map2.has(\"test\"), false, \"found the set key in pending map\");\n\n\t\t\t\t\t// map2.set(key, \"map2value2\");\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t\t// Verify the SharedMap gets updated from remote\n\t\t\t\t\tassert.equal(map1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\t\tassert.equal(map1.get(\"test\"), \"map2value2\", \"could not get the set key\");\n\n\t\t\t\t\t// Verify the SharedMap with 2 pending clears\n\t\t\t\t\tassert.equal(map2.has(\"test\"), false, \"found the set key in pending map\");\n\n\t\t\t\t\t// map2.clear();\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t\t// Verify the SharedMap gets updated from remote clear\n\t\t\t\t\tassert.equal(map1.has(\"test\"), false, \"found the set key\");\n\n\t\t\t\t\t// Verify the SharedMap with 1 pending clear\n\t\t\t\t\tassert.equal(map2.has(\"test\"), false, \"found the set key in pending map\");\n\n\t\t\t\t\t// map2.set(key, \"map2value3\");\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t\t// Verify the SharedMap gets updated from remote\n\t\t\t\t\tassert.equal(map1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\t\tassert.equal(map1.get(\"test\"), \"map2value3\", \"could not get the set key\");\n\n\t\t\t\t\t// Verify the SharedMap with 1 pending clear\n\t\t\t\t\tassert.equal(map2.has(\"test\"), false, \"found the set key in pending map\");\n\n\t\t\t\t\t// map2.clear();\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t\t// Verify the SharedMap gets updated from remote clear\n\t\t\t\t\tassert.equal(map1.has(\"test\"), false, \"found the set key\");\n\n\t\t\t\t\t// Verify the SharedMap with no more pending clear\n\t\t\t\t\tassert.equal(map2.has(\"test\"), false, \"found the set key in pending map\");\n\n\t\t\t\t\tmap1.set(key, \"map1value4\");\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t\t// Verify the SharedMap gets updated from local\n\t\t\t\t\tassert.equal(map1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\t\tassert.equal(map1.get(\"test\"), \"map1value4\", \"could not get the set key\");\n\n\t\t\t\t\t// Verify the SharedMap gets updated from remote\n\t\t\t\t\tassert.equal(map1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\t\tassert.equal(map1.get(\"test\"), \"map1value4\", \"could not get the set key\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\".delete()\", () => {\n\t\t\t\tit(\"Can set and delete map key\", async () => {\n\t\t\t\t\tmap1.set(\"testKey\", \"testValue\");\n\t\t\t\t\tmap1.set(\"testKey2\", \"testValue2\");\n\t\t\t\t\tmap1.delete(\"testKey\");\n\t\t\t\t\tmap1.delete(\"testKey2\");\n\t\t\t\t\tassert.equal(map1.has(\"testKey\"), false, \"could not delete key 1\");\n\t\t\t\t\tassert.equal(map1.has(\"testKey2\"), false, \"could not delete key 2\");\n\t\t\t\t\tmap1.set(\"testKey\", \"testValue\");\n\t\t\t\t\tmap1.set(\"testKey2\", \"testValue2\");\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap1.get(\"testKey\"),\n\t\t\t\t\t\t\"testValue\",\n\t\t\t\t\t\t\"could not retrieve set key 1 after delete\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tmap1.get(\"testKey2\"),\n\t\t\t\t\t\t\"testValue2\",\n\t\t\t\t\t\t\"could not retrieve set key 2 after delete\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t/**\n\t\t\t\t * It is an unusual scenario, the client of map1 executes an invalid delete (since \"foo\" does not exist in its keys),\n\t\t\t\t * but it can remotely delete the \"foo\" which is locally inserted in map2 but not ack'd yet.\n\t\t\t\t *\n\t\t\t\t * This merge outcome might be undesirable: this test case is mostly here to document Map's behavior.\n\t\t\t\t * Please communicate any concerns about the merge outcome to the DDS team.\n\t\t\t\t */\n\t\t\t\tit(\"Can remotely delete a key which should be unknown to the local client\", () => {\n\t\t\t\t\tmap1.set(\"foo\", 1);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tmap1.delete(\"foo\");\n\t\t\t\t\tmap2.set(\"foo\", 2);\n\t\t\t\t\tmap1.delete(\"foo\");\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\tassert.equal(map1.get(\"foo\"), undefined);\n\t\t\t\t\tassert.equal(map2.get(\"foo\"), undefined);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\".forEach()\", () => {\n\t\t\t\tit(\"Should iterate over all keys in the map\", () => {\n\t\t\t\t\t// We use a set to mark the values we want to insert. When we iterate we will remove from the set\n\t\t\t\t\t// and then check it's empty at the end\n\t\t\t\t\tconst set = new Set<string>();\n\t\t\t\t\tset.add(\"first\");\n\t\t\t\t\tset.add(\"second\");\n\t\t\t\t\tset.add(\"third\");\n\n\t\t\t\t\tfor (const value of set) {\n\t\t\t\t\t\tmap1.set(value, value);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\t// Verify the local SharedMap\n\t\t\t\t\tfor (const [key, value] of map1.entries()) {\n\t\t\t\t\t\tassert.ok(set.has(key), \"the key should be present in the set\");\n\t\t\t\t\t\tassert.equal(key, value, \"the value should match the set value\");\n\t\t\t\t\t\tassert.equal(map1.get(key), value, \"could not get key\");\n\t\t\t\t\t}\n\n\t\t\t\t\t// Verify the remote SharedMap\n\t\t\t\t\tfor (const [key, value] of map2.entries()) {\n\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\tset.has(key),\n\t\t\t\t\t\t\t\"the key in remote map should be present in the set\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\"the value should match the set value in the remote map\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassert.equal(map2.get(key), value, \"could not get key in the remote map\");\n\t\t\t\t\t\tset.delete(key);\n\t\t\t\t\t}\n\n\t\t\t\t\tassert.equal(set.size, 0);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\".size\", () => {\n\t\t\t\tit(\"shouldn't count keys deleted concurrent to a clear op\", () => {\n\t\t\t\t\tmap1.clear();\n\t\t\t\t\tmap2.delete(\"dummy\");\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tassert.equal(map1.size, 0);\n\t\t\t\t\tassert.equal(map2.size, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"should count the key with undefined value concurrent to a clear op\", () => {\n\t\t\t\t\tmap1.clear();\n\t\t\t\t\tmap2.set(\"1\", undefined);\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\t\t\t\t\tassert.equal(map1.size, 0);\n\t\t\t\t\tassert.equal(map2.size, 1);\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\t\t\t\t\tassert.equal(map1.size, 1);\n\t\t\t\t\tassert.equal(map2.size, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"should count keys correctly after local operations\", () => {\n\t\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\t\tmap1.set(\"2\", 1);\n\t\t\t\t\tmap2.set(\"3\", 1);\n\n\t\t\t\t\tassert.equal(map1.size, 2);\n\t\t\t\t\tassert.equal(map2.size, 1);\n\n\t\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\t\tmap1.delete(\"1\");\n\t\t\t\t\tmap2.set(\"2\", 1);\n\n\t\t\t\t\tassert.equal(map1.size, 1);\n\t\t\t\t\tassert.equal(map2.size, 2);\n\n\t\t\t\t\tmap1.delete(\"1\");\n\t\t\t\t\tmap2.clear();\n\n\t\t\t\t\tassert.equal(map1.size, 1);\n\t\t\t\t\tassert.equal(map2.size, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"should count keys correctly after remote operations\", () => {\n\t\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\t\tmap1.set(\"2\", 1);\n\t\t\t\t\tmap2.set(\"3\", 1);\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(2);\n\t\t\t\t\tassert.equal(map1.size, 2);\n\t\t\t\t\tassert.equal(map2.size, 3);\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\t\t\t\t\tassert.equal(map1.size, 3);\n\t\t\t\t\tassert.equal(map2.size, 3);\n\n\t\t\t\t\tmap1.delete(\"3\");\n\t\t\t\t\tmap2.clear();\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\t\t\t\t\tassert.equal(map1.size, 2);\n\t\t\t\t\tassert.equal(map2.size, 0);\n\n\t\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\t\t\t\t\tassert.equal(map1.size, 0);\n\t\t\t\t\tassert.equal(map2.size, 0);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Garbage Collection\", () => {\n\t\tclass GCSharedMapProvider implements IGCTestProvider {\n\t\t\tprivate subMapCount = 0;\n\t\t\tprivate _expectedRoutes: string[] = [];\n\t\t\tprivate readonly map1: SharedMap;\n\t\t\tprivate readonly map2: SharedMap;\n\t\t\tprivate readonly containerRuntimeFactory: MockContainerRuntimeFactory;\n\n\t\t\tpublic constructor() {\n\t\t\t\tthis.containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\t\tthis.map1 = createConnectedMap(\"map1\", this.containerRuntimeFactory);\n\t\t\t\tthis.map2 = createConnectedMap(\"map2\", this.containerRuntimeFactory);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * {@inheritDoc @fluid-private/test-dds-utils#IGCTestProvider.sharedObject}\n\t\t\t */\n\t\t\tpublic get sharedObject(): SharedMap {\n\t\t\t\t// Return the remote SharedMap because we want to verify its summary data.\n\t\t\t\treturn this.map2;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * {@inheritDoc @fluid-private/test-dds-utils#IGCTestProvider.expectedOutboundRoutes}\n\t\t\t */\n\t\t\tpublic get expectedOutboundRoutes(): string[] {\n\t\t\t\treturn this._expectedRoutes;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * {@inheritDoc @fluid-private/test-dds-utils#IGCTestProvider.addOutboundRoutes}\n\t\t\t */\n\t\t\tpublic async addOutboundRoutes(): Promise<void> {\n\t\t\t\tconst newSubMapId = `subMap-${++this.subMapCount}`;\n\t\t\t\tconst subMap = createLocalMap(newSubMapId);\n\t\t\t\tthis.map1.set(newSubMapId, subMap.handle);\n\t\t\t\tthis._expectedRoutes.push(subMap.handle.absolutePath);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * {@inheritDoc @fluid-private/test-dds-utils#IGCTestProvider.deleteOutboundRoutes}\n\t\t\t */\n\t\t\tpublic async deleteOutboundRoutes(): Promise<void> {\n\t\t\t\t// Delete the last handle that was added.\n\t\t\t\tconst subMapId = `subMap-${this.subMapCount}`;\n\t\t\t\tconst deletedHandle = this.map1.get<IFluidHandle>(subMapId);\n\t\t\t\tassert(deletedHandle, \"Route must be added before deleting\");\n\n\t\t\t\tthis.map1.delete(subMapId);\n\t\t\t\t// Remove deleted handle's route from expected routes.\n\t\t\t\tthis._expectedRoutes = this._expectedRoutes.filter(\n\t\t\t\t\t(route) => route !== deletedHandle.absolutePath,\n\t\t\t\t);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * {@inheritDoc @fluid-private/test-dds-utils#IGCTestProvider.addNestedHandles}\n\t\t\t */\n\t\t\tpublic async addNestedHandles(): Promise<void> {\n\t\t\t\tconst subMapId1 = `subMap-${++this.subMapCount}`;\n\t\t\t\tconst subMapId2 = `subMap-${++this.subMapCount}`;\n\t\t\t\tconst subMap = createLocalMap(subMapId1);\n\t\t\t\tconst subMap2 = createLocalMap(subMapId2);\n\t\t\t\tconst containingObject = {\n\t\t\t\t\tsubMapHandle: subMap.handle,\n\t\t\t\t\tnestedObj: {\n\t\t\t\t\t\tsubMap2Handle: subMap2.handle,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tthis.map1.set(subMapId2, containingObject);\n\t\t\t\tthis._expectedRoutes.push(subMap.handle.absolutePath, subMap2.handle.absolutePath);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t}\n\t\t}\n\n\t\trunGCTests(GCSharedMapProvider);\n\t});\n});\n"]}
@@ -0,0 +1,158 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "node:assert";
6
+ import { MockFluidDataStoreRuntime, MockContainerRuntimeFactory, MockStorage, } from "@fluidframework/test-runtime-utils";
7
+ import { FlushMode } from "@fluidframework/runtime-definitions";
8
+ import { MapFactory, SharedMap } from "../../map.js";
9
+ import { DirectoryFactory, SharedDirectory } from "../../directory.js";
10
+ describe("Rebasing", () => {
11
+ let containerRuntimeFactory;
12
+ let containerRuntime1;
13
+ let containerRuntime2;
14
+ for (const testConfig of [
15
+ {
16
+ options: {
17
+ flushMode: FlushMode.Immediate,
18
+ },
19
+ name: "FlushMode immediate",
20
+ },
21
+ {
22
+ options: {
23
+ flushMode: FlushMode.TurnBased,
24
+ enableGroupedBatching: true,
25
+ },
26
+ name: "FlushMode TurnBased with grouped batching",
27
+ },
28
+ ]) {
29
+ describe(`SharedMap - ${testConfig.name}`, () => {
30
+ let map1;
31
+ let map2;
32
+ beforeEach("createMaps", async () => {
33
+ containerRuntimeFactory = new MockContainerRuntimeFactory(testConfig.options);
34
+ const dataStoreRuntime1 = new MockFluidDataStoreRuntime();
35
+ containerRuntime1 =
36
+ containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);
37
+ const services1 = {
38
+ deltaConnection: dataStoreRuntime1.createDeltaConnection(),
39
+ objectStorage: new MockStorage(),
40
+ };
41
+ map1 = new SharedMap("shared-map-1", dataStoreRuntime1, MapFactory.Attributes);
42
+ map1.connect(services1);
43
+ const dataStoreRuntime2 = new MockFluidDataStoreRuntime();
44
+ containerRuntime2 =
45
+ containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);
46
+ const services2 = {
47
+ deltaConnection: dataStoreRuntime2.createDeltaConnection(),
48
+ objectStorage: new MockStorage(),
49
+ };
50
+ map2 = new SharedMap("shared-map-2", dataStoreRuntime2, MapFactory.Attributes);
51
+ map2.connect(services2);
52
+ });
53
+ it("Rebasing ops maintains eventual consistency", () => {
54
+ const keyCount = 10;
55
+ for (let i = 0; i < keyCount; i++) {
56
+ map1.set(`${i}`, map1.size);
57
+ }
58
+ containerRuntime1.rebase();
59
+ containerRuntime1.flush();
60
+ containerRuntimeFactory.processAllMessages();
61
+ for (let i = 0; i < keyCount; i++) {
62
+ assert.strictEqual(map1.get(`${i}`), i);
63
+ assert.strictEqual(map2.get(`${i}`), i);
64
+ }
65
+ const deleteThreshold = 5;
66
+ for (let i = 0; i < deleteThreshold - 1; i++) {
67
+ map2.delete(`${i}`);
68
+ }
69
+ map1.delete(`${deleteThreshold - 1}`);
70
+ containerRuntime2.rebase();
71
+ containerRuntime1.flush();
72
+ containerRuntime2.flush();
73
+ containerRuntimeFactory.processAllMessages();
74
+ for (let i = 0; i < 10; i++) {
75
+ const expected = i < deleteThreshold ? undefined : i;
76
+ assert.strictEqual(map1.get(`${i}`), expected);
77
+ assert.strictEqual(map2.get(`${i}`), expected);
78
+ }
79
+ });
80
+ });
81
+ describe(`SharedDirectory - ${testConfig.name}`, () => {
82
+ let dir1;
83
+ let dir2;
84
+ beforeEach("createDirectories", async () => {
85
+ containerRuntimeFactory = new MockContainerRuntimeFactory(testConfig.options);
86
+ const dataStoreRuntime1 = new MockFluidDataStoreRuntime();
87
+ containerRuntime1 =
88
+ containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);
89
+ const services1 = {
90
+ deltaConnection: dataStoreRuntime1.createDeltaConnection(),
91
+ objectStorage: new MockStorage(),
92
+ };
93
+ dir1 = new SharedDirectory("shared-directory-1", dataStoreRuntime1, DirectoryFactory.Attributes);
94
+ dir1.connect(services1);
95
+ // Create the second SharedMap.
96
+ const dataStoreRuntime2 = new MockFluidDataStoreRuntime();
97
+ containerRuntime2 =
98
+ containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);
99
+ const services2 = {
100
+ deltaConnection: dataStoreRuntime2.createDeltaConnection(),
101
+ objectStorage: new MockStorage(),
102
+ };
103
+ dir2 = new SharedDirectory("shared-directory-2", dataStoreRuntime2, DirectoryFactory.Attributes);
104
+ dir2.connect(services2);
105
+ });
106
+ const areDirectoriesEqual = (a, b) => {
107
+ if (a === undefined || b === undefined) {
108
+ assert.strictEqual(a, b, "Both directories should be undefined");
109
+ return;
110
+ }
111
+ const leftKeys = [...a.keys()];
112
+ const rightKeys = [...b.keys()];
113
+ assert.strictEqual(leftKeys.length, rightKeys.length, "Number of keys should be the same");
114
+ for (const key of leftKeys) {
115
+ assert.strictEqual(a.get(key), b.get(key), "Key values should be the same");
116
+ }
117
+ const leftSubdirectories = [...a.subdirectories()];
118
+ const rightSubdirectories = [...b.subdirectories()];
119
+ assert.strictEqual(leftSubdirectories.length, rightSubdirectories.length, "Number of subdirectories should be the same");
120
+ for (const [name] of leftSubdirectories)
121
+ areDirectoriesEqual(a.getSubDirectory(name), b.getSubDirectory(name));
122
+ };
123
+ it("Rebasing ops maintains eventual consistency", () => {
124
+ dir2.on("valueChanged", (changed) => {
125
+ if (changed.key === "key") {
126
+ dir2.set("valueChanged", "valueChanged");
127
+ }
128
+ });
129
+ dir2.on("subDirectoryCreated", () => {
130
+ dir2.set("subDirectoryCreated1", "subDirectoryCreated");
131
+ dir2.set("subDirectoryCreated2", "subDirectoryCreated");
132
+ });
133
+ const root1SubDir = dir1.createSubDirectory("testSubDir");
134
+ dir2.createSubDirectory("testSubDir");
135
+ containerRuntime1.flush();
136
+ containerRuntime2.rebase();
137
+ containerRuntime2.flush();
138
+ root1SubDir.set("key1", "testValue1");
139
+ dir1.set("key", "value");
140
+ containerRuntime1.flush();
141
+ containerRuntimeFactory.processAllMessages();
142
+ dir2.deleteSubDirectory("testSubDir");
143
+ dir2.createSubDirectory("testSubDir");
144
+ containerRuntime2.rebase();
145
+ containerRuntime2.flush();
146
+ containerRuntimeFactory.processAllMessages();
147
+ const directory1SubDir = dir1.getSubDirectory("testSubDir");
148
+ const directory2SubDir = dir2.getSubDirectory("testSubDir");
149
+ assert(directory1SubDir !== undefined, "SubDirectory on dir 1 should be present");
150
+ assert(directory2SubDir !== undefined, "SubDirectory on dir 2 should be present");
151
+ assert.strictEqual(directory1SubDir.size, 0, "Dir 1 no key should exist");
152
+ assert.strictEqual(directory2SubDir.size, 0, "Dir 2 no key should exist");
153
+ areDirectoriesEqual(dir1, dir2);
154
+ });
155
+ });
156
+ }
157
+ });
158
+ //# sourceMappingURL=rebasing.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebasing.spec.js","sourceRoot":"","sources":["../../../src/test/mocha/rebasing.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport { MapFactory, SharedMap } from \"../../map.js\";\nimport { DirectoryFactory, SharedDirectory } from \"../../directory.js\";\nimport { IDirectory } from \"../../interfaces.js\";\n\ndescribe(\"Rebasing\", () => {\n\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\tlet containerRuntime1: MockContainerRuntime;\n\tlet containerRuntime2: MockContainerRuntime;\n\n\tfor (const testConfig of [\n\t\t{\n\t\t\toptions: {\n\t\t\t\tflushMode: FlushMode.Immediate,\n\t\t\t},\n\t\t\tname: \"FlushMode immediate\",\n\t\t},\n\t\t{\n\t\t\toptions: {\n\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\tenableGroupedBatching: true,\n\t\t\t},\n\t\t\tname: \"FlushMode TurnBased with grouped batching\",\n\t\t},\n\t]) {\n\t\tdescribe(`SharedMap - ${testConfig.name}`, () => {\n\t\t\tlet map1: SharedMap;\n\t\t\tlet map2: SharedMap;\n\n\t\t\tbeforeEach(\"createMaps\", async () => {\n\t\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory(testConfig.options);\n\t\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntime1 =\n\t\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\t\tconst services1 = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t\t};\n\t\t\t\tmap1 = new SharedMap(\"shared-map-1\", dataStoreRuntime1, MapFactory.Attributes);\n\t\t\t\tmap1.connect(services1);\n\n\t\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntime2 =\n\t\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\t\tconst services2 = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t\t};\n\t\t\t\tmap2 = new SharedMap(\"shared-map-2\", dataStoreRuntime2, MapFactory.Attributes);\n\t\t\t\tmap2.connect(services2);\n\t\t\t});\n\n\t\t\tit(\"Rebasing ops maintains eventual consistency\", () => {\n\t\t\t\tconst keyCount = 10;\n\t\t\t\tfor (let i = 0; i < keyCount; i++) {\n\t\t\t\t\tmap1.set(`${i}`, map1.size);\n\t\t\t\t}\n\n\t\t\t\tcontainerRuntime1.rebase();\n\t\t\t\tcontainerRuntime1.flush();\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tfor (let i = 0; i < keyCount; i++) {\n\t\t\t\t\tassert.strictEqual(map1.get(`${i}`), i);\n\t\t\t\t\tassert.strictEqual(map2.get(`${i}`), i);\n\t\t\t\t}\n\n\t\t\t\tconst deleteThreshold = 5;\n\t\t\t\tfor (let i = 0; i < deleteThreshold - 1; i++) {\n\t\t\t\t\tmap2.delete(`${i}`);\n\t\t\t\t}\n\n\t\t\t\tmap1.delete(`${deleteThreshold - 1}`);\n\n\t\t\t\tcontainerRuntime2.rebase();\n\t\t\t\tcontainerRuntime1.flush();\n\t\t\t\tcontainerRuntime2.flush();\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\t\tconst expected = i < deleteThreshold ? undefined : i;\n\t\t\t\t\tassert.strictEqual(map1.get(`${i}`), expected);\n\t\t\t\t\tassert.strictEqual(map2.get(`${i}`), expected);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tdescribe(`SharedDirectory - ${testConfig.name}`, () => {\n\t\t\tlet dir1: SharedDirectory;\n\t\t\tlet dir2: SharedDirectory;\n\n\t\t\tbeforeEach(\"createDirectories\", async () => {\n\t\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory(testConfig.options);\n\t\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntime1 =\n\t\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\t\tconst services1 = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t\t};\n\t\t\t\tdir1 = new SharedDirectory(\n\t\t\t\t\t\"shared-directory-1\",\n\t\t\t\t\tdataStoreRuntime1,\n\t\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tdir1.connect(services1);\n\n\t\t\t\t// Create the second SharedMap.\n\t\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntime2 =\n\t\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\t\tconst services2 = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t\t};\n\t\t\t\tdir2 = new SharedDirectory(\n\t\t\t\t\t\"shared-directory-2\",\n\t\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tdir2.connect(services2);\n\t\t\t});\n\n\t\t\tconst areDirectoriesEqual = (\n\t\t\t\ta: IDirectory | undefined,\n\t\t\t\tb: IDirectory | undefined,\n\t\t\t): void => {\n\t\t\t\tif (a === undefined || b === undefined) {\n\t\t\t\t\tassert.strictEqual(a, b, \"Both directories should be undefined\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst leftKeys = [...a.keys()];\n\t\t\t\tconst rightKeys = [...b.keys()];\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tleftKeys.length,\n\t\t\t\t\trightKeys.length,\n\t\t\t\t\t\"Number of keys should be the same\",\n\t\t\t\t);\n\t\t\t\tfor (const key of leftKeys) {\n\t\t\t\t\tassert.strictEqual(a.get(key), b.get(key), \"Key values should be the same\");\n\t\t\t\t}\n\n\t\t\t\tconst leftSubdirectories = [...a.subdirectories()];\n\t\t\t\tconst rightSubdirectories = [...b.subdirectories()];\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tleftSubdirectories.length,\n\t\t\t\t\trightSubdirectories.length,\n\t\t\t\t\t\"Number of subdirectories should be the same\",\n\t\t\t\t);\n\n\t\t\t\tfor (const [name] of leftSubdirectories)\n\t\t\t\t\tareDirectoriesEqual(a.getSubDirectory(name), b.getSubDirectory(name));\n\t\t\t};\n\n\t\t\tit(\"Rebasing ops maintains eventual consistency\", () => {\n\t\t\t\tdir2.on(\"valueChanged\", (changed) => {\n\t\t\t\t\tif (changed.key === \"key\") {\n\t\t\t\t\t\tdir2.set(\"valueChanged\", \"valueChanged\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tdir2.on(\"subDirectoryCreated\", () => {\n\t\t\t\t\tdir2.set(\"subDirectoryCreated1\", \"subDirectoryCreated\");\n\t\t\t\t\tdir2.set(\"subDirectoryCreated2\", \"subDirectoryCreated\");\n\t\t\t\t});\n\t\t\t\tconst root1SubDir = dir1.createSubDirectory(\"testSubDir\");\n\t\t\t\tdir2.createSubDirectory(\"testSubDir\");\n\n\t\t\t\tcontainerRuntime1.flush();\n\t\t\t\tcontainerRuntime2.rebase();\n\t\t\t\tcontainerRuntime2.flush();\n\n\t\t\t\troot1SubDir.set(\"key1\", \"testValue1\");\n\t\t\t\tdir1.set(\"key\", \"value\");\n\t\t\t\tcontainerRuntime1.flush();\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tdir2.deleteSubDirectory(\"testSubDir\");\n\t\t\t\tdir2.createSubDirectory(\"testSubDir\");\n\n\t\t\t\tcontainerRuntime2.rebase();\n\t\t\t\tcontainerRuntime2.flush();\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst directory1SubDir = dir1.getSubDirectory(\"testSubDir\");\n\t\t\t\tconst directory2SubDir = dir2.getSubDirectory(\"testSubDir\");\n\n\t\t\t\tassert(directory1SubDir !== undefined, \"SubDirectory on dir 1 should be present\");\n\t\t\t\tassert(directory2SubDir !== undefined, \"SubDirectory on dir 2 should be present\");\n\n\t\t\t\tassert.strictEqual(directory1SubDir.size, 0, \"Dir 1 no key should exist\");\n\t\t\t\tassert.strictEqual(directory2SubDir.size, 0, \"Dir 2 no key should exist\");\n\t\t\t\tareDirectoriesEqual(dir1, dir2);\n\t\t\t});\n\t\t});\n\t}\n});\n"]}