@fluidframework/map 2.0.0-rc.2.0.1 → 2.0.0-rc.3.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 (129) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/api-report/map.api.md +17 -158
  3. package/dist/directory.d.ts +7 -51
  4. package/dist/directory.d.ts.map +1 -1
  5. package/dist/directory.js +39 -107
  6. package/dist/directory.js.map +1 -1
  7. package/dist/directoryFactory.d.ts +54 -0
  8. package/dist/directoryFactory.d.ts.map +1 -0
  9. package/dist/directoryFactory.js +91 -0
  10. package/dist/directoryFactory.js.map +1 -0
  11. package/dist/index.d.ts +3 -45
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +7 -55
  14. package/dist/index.js.map +1 -1
  15. package/dist/interfaces.d.ts +7 -57
  16. package/dist/interfaces.d.ts.map +1 -1
  17. package/dist/interfaces.js.map +1 -1
  18. package/dist/internalInterfaces.d.ts +50 -1
  19. package/dist/internalInterfaces.d.ts.map +1 -1
  20. package/dist/internalInterfaces.js.map +1 -1
  21. package/dist/legacy.d.ts +25 -0
  22. package/dist/localValues.d.ts +1 -1
  23. package/dist/localValues.d.ts.map +1 -1
  24. package/dist/localValues.js +6 -6
  25. package/dist/localValues.js.map +1 -1
  26. package/dist/map.d.ts +4 -36
  27. package/dist/map.d.ts.map +1 -1
  28. package/dist/map.js +9 -60
  29. package/dist/map.js.map +1 -1
  30. package/dist/mapFactory.d.ts +52 -0
  31. package/dist/mapFactory.d.ts.map +1 -0
  32. package/dist/mapFactory.js +71 -0
  33. package/dist/mapFactory.js.map +1 -0
  34. package/dist/mapKernel.d.ts +3 -3
  35. package/dist/mapKernel.d.ts.map +1 -1
  36. package/dist/mapKernel.js +14 -14
  37. package/dist/mapKernel.js.map +1 -1
  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/public.d.ts +12 -0
  42. package/internal.d.ts +11 -0
  43. package/legacy.d.ts +11 -0
  44. package/lib/directory.d.ts +7 -51
  45. package/lib/directory.d.ts.map +1 -1
  46. package/lib/directory.js +6 -73
  47. package/lib/directory.js.map +1 -1
  48. package/lib/directoryFactory.d.ts +54 -0
  49. package/lib/directoryFactory.d.ts.map +1 -0
  50. package/lib/directoryFactory.js +87 -0
  51. package/lib/directoryFactory.js.map +1 -0
  52. package/lib/index.d.ts +3 -45
  53. package/lib/index.d.ts.map +1 -1
  54. package/lib/index.js +2 -50
  55. package/lib/index.js.map +1 -1
  56. package/lib/interfaces.d.ts +7 -57
  57. package/lib/interfaces.d.ts.map +1 -1
  58. package/lib/interfaces.js.map +1 -1
  59. package/lib/internalInterfaces.d.ts +50 -1
  60. package/lib/internalInterfaces.d.ts.map +1 -1
  61. package/lib/internalInterfaces.js.map +1 -1
  62. package/lib/legacy.d.ts +25 -0
  63. package/lib/localValues.d.ts +1 -1
  64. package/lib/localValues.d.ts.map +1 -1
  65. package/lib/localValues.js +1 -1
  66. package/lib/localValues.js.map +1 -1
  67. package/lib/map.d.ts +4 -36
  68. package/lib/map.d.ts.map +1 -1
  69. package/lib/map.js +4 -54
  70. package/lib/map.js.map +1 -1
  71. package/lib/mapFactory.d.ts +52 -0
  72. package/lib/mapFactory.d.ts.map +1 -0
  73. package/lib/mapFactory.js +67 -0
  74. package/lib/mapFactory.js.map +1 -0
  75. package/lib/mapKernel.d.ts +3 -3
  76. package/lib/mapKernel.d.ts.map +1 -1
  77. package/lib/mapKernel.js +2 -2
  78. package/lib/mapKernel.js.map +1 -1
  79. package/lib/packageVersion.d.ts +1 -1
  80. package/lib/packageVersion.js +1 -1
  81. package/lib/packageVersion.js.map +1 -1
  82. package/lib/public.d.ts +12 -0
  83. package/package.json +105 -59
  84. package/src/directory.ts +16 -100
  85. package/src/directoryFactory.ts +120 -0
  86. package/src/index.ts +2 -73
  87. package/src/interfaces.ts +7 -62
  88. package/src/internalInterfaces.ts +55 -2
  89. package/src/localValues.ts +6 -5
  90. package/src/map.ts +8 -71
  91. package/src/mapFactory.ts +101 -0
  92. package/src/mapKernel.ts +13 -9
  93. package/src/packageVersion.ts +1 -1
  94. package/api-extractor-cjs.json +0 -8
  95. package/dist/map-alpha.d.ts +0 -898
  96. package/dist/map-beta.d.ts +0 -195
  97. package/dist/map-public.d.ts +0 -195
  98. package/dist/map-untrimmed.d.ts +0 -912
  99. package/lib/map-alpha.d.ts +0 -898
  100. package/lib/map-beta.d.ts +0 -195
  101. package/lib/map-public.d.ts +0 -195
  102. package/lib/map-untrimmed.d.ts +0 -912
  103. package/lib/test/memory/directory.spec.js +0 -71
  104. package/lib/test/memory/directory.spec.js.map +0 -1
  105. package/lib/test/memory/map.spec.js +0 -71
  106. package/lib/test/memory/map.spec.js.map +0 -1
  107. package/lib/test/mocha/directory.order.spec.js +0 -422
  108. package/lib/test/mocha/directory.order.spec.js.map +0 -1
  109. package/lib/test/mocha/directory.snapshot.spec.js +0 -111
  110. package/lib/test/mocha/directory.snapshot.spec.js.map +0 -1
  111. package/lib/test/mocha/directory.spec.js +0 -1406
  112. package/lib/test/mocha/directory.spec.js.map +0 -1
  113. package/lib/test/mocha/directoryEquivalenceUtils.js +0 -36
  114. package/lib/test/mocha/directoryEquivalenceUtils.js.map +0 -1
  115. package/lib/test/mocha/directoryFuzzTests.spec.js +0 -337
  116. package/lib/test/mocha/directoryFuzzTests.spec.js.map +0 -1
  117. package/lib/test/mocha/dirname.cjs +0 -16
  118. package/lib/test/mocha/dirname.cjs.map +0 -1
  119. package/lib/test/mocha/map.fuzz.spec.js +0 -114
  120. package/lib/test/mocha/map.fuzz.spec.js.map +0 -1
  121. package/lib/test/mocha/map.spec.js +0 -685
  122. package/lib/test/mocha/map.spec.js.map +0 -1
  123. package/lib/test/mocha/rebasing.spec.js +0 -158
  124. package/lib/test/mocha/rebasing.spec.js.map +0 -1
  125. package/lib/test/mocha/reconnection.spec.js +0 -327
  126. package/lib/test/mocha/reconnection.spec.js.map +0 -1
  127. package/lib/test/types/validateMapPrevious.generated.js +0 -66
  128. package/lib/test/types/validateMapPrevious.generated.js.map +0 -1
  129. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"directory.spec.js","sourceRoot":"","sources":["../../../src/test/mocha/directory.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { type IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { UsageError } from \"@fluidframework/telemetry-utils\";\nimport { ISummaryBlob, SummaryType } 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\";\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { MapFactory } from \"../../map.js\";\nimport { DirectoryFactory, IDirectoryNewStorageFormat, SharedDirectory } from \"../../directory.js\";\nimport { IDirectory, IDirectoryValueChanged, ISharedMap } from \"../../interfaces.js\";\nimport { assertEquivalentDirectories } from \"./directoryEquivalenceUtils.js\";\n\nfunction createConnectedDirectory(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactory,\n): SharedDirectory {\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 directory = new SharedDirectory(id, dataStoreRuntime, DirectoryFactory.Attributes);\n\tdirectory.connect(services);\n\treturn directory;\n}\n\nfunction createLocalMap(id: string): ISharedMap {\n\tconst factory = new MapFactory();\n\treturn factory.create(new MockFluidDataStoreRuntime(), id);\n}\n\nasync function populate(directory: SharedDirectory, content: unknown): Promise<void> {\n\tconst storage = new MockSharedObjectServices({\n\t\theader: JSON.stringify(content),\n\t});\n\treturn directory.load(storage);\n}\n\nfunction serialize(directory1: SharedDirectory): string {\n\tconst summaryTree = directory1.getAttachSummary().summary;\n\tconst summaryObjectKeys = Object.keys(summaryTree.tree);\n\tassert.strictEqual(summaryObjectKeys.length, 1, \"summary tree should only have one blob\");\n\tassert.strictEqual(summaryObjectKeys[0], \"header\", \"summary should have a header blob\");\n\tassert.strictEqual(\n\t\tsummaryTree.tree.header.type,\n\t\tSummaryType.Blob,\n\t\t\"header is not of SummaryType.Blob\",\n\t);\n\n\tconst content = summaryTree.tree.header.content as string;\n\treturn JSON.stringify((JSON.parse(content) as IDirectoryNewStorageFormat).content);\n}\n\ndescribe(\"Directory\", () => {\n\tdescribe(\"Local state\", () => {\n\t\tlet directory: SharedDirectory;\n\t\tlet dataStoreRuntime: MockFluidDataStoreRuntime;\n\n\t\tbeforeEach(\"createDirectory\", async () => {\n\t\t\tdataStoreRuntime = new MockFluidDataStoreRuntime({ attachState: AttachState.Detached });\n\t\t\tdirectory = new SharedDirectory(\n\t\t\t\t\"directory\",\n\t\t\t\tdataStoreRuntime,\n\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t);\n\t\t});\n\n\t\tdescribe(\"API\", () => {\n\t\t\tit(\"Can create a new directory\", () => {\n\t\t\t\tassert.ok(directory, \"could not create a new directory\");\n\t\t\t});\n\n\t\t\tit(\"Knows its absolute path\", () => {\n\t\t\t\tassert.equal(directory.absolutePath, \"/\", \"the absolute path is not correct\");\n\t\t\t});\n\n\t\t\tit(\"Can set and get keys one level deep\", () => {\n\t\t\t\tdirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tdirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tassert.equal(directory.get(\"testKey\"), \"testValue\", \"could not retrieve set key 1\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory.get(\"testKey2\"),\n\t\t\t\t\t\"testValue2\",\n\t\t\t\t\t\"could not retrieve set key 2\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"should fire correct directory events\", async () => {\n\t\t\t\tlet valueChangedExpected: boolean = true;\n\t\t\t\tlet containedValueChangedExpected: boolean = true;\n\t\t\t\tlet clearExpected: boolean = false;\n\t\t\t\tlet previousValue: unknown;\n\t\t\t\tlet directoryCreationExpected: boolean = true;\n\t\t\t\tlet directoryDeletedExpected: boolean = true;\n\n\t\t\t\tdirectory.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\tdirectory.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, \"dwayne\");\n\t\t\t\t\tassert.equal(changed.previousValue, previousValue);\n\t\t\t\t\tassert.equal(changed.path, directory.absolutePath);\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\tdirectory,\n\t\t\t\t\t\t\"target should be the directory for valueChanged event\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tdirectory.on(\"subDirectoryCreated\", (path, local, target) => {\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tdirectoryCreationExpected,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"subDirectoryCreated event not expected\",\n\t\t\t\t\t);\n\t\t\t\t\tdirectoryCreationExpected = false;\n\n\t\t\t\t\tassert.equal(path, \"rock\");\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 subDirectoryCreated 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\tdirectory,\n\t\t\t\t\t\t\"target should be the directory for subDirectoryCreated event\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tdirectory.on(\"subDirectoryDeleted\", (path, local, target) => {\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tdirectoryDeletedExpected,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"subDirectoryDeleted event not expected\",\n\t\t\t\t\t);\n\t\t\t\t\tdirectoryDeletedExpected = false;\n\t\t\t\t\tassert.equal(path, \"rock\");\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 subDirectoryDeleted 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\tdirectory,\n\t\t\t\t\t\t\"target should be the directory for subDirectoryDeleted event\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tdirectory.on(\"containedValueChanged\", (changed, local, target) => {\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tcontainedValueChangedExpected,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"containedValueChanged event not expected for containedValueChanged event\",\n\t\t\t\t\t);\n\t\t\t\t\tcontainedValueChangedExpected = false;\n\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\tassert.equal(changed.key, \"dwayne\");\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\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 containedValueChanged 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\tdirectory,\n\t\t\t\t\t\t\"target should be the directory for containedValueChanged event\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tdirectory.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(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tdirectory,\n\t\t\t\t\t\t\"target should be the directory for clear event\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tdirectory.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\tdirectory.set(\"dwayne\", \"johnson\");\n\t\t\t\tassert.equal(valueChangedExpected, false, \"missing valueChangedExpected event\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tcontainedValueChangedExpected,\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"missing containedValueChanged event\",\n\t\t\t\t);\n\n\t\t\t\t// Test delete\n\t\t\t\tpreviousValue = \"johnson\";\n\t\t\t\tvalueChangedExpected = true;\n\t\t\t\tcontainedValueChangedExpected = true;\n\t\t\t\tdirectory.delete(\"dwayne\");\n\t\t\t\tassert.equal(valueChangedExpected, false, \"missing valueChangedExpected event\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tcontainedValueChangedExpected,\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"missing containedValueChanged event\",\n\t\t\t\t);\n\n\t\t\t\t// Test createSubDirectory\n\t\t\t\tdirectory.createSubDirectory(\"rock\");\n\t\t\t\tassert.equal(directoryCreationExpected, false, \"missing subDirectoryCreated event\");\n\n\t\t\t\t// Test deleteSubDirectory\n\t\t\t\tpreviousValue = directory.getSubDirectory(\"rock\");\n\t\t\t\tdirectory.deleteSubDirectory(\"rock\");\n\t\t\t\tassert.equal(valueChangedExpected, false, \"missing valueChangedExpected event\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tcontainedValueChangedExpected,\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"missing containedValueChanged event\",\n\t\t\t\t);\n\n\t\t\t\t// Test clear\n\t\t\t\tclearExpected = true;\n\t\t\t\tdirectory.clear();\n\t\t\t\tassert.equal(clearExpected, false, \"missing clearExpected event\");\n\t\t\t});\n\n\t\t\tit(\"should fire create/delete sub directory events\", async () => {\n\t\t\t\tconst subDirectory = directory.createSubDirectory(\"rock\");\n\t\t\t\tconst subDirectory1 = subDirectory.createSubDirectory(\"rockChild\");\n\t\t\t\t// Check Creation events\n\t\t\t\tlet directoryCreationExpected1 = false;\n\t\t\t\tlet directoryCreationExpected2 = false;\n\t\t\t\tsubDirectory.on(\"subDirectoryCreated\", (relativePath, local, target) => {\n\t\t\t\t\tdirectoryCreationExpected1 = true;\n\t\t\t\t\tassert.equal(relativePath, \"rockChild/rockChildChild\", \"Path should match\");\n\t\t\t\t});\n\t\t\t\tsubDirectory1.on(\"subDirectoryCreated\", (relativePath, local, target) => {\n\t\t\t\t\tdirectoryCreationExpected2 = true;\n\t\t\t\t\tassert.equal(relativePath, \"rockChildChild\", \"Path should match\");\n\t\t\t\t});\n\t\t\t\tsubDirectory1.createSubDirectory(\"rockChildChild\");\n\t\t\t\tassert(directoryCreationExpected1, \"Create event should fire\");\n\t\t\t\tassert(directoryCreationExpected2, \"Create event should fire\");\n\n\t\t\t\t// Check Deletion Events\n\t\t\t\tlet directoryDeletionExpected = false;\n\t\t\t\tlet directoryDeletionExpected1 = false;\n\t\t\t\tlet directoryDeletionExpected2 = false;\n\t\t\t\tdirectory.on(\"subDirectoryDeleted\", (relativePath, local, target) => {\n\t\t\t\t\tdirectoryDeletionExpected = true;\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\trelativePath,\n\t\t\t\t\t\t\"rock/rockChild/rockChildChild\",\n\t\t\t\t\t\t\"Path should match\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tsubDirectory.on(\"subDirectoryDeleted\", (relativePath, local, target) => {\n\t\t\t\t\tdirectoryDeletionExpected1 = true;\n\t\t\t\t\tassert.equal(relativePath, \"rockChild/rockChildChild\", \"Path should match\");\n\t\t\t\t});\n\t\t\t\tsubDirectory1.on(\"subDirectoryDeleted\", (relativePath, local, target) => {\n\t\t\t\t\tdirectoryDeletionExpected2 = true;\n\t\t\t\t\tassert.equal(relativePath, \"rockChildChild\", \"Path should match\");\n\t\t\t\t});\n\t\t\t\tsubDirectory1.deleteSubDirectory(\"rockChildChild\");\n\t\t\t\tassert(directoryDeletionExpected, \"Delete event should fire on root\");\n\t\t\t\tassert(directoryDeletionExpected1, \"Delete event should fire on child1\");\n\t\t\t\tassert(directoryDeletionExpected2, \"Delete event should fire on child2\");\n\t\t\t\tsubDirectory1.deleteSubDirectory(\"rockChildChild\");\n\t\t\t});\n\n\t\t\tit(\"Should fire dispose event correctly\", () => {\n\t\t\t\tlet valueChangedExpected: boolean = true;\n\n\t\t\t\tdirectory.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, \"dwayne\", \"key should match\");\n\t\t\t\t\tassert.equal(changed.previousValue, undefined, \"previous value should match\");\n\t\t\t\t\tassert.equal(changed.path, \"/rock\", \"absolute path should match\");\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\tdirectory,\n\t\t\t\t\t\t\"target should be the directory for valueChanged event\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// Test dispose on subDirectory delete\n\t\t\t\tlet subDirectoryDisposed = false;\n\t\t\t\tconst subDirectory = directory.createSubDirectory(\"rock\");\n\t\t\t\tsubDirectory.on(\"disposed\", (value: IDirectory) => {\n\t\t\t\t\tsubDirectoryDisposed = true;\n\t\t\t\t\tassert.equal(value.disposed, true, \"sub directory not deleted\");\n\t\t\t\t});\n\t\t\t\t// Should fire dispose event.\n\t\t\t\tdirectory.deleteSubDirectory(\"rock\");\n\t\t\t\tassert.equal(subDirectoryDisposed, true, \"sub directory not disposed!!\");\n\n\t\t\t\t// Should be able to work on new directory with same name.\n\t\t\t\tvalueChangedExpected = true;\n\t\t\t\tconst newSubDirectory = directory.createSubDirectory(\"rock\");\n\t\t\t\tnewSubDirectory.set(\"dwayne\", \"johnson\");\n\t\t\t\tassert.equal(valueChangedExpected, false, \"missing valueChangedExpected event\");\n\n\t\t\t\t// Usage Error on accessing disposed directory.\n\t\t\t\ttry {\n\t\t\t\t\tsubDirectory.set(\"throw\", \"error\");\n\t\t\t\t\tassert.fail(\"Should throw usage error\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\t(error as UsageError)?.errorType,\n\t\t\t\t\t\t\"usageError\",\n\t\t\t\t\t\t\"Should throw usage error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Check recursive dispose event firing\n\t\t\t\tconst subSubDirectory = newSubDirectory.createSubDirectory(\"rockChild\");\n\t\t\t\tlet rockSubDirectoryDisposed = false;\n\t\t\t\tlet subSubDirectoryDisposed = false;\n\t\t\t\tnewSubDirectory.on(\"disposed\", (value: IDirectory) => {\n\t\t\t\t\trockSubDirectoryDisposed = true;\n\t\t\t\t\tassert.equal(value.disposed, true, \"rock sub directory not deleted\");\n\t\t\t\t});\n\t\t\t\tsubSubDirectory.on(\"disposed\", (value: IDirectory) => {\n\t\t\t\t\tsubSubDirectoryDisposed = true;\n\t\t\t\t\tassert.equal(value.disposed, true, \"sub sub directory not deleted\");\n\t\t\t\t});\n\t\t\t\tdirectory.deleteSubDirectory(\"rock\");\n\t\t\t\tassert(rockSubDirectoryDisposed, \"Rock sub directory should be disposed\");\n\t\t\t\tassert(subSubDirectoryDisposed, \"sub sub directory should be disposed\");\n\t\t\t});\n\n\t\t\tit(\"Check number of sub directories\", () => {\n\t\t\t\tconst subDirectory = directory.createSubDirectory(\"rock1\");\n\t\t\t\tdirectory.createSubDirectory(\"rock2\");\n\t\t\t\tconst childSubDirectory = subDirectory.createSubDirectory(\"rock1Child\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tdirectory.countSubDirectory(),\n\t\t\t\t\t2,\n\t\t\t\t\t\"Should have 2 sub directories\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tsubDirectory.countSubDirectory !== undefined &&\n\t\t\t\t\t\tsubDirectory.countSubDirectory() === 1,\n\t\t\t\t\t\"Should have 1 sub directory\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tchildSubDirectory.countSubDirectory !== undefined &&\n\t\t\t\t\t\tsubDirectory.countSubDirectory() === 1,\n\t\t\t\t\t\"Should have 0 sub directory\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Rejects a undefined and null key set\", () => {\n\t\t\t\tassert.throws(() => {\n\t\t\t\t\tdirectory.set(undefined as unknown as string, \"testValue\");\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\tdirectory.set(null as unknown as string, \"testValue\");\n\t\t\t\t}, \"Should throw for key of null\");\n\t\t\t});\n\n\t\t\tit(\"Rejects subdirectories with undefined and null names\", () => {\n\t\t\t\tassert.throws(() => {\n\t\t\t\t\tdirectory.createSubDirectory(undefined as unknown as string);\n\t\t\t\t}, \"Should throw for undefined subDirectory name\");\n\t\t\t\tassert.throws(() => {\n\t\t\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\t\t\tdirectory.createSubDirectory(null as unknown as string);\n\t\t\t\t}, \"Should throw for null subDirectory name\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Serialize\", () => {\n\t\t\tit(\"Should serialize an empty directory as a JSON object\", () => {\n\t\t\t\tconst serialized = serialize(directory);\n\t\t\t\tassert.equal(serialized, '{\"ci\":{\"csn\":0,\"ccIds\":[]}}');\n\t\t\t});\n\n\t\t\tit(\"Should serialize a directory without subdirectories as a JSON object\", () => {\n\t\t\t\tdirectory.set(\"first\", \"second\");\n\t\t\t\tdirectory.set(\"third\", \"fourth\");\n\t\t\t\tdirectory.set(\"fifth\", \"sixth\");\n\t\t\t\tconst subMap = createLocalMap(\"subMap\");\n\t\t\t\tdirectory.set(\"object\", subMap.handle);\n\n\t\t\t\tconst subMapHandleUrl = subMap.handle.absolutePath;\n\n\t\t\t\tconst serialized = serialize(directory);\n\t\t\t\tconst expected = `{\"ci\":{\"csn\":0,\"ccIds\":[]},\"storage\":{\"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\tassert.equal(serialized, expected);\n\t\t\t});\n\n\t\t\tit(\"Should serialize a directory with subdirectories as a JSON object\", () => {\n\t\t\t\tdirectory.set(\"first\", \"second\");\n\t\t\t\tdirectory.set(\"third\", \"fourth\");\n\t\t\t\tdirectory.set(\"fifth\", \"sixth\");\n\t\t\t\tconst subMap = createLocalMap(\"subMap\");\n\t\t\t\tdirectory.set(\"object\", subMap.handle);\n\t\t\t\tconst nestedDirectory = directory.createSubDirectory(\"nested\");\n\t\t\t\tnestedDirectory.set(\"deepKey1\", \"deepValue1\");\n\t\t\t\tnestedDirectory\n\t\t\t\t\t.createSubDirectory(\"nested2\")\n\t\t\t\t\t.createSubDirectory(\"nested3\")\n\t\t\t\t\t.set(\"deepKey2\", \"deepValue2\");\n\n\t\t\t\tconst subMapHandleUrl = subMap.handle.absolutePath;\n\t\t\t\tconst serialized = serialize(directory);\n\t\t\t\tconst expected = `{\"ci\":{\"csn\":0,\"ccIds\":[]},\"storage\":{\"first\":{\"type\":\"Plain\",\"value\":\"second\"},\"third\":{\"type\":\"Plain\",\"value\":\"fourth\"},\"fifth\":{\"type\":\"Plain\",\"value\":\"sixth\"},\"object\":{\"type\":\"Plain\",\"value\":{\"type\":\"__fluid_handle__\",\"url\":\"${subMapHandleUrl}\"}}},\"subdirectories\":{\"nested\":{\"ci\":{\"csn\":0,\"ccIds\":[\"${dataStoreRuntime.clientId}\"]},\"storage\":{\"deepKey1\":{\"type\":\"Plain\",\"value\":\"deepValue1\"}},\"subdirectories\":{\"nested2\":{\"ci\":{\"csn\":0,\"ccIds\":[\"${dataStoreRuntime.clientId}\"]},\"subdirectories\":{\"nested3\":{\"ci\":{\"csn\":0,\"ccIds\":[\"${dataStoreRuntime.clientId}\"]},\"storage\":{\"deepKey2\":{\"type\":\"Plain\",\"value\":\"deepValue2\"}}}}}}}}}`;\n\t\t\t\tassert.equal(serialized, expected);\n\t\t\t});\n\n\t\t\tit(\"Should serialize an undefined value\", () => {\n\t\t\t\tdirectory.set(\"first\", \"second\");\n\t\t\t\tdirectory.set(\"third\", \"fourth\");\n\t\t\t\tdirectory.set(\"fifth\", undefined);\n\t\t\t\tassert.ok(directory.has(\"fifth\"));\n\t\t\t\tconst subMap = createLocalMap(\"subMap\");\n\t\t\t\tdirectory.set(\"object\", subMap.handle);\n\t\t\t\tconst nestedDirectory = directory.createSubDirectory(\"nested\");\n\t\t\t\tnestedDirectory.set(\"deepKey1\", \"deepValue1\");\n\t\t\t\tnestedDirectory.set(\"deepKeyUndefined\", undefined);\n\t\t\t\tassert.ok(nestedDirectory.has(\"deepKeyUndefined\"));\n\t\t\t\tnestedDirectory\n\t\t\t\t\t.createSubDirectory(\"nested2\")\n\t\t\t\t\t.createSubDirectory(\"nested3\")\n\t\t\t\t\t.set(\"deepKey2\", \"deepValue2\");\n\n\t\t\t\tconst subMapHandleUrl = subMap.handle.absolutePath;\n\t\t\t\tconst serialized = serialize(directory);\n\t\t\t\tconst expected = `{\"ci\":{\"csn\":0,\"ccIds\":[]},\"storage\":{\"first\":{\"type\":\"Plain\",\"value\":\"second\"},\"third\":{\"type\":\"Plain\",\"value\":\"fourth\"},\"fifth\":{\"type\":\"Plain\"},\"object\":{\"type\":\"Plain\",\"value\":{\"type\":\"__fluid_handle__\",\"url\":\"${subMapHandleUrl}\"}}},\"subdirectories\":{\"nested\":{\"ci\":{\"csn\":0,\"ccIds\":[\"${dataStoreRuntime.clientId}\"]},\"storage\":{\"deepKey1\":{\"type\":\"Plain\",\"value\":\"deepValue1\"},\"deepKeyUndefined\":{\"type\":\"Plain\"}},\"subdirectories\":{\"nested2\":{\"ci\":{\"csn\":0,\"ccIds\":[\"${dataStoreRuntime.clientId}\"]},\"subdirectories\":{\"nested3\":{\"ci\":{\"csn\":0,\"ccIds\":[\"${dataStoreRuntime.clientId}\"]},\"storage\":{\"deepKey2\":{\"type\":\"Plain\",\"value\":\"deepValue2\"}}}}}}}}}`;\n\t\t\t\tassert.equal(serialized, expected);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Populate\", () => {\n\t\t\tit(\"Should populate the directory from an empty JSON object (old format)\", async () => {\n\t\t\t\tawait populate(directory, {});\n\t\t\t\tassert.equal(directory.size, 0, \"Failed to initialize to empty directory storage\");\n\t\t\t\tdirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tassert.equal(directory.get(\"testKey\"), \"testValue\", \"Failed to set testKey\");\n\t\t\t\tdirectory.createSubDirectory(\"testSubDir\").set(\"testSubKey\", \"testSubValue\");\n\t\t\t\tconst subDir = directory.getWorkingDirectory(\"testSubDir\");\n\t\t\t\tassert(subDir);\n\t\t\t\tassert.equal(subDir.get(\"testSubKey\"), \"testSubValue\", \"Failed to set testSubKey\");\n\t\t\t});\n\n\t\t\tit(\"Should populate the directory from a basic JSON object (old format)\", async () => {\n\t\t\t\tawait populate(directory, {\n\t\t\t\t\tstorage: {\n\t\t\t\t\t\ttestKey: {\n\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\tvalue: \"testValue4\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttestKey2: {\n\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\tvalue: \"testValue5\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tsubdirectories: {\n\t\t\t\t\t\tfoo: {\n\t\t\t\t\t\t\tstorage: {\n\t\t\t\t\t\t\t\ttestKey: {\n\t\t\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\t\t\tvalue: \"testValue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttestKey2: {\n\t\t\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\t\t\tvalue: \"testValue2\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbar: {\n\t\t\t\t\t\t\tstorage: {\n\t\t\t\t\t\t\t\ttestKey3: {\n\t\t\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\t\t\tvalue: \"testValue3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tassert.equal(directory.size, 2, \"Failed to initialize directory storage correctly\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"/foo\")?.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"foo\")?.get(\"testKey2\"), \"testValue2\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"/bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"\")?.get(\"testKey\"), \"testValue4\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"/\")?.get(\"testKey2\"), \"testValue5\");\n\t\t\t\tdirectory.set(\"testKey\", \"newValue\");\n\t\t\t\tassert.equal(directory.get(\"testKey\"), \"newValue\", \"Failed to set testKey\");\n\t\t\t\tdirectory.createSubDirectory(\"testSubDir\").set(\"testSubKey\", \"newSubValue\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory.getWorkingDirectory(\"testSubDir\")?.get(\"testSubKey\"),\n\t\t\t\t\t\"newSubValue\",\n\t\t\t\t\t\"Failed to set testSubKey\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Should populate the directory with undefined values (old format)\", async () => {\n\t\t\t\tawait populate(directory, {\n\t\t\t\t\tstorage: {\n\t\t\t\t\t\ttestKey: {\n\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\tvalue: \"testValue4\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttestKey2: {\n\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tsubdirectories: {\n\t\t\t\t\t\tfoo: {\n\t\t\t\t\t\t\tstorage: {\n\t\t\t\t\t\t\t\ttestKey: {\n\t\t\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\t\t\tvalue: \"testValue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttestKey2: {\n\t\t\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbar: {\n\t\t\t\t\t\t\tstorage: {\n\t\t\t\t\t\t\t\ttestKey3: {\n\t\t\t\t\t\t\t\t\ttype: \"Plain\",\n\t\t\t\t\t\t\t\t\tvalue: \"testValue3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tassert.equal(directory.size, 2, \"Failed to initialize directory storage correctly\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"/foo\")?.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"foo\")?.get(\"testKey2\"), undefined);\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"/bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"\")?.get(\"testKey\"), \"testValue4\");\n\t\t\t\tassert.equal(directory.getWorkingDirectory(\"/\")?.get(\"testKey2\"), undefined);\n\t\t\t\tassert.ok(directory.has(\"testKey2\"));\n\t\t\t\tassert.ok(directory.getWorkingDirectory(\"/foo\")?.has(\"testKey2\"));\n\t\t\t\tdirectory.set(\"testKey\", \"newValue\");\n\t\t\t\tassert.equal(directory.get(\"testKey\"), \"newValue\", \"Failed to set testKey\");\n\t\t\t\tdirectory.createSubDirectory(\"testSubDir\").set(\"testSubKey\", \"newSubValue\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory.getWorkingDirectory(\"testSubDir\")?.get(\"testSubKey\"),\n\t\t\t\t\t\"newSubValue\",\n\t\t\t\t\t\"Failed to set testSubKey\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Should populate, serialize and de-serialize directory with long property values\", async () => {\n\t\t\t\t// 40K word\n\t\t\t\tlet longWord = \"0123456789\";\n\t\t\t\tfor (let i = 0; i < 12; i++) {\n\t\t\t\t\tlongWord = longWord + longWord;\n\t\t\t\t}\n\t\t\t\tconst logWord2 = `${longWord}_2`;\n\n\t\t\t\tdirectory.set(\"first\", \"second\");\n\t\t\t\tdirectory.set(\"long1\", longWord);\n\t\t\t\tconst nestedDirectory = directory.createSubDirectory(\"nested\");\n\t\t\t\tnestedDirectory.set(\"deepKey1\", \"deepValue1\");\n\t\t\t\tnestedDirectory.set(\"long2\", logWord2);\n\n\t\t\t\tconst summarizeResult = directory.getAttachSummary();\n\t\t\t\tconst summaryTree = summarizeResult.summary;\n\t\t\t\tassert.strictEqual(summaryTree.type, SummaryType.Tree, \"summary should be a tree\");\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tObject.keys(summaryTree.tree).length,\n\t\t\t\t\t3,\n\t\t\t\t\t\"number of blobs in summary is incorrect\",\n\t\t\t\t);\n\n\t\t\t\tconst blob0 = summaryTree.tree.blob0 as ISummaryBlob;\n\t\t\t\tassert(blob0 !== undefined, \"blob0 not present in summary\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tblob0.type,\n\t\t\t\t\tSummaryType.Blob,\n\t\t\t\t\t\"blob0 is not of SummaryType.Blob\",\n\t\t\t\t);\n\t\t\t\tassert(blob0.content.length >= 1024, \"blob0's length is incorrect\");\n\n\t\t\t\tconst blob1 = summaryTree.tree.blob1 as ISummaryBlob;\n\t\t\t\tassert(blob1 !== undefined, \"blob1 not present in summary\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tblob1.type,\n\t\t\t\t\tSummaryType.Blob,\n\t\t\t\t\t\"blob1 is not of SummaryType.Blob\",\n\t\t\t\t);\n\t\t\t\tassert(blob1.content.length >= 1024, \"blob1's length is incorrect\");\n\n\t\t\t\tconst header = summaryTree.tree.header as ISummaryBlob;\n\t\t\t\tassert(header !== undefined, \"header not present in summary\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\theader.type,\n\t\t\t\t\tSummaryType.Blob,\n\t\t\t\t\t\"header is not of SummaryType.Blob\",\n\t\t\t\t);\n\t\t\t\tassert(header.content.length >= 200, \"header's length is incorrect\");\n\n\t\t\t\tconst directory2 = new SharedDirectory(\n\t\t\t\t\t\"test\",\n\t\t\t\t\tdataStoreRuntime,\n\t\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tconst storage = MockSharedObjectServices.createFromSummary(summarizeResult.summary);\n\t\t\t\tawait directory2.load(storage);\n\n\t\t\t\tassert.equal(directory2.get(\"first\"), \"second\");\n\t\t\t\tassert.equal(directory2.get(\"long1\"), longWord);\n\t\t\t\tconst nestedSubDir = directory2.getWorkingDirectory(\"/nested\");\n\t\t\t\tassert(nestedSubDir);\n\t\t\t\tassert.equal(nestedSubDir.get(\"deepKey1\"), \"deepValue1\");\n\t\t\t\tassert.equal(nestedSubDir.get(\"long2\"), logWord2);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Op processing\", () => {\n\t\t\tit(\"Should lead to eventual consistency 1\", async () => {\n\t\t\t\t// Load a new SharedDirectory in connected state from the summarize 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\tdirectory.getAttachSummary().summary,\n\t\t\t\t);\n\t\t\t\tservices2.deltaConnection = dataStoreRuntime2.createDeltaConnection();\n\n\t\t\t\tconst directory2 = new SharedDirectory(\n\t\t\t\t\t\"directory2\",\n\t\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tawait directory2.load(services2);\n\n\t\t\t\t// Now connect the first SharedDirectory\n\t\t\t\tdataStoreRuntime.setAttachState(AttachState.Attached);\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\t\t\tconst services1 = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t\t\t};\n\t\t\t\tdirectory.connect(services1);\n\n\t\t\t\t// Create a sub directory in a sub directory and queue up keys to be set in it\n\t\t\t\tconst someParentDir1 = directory.createSubDirectory(\"lists\");\n\n\t\t\t\tconst subDir1 = someParentDir1.createSubDirectory(\"ListLevels-0\");\n\t\t\t\tsubDir1.set(\"random1\", 1);\n\t\t\t\tsubDir1.set(\"random2\", 2);\n\n\t\t\t\t// Let everything get stamped and round-trip back to us\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Now, let's be tricky. Let's set one of the keys again...\n\t\t\t\tconst dir1 = directory.getSubDirectory(\"lists\");\n\t\t\t\tconst subDirDir11 = dir1?.getSubDirectory(\"ListLevels-0\");\n\t\t\t\tsubDirDir11?.set(\"random1\", 3);\n\n\t\t\t\t// ... then delete the sub directory and its parent, create a new sub directory\n\t\t\t\t// and parent with the exact same paths. We need to set at least one of the same\n\t\t\t\t// keys as we had unacked in the old sub directory instance. In this case, we only\n\t\t\t\t// need to set one of the keys.\n\t\t\t\tdirectory.getSubDirectory(\"lists\")?.deleteSubDirectory(\"ListLevels-0\");\n\t\t\t\tdirectory.deleteSubDirectory(\"lists\");\n\n\t\t\t\tconst someParentDir2 = directory.createSubDirectory(\"lists\");\n\t\t\t\tconst subDir2 = someParentDir2.createSubDirectory(\"ListLevels-0\");\n\t\t\t\tsubDir2.set(\"random1\", 4);\n\n\t\t\t\t// Let everything get stamped and round-trip back to us\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst testSubDir1 = directory\n\t\t\t\t\t.getSubDirectory(\"lists\")\n\t\t\t\t\t?.getSubDirectory(\"ListLevels-0\");\n\t\t\t\tconst testSubDir2 = directory2\n\t\t\t\t\t.getSubDirectory(\"lists\")\n\t\t\t\t\t?.getSubDirectory(\"ListLevels-0\");\n\t\t\t\tassert(testSubDir1 !== undefined, \"second level subDir should exists in dir1\");\n\t\t\t\tassert(testSubDir2 !== undefined, \"second level subDir should exists in dir2\");\n\t\t\t\tassert(testSubDir1.get(\"random1\") === 4, \"value should be correct in dir1\");\n\t\t\t\tassert(testSubDir2.get(\"random1\") === 4, \"value should be correct in dir2\");\n\t\t\t\tassert(\n\t\t\t\t\ttestSubDir1.get(\"random2\") === undefined,\n\t\t\t\t\t\"value should be correct in dir1 for key2\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\ttestSubDir2.get(\"random2\") === undefined,\n\t\t\t\t\t\"value should be correct in dir2 for key2\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Should populate with csn as 0 and then process the create op\", async () => {\n\t\t\t\tdirectory.createSubDirectory(\"nested\");\n\t\t\t\tconst serialized = serialize(directory);\n\n\t\t\t\t// Now populate a new directory with contents of above to simulate processing of attach op\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\tdirectory.getAttachSummary().summary,\n\t\t\t\t);\n\t\t\t\tservices2.deltaConnection = dataStoreRuntime2.createDeltaConnection();\n\n\t\t\t\tconst directory2 = new SharedDirectory(\n\t\t\t\t\t\"directory2\",\n\t\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tawait directory2.load(services2);\n\n\t\t\t\t// Now load another directory to send op from that.\n\t\t\t\tconst dataStoreRuntime3 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime3);\n\t\t\t\tconst services3 = MockSharedObjectServices.createFromSummary(\n\t\t\t\t\tdirectory.getAttachSummary().summary,\n\t\t\t\t);\n\t\t\t\tservices3.deltaConnection = dataStoreRuntime3.createDeltaConnection();\n\n\t\t\t\tconst directory3 = new SharedDirectory(\n\t\t\t\t\t\"directory3\",\n\t\t\t\t\tdataStoreRuntime3,\n\t\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tawait directory3.load(services3);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Now send create op\n\t\t\t\tdirectory3.getSubDirectory(\"nested\")?.createSubDirectory(\"nested2\");\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Other directory should process the create op.\n\t\t\t\tassert(\n\t\t\t\t\tdirectory2.getSubDirectory(\"nested\")?.getSubDirectory(\"nested2\") !== undefined,\n\t\t\t\t\t\"/nested/nested2 should be present\",\n\t\t\t\t);\n\t\t\t});\n\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 SharedDirectory in local state performs a set or directory operation.\n\t\t\t *\n\t\t\t * - A second SharedDirectory is then created from the summarize of the first one.\n\t\t\t *\n\t\t\t * - The second SharedDirectory performs the same operation as the first one but with a different value.\n\t\t\t *\n\t\t\t * - The expected behavior is that the first SharedDirectory updates the key with the new value. But in the\n\t\t\t * bug, the first SharedDirectory stores the key in its pending state even though it does not send out an\n\t\t\t * an op. So when it gets a remote op with the same key, it ignores it as it has a pending op with the\n\t\t\t * 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\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\tdirectory.set(key, value);\n\n\t\t\t\t// Load a new SharedDirectory in connected state from the summarize 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\tdirectory.getAttachSummary().summary,\n\t\t\t\t);\n\t\t\t\tservices2.deltaConnection = dataStoreRuntime2.createDeltaConnection();\n\n\t\t\t\tconst directory2 = new SharedDirectory(\n\t\t\t\t\t\"directory2\",\n\t\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tawait directory2.load(services2);\n\n\t\t\t\t// Now connect the first SharedDirectory\n\t\t\t\tdataStoreRuntime.setAttachState(AttachState.Attached);\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\t\t\tconst services1 = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t\t\t};\n\t\t\t\tdirectory.connect(services1);\n\n\t\t\t\t// Verify that both the directories have the key.\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory.get(key),\n\t\t\t\t\tvalue,\n\t\t\t\t\t\"The first directory does not have the key\",\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.get(key),\n\t\t\t\t\tvalue,\n\t\t\t\t\t\"The second directory does not have the key\",\n\t\t\t\t);\n\n\t\t\t\t// Set a new value for the same key in the second SharedDirectory.\n\t\t\t\tconst newValue = \"newValue\";\n\t\t\t\tdirectory2.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 directories get the new value.\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory.get(key),\n\t\t\t\t\tnewValue,\n\t\t\t\t\t\"The first directory did not get the new value\",\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.get(key),\n\t\t\t\t\tnewValue,\n\t\t\t\t\t\"The second directory did not get the new value\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"should correctly process subDirectory operations sent in local state\", async () => {\n\t\t\t\t// Set the data store runtime to local.\n\t\t\t\tdataStoreRuntime.local = true;\n\n\t\t\t\t// Create a sub directory in local state.\n\t\t\t\tconst subDirName = \"testSubDir\";\n\t\t\t\tdirectory.createSubDirectory(subDirName);\n\n\t\t\t\t// Load a new SharedDirectory in connected state from the summarize 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\tdirectory.getAttachSummary().summary,\n\t\t\t\t);\n\t\t\t\tservices2.deltaConnection = dataStoreRuntime2.createDeltaConnection();\n\n\t\t\t\tconst directory2 = new SharedDirectory(\n\t\t\t\t\t\"directory2\",\n\t\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tawait directory2.load(services2);\n\n\t\t\t\t// Now connect the first SharedDirectory\n\t\t\t\tdataStoreRuntime.setAttachState(AttachState.Attached);\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\t\t\tconst services1 = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t\t\t};\n\t\t\t\tdirectory.connect(services1);\n\n\t\t\t\t// Verify that both the directories have the key.\n\t\t\t\tassert.ok(\n\t\t\t\t\tdirectory.getSubDirectory(subDirName),\n\t\t\t\t\t\"The first directory does not have sub directory\",\n\t\t\t\t);\n\t\t\t\tconst subDir2 = directory2.getSubDirectory(subDirName);\n\n\t\t\t\tassert.ok(subDir2, \"The second directory does not have sub directory\");\n\n\t\t\t\tsubDir2.set(\"foo\", \"bar\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tassertEquivalentDirectories(directory, directory2);\n\n\t\t\t\t// Delete the subDirectory in the second SharedDirectory.\n\t\t\t\tdirectory2.deleteSubDirectory(subDirName);\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 directory have the sub directory deleted.\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory.getSubDirectory(subDirName),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"The first directory did not process delete\",\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.getSubDirectory(subDirName),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"The second directory did not process delete\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Connected state\", () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tlet directory1: SharedDirectory;\n\t\tlet directory2: SharedDirectory;\n\n\t\tbeforeEach(\"createDirectory\", async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\t// Create the first directory1.\n\t\t\tdirectory1 = createConnectedDirectory(\"directory1\", containerRuntimeFactory);\n\t\t\t// Create a second directory1\n\t\t\tdirectory2 = createConnectedDirectory(\"directory2\", containerRuntimeFactory);\n\t\t});\n\n\t\tdescribe(\"API\", () => {\n\t\t\tit(\"Can set and get keys one level deep\", () => {\n\t\t\t\tdirectory1.set(\"testKey\", \"testValue\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(directory1.get(\"testKey\"), \"testValue\", \"could not retrieve key\");\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.get(\"testKey\"),\n\t\t\t\t\t\"testValue\",\n\t\t\t\t\t\"could not retrieve key from remote directory1\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Can set and get keys two levels deep\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"foo\")?.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"foo/\")?.get(\"testKey2\"), \"testValue2\");\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"bar\")?.get(\"testKey3\"), \"testValue3\");\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"foo\")?.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"foo/\")?.get(\"testKey2\"), \"testValue2\");\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t});\n\n\t\t\tit(\"Can clear keys stored directly under the root\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tdirectory1.set(\"testKey\", \"testValue4\");\n\t\t\t\tdirectory1.set(\"testKey2\", \"testValue5\");\n\t\t\t\tdirectory1.clear();\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"/foo/\")?.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory1.getWorkingDirectory(\"./foo\")?.get(\"testKey2\"),\n\t\t\t\t\t\"testValue2\",\n\t\t\t\t);\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t\tassert.equal(directory1.get(\"testKey\"), undefined);\n\t\t\t\tassert.equal(directory1.get(\"testKey2\"), undefined);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"/foo/\")?.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.getWorkingDirectory(\"./foo\")?.get(\"testKey2\"),\n\t\t\t\t\t\"testValue2\",\n\t\t\t\t);\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t\tassert.equal(directory2.get(\"testKey\"), undefined);\n\t\t\t\tassert.equal(directory2.get(\"testKey2\"), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can delete keys from the root\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tdirectory1.set(\"testKey\", \"testValue4\");\n\t\t\t\tdirectory1.set(\"testKey2\", \"testValue5\");\n\t\t\t\tdirectory1.delete(\"testKey2\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"foo\")?.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"foo\")?.get(\"testKey2\"), \"testValue2\");\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t\tassert.equal(directory1.get(\"testKey\"), \"testValue4\");\n\t\t\t\tassert.equal(directory1.get(\"testKey2\"), undefined);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"foo\")?.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"foo\")?.get(\"testKey2\"), \"testValue2\");\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t\tassert.equal(directory2.get(\"testKey\"), \"testValue4\");\n\t\t\t\tassert.equal(directory2.get(\"testKey2\"), undefined);\n\t\t\t});\n\n\t\t\tit(\"Shouldn't clear value if there is pending set\", () => {\n\t\t\t\tconst valuesChanged: IDirectoryValueChanged[] = [];\n\t\t\t\tlet clearCount = 0;\n\n\t\t\t\tdirectory1.on(\"valueChanged\", (changed, local, target) => {\n\t\t\t\t\tvaluesChanged.push(changed);\n\t\t\t\t});\n\t\t\t\tdirectory1.on(\"clear\", (local, target) => {\n\t\t\t\t\tclearCount++;\n\t\t\t\t});\n\n\t\t\t\tdirectory2.set(\"directory2key\", \"value2\");\n\t\t\t\tdirectory2.clear();\n\t\t\t\tdirectory1.set(\"directory1Key\", \"value1\");\n\t\t\t\tdirectory2.clear();\n\n\t\t\t\tif (containerRuntimeFactory.processSomeMessages === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(2);\n\n\t\t\t\tassert.equal(valuesChanged.length, 3);\n\t\t\t\tassert.equal(valuesChanged[0].key, \"directory1Key\");\n\t\t\t\tassert.equal(valuesChanged[0].previousValue, undefined);\n\t\t\t\tassert.equal(valuesChanged[1].key, \"directory2key\");\n\t\t\t\tassert.equal(valuesChanged[1].previousValue, undefined);\n\t\t\t\tassert.equal(valuesChanged[2].key, \"directory1Key\");\n\t\t\t\tassert.equal(valuesChanged[2].previousValue, undefined);\n\t\t\t\tassert.equal(clearCount, 1);\n\t\t\t\tassert.equal(directory1.size, 1);\n\t\t\t\tassert.equal(directory1.get(\"directory1Key\"), \"value1\");\n\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(2);\n\n\t\t\t\tassert.equal(valuesChanged.length, 3);\n\t\t\t\tassert.equal(clearCount, 2);\n\t\t\t\tassert.equal(directory1.size, 0);\n\t\t\t});\n\n\t\t\tit(\"Shouldn't overwrite value if there is pending set\", () => {\n\t\t\t\tconst value1 = \"value1\";\n\t\t\t\tconst pending1 = \"pending1\";\n\t\t\t\tconst pending2 = \"pending2\";\n\t\t\t\tdirectory1.set(\"test\", value1);\n\t\t\t\tdirectory2.set(\"test\", pending1);\n\t\t\t\tdirectory2.set(\"test\", pending2);\n\n\t\t\t\tif (containerRuntimeFactory.processSomeMessages === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t// Verify the SharedDirectory with processed message\n\t\t\t\tassert.equal(directory1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\tassert.equal(directory1.get(\"test\"), value1, \"could not get the set key\");\n\n\t\t\t\t// Verify the SharedDirectory with 2 pending messages\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.has(\"test\"),\n\t\t\t\t\ttrue,\n\t\t\t\t\t\"could not find the set key in pending directory\",\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.get(\"test\"),\n\t\t\t\t\tpending2,\n\t\t\t\t\t\"could not get the set key from pending directory\",\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t// Verify the SharedDirectory gets updated from remote\n\t\t\t\tassert.equal(directory1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\tassert.equal(directory1.get(\"test\"), pending1, \"could not get the set key\");\n\n\t\t\t\t// Verify the SharedDirectory with 1 pending message\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.has(\"test\"),\n\t\t\t\t\ttrue,\n\t\t\t\t\t\"could not find the set key in pending directory\",\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.get(\"test\"),\n\t\t\t\t\tpending2,\n\t\t\t\t\t\"could not get the set key from pending directory\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Shouldn't set values when pending clear\", () => {\n\t\t\t\tconst key = \"test\";\n\t\t\t\tdirectory1.set(key, \"directory1value1\");\n\t\t\t\tdirectory2.set(key, \"directory2value2\");\n\t\t\t\tdirectory2.clear();\n\t\t\t\tdirectory2.set(key, \"directory2value3\");\n\t\t\t\tdirectory2.clear();\n\n\t\t\t\tif (containerRuntimeFactory.processSomeMessages === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// directory1.set(key, \"directory1value1\");\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t// Verify the SharedDirectory with processed message\n\t\t\t\tassert.equal(directory1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory1.get(\"test\"),\n\t\t\t\t\t\"directory1value1\",\n\t\t\t\t\t\"could not get the set key\",\n\t\t\t\t);\n\n\t\t\t\t// Verify the SharedDirectory with 2 pending clears\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.has(\"test\"),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"found the set key in pending directory\",\n\t\t\t\t);\n\n\t\t\t\t// directory2.set(key, \"directory2value2\");\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t// Verify the SharedDirectory gets updated from remote\n\t\t\t\tassert.equal(directory1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory1.get(\"test\"),\n\t\t\t\t\t\"directory2value2\",\n\t\t\t\t\t\"could not get the set key\",\n\t\t\t\t);\n\n\t\t\t\t// Verify the SharedDirectory with 2 pending clears\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.has(\"test\"),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"found the set key in pending directory\",\n\t\t\t\t);\n\n\t\t\t\t// directory2.clear();\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t// Verify the SharedDirectory gets updated from remote clear\n\t\t\t\tassert.equal(directory1.has(\"test\"), false, \"found the set key\");\n\n\t\t\t\t// Verify the SharedDirectory with 1 pending clear\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.has(\"test\"),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"found the set key in pending directory\",\n\t\t\t\t);\n\n\t\t\t\t// directory2.set(key, \"directory2value3\");\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t// Verify the SharedDirectory gets updated from remote\n\t\t\t\tassert.equal(directory1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory1.get(\"test\"),\n\t\t\t\t\t\"directory2value3\",\n\t\t\t\t\t\"could not get the set key\",\n\t\t\t\t);\n\n\t\t\t\t// Verify the SharedDirectory with 1 pending clear\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.has(\"test\"),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"found the set key in pending directory\",\n\t\t\t\t);\n\n\t\t\t\t// directory2.clear();\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t// Verify the SharedDirectory gets updated from remote clear\n\t\t\t\tassert.equal(directory1.has(\"test\"), false, \"found the set key\");\n\n\t\t\t\t// Verify the SharedDirectory with no more pending clear\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.has(\"test\"),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"found the set key in pending directory\",\n\t\t\t\t);\n\n\t\t\t\tdirectory1.set(key, \"directory1value4\");\n\t\t\t\tcontainerRuntimeFactory.processSomeMessages(1);\n\n\t\t\t\t// Verify the SharedDirectory gets updated from local\n\t\t\t\tassert.equal(directory1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory1.get(\"test\"),\n\t\t\t\t\t\"directory1value4\",\n\t\t\t\t\t\"could not get the set key\",\n\t\t\t\t);\n\n\t\t\t\t// Verify the SharedDirectory gets updated from remote\n\t\t\t\tassert.equal(directory1.has(\"test\"), true, \"could not find the set key\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory1.get(\"test\"),\n\t\t\t\t\t\"directory1value4\",\n\t\t\t\t\t\"could not get the set key\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Directories should ensure eventual consistency using LWW approach 1: Test 1\", async () => {\n\t\t\t\tconst root1SubDir = directory1.createSubDirectory(\"testSubDir\");\n\t\t\t\troot1SubDir.set(\"key1\", \"testValue1\");\n\n\t\t\t\tdirectory1.deleteSubDirectory(\"testSubDir\");\n\t\t\t\tconst root1SubDir2 = directory1.createSubDirectory(\"testSubDir\");\n\t\t\t\troot1SubDir2.set(\"key2\", \"testValue2\");\n\t\t\t\tdirectory2.createSubDirectory(\"testSubDir\");\n\n\t\t\t\t// After the above scenario, the consistent state using LWW would be to have testSubDir with 1 key.\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst directory1SubDir = directory1.getSubDirectory(\"testSubDir\");\n\t\t\t\tconst directory2SubDir = directory2.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, 1, \"Dir1 1 key should exist\");\n\t\t\t\tassert.strictEqual(directory2SubDir.size, 1, \"Dir2 1 key should exist\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tdirectory1SubDir.get(\"key2\"),\n\t\t\t\t\t\"testValue2\",\n\t\t\t\t\t\"Dir1 key value should match\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tdirectory2SubDir.get(\"key2\"),\n\t\t\t\t\t\"testValue2\",\n\t\t\t\t\t\"Dir2 key value should match\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Directories should ensure eventual consistency using LWW approach 1: Test 2\", async () => {\n\t\t\t\tconst root1SubDir = directory1.createSubDirectory(\"testSubDir\");\n\t\t\t\tdirectory2.createSubDirectory(\"testSubDir\");\n\n\t\t\t\troot1SubDir.set(\"key1\", \"testValue1\");\n\t\t\t\tdirectory2.deleteSubDirectory(\"testSubDir\");\n\t\t\t\tdirectory2.createSubDirectory(\"testSubDir\");\n\n\t\t\t\t// After the above scenario, the consistent state using LWW would be to have testSubDir with 0 keys.\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst directory1SubDir = directory1.getSubDirectory(\"testSubDir\");\n\t\t\t\tconst directory2SubDir = directory2.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});\n\t\t});\n\n\t\tdescribe(\"SubDirectory\", () => {\n\t\t\tit(\"Can iterate over the subdirectories in the root\", () => {\n\t\t\t\tdirectory1.createSubDirectory(\"foo\");\n\t\t\t\tdirectory1.createSubDirectory(\"bar\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst expectedDirectories = new Set([\"foo\", \"bar\"]);\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tfor (const [subDirName] of directory1.subdirectories()) {\n\t\t\t\t\tassert.ok(expectedDirectories.has(subDirName));\n\t\t\t\t}\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tfor (const [subDirName] of directory2.subdirectories()) {\n\t\t\t\t\tassert.ok(expectedDirectories.has(subDirName));\n\t\t\t\t\texpectedDirectories.delete(subDirName);\n\t\t\t\t}\n\t\t\t\tassert.ok(expectedDirectories.size === 0);\n\t\t\t});\n\n\t\t\tit(\"Can get a subDirectory\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.ok(directory1.getWorkingDirectory(\"/foo\"));\n\t\t\t\tassert.ok(directory1.getSubDirectory(\"foo\"));\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.ok(directory2.getWorkingDirectory(\"/foo\"));\n\t\t\t\tassert.ok(directory2.getSubDirectory(\"foo\"));\n\t\t\t});\n\n\t\t\tit(\"Knows its absolute path\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = fooDirectory.createSubDirectory(\"bar\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(fooDirectory.absolutePath, \"/foo\");\n\t\t\t\tassert.equal(barDirectory.absolutePath, \"/foo/bar\");\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst fooDirectory2 = directory2.getSubDirectory(\"foo\");\n\t\t\t\tassert(fooDirectory2);\n\t\t\t\tconst barDirectory2 = fooDirectory2.getSubDirectory(\"bar\");\n\t\t\t\tassert(barDirectory2);\n\t\t\t\tassert.equal(fooDirectory2.absolutePath, \"/foo\");\n\t\t\t\tassert.equal(barDirectory2.absolutePath, \"/foo/bar\");\n\t\t\t});\n\n\t\t\tit(\"Can get and set keys from a subDirectory using relative paths\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst testSubDir = directory1.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(testSubDir);\n\t\t\t\tassert.equal(testSubDir.has(\"testKey\"), true);\n\t\t\t\tassert.equal(testSubDir.has(\"garbage\"), false);\n\t\t\t\tassert.equal(testSubDir.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(testSubDir.get(\"testKey2\"), \"testValue2\");\n\t\t\t\tassert.equal(testSubDir.get(\"testKey3\"), undefined);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst barSubDir = directory2.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(barSubDir);\n\t\t\t\tassert.equal(barSubDir.has(\"testKey\"), true);\n\t\t\t\tassert.equal(barSubDir.has(\"garbage\"), false);\n\t\t\t\tassert.equal(barSubDir.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(barSubDir.get(\"testKey2\"), \"testValue2\");\n\t\t\t\tassert.equal(barSubDir.get(\"testKey3\"), undefined);\n\n\t\t\t\t// Set value in sub directory1.\n\t\t\t\ttestSubDir.set(\"fromSubDir\", \"testValue4\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local sub directory1\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory1.getWorkingDirectory(\"foo\")?.get(\"fromSubDir\"),\n\t\t\t\t\t\"testValue4\",\n\t\t\t\t);\n\n\t\t\t\t// Verify the remote sub directory1\n\t\t\t\tassert.equal(\n\t\t\t\t\tdirectory2.getWorkingDirectory(\"foo\")?.get(\"fromSubDir\"),\n\t\t\t\t\t\"testValue4\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"raises the containedValueChanged event when keys are set and deleted from a subDirectory\", () => {\n\t\t\t\tdirectory1.createSubDirectory(\"foo\");\n\t\t\t\tdirectory1.createSubDirectory(\"bar\");\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst foo1 = directory1.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(foo1);\n\t\t\t\tconst foo2 = directory2.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(foo2);\n\t\t\t\tconst bar1 = directory1.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(bar1);\n\t\t\t\tconst bar2 = directory2.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(bar2);\n\n\t\t\t\tlet called1 = 0;\n\t\t\t\tlet called2 = 0;\n\t\t\t\tlet called3 = 0;\n\t\t\t\tlet called4 = 0;\n\t\t\t\tfoo1.on(\"containedValueChanged\", () => called1++);\n\t\t\t\tfoo2.on(\"containedValueChanged\", () => called2++);\n\t\t\t\tbar1.on(\"containedValueChanged\", () => called3++);\n\t\t\t\tbar2.on(\"containedValueChanged\", () => called4++);\n\n\t\t\t\tfoo1.set(\"testKey\", \"testValue\");\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcalled1,\n\t\t\t\t\t1,\n\t\t\t\t\t\"containedValueChanged on local foo subDirectory after set()\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcalled2,\n\t\t\t\t\t1,\n\t\t\t\t\t\"containedValueChanged on remote foo subDirectory after set()\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcalled3,\n\t\t\t\t\t0,\n\t\t\t\t\t\"containedValueChanged on local bar subDirectory after set()\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcalled4,\n\t\t\t\t\t0,\n\t\t\t\t\t\"containedValueChanged on remote bar subDirectory after set()\",\n\t\t\t\t);\n\n\t\t\t\tfoo1.delete(\"testKey\");\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcalled1,\n\t\t\t\t\t2,\n\t\t\t\t\t\"containedValueChanged on local subDirectory after delete()\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcalled2,\n\t\t\t\t\t2,\n\t\t\t\t\t\"containedValueChanged on remote subDirectory after delete()\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcalled3,\n\t\t\t\t\t0,\n\t\t\t\t\t\"containedValueChanged on local bar subDirectory after delete()\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tcalled4,\n\t\t\t\t\t0,\n\t\t\t\t\t\"containedValueChanged on remote bar subDirectory after delete()\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Can be cleared from the subDirectory\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tdirectory1.set(\"testKey\", \"testValue4\");\n\t\t\t\tdirectory1.set(\"testKey2\", \"testValue5\");\n\t\t\t\tconst testSubDir = directory1.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(testSubDir);\n\t\t\t\ttestSubDir.clear();\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst fooSubDirectory1 = directory1.getWorkingDirectory(\"foo\");\n\t\t\t\tassert(fooSubDirectory1);\n\t\t\t\tassert.equal(fooSubDirectory1.get(\"testKey\"), undefined);\n\t\t\t\tassert.equal(fooSubDirectory1.get(\"testKey2\"), undefined);\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"..\")?.get(\"testKey\"), \"testValue4\");\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\".\")?.get(\"testKey2\"), \"testValue5\");\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst fooSubDirectory2 = directory2.getWorkingDirectory(\"foo\");\n\t\t\t\tassert(fooSubDirectory2);\n\t\t\t\tassert.equal(fooSubDirectory2.get(\"testKey\"), undefined);\n\t\t\t\tassert.equal(fooSubDirectory2.get(\"testKey2\"), undefined);\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"bar\")?.get(\"testKey3\"), \"testValue3\");\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"..\")?.get(\"testKey\"), \"testValue4\");\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\".\")?.get(\"testKey2\"), \"testValue5\");\n\t\t\t});\n\n\t\t\tit(\"Can delete keys from the subDirectory\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tdirectory1.set(\"testKey\", \"testValue4\");\n\t\t\t\tdirectory1.set(\"testKey2\", \"testValue5\");\n\t\t\t\tconst testSubDirFoo = directory1.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(testSubDirFoo);\n\t\t\t\ttestSubDirFoo.delete(\"testKey2\");\n\t\t\t\tconst testSubDirBar = directory1.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(testSubDirBar);\n\t\t\t\ttestSubDirBar.delete(\"testKey3\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst fooSubDirectory1 = directory1.getWorkingDirectory(\"foo\");\n\t\t\t\tassert(fooSubDirectory1);\n\t\t\t\tconst barSubDirectory1 = directory1.getWorkingDirectory(\"bar\");\n\t\t\t\tassert(barSubDirectory1);\n\t\t\t\tassert.equal(fooSubDirectory1.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(fooSubDirectory1.get(\"testKey2\"), undefined);\n\t\t\t\tassert.equal(barSubDirectory1.get(\"testKey3\"), undefined);\n\t\t\t\tassert.equal(directory1.get(\"testKey\"), \"testValue4\");\n\t\t\t\tassert.equal(directory1.get(\"testKey2\"), \"testValue5\");\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst fooSubDirectory2 = directory2.getWorkingDirectory(\"foo\");\n\t\t\t\tassert(fooSubDirectory2);\n\t\t\t\tconst barSubDirectory2 = directory2.getWorkingDirectory(\"bar\");\n\t\t\t\tassert(barSubDirectory2);\n\t\t\t\tassert.equal(fooSubDirectory2.get(\"testKey\"), \"testValue\");\n\t\t\t\tassert.equal(fooSubDirectory2.get(\"testKey2\"), undefined);\n\t\t\t\tassert.equal(barSubDirectory2.get(\"testKey3\"), undefined);\n\t\t\t\tassert.equal(directory2.get(\"testKey\"), \"testValue4\");\n\t\t\t\tassert.equal(directory2.get(\"testKey2\"), \"testValue5\");\n\t\t\t});\n\n\t\t\tit(\"Knows the size of the subDirectory\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tdirectory1.set(\"testKey\", \"testValue4\");\n\t\t\t\tdirectory1.set(\"testKey2\", \"testValue5\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst testSubDirFoo = directory1.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(testSubDirFoo);\n\t\t\t\tassert.equal(testSubDirFoo.size, 2);\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst testSubDirFoo2 = directory2.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(testSubDirFoo2);\n\t\t\t\tassert.equal(testSubDirFoo2.size, 2);\n\n\t\t\t\ttestSubDirFoo.delete(\"testKey2\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo.size, 1);\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo2.size, 1);\n\n\t\t\t\tdirectory1.delete(\"testKey\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo.size, 1);\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo2.size, 1);\n\n\t\t\t\tconst testSubDirBar = directory1.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(testSubDirBar);\n\t\t\t\ttestSubDirBar.delete(\"testKey3\");\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo.size, 1);\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo2.size, 1);\n\n\t\t\t\tdirectory1.clear();\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo.size, 1);\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo2.size, 1);\n\n\t\t\t\ttestSubDirFoo.clear();\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo.size, 0);\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(testSubDirFoo2.size, 0);\n\t\t\t});\n\n\t\t\tit(\"Can get a subDirectory from a subDirectory\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tconst bazDirectory = barDirectory.createSubDirectory(\"baz\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tbazDirectory.set(\"testKey4\", \"testValue4\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst barSubDir = directory1.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert.ok(barSubDir);\n\t\t\t\tconst bazSubDir = barSubDir.getWorkingDirectory(\"./baz\");\n\t\t\t\tassert.ok(bazSubDir);\n\t\t\t\tassert.equal(bazSubDir.get(\"testKey4\"), \"testValue4\");\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst barSubDir2 = directory2.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert.ok(barSubDir2);\n\t\t\t\tconst bazSubDir2 = barSubDir2.getWorkingDirectory(\"./baz\");\n\t\t\t\tassert.ok(bazSubDir2);\n\t\t\t\tassert.equal(bazSubDir2.get(\"testKey4\"), \"testValue4\");\n\t\t\t});\n\n\t\t\tit(\"Can delete a child subDirectory\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tconst bazDirectory = barDirectory.createSubDirectory(\"baz\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tbazDirectory.set(\"testKey4\", \"testValue4\");\n\t\t\t\tbarDirectory.deleteSubDirectory(\"baz\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(barDirectory.getWorkingDirectory(\"baz\"), undefined);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst barDirectory2 = directory2.getSubDirectory(\"bar\");\n\t\t\t\tassert(barDirectory2);\n\t\t\t\tassert.equal(barDirectory2.getWorkingDirectory(\"baz\"), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can delete a child subDirectory with children\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tconst bazDirectory = barDirectory.createSubDirectory(\"baz\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tbazDirectory.set(\"testKey4\", \"testValue4\");\n\t\t\t\tdirectory1.deleteSubDirectory(\"bar\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tassert.equal(directory1.getWorkingDirectory(\"bar\"), undefined);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tassert.equal(directory2.getWorkingDirectory(\"bar\"), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can get and use a keys iterator\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tconst bazDirectory = barDirectory.createSubDirectory(\"baz\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tbazDirectory.set(\"testKey4\", \"testValue4\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst fooSubDir = directory1.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(fooSubDir);\n\t\t\t\tconst fooSubDirIterator = fooSubDir.keys();\n\t\t\t\tconst fooSubDirResult1 = fooSubDirIterator.next();\n\t\t\t\tassert.equal(fooSubDirResult1.value, \"testKey\");\n\t\t\t\tassert.equal(fooSubDirResult1.done, false);\n\t\t\t\tconst fooSubDirResult2 = fooSubDirIterator.next();\n\t\t\t\tassert.equal(fooSubDirResult2.value, \"testKey2\");\n\t\t\t\tassert.equal(fooSubDirResult2.done, false);\n\t\t\t\tconst fooSubDirResult3 = fooSubDirIterator.next();\n\t\t\t\tassert.equal(fooSubDirResult3.value, undefined);\n\t\t\t\tassert.equal(fooSubDirResult3.done, true);\n\n\t\t\t\tconst barSubDir = directory1.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(barSubDir);\n\t\t\t\tconst barSubDirIterator = barSubDir.keys();\n\t\t\t\tconst barSubDirResult1 = barSubDirIterator.next();\n\t\t\t\tassert.equal(barSubDirResult1.value, \"testKey3\");\n\t\t\t\tassert.equal(barSubDirResult1.done, false);\n\t\t\t\tconst barSubDirResult2 = barSubDirIterator.next();\n\t\t\t\tassert.equal(barSubDirResult2.value, undefined);\n\t\t\t\tassert.equal(barSubDirResult2.done, true);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst fooSubDir2 = directory2.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(fooSubDir2);\n\t\t\t\tconst fooSubDir2Iterator = fooSubDir2.keys();\n\t\t\t\tconst fooSubDir2Result1 = fooSubDir2Iterator.next();\n\t\t\t\tassert.equal(fooSubDir2Result1.value, \"testKey\");\n\t\t\t\tassert.equal(fooSubDir2Result1.done, false);\n\t\t\t\tconst fooSubDir2Result2 = fooSubDir2Iterator.next();\n\t\t\t\tassert.equal(fooSubDir2Result2.value, \"testKey2\");\n\t\t\t\tassert.equal(fooSubDir2Result2.done, false);\n\t\t\t\tconst fooSubDir2Result3 = fooSubDir2Iterator.next();\n\t\t\t\tassert.equal(fooSubDir2Result3.value, undefined);\n\t\t\t\tassert.equal(fooSubDir2Result3.done, true);\n\n\t\t\t\tconst barSubDir2 = directory2.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(barSubDir2);\n\t\t\t\tconst barSubDir2Iterator = barSubDir2.keys();\n\t\t\t\tconst barSubDir2Result1 = barSubDir2Iterator.next();\n\t\t\t\tassert.equal(barSubDir2Result1.value, \"testKey3\");\n\t\t\t\tassert.equal(barSubDir2Result1.done, false);\n\t\t\t\tconst barSubDir2Result2 = barSubDir2Iterator.next();\n\t\t\t\tassert.equal(barSubDir2Result2.value, undefined);\n\t\t\t\tassert.equal(barSubDir2Result2.done, true);\n\t\t\t});\n\n\t\t\tit(\"Can get and use a values iterator\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tconst bazDirectory = barDirectory.createSubDirectory(\"baz\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tbazDirectory.set(\"testKey4\", \"testValue4\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst fooSubDir = directory1.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(fooSubDir);\n\t\t\t\tconst fooSubDirIterator = fooSubDir.values();\n\t\t\t\tconst fooSubDirResult1 = fooSubDirIterator.next();\n\t\t\t\tassert.equal(fooSubDirResult1.value, \"testValue\");\n\t\t\t\tassert.equal(fooSubDirResult1.done, false);\n\t\t\t\tconst fooSubDirResult2 = fooSubDirIterator.next();\n\t\t\t\tassert.equal(fooSubDirResult2.value, \"testValue2\");\n\t\t\t\tassert.equal(fooSubDirResult2.done, false);\n\t\t\t\tconst fooSubDirResult3 = fooSubDirIterator.next();\n\t\t\t\tassert.equal(fooSubDirResult3.value, undefined);\n\t\t\t\tassert.equal(fooSubDirResult3.done, true);\n\n\t\t\t\tconst barSubDir = directory1.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(barSubDir);\n\t\t\t\tconst barSubDirIterator = barSubDir.values();\n\t\t\t\tconst barSubDirResult1 = barSubDirIterator.next();\n\t\t\t\tassert.equal(barSubDirResult1.value, \"testValue3\");\n\t\t\t\tassert.equal(barSubDirResult1.done, false);\n\t\t\t\tconst barSubDirResult2 = barSubDirIterator.next();\n\t\t\t\tassert.equal(barSubDirResult2.value, undefined);\n\t\t\t\tassert.equal(barSubDirResult2.done, true);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst fooSubDir2 = directory2.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(fooSubDir2);\n\t\t\t\tconst fooSubDir2Iterator = fooSubDir2.values();\n\t\t\t\tconst fooSubDir2Result1 = fooSubDir2Iterator.next();\n\t\t\t\tassert.equal(fooSubDir2Result1.value, \"testValue\");\n\t\t\t\tassert.equal(fooSubDir2Result1.done, false);\n\t\t\t\tconst fooSubDir2Result2 = fooSubDir2Iterator.next();\n\t\t\t\tassert.equal(fooSubDir2Result2.value, \"testValue2\");\n\t\t\t\tassert.equal(fooSubDir2Result2.done, false);\n\t\t\t\tconst fooSubDir2Result3 = fooSubDir2Iterator.next();\n\t\t\t\tassert.equal(fooSubDir2Result3.value, undefined);\n\t\t\t\tassert.equal(fooSubDir2Result3.done, true);\n\n\t\t\t\tconst barSubDir2 = directory2.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(barSubDir2);\n\t\t\t\tconst barSubDir2Iterator = barSubDir2.values();\n\t\t\t\tconst barSubDir2Result1 = barSubDir2Iterator.next();\n\t\t\t\tassert.equal(barSubDir2Result1.value, \"testValue3\");\n\t\t\t\tassert.equal(barSubDir2Result1.done, false);\n\t\t\t\tconst barSubDir2Result2 = barSubDir2Iterator.next();\n\t\t\t\tassert.equal(barSubDir2Result2.value, undefined);\n\t\t\t\tassert.equal(barSubDir2Result2.done, true);\n\t\t\t});\n\n\t\t\tit(\"Can get and use an entries iterator\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst barDirectory = directory1.createSubDirectory(\"bar\");\n\t\t\t\tconst bazDirectory = barDirectory.createSubDirectory(\"baz\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tfooDirectory.set(\"testKey2\", \"testValue2\");\n\t\t\t\tbarDirectory.set(\"testKey3\", \"testValue3\");\n\t\t\t\tbazDirectory.set(\"testKey4\", \"testValue4\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst fooSubDir = directory1.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(fooSubDir);\n\t\t\t\tconst fooSubDirIterator = fooSubDir.entries();\n\t\t\t\tconst fooSubDirResult1 = fooSubDirIterator.next();\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.equal(fooSubDirResult1.value[0], \"testKey\");\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.equal(fooSubDirResult1.value[1], \"testValue\");\n\t\t\t\tassert.equal(fooSubDirResult1.done, false);\n\t\t\t\tconst fooSubDirResult2 = fooSubDirIterator.next();\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.equal(fooSubDirResult2.value[0], \"testKey2\");\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.equal(fooSubDirResult2.value[1], \"testValue2\");\n\t\t\t\tassert.equal(fooSubDirResult2.done, false);\n\t\t\t\tconst fooSubDirResult3 = fooSubDirIterator.next();\n\t\t\t\tassert.equal(fooSubDirResult3.value, undefined);\n\t\t\t\tassert.equal(fooSubDirResult3.done, true);\n\n\t\t\t\tconst barSubDir = directory1.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(barSubDir);\n\n\t\t\t\tconst expectedEntries = new Set([\"testKey3\"]);\n\t\t\t\tfor (const entry of barSubDir) {\n\t\t\t\t\tassert.ok(expectedEntries.has(entry[0]));\n\t\t\t\t\texpectedEntries.delete(entry[0]);\n\t\t\t\t}\n\t\t\t\tassert.ok(expectedEntries.size === 0);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst fooSubDir2 = directory2.getWorkingDirectory(\"/foo\");\n\t\t\t\tassert(fooSubDir2);\n\t\t\t\tconst fooSubDir2Iterator = fooSubDir2.entries();\n\t\t\t\tconst fooSubDir2Result1 = fooSubDir2Iterator.next();\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.equal(fooSubDir2Result1.value[0], \"testKey\");\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.equal(fooSubDir2Result1.value[1], \"testValue\");\n\t\t\t\tassert.equal(fooSubDir2Result1.done, false);\n\t\t\t\tconst fooSubDir2Result2 = fooSubDir2Iterator.next();\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.equal(fooSubDir2Result2.value[0], \"testKey2\");\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.equal(fooSubDir2Result2.value[1], \"testValue2\");\n\t\t\t\tassert.equal(fooSubDir2Result2.done, false);\n\t\t\t\tconst fooSubDir2Result3 = fooSubDir2Iterator.next();\n\t\t\t\tassert.equal(fooSubDir2Result3.value, undefined);\n\t\t\t\tassert.equal(fooSubDir2Result3.done, true);\n\n\t\t\t\tconst barSubDir2 = directory2.getWorkingDirectory(\"/bar\");\n\t\t\t\tassert(barSubDir2);\n\n\t\t\t\tconst expectedEntries2 = new Set([\"testKey3\"]);\n\t\t\t\tfor (const entry of barSubDir2) {\n\t\t\t\t\tassert.ok(expectedEntries2.has(entry[0]));\n\t\t\t\t\texpectedEntries2.delete(entry[0]);\n\t\t\t\t}\n\t\t\t\tassert.ok(expectedEntries2.size === 0);\n\t\t\t});\n\n\t\t\tit(\"Can iterate over its subdirectories\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tfooDirectory.createSubDirectory(\"bar\");\n\t\t\t\tfooDirectory.createSubDirectory(\"baz\");\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Verify the local SharedDirectory\n\t\t\t\tconst expectedDirectories = new Set([\"bar\", \"baz\"]);\n\t\t\t\tfor (const [subDirName] of fooDirectory.subdirectories()) {\n\t\t\t\t\tassert.ok(expectedDirectories.has(subDirName));\n\t\t\t\t\texpectedDirectories.delete(subDirName);\n\t\t\t\t}\n\t\t\t\tassert.ok(expectedDirectories.size === 0);\n\n\t\t\t\t// Verify the remote SharedDirectory\n\t\t\t\tconst fooDirectory2 = directory2.getSubDirectory(\"foo\");\n\t\t\t\tassert(fooDirectory2);\n\t\t\t\tconst expectedDirectories2 = new Set([\"bar\", \"baz\"]);\n\t\t\t\tfor (const [subDirName] of fooDirectory2.subdirectories()) {\n\t\t\t\t\tassert.ok(expectedDirectories2.has(subDirName));\n\t\t\t\t\texpectedDirectories2.delete(subDirName);\n\t\t\t\t}\n\t\t\t\tassert.ok(expectedDirectories2.size === 0);\n\t\t\t});\n\n\t\t\tit(\"Only creates a subDirectory once\", () => {\n\t\t\t\tconst fooDirectory = directory1.createSubDirectory(\"foo\");\n\t\t\t\tfooDirectory.set(\"testKey\", \"testValue\");\n\t\t\t\tconst fooDirectory2 = directory1.createSubDirectory(\"foo\");\n\t\t\t\tfooDirectory2.set(\"testKey2\", \"testValue2\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tfooDirectory,\n\t\t\t\t\tfooDirectory2,\n\t\t\t\t\t\"Created two separate subdirectories\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tfooDirectory.get(\"testKey2\"),\n\t\t\t\t\t\"testValue2\",\n\t\t\t\t\t\"Value 2 not present\",\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tfooDirectory2.get(\"testKey\"),\n\t\t\t\t\t\"testValue\",\n\t\t\t\t\t\"Value 1 not present\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"Garbage Collection\", () => {\n\t\tclass GCSharedDirectoryProvider implements IGCTestProvider {\n\t\t\tprivate subMapCount = 0;\n\t\t\tprivate _expectedRoutes: string[] = [];\n\t\t\tprivate readonly directory1: SharedDirectory;\n\t\t\tprivate readonly directory2: SharedDirectory;\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.directory1 = createConnectedDirectory(\n\t\t\t\t\t\"directory1\",\n\t\t\t\t\tthis.containerRuntimeFactory,\n\t\t\t\t);\n\t\t\t\tthis.directory2 = createConnectedDirectory(\n\t\t\t\t\t\"directory2\",\n\t\t\t\t\tthis.containerRuntimeFactory,\n\t\t\t\t);\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(): SharedDirectory {\n\t\t\t\t// Return the remote SharedDirectory because we want to verify its summary data.\n\t\t\t\treturn this.directory2;\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 subMapId1 = `subMap-${++this.subMapCount}`;\n\t\t\t\tconst subMap1 = createLocalMap(subMapId1);\n\t\t\t\tthis.directory1.set(subMapId1, subMap1.handle);\n\t\t\t\tthis._expectedRoutes.push(subMap1.handle.absolutePath);\n\n\t\t\t\tconst fooDirectory =\n\t\t\t\t\tthis.directory1.getSubDirectory(\"foo\") ??\n\t\t\t\t\tthis.directory1.createSubDirectory(\"foo\");\n\t\t\t\tconst subMapId2 = `subMap-${++this.subMapCount}`;\n\t\t\t\tconst subMap2 = createLocalMap(subMapId2);\n\t\t\t\tfooDirectory.set(subMapId2, subMap2.handle);\n\t\t\t\tthis._expectedRoutes.push(subMap2.handle.absolutePath);\n\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 fooDirectory = this.directory1.getSubDirectory(\"foo\");\n\t\t\t\tassert(fooDirectory, \"Route must be added before deleting\");\n\n\t\t\t\tconst subMapId = `subMap-${this.subMapCount}`;\n\n\t\t\t\tconst deletedHandle = fooDirectory.get(subMapId) as IFluidHandle;\n\t\t\t\tassert(deletedHandle, \"Route must be added before deleting\");\n\n\t\t\t\tfooDirectory.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\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 fooDirectory =\n\t\t\t\t\tthis.directory1.getSubDirectory(\"foo\") ??\n\t\t\t\t\tthis.directory1.createSubDirectory(\"foo\");\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\tfooDirectory.set(subMapId2, containingObject);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t\tthis._expectedRoutes.push(subMap.handle.absolutePath, subMap2.handle.absolutePath);\n\t\t\t}\n\t\t}\n\n\t\trunGCTests(GCSharedDirectoryProvider);\n\t});\n});\n"]}
@@ -1,36 +0,0 @@
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
- export function assertEquivalentDirectories(first, second) {
7
- assertEventualConsistencyCore(first.getWorkingDirectory("/"), second.getWorkingDirectory("/"));
8
- }
9
- function assertEventualConsistencyCore(first, second) {
10
- assert(first !== undefined, "first root dir should be present");
11
- assert(second !== undefined, "second root dir should be present");
12
- // Check number of keys.
13
- assert.strictEqual(first.size, second.size, `Number of keys not same: Number of keys ` +
14
- `in first at path ${first.absolutePath}: ${first.size} and in second at path ${second.absolutePath}: ${second.size}`);
15
- // Check key/value pairs in both directories.
16
- for (const key of first.keys()) {
17
- assert.strictEqual(first.get(key), second.get(key), `Key not found or value not matching ` +
18
- `key: ${key}, value in dir first at path ${first.absolutePath}: ${first.get(key)} and in second at path ${second.absolutePath}: ${second.get(key)}`);
19
- }
20
- // Check for number of subdirectores with both directories.
21
- assert(first.countSubDirectory !== undefined && second.countSubDirectory !== undefined);
22
- assert.strictEqual(first.countSubDirectory(), second.countSubDirectory(), `Number of subDirectories not same: Number of subdirectory in ` +
23
- `first at path ${first.absolutePath}: ${first.countSubDirectory()} and in second` +
24
- `at path ${second.absolutePath}: ${second.countSubDirectory()}`);
25
- // Check for consistency of subdirectores with both directories.
26
- for (const [name, subDirectory1] of first.subdirectories()) {
27
- const subDirectory2 = second.getSubDirectory(name);
28
- assert(subDirectory2 !== undefined, `SubDirectory with name ${name} not present in second directory`);
29
- assertEventualConsistencyCore(subDirectory1, subDirectory2);
30
- }
31
- // Check for consistency of subdirectories ordering of both directories
32
- const firstSubdirNames = [...first.subdirectories()].map(([dirName, _]) => dirName);
33
- const secondSubdirNames = [...second.subdirectories()].map(([dirName, _]) => dirName);
34
- assert.deepStrictEqual(firstSubdirNames, secondSubdirNames);
35
- }
36
- //# sourceMappingURL=directoryEquivalenceUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"directoryEquivalenceUtils.js","sourceRoot":"","sources":["../../../src/test/mocha/directoryEquivalenceUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,UAAU,2BAA2B,CAAC,KAAiB,EAAE,MAAkB;IAChF,6BAA6B,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,6BAA6B,CACrC,KAA6B,EAC7B,MAA8B;IAE9B,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,kCAAkC,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,mCAAmC,CAAC,CAAC;IAElE,wBAAwB;IACxB,MAAM,CAAC,WAAW,CACjB,KAAK,CAAC,IAAI,EACV,MAAM,CAAC,IAAI,EACX,0CAA0C;QACzC,oBAAoB,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI,0BAA0B,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,IAAI,EAAE,CACrH,CAAC;IAEF,6CAA6C;IAC7C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;QAC/B,MAAM,CAAC,WAAW,CACjB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EACd,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EACf,sCAAsC;YACrC,QAAQ,GAAG,gCAAgC,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,GAAG,CAC1E,GAAG,CACH,0BAA0B,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;KACF;IAED,2DAA2D;IAC3D,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC;IACxF,MAAM,CAAC,WAAW,CACjB,KAAK,CAAC,iBAAiB,EAAE,EACzB,MAAM,CAAC,iBAAiB,EAAE,EAC1B,+DAA+D;QAC9D,iBAAiB,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,iBAAiB,EAAE,gBAAgB;QACjF,WAAW,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,iBAAiB,EAAE,EAAE,CAChE,CAAC;IAEF,gEAAgE;IAChE,KAAK,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE;QAC3D,MAAM,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CACL,aAAa,KAAK,SAAS,EAC3B,0BAA0B,IAAI,kCAAkC,CAChE,CAAC;QACF,6BAA6B,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;KAC5D;IAED,uEAAuE;IACvE,MAAM,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACpF,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,CAAC,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;AAC7D,CAAC","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 { IDirectory } from \"../../interfaces.js\";\n\nexport function assertEquivalentDirectories(first: IDirectory, second: IDirectory): void {\n\tassertEventualConsistencyCore(first.getWorkingDirectory(\"/\"), second.getWorkingDirectory(\"/\"));\n}\n\nfunction assertEventualConsistencyCore(\n\tfirst: IDirectory | undefined,\n\tsecond: IDirectory | undefined,\n): void {\n\tassert(first !== undefined, \"first root dir should be present\");\n\tassert(second !== undefined, \"second root dir should be present\");\n\n\t// Check number of keys.\n\tassert.strictEqual(\n\t\tfirst.size,\n\t\tsecond.size,\n\t\t`Number of keys not same: Number of keys ` +\n\t\t\t`in first at path ${first.absolutePath}: ${first.size} and in second at path ${second.absolutePath}: ${second.size}`,\n\t);\n\n\t// Check key/value pairs in both directories.\n\tfor (const key of first.keys()) {\n\t\tassert.strictEqual(\n\t\t\tfirst.get(key),\n\t\t\tsecond.get(key),\n\t\t\t`Key not found or value not matching ` +\n\t\t\t\t`key: ${key}, value in dir first at path ${first.absolutePath}: ${first.get(\n\t\t\t\t\tkey,\n\t\t\t\t)} and in second at path ${second.absolutePath}: ${second.get(key)}`,\n\t\t);\n\t}\n\n\t// Check for number of subdirectores with both directories.\n\tassert(first.countSubDirectory !== undefined && second.countSubDirectory !== undefined);\n\tassert.strictEqual(\n\t\tfirst.countSubDirectory(),\n\t\tsecond.countSubDirectory(),\n\t\t`Number of subDirectories not same: Number of subdirectory in ` +\n\t\t\t`first at path ${first.absolutePath}: ${first.countSubDirectory()} and in second` +\n\t\t\t`at path ${second.absolutePath}: ${second.countSubDirectory()}`,\n\t);\n\n\t// Check for consistency of subdirectores with both directories.\n\tfor (const [name, subDirectory1] of first.subdirectories()) {\n\t\tconst subDirectory2 = second.getSubDirectory(name);\n\t\tassert(\n\t\t\tsubDirectory2 !== undefined,\n\t\t\t`SubDirectory with name ${name} not present in second directory`,\n\t\t);\n\t\tassertEventualConsistencyCore(subDirectory1, subDirectory2);\n\t}\n\n\t// Check for consistency of subdirectories ordering of both directories\n\tconst firstSubdirNames = [...first.subdirectories()].map(([dirName, _]) => dirName);\n\tconst secondSubdirNames = [...second.subdirectories()].map(([dirName, _]) => dirName);\n\tassert.deepStrictEqual(firstSubdirNames, secondSubdirNames);\n}\n"]}