@itwin/core-backend 5.3.0-dev.8 → 5.4.0-dev.2
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.
- package/CHANGELOG.md +26 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +14 -0
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +11 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.d.ts.map +1 -1
- package/lib/cjs/DisplayStyle.js +4 -4
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/Element.d.ts +2 -2
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +2 -2
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +15 -3
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +42 -5
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js +2 -2
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +1 -2
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +9 -17
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/Material.d.ts +1 -1
- package/lib/cjs/Material.d.ts.map +1 -1
- package/lib/cjs/Material.js +2 -2
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +5 -0
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +7 -0
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/TileStorage.d.ts +1 -1
- package/lib/cjs/TileStorage.d.ts.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +8 -0
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +30 -2
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +1 -1
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js +2 -2
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +4 -4
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +5 -4
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +26 -11
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.d.ts.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js +2 -0
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +14 -0
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +11 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.d.ts.map +1 -1
- package/lib/esm/DisplayStyle.js +4 -4
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/Element.d.ts +2 -2
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +2 -2
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +15 -3
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +42 -5
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/esm/IModelElementCloneContext.js +2 -2
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +1 -2
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +10 -18
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/Material.d.ts +1 -1
- package/lib/esm/Material.d.ts.map +1 -1
- package/lib/esm/Material.js +2 -2
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Relationship.d.ts +5 -0
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +7 -0
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/TileStorage.d.ts +1 -1
- package/lib/esm/TileStorage.d.ts.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +8 -0
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +30 -2
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +1 -1
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js +2 -2
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +4 -4
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +5 -4
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +26 -11
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.d.ts.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js +2 -0
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.d.ts +93 -0
- package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -0
- package/lib/esm/test/ElementDrivesElement.test.js +862 -0
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -0
- package/lib/esm/test/ElementLRUCache.test.js +19 -0
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js +17 -11
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +44 -0
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +71 -25
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +2 -2
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +33 -2
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +169 -2
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.d.ts +2 -0
- package/lib/esm/test/imodel/Code.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/Code.test.js +272 -0
- package/lib/esm/test/imodel/Code.test.js.map +1 -0
- package/lib/esm/test/imodel/IModel.test.js +144 -1
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +64 -55
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js +6 -6
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js +75 -6
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js +4 -4
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +33 -5
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +16 -18
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementDrivesElement.test.js","sourceRoot":"","sources":["../../../src/test/ElementDrivesElement.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { BeEvent, DbResult, Id64String, IModelStatus, StopWatch } from \"@itwin/core-bentley\";\nimport { Code, ElementProps, GeometricElement3dProps, GeometryStreamBuilder, GeometryStreamProps, IModel, IModelError, RelatedElement, RelationshipProps } from \"@itwin/core-common\";\nimport { LineSegment3d, Point3d, YawPitchRollAngles } from \"@itwin/core-geometry\";\nimport * as chai from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { SpatialCategory } from \"../Category\";\nimport { ChannelControl } from \"../ChannelControl\";\nimport { ClassRegistry } from \"../ClassRegistry\";\nimport { GeometricElement3d, PhysicalPartition } from \"../Element\";\nimport { BriefcaseDb, IModelDb } from \"../IModelDb\";\nimport { HubMock } from \"../internal/HubMock\";\nimport { PhysicalModel } from \"../Model\";\nimport { SubjectOwnsPartitionElements } from \"../NavigationRelationship\";\nimport { ElementDrivesElement, ElementDrivesElementProps } from \"../Relationship\";\nimport { Schema, Schemas } from \"../Schema\";\nimport { HubWrappers } from \"./IModelTestUtils\";\nimport { KnownTestLocations } from \"./KnownTestLocations\";\nchai.use(chaiAsPromised);\n/**\n 1. What is Change Propagation?**\n In engineering, models often consist of many interdependent components (e.g., parts, assemblies, constraints). When you modify one component (say, changing a dimension), that change can affect other components.\n **Change propagation** is the process of updating all dependent components so the design remains consistent.\n\n 2. Why Use Topological Sort?**\n The dependencies between components can be represented as a **Directed Acyclic Graph (DAG)**:\n - **Nodes** = components or features.\n - **Edges** = dependency relationships (e.g., \"Feature B depends on Feature A\").\n\n To propagate changes correctly:\n - You must update components **in dependency order** (parents before children).\n - This is where **topological sorting** comes in—it gives a linear order of nodes such that every dependency comes before the dependent.\n\n 3. How It Works**\n **Steps:**\n 1. **Build the dependency graph**:\n - For each feature/component, list what it depends on.\n 2. **Perform topological sort**:\n - Use algorithms like **Kahn’s Algorithm** or **DFS-based sort**.\n 3. **Propagate changes in sorted order**:\n - Start from nodes with no dependencies (roots).\n - Update each node, then move to its dependents.\n\n\n 4. Example**\n Imagine a CAD model:\n - **Sketch → Extrude → Fillet → Hole**\n - If you change the **Sketch**, the **Extrude**, **Fillet**, and **Hole** must update in that order.\n\n Graph:\n Sketch → Extrude → Fillet → Hole\n Topological sort result:\n [Sketch, Extrude, Fillet, Hole]\n Update in this order to maintain consistency.\n\n 5. Benefits**\n - Prevents circular updates (since DAG ensures no cycles).\n - Ensures deterministic and efficient update propagation.\n - Scales well for complex assemblies.\n */\n\nenum Color {\n White, // unvisited\n Gray, // visiting\n Black, // visited\n}\n\nexport class Graph<T> {\n private _nodes: T[] = [];\n private _edges = new Map<T, T[]>();\n public constructor() {\n }\n\n public addNode(node: T): void {\n if (!this._nodes.includes(node))\n this._nodes.push(node);\n }\n\n public *nodes(): IterableIterator<T> {\n yield* this._nodes;\n }\n\n public *edges(): IterableIterator<{ from: T, to: T }> {\n for (const [from, toList] of this._edges.entries()) {\n for (const to of toList) {\n yield { from, to };\n }\n }\n }\n\n public addEdge(from: T, to: T | T[]): void {\n this.addNode(from);\n if (!this._edges.has(from)) {\n this._edges.set(from, []);\n }\n if (Array.isArray(to)) {\n to.forEach(t => this.addNode(t));\n this._edges.get(from)!.push(...to);\n } else {\n this.addNode(to);\n this._edges.get(from)!.push(to);\n }\n }\n public getEdges(node: T): T[] {\n if (!this._edges.has(node))\n return [];\n return this._edges.get(node)!;\n }\n public clone(): Graph<T> {\n const newGraph = new Graph<T>();\n for (const node of this._nodes) {\n newGraph.addNode(node);\n }\n for (const [from, toList] of this._edges.entries()) {\n newGraph.addEdge(from, toList);\n }\n return newGraph;\n }\n public toGraphvis(accessor: NodeAccessor<T>): string {\n // Implementation for converting the graph to Graphviz DOT format\n let dot = \"digraph G {\\n\";\n for (const node of this._nodes) {\n dot += ` \"${accessor.getId(node)}\" [label=\"${accessor.getLabel(node)}\"];\\n`;\n }\n for (const [from, toList] of this._edges.entries()) {\n for (const to of toList) {\n dot += ` \"${accessor.getId(from)}\" -> \"${accessor.getId(to)}\";\\n`;\n }\n }\n dot += \"}\\n\";\n return dot;\n }\n}\nexport interface NodeAccessor<T> {\n getLabel: (node: T) => string;\n getId: (node: T) => string;\n}\nexport class TopologicalSorter {\n private static visit<T>(graph: Graph<T>, node: T, colors: Map<T, Color>, sorted: T[], failOnCycles: boolean): void {\n if (colors.get(node) === Color.Gray) {\n if (failOnCycles)\n throw new Error(\"Graph has a cycle\");\n else {\n return;\n }\n }\n\n if (colors.get(node) === Color.White) {\n colors.set(node, Color.Gray);\n const neighbors = graph.getEdges(node);\n for (const neighbor of neighbors) {\n this.visit(graph, neighbor, colors, sorted, failOnCycles);\n }\n colors.set(node, Color.Black);\n sorted.push(node);\n }\n }\n\n public static sortDepthFirst<T>(graph: Graph<T>, updated?: T[], failOnCycles = true): T[] {\n const sorted: T[] = [];\n const colors = new Map(Array.from(graph.nodes()).map((node) => [node, Color.White]));\n if (updated) {\n // remove duplicate\n let filteredUpdated = Array.from(new Set(updated));\n filteredUpdated = filteredUpdated.filter(node => colors.get(node) === Color.White);\n if (filteredUpdated.length !== updated.length) {\n throw new Error(\"Updated list contains nodes that are not in the graph or have duplicates\");\n }\n if (filteredUpdated.length === 0)\n updated = undefined;\n else\n updated = filteredUpdated;\n }\n for (const node of updated ?? Array.from(graph.nodes())) {\n if (colors.get(node) === Color.White) {\n this.visit(graph, node, colors, sorted, failOnCycles);\n }\n }\n\n return sorted.reverse();\n }\n public static sortBreadthFirst<T>(graph: Graph<T>, updated?: T[], failOnCycles = true): T[] {\n const sorted: T[] = [];\n const queue: T[] = [];\n // Vector to store indegree of each vertex\n const inDegree = new Map<T, number>();\n for (const node of graph.nodes()) {\n inDegree.set(node, 0);\n }\n for (const edge of graph.edges()) {\n inDegree.set(edge.to, (inDegree.get(edge.to) ?? 0) + 1);\n }\n\n if (updated) {\n // remove duplicate\n const filteredUpdated = Array.from(new Set(updated));\n if (filteredUpdated.length !== updated.length) {\n throw new Error(\"Updated list contains nodes that are not in the graph or have duplicates\");\n }\n if (filteredUpdated.length === 0)\n updated = undefined;\n else\n updated = filteredUpdated;\n }\n const startNodes = updated ?? Array.from(graph.nodes());\n for (const node of startNodes) {\n if (inDegree.get(node) === 0) {\n queue.push(node);\n }\n }\n if (startNodes.length === 0) {\n throw new Error(\"Graph has at least one cycle\");\n }\n\n if (startNodes)\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n for (const neighbor of graph.getEdges(current)) {\n inDegree.set(neighbor, (inDegree.get(neighbor) ?? 0) - 1);\n if (inDegree.get(neighbor) === 0) {\n queue.push(neighbor);\n }\n }\n }\n if (failOnCycles && sorted.length !== Array.from(graph.nodes()).length)\n throw new Error(\"Graph has at least one cycle\");\n\n return sorted;\n }\n public static validate<T>(graph: Graph<T>, sorted: T[]): boolean {\n if (sorted.length !== Array.from(graph.nodes()).length) {\n return false;\n }\n\n const position = new Map<T, number>();\n for (let i = 0; i < sorted.length; i++) {\n position.set(sorted[i], i);\n }\n\n for (const { from, to } of graph.edges()) {\n if (position.get(from)! > position.get(to)!) {\n return false;\n }\n }\n return true;\n }\n}\n\nclass ElementDrivesElementEventMonitor {\n public readonly onRootChanged: [string, string][] = [];\n public readonly onAllInputsHandled: string[] = [];\n public readonly onBeforeOutputsHandled: string[] = [];\n public readonly onDeletedDependency: [string, string][] = [];\n constructor(public iModelDb: IModelDb) {\n InputDrivesOutput.events.onDeletedDependency.addListener((props: RelationshipProps) => this.onDeletedDependency.push([this.iModelDb.elements.tryGetElement<NodeElement>(props.sourceId)?.userLabel as string, this.iModelDb.elements.tryGetElement<NodeElement>(props.targetId)?.userLabel as string]));\n InputDrivesOutput.events.onRootChanged.addListener((props: RelationshipProps) => this.onRootChanged.push([this.iModelDb.elements.tryGetElement<NodeElement>(props.sourceId)?.userLabel as string, this.iModelDb.elements.tryGetElement<NodeElement>(props.targetId)?.userLabel as string]));\n NodeElement.events.onAllInputsHandled.addListener((id: Id64String) => this.onAllInputsHandled.push(this.iModelDb.elements.tryGetElement<NodeElement>(id)?.userLabel as string));\n NodeElement.events.onBeforeOutputsHandled.addListener((id: Id64String) => this.onBeforeOutputsHandled.push(this.iModelDb.elements.tryGetElement<NodeElement>(id)?.userLabel as string));\n }\n public clear() {\n this.onRootChanged.length = 0;\n this.onAllInputsHandled.length = 0;\n this.onBeforeOutputsHandled.length = 0;\n this.onDeletedDependency.length = 0;\n }\n}\nexport interface InputDrivesOutputProps extends ElementDrivesElementProps {\n prop: number;\n}\n\nexport interface NodeElementProps extends GeometricElement3dProps {\n op: string;\n val: number;\n}\n\nexport class InputDrivesOutput extends ElementDrivesElement {\n public static readonly events = {\n onRootChanged: new BeEvent<(props: RelationshipProps, iModel: IModelDb) => void>(),\n onDeletedDependency: new BeEvent<(props: RelationshipProps, iModel: IModelDb) => void>(),\n };\n public static override get className(): string { return \"InputDrivesOutput\"; }\n protected constructor(props: InputDrivesOutputProps, iModel: IModelDb) {\n super(props, iModel);\n }\n public static override onRootChanged(props: RelationshipProps, iModel: IModelDb): void {\n this.events.onRootChanged.raiseEvent(props, iModel);\n }\n public static override onDeletedDependency(props: RelationshipProps, iModel: IModelDb): void {\n this.events.onDeletedDependency.raiseEvent(props, iModel);\n }\n}\nexport class NodeElement extends GeometricElement3d {\n public op: string;\n public val: number;\n public static readonly events = {\n onAllInputsHandled: new BeEvent<(id: Id64String, iModel: IModelDb) => void>(),\n onBeforeOutputsHandled: new BeEvent<(id: Id64String, iModel: IModelDb) => void>(),\n };\n\n public static override get className(): string { return \"Node\"; }\n protected constructor(props: NodeElementProps, iModel: IModelDb) {\n super(props, iModel);\n this.op = props.op;\n this.val = props.val;\n }\n public override toJSON(): GeometricElement3dProps {\n const val = super.toJSON() as NodeElementProps;\n val.op = this.op;\n val.val = this.val;\n return val;\n }\n protected static override onAllInputsHandled(id: Id64String, iModel: IModelDb): void {\n this.events.onAllInputsHandled.raiseEvent(id, iModel);\n }\n protected static override onBeforeOutputsHandled(id: Id64String, iModel: IModelDb): void {\n this.events.onBeforeOutputsHandled.raiseEvent(id, iModel);\n }\n public static generateGeometry(radius: number): GeometryStreamProps {\n const builder = new GeometryStreamBuilder();\n const p1 = Point3d.createZero();\n const p2 = Point3d.createFrom({ x: radius, y: 0.0, z: 0.0 });\n const circle = LineSegment3d.create(p1, p2);\n builder.appendGeometry(circle);\n return builder.geometryStream;\n }\n public static getCategory(iModelDb: IModelDb) {\n const categoryId = SpatialCategory.queryCategoryIdByName(iModelDb, IModelDb.dictionaryId, this.classFullName);\n if (categoryId === undefined)\n throw new IModelError(IModelStatus.NotFound, \"Category not found\");\n return iModelDb.elements.getElement(categoryId);\n }\n}\n\nexport class NetworkSchema extends Schema {\n public static override get schemaName(): string { return \"Network\"; }\n public static registerSchema() {\n if (this !== Schemas.getRegisteredSchema(NetworkSchema.schemaName)) {\n Schemas.registerSchema(this);\n ClassRegistry.register(NodeElement, this);\n ClassRegistry.register(InputDrivesOutput, this);\n }\n }\n\n public static async importSchema(iModel: IModelDb): Promise<void> {\n if (iModel.querySchemaVersion(\"Network\"))\n return;\n\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"Network\" alias=\"net\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Node\">\n <BaseClass>bis:GraphicalElement3d</BaseClass>\n <ECProperty propertyName=\"op\" typeName=\"string\" />\n <ECProperty propertyName=\"val\" typeName=\"double\" />\n </ECEntityClass>\n <ECRelationshipClass typeName=\"InputDrivesOutput\" modifier=\"None\" strength=\"referencing\">\n <BaseClass>bis:ElementDrivesElement</BaseClass>\n <Source multiplicity=\"(0..1)\" roleLabel=\"drives\" polymorphic=\"true\">\n <Class class=\"Node\"/>\n </Source>\n <Target multiplicity=\"(0..*)\" roleLabel=\"is driven by\" polymorphic=\"false\">\n <Class class=\"Node\"/>\n </Target>\n <ECProperty propertyName=\"prop\" typeName=\"double\" />\n </ECRelationshipClass>\n </ECSchema>`;\n await iModel.importSchemaStrings([schema1]);\n }\n}\n\nexport class Engine {\n public static async createGraph(iModelDb: IModelDb, modelId: Id64String, graph: Graph<string>): Promise<Graph<{ id: Id64String, name: string }>> {\n const nodes = new Map<string, { id: Id64String, name: string }>();\n const outGraph = new Graph<{ id: Id64String, name: string }>();\n for (const node of graph.nodes()) {\n const id = await this.insertNode(iModelDb, modelId, node, \"\", 0, new Point3d(0, 0, 0));\n nodes.set(node, { id, name: node });\n }\n for (const edge of graph.edges()) {\n const fromId = nodes.get(edge.from)!.id;\n const toId = nodes.get(edge.to)!.id;\n await this.insertEdge(iModelDb, fromId, toId, 0);\n outGraph.addEdge(nodes.get(edge.from)!, nodes.get(edge.to)!);\n }\n return outGraph;\n }\n public static countNodes(iModelDb: IModelDb): number {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return iModelDb.withPreparedStatement(\"SELECT COUNT(*) FROM Network.Node\", (stmt) => {\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n return stmt.getValue(0).getInteger();\n }\n return 0;\n });\n }\n public static countEdges(iModelDb: IModelDb): number {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return iModelDb.withPreparedStatement(\"SELECT COUNT(*) FROM [Network].[InputDrivesOutput]\", (stmt) => {\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n return stmt.getValue(0).getInteger();\n }\n return 0;\n });\n }\n public static queryEdgesForSource(iModelDb: IModelDb, sourceId: Id64String): InputDrivesOutputProps[] {\n const edges: InputDrivesOutputProps[] = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n iModelDb.withPreparedStatement(\"SELECT [ECInstanceId], [SourceECInstanceId], [TargetECInstanceId], [prop], [Status], [Priority] FROM [Network].[InputDrivesOutput] WHERE [SourceECInstanceId] = ?\", (stmt) => {\n stmt.bindId(1, sourceId);\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n edges.push({\n id: stmt.getValue(0).getId(),\n classFullName: InputDrivesOutput.classFullName,\n sourceId: stmt.getValue(1).getId(),\n targetId: stmt.getValue(2).getId(),\n prop: stmt.getValue(3).getDouble(),\n status: stmt.getValue(4).getInteger(),\n priority: stmt.getValue(5).getInteger(),\n });\n }\n });\n return edges;\n }\n public static queryEdgesForTarget(iModelDb: IModelDb, targetId: Id64String): InputDrivesOutputProps[] {\n const edges: InputDrivesOutputProps[] = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n iModelDb.withPreparedStatement(\"SELECT [ECInstanceId], [SourceECInstanceId], [TargetECInstanceId], [prop], [Status], [Priority] FROM [Network].[InputDrivesOutput] WHERE [TargetECInstanceId] = ?\", (stmt) => {\n stmt.bindId(1, targetId);\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n edges.push({\n id: stmt.getValue(0).getId(),\n classFullName: InputDrivesOutput.classFullName,\n sourceId: stmt.getValue(1).getId(),\n targetId: stmt.getValue(2).getId(),\n prop: stmt.getValue(3).getDouble(),\n status: stmt.getValue(4).getInteger(),\n priority: stmt.getValue(5).getInteger(),\n });\n }\n });\n return edges;\n }\n private static async createPartition(iModelDb: IModelDb): Promise<Id64String> {\n const parentId = new SubjectOwnsPartitionElements(IModel.rootSubjectId);\n const modelId = IModel.repositoryModelId;\n const modeledElementProps: ElementProps = {\n classFullName: PhysicalPartition.classFullName,\n parent: parentId,\n model: modelId,\n code: Code.createEmpty(),\n userLabel: \"NetworkPhysicalPartition\"\n };\n const modeledElement = iModelDb.elements.createElement(modeledElementProps);\n await iModelDb.locks.acquireLocks({ shared: modelId });\n return iModelDb.elements.insertElement(modeledElement.toJSON());\n }\n private static async createModel(iModelDb: IModelDb): Promise<Id64String> {\n const partitionId = await this.createPartition(iModelDb);\n const modeledElementRef = new RelatedElement({ id: partitionId });\n const newModel = iModelDb.models.createModel({ modeledElement: modeledElementRef, classFullName: PhysicalModel.classFullName });\n const newModelId = newModel.insert();\n return newModelId;\n }\n private static async createNodeCategory(iModelDb: IModelDb) {\n const category = SpatialCategory.create(iModelDb, IModelDb.dictionaryId, NodeElement.classFullName);\n return category.insert();\n }\n public static async initialize(iModelDb: IModelDb) {\n await NetworkSchema.importSchema(iModelDb);\n NetworkSchema.registerSchema();\n const modelId = await this.createModel(iModelDb);\n const categoryId = await this.createNodeCategory(iModelDb);\n return {\n modelId,\n categoryId,\n };\n }\n public static async insertNode(iModelDb: IModelDb, modelId: Id64String, name: string, op: string, val: number, location: Point3d, radius: number = 0.1) {\n const props: NodeElementProps = {\n classFullName: NodeElement.classFullName,\n model: modelId,\n code: Code.createEmpty(),\n userLabel: name,\n category: NodeElement.getCategory(iModelDb).id,\n placement: { origin: location, angles: new YawPitchRollAngles() },\n geom: NodeElement.generateGeometry(radius),\n op,\n val,\n };\n await iModelDb.locks.acquireLocks({ shared: modelId });\n return iModelDb.elements.insertElement(props);\n }\n public static async deleteNode(iModelDb: IModelDb, nodeId: Id64String) {\n await iModelDb.locks.acquireLocks({ exclusive: nodeId });\n return iModelDb.elements.deleteElement(nodeId);\n }\n public static async updateNodeProps(iModelDb: IModelDb, props: Partial<NodeElementProps>) {\n await iModelDb.locks.acquireLocks({ exclusive: props.id });\n return iModelDb.elements.updateElement(props);\n }\n public static async updateNode(iModelDb: IModelDb, userLabel: string) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const id = iModelDb.withPreparedStatement(\"SELECT [ECInstanceId] FROM [Network].[Node] WHERE [UserLabel] = ?\", (stmt) => {\n stmt.bindString(1, userLabel);\n if (stmt.step() === DbResult.BE_SQLITE_ROW)\n return stmt.getValue(0).getId();\n return undefined;\n });\n if (!id) {\n throw new Error(`Node with userLabel ${userLabel} not found`);\n }\n await this.updateNodeProps(iModelDb, { id });\n }\n public static async deleteEdge(iModelDb: IModelDb, from: string, to: string) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const edge = iModelDb.withPreparedStatement(`\n SELECT [IDo].[ECInstanceId], [IDo].[SourceECInstanceId], [IDo].[TargetECInstanceId]\n FROM [Network].[InputDrivesOutput] [IDo]\n JOIN [Network].[Node] [Src] ON [Src].[ECInstanceId] = [IDo].[SourceECInstanceId]\n JOIN [Network].[Node] [Tgt] ON [Tgt].[ECInstanceId] = [IDo].[TargetECInstanceId]\n WHERE [Src].[UserLabel] = ? AND [Tgt].[UserLabel] = ?`, (stmt) => {\n stmt.bindString(1, from);\n stmt.bindString(2, to);\n if (stmt.step() === DbResult.BE_SQLITE_ROW)\n return {\n id: stmt.getValue(0).getId(),\n classFullName: InputDrivesOutput.classFullName,\n sourceId: stmt.getValue(1).getId(),\n targetId: stmt.getValue(2).getId(),\n } as RelationshipProps;\n return undefined;\n });\n if (!edge) {\n throw new Error(`Edge from ${from} to ${to} not found`);\n }\n iModelDb.relationships.deleteInstance(edge);\n }\n public static async insertEdge(iModelDb: IModelDb, sourceId: Id64String, targetId: Id64String, prop: number) {\n const props: InputDrivesOutputProps = {\n classFullName: InputDrivesOutput.classFullName,\n sourceId,\n targetId,\n prop,\n status: 0,\n priority: 0\n };\n return iModelDb.relationships.insertInstance(props);\n }\n}\n\ndescribe(\"ElementDrivesElement Tests\", () => {\n const briefcases: BriefcaseDb[] = [];\n let iModelId: string;\n async function openBriefcase(): Promise<BriefcaseDb> {\n const iModelDb = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId });\n iModelDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n iModelDb.saveChanges();\n briefcases.push(iModelDb);\n return iModelDb;\n }\n beforeEach(async () => {\n HubMock.startup(\"TestIModel\", KnownTestLocations.outputDir);\n iModelId = await HubMock.createNewIModel({ iTwinId: HubMock.iTwinId, iModelName: \"Test\", description: \"TestSubject\" });\n });\n afterEach(async () => {\n NodeElement.events.onAllInputsHandled.clear();\n NodeElement.events.onBeforeOutputsHandled.clear();\n InputDrivesOutput.events.onRootChanged.clear();\n InputDrivesOutput.events.onDeletedDependency.clear();\n for (const briefcase of briefcases) {\n briefcase.close();\n }\n HubMock.shutdown();\n });\n it(\"local: topological sort\", async () => {\n const graph = new Graph<string>();\n\n graph.addEdge(\"1\", [\"2\", \"3\"]);\n graph.addEdge(\"2\", [\"5\", \"4\"]);\n graph.addEdge(\"3\", [\"4\"]);\n graph.addEdge(\"4\", [\"5\"]);\n const df = TopologicalSorter.sortDepthFirst(graph);\n chai.expect(TopologicalSorter.validate(graph, df)).to.be.true;\n chai.expect(df).to.deep.equal([\"1\", \"3\", \"2\", \"4\", \"5\"]);\n\n const bf = TopologicalSorter.sortBreadthFirst(graph);\n chai.expect(TopologicalSorter.validate(graph, bf)).to.be.true;\n chai.expect(bf).to.deep.equal([\"1\", \"2\", \"3\", \"4\", \"5\"]);\n });\n\n it(\"local: cycle detection (suppress cycles)\", async () => {\n const graph = new Graph<string>();\n // Graph structure:\n // 1 --> 2 <-- 3\n // ^ |\n // |-----------|\n graph.addEdge(\"1\", [\"2\"]);\n graph.addEdge(\"2\", [\"3\"]);\n graph.addEdge(\"3\", [\"1\"]);\n\n const df = TopologicalSorter.sortDepthFirst(graph, [], false);\n chai.expect(TopologicalSorter.validate(graph, df)).to.be.false;\n chai.expect(df).to.deep.equal([\"1\", \"2\", \"3\"]);\n });\n it(\"local: cycle detection (throw)\", async () => {\n const graph = new Graph<string>();\n // Graph structure:\n // 1 --> 2 --> 3\n // ^ |\n // |-----------|\n graph.addEdge(\"1\", [\"2\"]);\n graph.addEdge(\"2\", [\"3\"]);\n graph.addEdge(\"3\", [\"1\"]);\n\n chai.expect(() => TopologicalSorter.sortDepthFirst(graph)).to.throw(\n \"Graph has a cycle\"\n );\n });\n it(\"EDE/local: build system dependencies\", async () => {\n const graph = new Graph<string>();\n /*\n Example: Build system dependencies\n\n - Compile main.c and util.c to main.o and util.o\n - Link main.o and util.o to produce app.exe\n - app.exe depends on config.json\n - test.exe depends on main.o, util.o, and test.c\n\n Graph:\n main.c util.c test.c config.json\n | | | |\n v v | |\n main.o util.o | |\n \\ / | |\n \\ / | |\n app.exe test.exe |\n | | |\n +----------------+---------+\n */\n\n graph.addEdge(\"main.c\", [\"main.o\"]);\n graph.addEdge(\"util.c\", [\"util.o\"]);\n graph.addEdge(\"test.c\", [\"test.exe\"]);\n graph.addEdge(\"main.o\", [\"app.exe\", \"test.exe\"]);\n graph.addEdge(\"util.o\", [\"app.exe\", \"test.exe\"]);\n graph.addEdge(\"config.json\", [\"app.exe\", \"test.exe\"]);\n\n\n // create graph\n const b1 = await openBriefcase();\n const { modelId, } = await Engine.initialize(b1);\n const monitor = new ElementDrivesElementEventMonitor(b1);\n await Engine.createGraph(b1, modelId, graph);\n b1.saveChanges();\n b1.saveChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([\n [\"main.c\", \"main.o\"],\n [\"main.o\", \"test.exe\"],\n [\"main.o\", \"app.exe\"],\n [\"util.c\", \"util.o\"],\n [\"util.o\", \"test.exe\"],\n [\"util.o\", \"app.exe\"],\n [\"test.c\", \"test.exe\"],\n [\"config.json\", \"test.exe\"],\n [\"config.json\", \"app.exe\"],\n ]);\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([\"main.o\", \"util.o\", \"test.exe\", \"app.exe\"]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([\"main.c\", \"util.c\", \"test.c\", \"config.json\"]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([]);\n\n // update main.c\n monitor.clear();\n await Engine.updateNode(b1, \"main.c\");\n b1.saveChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([\n [\"main.c\", \"main.o\"],\n [\"main.o\", \"test.exe\"],\n [\"main.o\", \"app.exe\"],\n ]);\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([\"main.o\", \"test.exe\", \"app.exe\"]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([\"main.c\"]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([]);\n\n // Topological sort (depth-first)\n const df = TopologicalSorter.sortDepthFirst(graph);\n chai.expect(TopologicalSorter.validate(graph, df)).to.be.true;\n\n // Topological sort (breadth-first)\n const bf = TopologicalSorter.sortBreadthFirst(graph);\n chai.expect(TopologicalSorter.validate(graph, bf)).to.be.true;\n chai.expect(df).to.deep.equal([\"config.json\", \"test.c\", \"util.c\", \"util.o\", \"main.c\", \"main.o\", \"test.exe\", \"app.exe\"]);\n chai.expect(bf).to.deep.equal([\"main.c\", \"util.c\", \"test.c\", \"config.json\", \"main.o\", \"util.o\", \"app.exe\", \"test.exe\"]);\n });\n it(\"EDE/local: complex, subset\", async () => {\n const graph = new Graph<string>();\n /*\n Graph shows what must be put on before other items:\n - Socks before Shoes\n - Underwear before Shoes and Pants\n - Pants before Belt and Shoes\n - Shirt before Belt and Tie\n - Tie before Jacket\n - Belt before Jacket\n - Watch has no dependencies\n */\n\n graph.addEdge(\"Socks\", [\"Shoes\"]);\n graph.addEdge(\"Underwear\", [\"Shoes\", \"Pants\"]);\n graph.addEdge(\"Pants\", [\"Belt\", \"Shoes\"]);\n graph.addEdge(\"Shirt\", [\"Belt\", \"Tie\"]);\n graph.addEdge(\"Tie\", [\"Jacket\"]);\n graph.addEdge(\"Belt\", [\"Jacket\"]);\n graph.addNode(\"Watch\");\n\n // Test using EDE\n const b1 = await openBriefcase();\n const { modelId, } = await Engine.initialize(b1);\n const monitor = new ElementDrivesElementEventMonitor(b1);\n await Engine.createGraph(b1, modelId, graph);\n b1.saveChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([\n [\"Socks\", \"Shoes\"],\n [\"Underwear\", \"Shoes\"],\n [\"Underwear\", \"Pants\"],\n [\"Pants\", \"Shoes\"],\n [\"Pants\", \"Belt\"],\n [\"Shirt\", \"Belt\"],\n [\"Belt\", \"Jacket\"],\n [\"Shirt\", \"Tie\"],\n [\"Tie\", \"Jacket\"]\n ]);\n\n // Watch is missing as it is not connected to any other node.\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([\"Pants\", \"Shoes\", \"Belt\", \"Tie\", \"Jacket\"]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([\"Socks\", \"Underwear\", \"Shirt\"]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([]);\n\n monitor.clear();\n await Engine.updateNode(b1, \"Socks\");\n b1.saveChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([[\"Socks\", \"Shoes\"]]);\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([\"Shoes\"]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([\"Socks\"]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([]);\n\n const sorted = TopologicalSorter.sortDepthFirst(graph);\n chai.expect(TopologicalSorter.validate(graph, sorted)).to.be.true;\n chai.expect(sorted).to.deep.equal([\"Watch\", \"Shirt\", \"Tie\", \"Underwear\", \"Pants\", \"Belt\", \"Jacket\", \"Socks\", \"Shoes\"]);\n\n // Test sorting with a subset of nodes\n const sorted1 = TopologicalSorter.sortDepthFirst(graph, [\"Underwear\"]);\n chai.expect(sorted1).to.deep.equal([\"Underwear\", \"Pants\", \"Belt\", \"Jacket\", \"Shoes\"]);\n\n const sorted2 = TopologicalSorter.sortDepthFirst(graph, [\"Belt\"]);\n chai.expect(sorted2).to.deep.equal([\"Belt\", \"Jacket\"]);\n\n const sorted3 = TopologicalSorter.sortDepthFirst(graph, [\"Shoes\"]);\n chai.expect(sorted3).to.deep.equal([\"Shoes\"]);\n\n const sorted4 = TopologicalSorter.sortDepthFirst(graph, [\"Socks\"]);\n chai.expect(sorted4).to.deep.equal([\"Socks\", \"Shoes\"]);\n\n const sorted5 = TopologicalSorter.sortDepthFirst(graph, [\"Tie\"]);\n chai.expect(sorted5).to.deep.equal([\"Tie\", \"Jacket\"]);\n\n const sorted6 = TopologicalSorter.sortDepthFirst(graph, [\"Jacket\"]);\n chai.expect(sorted6).to.deep.equal([\"Jacket\"]);\n\n const sorted7 = TopologicalSorter.sortDepthFirst(graph, [\"Shirt\"]);\n chai.expect(sorted7).to.deep.equal([\"Shirt\", \"Tie\", \"Belt\", \"Jacket\"]);\n\n const sorted8 = TopologicalSorter.sortDepthFirst(graph, [\"Watch\"]);\n chai.expect(sorted8).to.deep.equal([\"Watch\"]);\n });\n\n it(\"EDE: basic graph operations\", async () => {\n const b1 = await openBriefcase();\n const { modelId, } = await Engine.initialize(b1);\n const graph = new Graph<string>();\n\n // Graph structure:\n // A\n // / \\\n // B C\n // |\\ /\n // | \\/\n // E--D \n graph.addEdge(\"A\", [\"B\", \"C\"]);\n graph.addEdge(\"B\", [\"E\", \"D\"]);\n graph.addEdge(\"C\", [\"D\"]);\n graph.addEdge(\"D\", [\"E\"]);\n const monitor = new ElementDrivesElementEventMonitor(b1);\n\n // create a network\n await Engine.createGraph(b1, modelId, graph);\n b1.saveChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([\n [\"A\", \"B\"],\n [\"A\", \"C\"],\n [\"B\", \"E\"],\n [\"B\", \"D\"],\n [\"C\", \"D\"],\n [\"D\", \"E\"]]);\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([\"B\", \"C\", \"D\", \"E\"]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([\"A\"]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([]);\n monitor.clear();\n\n // update a node in network\n await Engine.updateNode(b1, \"B\");\n b1.saveChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([\n [\"B\", \"E\"],\n [\"B\", \"D\"],\n [\"D\", \"E\"]]);\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([\"D\", \"E\"]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([\"B\"]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([]);\n monitor.clear();\n\n // delete edge in network\n await Engine.deleteEdge(b1, \"B\", \"E\");\n b1.saveChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([]);\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([[\"B\", \"E\"]]);\n });\n it(\"EDE: cyclical throw exception\", async () => {\n const b1 = await openBriefcase();\n const { modelId, } = await Engine.initialize(b1);\n const graph = new Graph<string>();\n // Graph structure with a cycle:\n // A\n // / \\\n // B - C\n\n graph.addEdge(\"A\", [\"B\"]);\n graph.addEdge(\"B\", [\"C\"]);\n graph.addEdge(\"C\", [\"A\"]);\n\n const monitor = new ElementDrivesElementEventMonitor(b1);\n // create a network\n await Engine.createGraph(b1, modelId, graph);\n chai.expect(() => b1.saveChanges()).to.throw(\"Could not save changes due to propagation failure.\");\n b1.abandonChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([[\"B\", \"C\"], [\"C\", \"A\"], [\"A\", \"B\"]]);\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([\"C\", \"A\", \"B\"]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([]);\n monitor.clear();\n });\n it(\"EDE: cyclical graph can start propagation with no clear starting element\", async () => {\n const b1 = await openBriefcase();\n const { modelId, } = await Engine.initialize(b1);\n const graph = new Graph<string>();\n // Graph structure with a cycle:\n // A\n // / \\\n // B - C\n\n // order of insertion effect graph with cycles.\n graph.addNode(\"B\");\n graph.addNode(\"A\");\n graph.addNode(\"C\");\n\n graph.addEdge(\"A\", [\"B\"]);\n graph.addEdge(\"B\", [\"C\"]);\n graph.addEdge(\"C\", [\"A\"]);\n\n const monitor = new ElementDrivesElementEventMonitor(b1);\n // create a network\n await Engine.createGraph(b1, modelId, graph);\n chai.expect(() => b1.saveChanges()).to.throw(\"Could not save changes due to propagation failure.\");\n b1.abandonChanges();\n chai.expect(monitor.onRootChanged).to.deep.equal([[\"C\", \"A\"], [\"A\", \"B\"], [\"B\", \"C\"]]);\n chai.expect(monitor.onAllInputsHandled).to.deep.equal([\"A\", \"B\", \"C\"]);\n chai.expect(monitor.onBeforeOutputsHandled).to.deep.equal([]);\n chai.expect(monitor.onDeletedDependency).to.deep.equal([]);\n monitor.clear();\n });\n it.skip(\"EDE: performance\", async () => {\n const b1 = await openBriefcase();\n const { modelId, } = await Engine.initialize(b1);\n const graph = new Graph<string>();\n\n const createTree = (depth: number, breadth: number, prefix: string) => {\n if (depth === 0)\n return;\n for (let i = 0; i < breadth; i++) {\n const node = `${prefix}${i}`;\n graph.addNode(node);\n if (depth > 1) {\n for (let j = 0; j < breadth; j++) {\n const child = `${prefix}${i}${j}`;\n graph.addEdge(node, [child]);\n createTree(depth - 1, breadth, `${prefix}${i}${j}`);\n }\n }\n }\n };\n\n const stopWatch0 = new StopWatch(\"create graph\", true);\n createTree(5, 3, \"N\");\n await Engine.createGraph(b1, modelId, graph);\n stopWatch0.stop();\n const createGraphTime = stopWatch0.elapsed.seconds;\n\n let onRootChangedCount = 0;\n let onDeletedDependencyCount = 0;\n let onAllInputsHandledCount = 0;\n let onBeforeOutputsHandledCount = 0;\n InputDrivesOutput.events.onRootChanged.addListener(() => { onRootChangedCount++; });\n InputDrivesOutput.events.onDeletedDependency.addListener(() => { onDeletedDependencyCount++; });\n NodeElement.events.onAllInputsHandled.addListener((_id: Id64String) => { onAllInputsHandledCount++; });\n NodeElement.events.onBeforeOutputsHandled.addListener(() => { onBeforeOutputsHandledCount++; });\n\n const stopWatch1 = new StopWatch(\"save changes\", true);\n b1.saveChanges();\n stopWatch1.stop();\n const saveChangesTime = stopWatch1.elapsed.seconds;\n chai.expect(onRootChangedCount).to.be.equals(7380);\n chai.expect(onDeletedDependencyCount).to.equal(0);\n chai.expect(onAllInputsHandledCount).to.be.equals(7380);\n chai.expect(onBeforeOutputsHandledCount).to.equal(2460);\n chai.expect(createGraphTime).to.be.lessThan(3);\n chai.expect(saveChangesTime).to.be.lessThan(3);\n });\n});\n"]}
|
|
@@ -318,6 +318,12 @@ describe('InstanceKeyLRUCache', () => {
|
|
|
318
318
|
expect(retrievedResultByCode).to.not.be.undefined;
|
|
319
319
|
expect(retrievedResultByCode).to.equal(testResults[0]);
|
|
320
320
|
});
|
|
321
|
+
it('should not store a bad id as result in the cache', () => {
|
|
322
|
+
const cache = new InstanceKeyLRUCache(3);
|
|
323
|
+
const badResult = { id: Id64.invalid, classFullName: "badName" };
|
|
324
|
+
expect(() => cache.set(testArgs1, badResult)).to.throw(Error, "Invalid InstanceKey result");
|
|
325
|
+
expect(cache.size).to.equal(0);
|
|
326
|
+
});
|
|
321
327
|
it('should delete least used element', () => {
|
|
322
328
|
const cache = new InstanceKeyLRUCache(3);
|
|
323
329
|
cache.set(testArgs1, testResults[0]);
|
|
@@ -420,6 +426,19 @@ describe('InstanceKeyLRUCache', () => {
|
|
|
420
426
|
const retrievedResult2 = cache.get(testArgs1);
|
|
421
427
|
expect(retrievedResult2).to.be.undefined;
|
|
422
428
|
});
|
|
429
|
+
it('should throw when trying to delete with all undefined keys', () => {
|
|
430
|
+
const cache = new InstanceKeyLRUCache(3);
|
|
431
|
+
cache.set(testArgs1, testResults[0]);
|
|
432
|
+
cache.set(testArgs2, testResults[1]);
|
|
433
|
+
cache.set(testArgs3, testResults[2]);
|
|
434
|
+
expect(cache.size).to.equal(3);
|
|
435
|
+
expect(() => cache.delete({
|
|
436
|
+
partialKey: undefined,
|
|
437
|
+
federationGuid: undefined,
|
|
438
|
+
code: undefined
|
|
439
|
+
})).to.throw(Error, "ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid");
|
|
440
|
+
expect(cache.size).to.equal(3);
|
|
441
|
+
});
|
|
423
442
|
it('should clear the cache', () => {
|
|
424
443
|
const cache = new InstanceKeyLRUCache(3);
|
|
425
444
|
cache.set(testArgs1, testResults[0]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElementLRUCache.test.js","sourceRoot":"","sources":["../../../src/test/ElementLRUCache.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from \"chai\";\nimport { CachedElement, ElementLRUCache, InstanceKeyLRUCache } from \"../internal/ElementLRUCache\";\nimport { IModelJsNative } from \"../core-backend\";\nimport { Id64 } from \"@itwin/core-bentley\";\n\ndescribe('ElementLruCache', () => {\n const testElem1: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId\",\n model: \"testModel\",\n code: {\n spec: \"testSpec\",\n scope: \"testScope\"\n },\n classFullName: \"testName\"\n },\n }\n\n const testElem2: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId2\",\n model: \"testModel2\",\n code: {\n spec: \"testSpec2\",\n scope: \"testScope2\",\n value: \"testValue2\"\n },\n classFullName: \"testName2\"\n },\n }\n\n const testElem3: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId3\",\n model: \"testModel3\",\n code: {\n spec: \"testSpec3\",\n scope: \"testScope3\"\n },\n classFullName: \"testName3\"\n },\n }\n\n const testElemFedGuid: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testIdFed\",\n model: \"testModel\",\n code: {\n spec: \"testSpec\",\n scope: \"testScope\"\n },\n classFullName: \"testName\",\n federationGuid: \"testFedGuid\"\n },\n }\n\n const testElemCode: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId5\",\n model: \"testModel5\",\n code: {\n spec: \"testSpec2:testValue2\",\n scope: \"testScope2\"\n },\n classFullName: \"testName5\",\n federationGuid: \"testFedGuid5\"\n },\n }\n\n const testElemNoId: CachedElement = {\n loadOptions: {},\n elProps: {\n id: undefined,\n model: \"testModel5\",\n code: {\n spec: \"testSpec2\",\n scope: \"testScope2\"\n },\n classFullName: \"testName5\",\n federationGuid: \"testFedGuid5\"\n },\n }\n\n it('should store and retrieve a valid element', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n const retrievedElem = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem1);\n });\n\n it('should overwrite existing valid element', () => {\n const cache = new ElementLRUCache(3);\n const testElemModel = testElem1;\n cache.set(testElemModel);\n const retrievedElem = cache.get({ id: testElemModel.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElemModel);\n\n testElemModel.elProps.model = \"newModel\";\n cache.set(testElemModel);\n const retrievedElem2 = cache.get({ id: testElemModel.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElemModel);\n });\n\n it('should store and retrieve a valid element by fedGuid', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElemFedGuid);\n const retrievedElem = cache.get({ federationGuid: testElemFedGuid.elProps.federationGuid });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElemFedGuid);\n });\n\n it('should store and retrieve a valid element by code', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n const retrievedElem = cache.get({ code: testElem1.elProps.code });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem1);\n\n cache.set(testElem2);\n const retrievedElem2 = cache.get({ code: testElem2.elProps.code });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem2);\n });\n\n it('should fail to store an element without id', () => {\n const cache = new ElementLRUCache(3);\n expect(() => cache.set(testElemNoId)).to.throw(Error, \"Element must have an id\");\n });\n\n it('should delete least used element', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n cache.set(testElemFedGuid);\n expect(cache.size).to.equal(3);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem2);\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.be.undefined;\n\n const retrievedElem3 = cache.get({ id: testElem3.elProps.id });\n expect(retrievedElem3).to.not.be.undefined;\n expect(retrievedElem3).to.equal(testElem3);\n });\n\n it('should delete with id', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.delete({ id: testElem2.elProps.id });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with federation guid', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElemFedGuid);\n expect(cache.size).to.equal(3);\n cache.delete({ federationGuid: testElemFedGuid.elProps.federationGuid });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElemFedGuid.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with code', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.delete({ code: testElem2.elProps.code });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with model id', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.deleteWithModel(testElem2.elProps.model);\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should clear the cache', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n\n cache.clear();\n expect(cache.size).to.equal(0);\n\n const retrievedElem = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem).to.be.undefined;\n });\n\n it('should not return wrong element when passed a manipulated code value', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem2);\n expect(cache.size).to.equal(1);\n\n const retrievedElem = cache.get({ code: testElemCode.elProps.code });\n expect(retrievedElem).to.be.undefined;\n });\n});\n\ndescribe('InstanceKeyLRUCache', () => {\n const testArgs1: IModelJsNative.ResolveInstanceKeyArgs = {\n partialKey: {\n id: Id64.fromJSON(\"0x123\"),\n baseClassName: \"baseName\",\n },\n }\n\n const testArgs2: IModelJsNative.ResolveInstanceKeyArgs = {\n federationGuid: \"testFedGuid\",\n }\n\n const testArgs3: IModelJsNative.ResolveInstanceKeyArgs = {\n code: {\n spec: \"testSpec\",\n scope: \"testScope\",\n value: \"testValue\"\n }\n }\n\n const testArgs4: IModelJsNative.ResolveInstanceKeyArgs = {\n code: {\n spec: \"testSpec\",\n scope: \"testScope\"\n }\n }\n\n const testResults: IModelJsNative.ResolveInstanceKeyResult[] = [\n {\n id: Id64.fromJSON(\"0x123\"),\n classFullName: \"testName1\",\n },\n {\n id: Id64.fromJSON(\"0x122\"),\n classFullName: \"testName2\",\n },\n {\n id: Id64.fromJSON(\"0x133\"),\n classFullName: \"testName3\",\n },\n {\n id: Id64.fromJSON(\"0x144\"),\n classFullName: \"testName4\",\n }\n ];\n\n it('should store and retrieve a valid InstanceKey', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n const retrievedResult = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResults[0]);\n });\n\n it('should overwrite existing valid InstanceKey', () => {\n const cache = new InstanceKeyLRUCache(3);\n const testResult = testResults[0];\n cache.set(testArgs1, testResult);\n const retrievedResult = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResult);\n\n const newTestResult = { id: testResult.id, classFullName: \"newModel\" };\n cache.set(testArgs1, newTestResult);\n const retrievedResult2 = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(newTestResult);\n });\n\n it('should store and retrieve a valid InstanceKey by fedGuid', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs2, testResults[0]);\n const retrievedResult = cache.get({ federationGuid: testArgs2.federationGuid });\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResults[0]);\n });\n\n it('should store and retrieve a valid InstanceKey by code', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs3, testResults[0]);\n const retrievedResult = cache.get({ code: testArgs3.code });\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResults[0]);\n\n cache.set(testArgs4, testResults[1]);\n const retrievedResult2 = cache.get({ code: testArgs4.code });\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[1]);\n });\n\n it('should find the same InstanceKey with either code, fedGuid, or Id', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set({ ...testArgs1, ...testArgs2, ...testArgs3}, testResults[0]);\n\n const retrievedResultById = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResultById).to.not.be.undefined;\n expect(retrievedResultById).to.equal(testResults[0]);\n\n const retrievedResultByFedGuid = cache.get({ federationGuid: testArgs2.federationGuid });\n expect(retrievedResultByFedGuid).to.not.be.undefined;\n expect(retrievedResultByFedGuid).to.equal(testResults[0]);\n\n const retrievedResultByCode = cache.get({ code: testArgs3.code });\n expect(retrievedResultByCode).to.not.be.undefined;\n expect(retrievedResultByCode).to.equal(testResults[0]);\n });\n\n it('should update an existing InstanceKey with either code, fedGuid, or Id', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[0]);\n cache.set(testArgs3, testResults[0]);\n\n const retrievedResultById = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResultById).to.not.be.undefined;\n expect(retrievedResultById).to.equal(testResults[0]);\n\n const retrievedResultByFedGuid = cache.get({ federationGuid: testArgs2.federationGuid });\n expect(retrievedResultByFedGuid).to.not.be.undefined;\n expect(retrievedResultByFedGuid).to.equal(testResults[0]);\n\n const retrievedResultByCode = cache.get({ code: testArgs3.code });\n expect(retrievedResultByCode).to.not.be.undefined;\n expect(retrievedResultByCode).to.equal(testResults[0]);\n });\n\n it('should delete least used element', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n cache.set(testArgs4, testResults[3]);\n expect(cache.size).to.equal(3);\n\n const retrievedResult = cache.get(testArgs2);\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResults[1]);\n\n const retrievedResult2 = cache.get(testArgs1);\n expect(retrievedResult2).to.be.undefined;\n\n const retrievedResult3 = cache.get(testArgs3);\n expect(retrievedResult3).to.not.be.undefined;\n expect(retrievedResult3).to.equal(testResults[2]);\n });\n\n it('should delete with partialKey', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.delete({ partialKey: testArgs1.partialKey });\n expect(cache.size).to.equal(2);\n\n const retrievedResult = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult).to.be.undefined;\n\n const retrievedResult2 = cache.get(testArgs2);\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[1]);\n });\n\n it('should delete with id', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.deleteById(testArgs1.partialKey!.id);\n expect(cache.size).to.equal(2);\n\n const retrievedResult = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult).to.be.undefined;\n\n const retrievedResult2 = cache.get(testArgs2);\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[1]);\n });\n\n it('should throw when deleting with a bad id', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n expect(() => cache.deleteById(\"badid\")).to.throw(Error, \"Invalid id provided\");\n expect(cache.size).to.equal(3);\n });\n\n it('should delete with federation guid', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.delete({ federationGuid: testArgs2.federationGuid });\n expect(cache.size).to.equal(2);\n\n const retrievedResult = cache.get({ federationGuid: testArgs2.federationGuid });\n expect(retrievedResult).to.be.undefined;\n\n const retrievedResult2 = cache.get(testArgs3);\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[2]);\n });\n\n it('should delete with code', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.delete({ code: testArgs3.code });\n expect(cache.size).to.equal(2);\n\n const retrievedResult = cache.get({ code: testArgs3.code });\n expect(retrievedResult).to.be.undefined;\n\n const retrievedResult2 = cache.get(testArgs1);\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[0]);\n });\n\n it('should delete with any applicable arg', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[0]);\n cache.set(testArgs3, testResults[0]);\n expect(cache.size).to.equal(1);\n cache.delete(testArgs3);\n expect(cache.size).to.equal(0);\n const retrievedResult = cache.get(testArgs1);\n expect(retrievedResult).to.be.undefined;\n\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.set(testArgs4, testResults[0]);\n expect(cache.size).to.equal(3);\n\n cache.delete(testArgs4);\n expect(cache.size).to.equal(2);\n const retrievedResult2 = cache.get(testArgs1);\n expect(retrievedResult2).to.be.undefined;\n });\n\n it('should clear the cache', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n\n cache.clear();\n expect(cache.size).to.equal(0);\n\n const retrievedElem = cache.get(testArgs1);\n expect(retrievedElem).to.be.undefined;\n });\n});"]}
|
|
1
|
+
{"version":3,"file":"ElementLRUCache.test.js","sourceRoot":"","sources":["../../../src/test/ElementLRUCache.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from \"chai\";\nimport { CachedElement, ElementLRUCache, InstanceKeyLRUCache } from \"../internal/ElementLRUCache\";\nimport { IModelJsNative } from \"../core-backend\";\nimport { Id64 } from \"@itwin/core-bentley\";\n\ndescribe('ElementLruCache', () => {\n const testElem1: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId\",\n model: \"testModel\",\n code: {\n spec: \"testSpec\",\n scope: \"testScope\"\n },\n classFullName: \"testName\"\n },\n }\n\n const testElem2: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId2\",\n model: \"testModel2\",\n code: {\n spec: \"testSpec2\",\n scope: \"testScope2\",\n value: \"testValue2\"\n },\n classFullName: \"testName2\"\n },\n }\n\n const testElem3: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId3\",\n model: \"testModel3\",\n code: {\n spec: \"testSpec3\",\n scope: \"testScope3\"\n },\n classFullName: \"testName3\"\n },\n }\n\n const testElemFedGuid: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testIdFed\",\n model: \"testModel\",\n code: {\n spec: \"testSpec\",\n scope: \"testScope\"\n },\n classFullName: \"testName\",\n federationGuid: \"testFedGuid\"\n },\n }\n\n const testElemCode: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId5\",\n model: \"testModel5\",\n code: {\n spec: \"testSpec2:testValue2\",\n scope: \"testScope2\"\n },\n classFullName: \"testName5\",\n federationGuid: \"testFedGuid5\"\n },\n }\n\n const testElemNoId: CachedElement = {\n loadOptions: {},\n elProps: {\n id: undefined,\n model: \"testModel5\",\n code: {\n spec: \"testSpec2\",\n scope: \"testScope2\"\n },\n classFullName: \"testName5\",\n federationGuid: \"testFedGuid5\"\n },\n }\n\n it('should store and retrieve a valid element', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n const retrievedElem = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem1);\n });\n\n it('should overwrite existing valid element', () => {\n const cache = new ElementLRUCache(3);\n const testElemModel = testElem1;\n cache.set(testElemModel);\n const retrievedElem = cache.get({ id: testElemModel.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElemModel);\n\n testElemModel.elProps.model = \"newModel\";\n cache.set(testElemModel);\n const retrievedElem2 = cache.get({ id: testElemModel.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElemModel);\n });\n\n it('should store and retrieve a valid element by fedGuid', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElemFedGuid);\n const retrievedElem = cache.get({ federationGuid: testElemFedGuid.elProps.federationGuid });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElemFedGuid);\n });\n\n it('should store and retrieve a valid element by code', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n const retrievedElem = cache.get({ code: testElem1.elProps.code });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem1);\n\n cache.set(testElem2);\n const retrievedElem2 = cache.get({ code: testElem2.elProps.code });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem2);\n });\n\n it('should fail to store an element without id', () => {\n const cache = new ElementLRUCache(3);\n expect(() => cache.set(testElemNoId)).to.throw(Error, \"Element must have an id\");\n });\n\n it('should delete least used element', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n cache.set(testElemFedGuid);\n expect(cache.size).to.equal(3);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem2);\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.be.undefined;\n\n const retrievedElem3 = cache.get({ id: testElem3.elProps.id });\n expect(retrievedElem3).to.not.be.undefined;\n expect(retrievedElem3).to.equal(testElem3);\n });\n\n it('should delete with id', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.delete({ id: testElem2.elProps.id });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with federation guid', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElemFedGuid);\n expect(cache.size).to.equal(3);\n cache.delete({ federationGuid: testElemFedGuid.elProps.federationGuid });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElemFedGuid.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with code', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.delete({ code: testElem2.elProps.code });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with model id', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.deleteWithModel(testElem2.elProps.model);\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should clear the cache', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n\n cache.clear();\n expect(cache.size).to.equal(0);\n\n const retrievedElem = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem).to.be.undefined;\n });\n\n it('should not return wrong element when passed a manipulated code value', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem2);\n expect(cache.size).to.equal(1);\n\n const retrievedElem = cache.get({ code: testElemCode.elProps.code });\n expect(retrievedElem).to.be.undefined;\n });\n});\n\ndescribe('InstanceKeyLRUCache', () => {\n const testArgs1: IModelJsNative.ResolveInstanceKeyArgs = {\n partialKey: {\n id: Id64.fromJSON(\"0x123\"),\n baseClassName: \"baseName\",\n },\n }\n\n const testArgs2: IModelJsNative.ResolveInstanceKeyArgs = {\n federationGuid: \"testFedGuid\",\n }\n\n const testArgs3: IModelJsNative.ResolveInstanceKeyArgs = {\n code: {\n spec: \"testSpec\",\n scope: \"testScope\",\n value: \"testValue\"\n }\n }\n\n const testArgs4: IModelJsNative.ResolveInstanceKeyArgs = {\n code: {\n spec: \"testSpec\",\n scope: \"testScope\"\n }\n }\n\n const testResults: IModelJsNative.ResolveInstanceKeyResult[] = [\n {\n id: Id64.fromJSON(\"0x123\"),\n classFullName: \"testName1\",\n },\n {\n id: Id64.fromJSON(\"0x122\"),\n classFullName: \"testName2\",\n },\n {\n id: Id64.fromJSON(\"0x133\"),\n classFullName: \"testName3\",\n },\n {\n id: Id64.fromJSON(\"0x144\"),\n classFullName: \"testName4\",\n }\n ];\n\n it('should store and retrieve a valid InstanceKey', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n const retrievedResult = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResults[0]);\n });\n\n it('should overwrite existing valid InstanceKey', () => {\n const cache = new InstanceKeyLRUCache(3);\n const testResult = testResults[0];\n cache.set(testArgs1, testResult);\n const retrievedResult = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResult);\n\n const newTestResult = { id: testResult.id, classFullName: \"newModel\" };\n cache.set(testArgs1, newTestResult);\n const retrievedResult2 = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(newTestResult);\n });\n\n it('should store and retrieve a valid InstanceKey by fedGuid', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs2, testResults[0]);\n const retrievedResult = cache.get({ federationGuid: testArgs2.federationGuid });\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResults[0]);\n });\n\n it('should store and retrieve a valid InstanceKey by code', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs3, testResults[0]);\n const retrievedResult = cache.get({ code: testArgs3.code });\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResults[0]);\n\n cache.set(testArgs4, testResults[1]);\n const retrievedResult2 = cache.get({ code: testArgs4.code });\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[1]);\n });\n\n it('should find the same InstanceKey with either code, fedGuid, or Id', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set({ ...testArgs1, ...testArgs2, ...testArgs3}, testResults[0]);\n\n const retrievedResultById = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResultById).to.not.be.undefined;\n expect(retrievedResultById).to.equal(testResults[0]);\n\n const retrievedResultByFedGuid = cache.get({ federationGuid: testArgs2.federationGuid });\n expect(retrievedResultByFedGuid).to.not.be.undefined;\n expect(retrievedResultByFedGuid).to.equal(testResults[0]);\n\n const retrievedResultByCode = cache.get({ code: testArgs3.code });\n expect(retrievedResultByCode).to.not.be.undefined;\n expect(retrievedResultByCode).to.equal(testResults[0]);\n });\n\n it('should update an existing InstanceKey with either code, fedGuid, or Id', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[0]);\n cache.set(testArgs3, testResults[0]);\n\n const retrievedResultById = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResultById).to.not.be.undefined;\n expect(retrievedResultById).to.equal(testResults[0]);\n\n const retrievedResultByFedGuid = cache.get({ federationGuid: testArgs2.federationGuid });\n expect(retrievedResultByFedGuid).to.not.be.undefined;\n expect(retrievedResultByFedGuid).to.equal(testResults[0]);\n\n const retrievedResultByCode = cache.get({ code: testArgs3.code });\n expect(retrievedResultByCode).to.not.be.undefined;\n expect(retrievedResultByCode).to.equal(testResults[0]);\n });\n\n it('should not store a bad id as result in the cache', () => {\n const cache = new InstanceKeyLRUCache(3);\n const badResult: IModelJsNative.ResolveInstanceKeyResult = { id: Id64.invalid, classFullName: \"badName\" };\n expect(() => cache.set(testArgs1, badResult)).to.throw(Error, \"Invalid InstanceKey result\");\n expect(cache.size).to.equal(0);\n });\n\n it('should delete least used element', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n cache.set(testArgs4, testResults[3]);\n expect(cache.size).to.equal(3);\n\n const retrievedResult = cache.get(testArgs2);\n expect(retrievedResult).to.not.be.undefined;\n expect(retrievedResult).to.equal(testResults[1]);\n\n const retrievedResult2 = cache.get(testArgs1);\n expect(retrievedResult2).to.be.undefined;\n\n const retrievedResult3 = cache.get(testArgs3);\n expect(retrievedResult3).to.not.be.undefined;\n expect(retrievedResult3).to.equal(testResults[2]);\n });\n\n it('should delete with partialKey', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.delete({ partialKey: testArgs1.partialKey });\n expect(cache.size).to.equal(2);\n\n const retrievedResult = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult).to.be.undefined;\n\n const retrievedResult2 = cache.get(testArgs2);\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[1]);\n });\n\n it('should delete with id', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.deleteById(testArgs1.partialKey!.id);\n expect(cache.size).to.equal(2);\n\n const retrievedResult = cache.get({ partialKey: testArgs1.partialKey });\n expect(retrievedResult).to.be.undefined;\n\n const retrievedResult2 = cache.get(testArgs2);\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[1]);\n });\n\n it('should throw when deleting with a bad id', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n expect(() => cache.deleteById(\"badid\")).to.throw(Error, \"Invalid id provided\");\n expect(cache.size).to.equal(3);\n });\n\n it('should delete with federation guid', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.delete({ federationGuid: testArgs2.federationGuid });\n expect(cache.size).to.equal(2);\n\n const retrievedResult = cache.get({ federationGuid: testArgs2.federationGuid });\n expect(retrievedResult).to.be.undefined;\n\n const retrievedResult2 = cache.get(testArgs3);\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[2]);\n });\n\n it('should delete with code', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.delete({ code: testArgs3.code });\n expect(cache.size).to.equal(2);\n\n const retrievedResult = cache.get({ code: testArgs3.code });\n expect(retrievedResult).to.be.undefined;\n\n const retrievedResult2 = cache.get(testArgs1);\n expect(retrievedResult2).to.not.be.undefined;\n expect(retrievedResult2).to.equal(testResults[0]);\n });\n\n it('should delete with any applicable arg', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[0]);\n cache.set(testArgs3, testResults[0]);\n expect(cache.size).to.equal(1);\n cache.delete(testArgs3);\n expect(cache.size).to.equal(0);\n const retrievedResult = cache.get(testArgs1);\n expect(retrievedResult).to.be.undefined;\n\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n cache.set(testArgs4, testResults[0]);\n expect(cache.size).to.equal(3);\n\n cache.delete(testArgs4);\n expect(cache.size).to.equal(2);\n const retrievedResult2 = cache.get(testArgs1);\n expect(retrievedResult2).to.be.undefined;\n });\n\n it('should throw when trying to delete with all undefined keys', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n\n expect(() => cache.delete({\n partialKey: undefined,\n federationGuid: undefined,\n code: undefined\n })).to.throw(Error, \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\");\n\n expect(cache.size).to.equal(3);\n });\n\n it('should clear the cache', () => {\n const cache = new InstanceKeyLRUCache(3);\n cache.set(testArgs1, testResults[0]);\n cache.set(testArgs2, testResults[1]);\n cache.set(testArgs3, testResults[2]);\n expect(cache.size).to.equal(3);\n\n cache.clear();\n expect(cache.size).to.equal(0);\n\n const retrievedElem = cache.get(testArgs1);\n expect(retrievedElem).to.be.undefined;\n });\n});"]}
|
|
@@ -11,8 +11,7 @@ import { SnapshotDb } from "../IModelDb";
|
|
|
11
11
|
import { IModelHost, KnownLocations } from "../IModelHost";
|
|
12
12
|
import { Schemas } from "../Schema";
|
|
13
13
|
import { KnownTestLocations } from "./KnownTestLocations";
|
|
14
|
-
import { AzureServerStorage
|
|
15
|
-
import { ServerStorage } from "@itwin/object-storage-core";
|
|
14
|
+
import { AzureServerStorage } from "@itwin/object-storage-azure";
|
|
16
15
|
import { TestUtils } from "./TestUtils";
|
|
17
16
|
import { IModelTestUtils } from "./IModelTestUtils";
|
|
18
17
|
import { Logger, LogLevel } from "@itwin/core-bentley";
|
|
@@ -127,17 +126,24 @@ describe("IModelHost", () => {
|
|
|
127
126
|
account: "testAccount",
|
|
128
127
|
accessKey: "testAccessKey",
|
|
129
128
|
};
|
|
130
|
-
const storageStub = sinon.createStubInstance(AzureServerStorage); // I guess Sinon type definitions don't work well with overloads
|
|
131
|
-
const registerStub = sinon.stub(AzureServerStorageBindings.prototype, "register").callsFake((container) => {
|
|
132
|
-
container.bind(ServerStorage).toConstantValue(storageStub);
|
|
133
|
-
});
|
|
134
129
|
await IModelHost.startup(config);
|
|
135
130
|
assert.isDefined(IModelHost.tileStorage);
|
|
136
|
-
assert.
|
|
137
|
-
assert.
|
|
138
|
-
assert.equal(
|
|
139
|
-
|
|
140
|
-
|
|
131
|
+
assert.isDefined(IModelHost.tileStorage.storage);
|
|
132
|
+
assert.instanceOf(IModelHost.tileStorage.storage, AzureServerStorage);
|
|
133
|
+
assert.equal((IModelHost.tileStorage?.storage)._config.baseUrl, `https://${config.tileCacheAzureCredentials.account}.blob.core.windows.net`);
|
|
134
|
+
});
|
|
135
|
+
it("should set Azure cloud storage provider for tile cache with custom baseUrl", async () => {
|
|
136
|
+
const config = {};
|
|
137
|
+
config.tileCacheAzureCredentials = {
|
|
138
|
+
account: "testAccount",
|
|
139
|
+
accessKey: "testAccessKey",
|
|
140
|
+
baseUrl: "https://custom.blob.core.windows.net",
|
|
141
|
+
};
|
|
142
|
+
await IModelHost.startup(config);
|
|
143
|
+
assert.isDefined(IModelHost.tileStorage);
|
|
144
|
+
assert.isDefined(IModelHost.tileStorage.storage);
|
|
145
|
+
assert.instanceOf(IModelHost.tileStorage.storage, AzureServerStorage);
|
|
146
|
+
assert.equal((IModelHost.tileStorage?.storage)._config.baseUrl, config.tileCacheAzureCredentials.baseUrl);
|
|
141
147
|
});
|
|
142
148
|
it("should set custom cloud storage provider for tile cache", async () => {
|
|
143
149
|
const config = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelHost.test.js","sourceRoot":"","sources":["../../../src/test/IModelHost.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { assert, expect } from \"chai\";\nimport * as path from \"path\";\nimport * as sinon from \"sinon\";\nimport { RpcRegistry } from \"@itwin/core-common\";\nimport { BriefcaseManager } from \"../BriefcaseManager\";\nimport { SnapshotDb } from \"../IModelDb\";\nimport { IModelHost, IModelHostOptions, KnownLocations } from \"../IModelHost\";\nimport { Schemas } from \"../Schema\";\nimport { KnownTestLocations } from \"./KnownTestLocations\";\nimport { AzureServerStorage, AzureServerStorageBindings, AzureServerStorageBindingsConfig } from \"@itwin/object-storage-azure\";\nimport { ServerStorage } from \"@itwin/object-storage-core\";\nimport { TestUtils } from \"./TestUtils\";\nimport { IModelTestUtils } from \"./IModelTestUtils\";\nimport { Logger, LogLevel } from \"@itwin/core-bentley\";\nimport { overrideSyncNativeLogLevels } from \"../internal/NativePlatform\";\nimport { _getHubAccess, _hubAccess } from \"../internal/Symbols\";\n\ndescribe(\"IModelHost\", () => {\n const opts = { cacheDir: TestUtils.getCacheDir() };\n beforeEach(async () => {\n await TestUtils.shutdownBackend();\n });\n\n afterEach(async () => {\n sinon.restore();\n });\n\n after(async () => {\n await TestUtils.startBackend();\n });\n\n it(\"valid default configuration\", async () => {\n await IModelHost.startup(opts);\n\n // Valid registered implemented RPCs\n expect(RpcRegistry.instance.implementationClasses.size).to.equal(4);\n expect(RpcRegistry.instance.implementationClasses.get(\"IModelReadRpcInterface\")).to.exist;\n expect(RpcRegistry.instance.implementationClasses.get(\"IModelTileRpcInterface\")).to.exist;\n expect(RpcRegistry.instance.implementationClasses.get(\"SnapshotIModelRpcInterface\")).to.exist;\n expect(RpcRegistry.instance.implementationClasses.get(\"DevToolsRpcInterface\")).to.exist;\n\n expect(Schemas.getRegisteredSchema(\"BisCore\")).to.exist;\n expect(Schemas.getRegisteredSchema(\"Generic\")).to.exist;\n expect(Schemas.getRegisteredSchema(\"Functional\")).to.exist;\n });\n\n it(\"should properly cleanup beforeExit event listeners on shutdown\", async () => {\n const beforeCount = process.listenerCount(\"beforeExit\");\n for (let i = 0; i <= 15; i++) {\n await IModelHost.startup();\n await IModelHost.shutdown();\n\n }\n const afterCount = process.listenerCount(\"beforeExit\");\n expect(beforeCount).to.be.equal(afterCount);\n });\n\n it(\"should call logger sync function\", async () => {\n let nSyncCalls = 0;\n overrideSyncNativeLogLevels(() => ++nSyncCalls);\n await IModelHost.startup(opts);\n expect(nSyncCalls).to.equal(0);\n Logger.setLevel(\"test-cat\", LogLevel.Warning);\n expect(nSyncCalls).to.equal(1);\n overrideSyncNativeLogLevels(undefined);\n });\n\n it(\"should raise onAfterStartup events\", async () => {\n const eventHandler = sinon.spy();\n IModelHost.onAfterStartup.addOnce(eventHandler);\n await IModelHost.startup(opts);\n expect(eventHandler.calledOnce).to.be.true;\n });\n\n it(\"should raise onBeforeShutdown events\", async () => {\n await TestUtils.startBackend();\n const eventHandler = sinon.spy();\n IModelHost.onBeforeShutdown.addOnce(eventHandler);\n const filename = IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\");\n\n const workspaceClose = sinon.spy((IModelHost.appWorkspace as any), \"close\");\n const saveSettings = IModelHost.appWorkspace.settings as any;\n const settingClose = sinon.spy(saveSettings, \"close\");\n expect(workspaceClose.callCount).eq(0);\n expect(settingClose.callCount).eq(0);\n expect(saveSettings._remove).to.not.be.undefined;\n\n // shutdown should close any opened iModels. Make sure that happens\n const imodel1 = SnapshotDb.openFile(filename, { key: \"imodel1\" });\n const imodel2 = SnapshotDb.openFile(filename, { key: \"imodel2\" });\n const imodel3 = SnapshotDb.openFile(filename, { key: \"imodel3\" });\n const imodel4 = SnapshotDb.openFile(filename, { key: \"imodel4\" });\n assert.notEqual(imodel1, imodel2);\n assert.notEqual(imodel2, imodel3);\n expect(imodel1.isOpen).to.be.true;\n expect(imodel2.isOpen).to.be.true;\n expect(imodel3.isOpen).to.be.true;\n imodel4.close(); // make sure it gets removed so we don't try to close it again on shutdown\n await TestUtils.shutdownBackend();\n expect(eventHandler.calledOnce).to.be.true;\n assert.isFalse(imodel1.isOpen, \"shutdown should close iModel1\");\n assert.isFalse(imodel2.isOpen, \"shutdown should close iModel2\");\n assert.isFalse(imodel3.isOpen, \"shutdown should close iModel3\");\n expect(workspaceClose.callCount).eq(1);\n expect(settingClose.callCount).eq(1);\n expect(saveSettings._remove).to.be.undefined;\n });\n\n it(\"should auto-shutdown on process beforeExit event\", async () => {\n await TestUtils.startBackend();\n expect(IModelHost.isValid).to.be.true;\n const eventHandler = sinon.spy();\n IModelHost.onBeforeShutdown.addOnce(eventHandler);\n process.emit(\"beforeExit\", 0);\n await new Promise((resolve) => setImmediate(resolve));\n expect(eventHandler.calledOnce).to.be.true;\n expect(IModelHost.isValid).to.be.false;\n });\n\n it(\"should set the briefcase cache directory to expected locations\", async () => {\n const config: IModelHostOptions = {};\n const cacheSubDir = \"imodels\";\n\n // Test cache default location\n await IModelHost.shutdown();\n await IModelHost.startup(config);\n let expectedDir = path.join(IModelHost.cacheDir, cacheSubDir);\n assert.strictEqual(expectedDir, BriefcaseManager.cacheDir);\n\n // Test custom cache location\n await IModelHost.shutdown();\n config.cacheDir = KnownLocations.tmpdir;\n await IModelHost.startup(config);\n expectedDir = path.join(KnownLocations.tmpdir, cacheSubDir);\n assert.strictEqual(expectedDir, BriefcaseManager.cacheDir);\n });\n\n it(\"should set Azure cloud storage provider for tile cache given credentials\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheAzureCredentials = {\n account: \"testAccount\",\n accessKey: \"testAccessKey\",\n };\n\n const storageStub = sinon.createStubInstance(AzureServerStorage) as sinon.SinonStubbedInstance<AzureServerStorage> & AzureServerStorage; // I guess Sinon type definitions don't work well with overloads\n const registerStub = sinon.stub(AzureServerStorageBindings.prototype, \"register\").callsFake((container) => {\n container.bind(ServerStorage).toConstantValue(storageStub);\n });\n\n await IModelHost.startup(config);\n\n assert.isDefined(IModelHost.tileStorage);\n assert.equal(IModelHost.tileStorage!.storage, storageStub);\n assert.isTrue(registerStub.calledOnce);\n assert.equal((registerStub.firstCall.lastArg as AzureServerStorageBindingsConfig).accountName, config.tileCacheAzureCredentials.account);\n assert.equal((registerStub.firstCall.lastArg as AzureServerStorageBindingsConfig).accountKey, config.tileCacheAzureCredentials.accessKey);\n assert.equal((registerStub.firstCall.lastArg as AzureServerStorageBindingsConfig).baseUrl, `https://${config.tileCacheAzureCredentials.account}.blob.core.windows.net`);\n });\n\n it(\"should set custom cloud storage provider for tile cache\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheStorage = {} as ServerStorage;\n\n await IModelHost.startup(config);\n\n assert.isDefined(IModelHost.tileStorage);\n assert.equal(IModelHost.tileStorage!.storage, config.tileCacheStorage);\n });\n\n it(\"should throw if both tileCacheStorage and tileCacheAzureCredentials are set\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheAzureCredentials = {\n account: \"testAccount\",\n accessKey: \"testAccessKey\",\n };\n config.tileCacheStorage = {} as ServerStorage;\n\n await expect(IModelHost.startup(config)).to.be.rejectedWith(\"Cannot use both Azure and custom cloud storage providers for tile cache.\");\n });\n\n it(\"should use local cache if cloud storage provider for tile cache is not set\", async () => {\n await IModelHost.startup(opts);\n\n assert.isUndefined(IModelHost.tileStorage);\n });\n\n it(\"should cleanup tileStorage on shutdown\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheStorage = {} as ServerStorage;\n\n await IModelHost.startup(config);\n\n assert.equal(IModelHost.tileStorage?.storage, config.tileCacheStorage);\n\n await IModelHost.shutdown();\n\n assert.isUndefined(IModelHost.tileStorage);\n });\n\n it(\"should throw if hubAccess is undefined and getter is called\", async () => {\n await IModelHost.startup(opts);\n expect(IModelHost[_getHubAccess]()).undefined;\n expect(() => IModelHost[_hubAccess]).throws();\n });\n\n it(\"computeSchemaChecksum\", () => {\n const assetsDir = path.join(KnownTestLocations.assetsDir, \"ECSchemaOps\");\n const schemaXmlPath = path.join(assetsDir, \"SchemaA.ecschema.xml\");\n let referencePaths = [assetsDir];\n let sha1 = IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths });\n expect(sha1).equal(\"3ac6578060902aa0b8426b61d62045fdf7fa0b2b\");\n\n expect(() => IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths, exactMatch: true })).throws(\"Failed to read schema SchemaA.ecschema\");\n\n referencePaths = [path.join(assetsDir, \"exact-match\")];\n sha1 = IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths, exactMatch: true });\n expect(sha1).equal(\"2a618664fbba1df7c05f27d7c0e8f58de250003b\");\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"IModelHost.test.js","sourceRoot":"","sources":["../../../src/test/IModelHost.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { assert, expect } from \"chai\";\nimport * as path from \"path\";\nimport * as sinon from \"sinon\";\nimport { RpcRegistry } from \"@itwin/core-common\";\nimport { BriefcaseManager } from \"../BriefcaseManager\";\nimport { SnapshotDb } from \"../IModelDb\";\nimport { IModelHost, IModelHostOptions, KnownLocations } from \"../IModelHost\";\nimport { Schemas } from \"../Schema\";\nimport { KnownTestLocations } from \"./KnownTestLocations\";\nimport { AzureServerStorage } from \"@itwin/object-storage-azure\";\nimport type { ServerStorage } from \"@itwin/object-storage-core\";\nimport { TestUtils } from \"./TestUtils\";\nimport { IModelTestUtils } from \"./IModelTestUtils\";\nimport { Logger, LogLevel } from \"@itwin/core-bentley\";\nimport { overrideSyncNativeLogLevels } from \"../internal/NativePlatform\";\nimport { _getHubAccess, _hubAccess } from \"../internal/Symbols\";\n\ndescribe(\"IModelHost\", () => {\n const opts = { cacheDir: TestUtils.getCacheDir() };\n beforeEach(async () => {\n await TestUtils.shutdownBackend();\n });\n\n afterEach(async () => {\n sinon.restore();\n });\n\n after(async () => {\n await TestUtils.startBackend();\n });\n\n it(\"valid default configuration\", async () => {\n await IModelHost.startup(opts);\n\n // Valid registered implemented RPCs\n expect(RpcRegistry.instance.implementationClasses.size).to.equal(4);\n expect(RpcRegistry.instance.implementationClasses.get(\"IModelReadRpcInterface\")).to.exist;\n expect(RpcRegistry.instance.implementationClasses.get(\"IModelTileRpcInterface\")).to.exist;\n expect(RpcRegistry.instance.implementationClasses.get(\"SnapshotIModelRpcInterface\")).to.exist;\n expect(RpcRegistry.instance.implementationClasses.get(\"DevToolsRpcInterface\")).to.exist;\n\n expect(Schemas.getRegisteredSchema(\"BisCore\")).to.exist;\n expect(Schemas.getRegisteredSchema(\"Generic\")).to.exist;\n expect(Schemas.getRegisteredSchema(\"Functional\")).to.exist;\n });\n\n it(\"should properly cleanup beforeExit event listeners on shutdown\", async () => {\n const beforeCount = process.listenerCount(\"beforeExit\");\n for (let i = 0; i <= 15; i++) {\n await IModelHost.startup();\n await IModelHost.shutdown();\n\n }\n const afterCount = process.listenerCount(\"beforeExit\");\n expect(beforeCount).to.be.equal(afterCount);\n });\n\n it(\"should call logger sync function\", async () => {\n let nSyncCalls = 0;\n overrideSyncNativeLogLevels(() => ++nSyncCalls);\n await IModelHost.startup(opts);\n expect(nSyncCalls).to.equal(0);\n Logger.setLevel(\"test-cat\", LogLevel.Warning);\n expect(nSyncCalls).to.equal(1);\n overrideSyncNativeLogLevels(undefined);\n });\n\n it(\"should raise onAfterStartup events\", async () => {\n const eventHandler = sinon.spy();\n IModelHost.onAfterStartup.addOnce(eventHandler);\n await IModelHost.startup(opts);\n expect(eventHandler.calledOnce).to.be.true;\n });\n\n it(\"should raise onBeforeShutdown events\", async () => {\n await TestUtils.startBackend();\n const eventHandler = sinon.spy();\n IModelHost.onBeforeShutdown.addOnce(eventHandler);\n const filename = IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\");\n\n const workspaceClose = sinon.spy((IModelHost.appWorkspace as any), \"close\");\n const saveSettings = IModelHost.appWorkspace.settings as any;\n const settingClose = sinon.spy(saveSettings, \"close\");\n expect(workspaceClose.callCount).eq(0);\n expect(settingClose.callCount).eq(0);\n expect(saveSettings._remove).to.not.be.undefined;\n\n // shutdown should close any opened iModels. Make sure that happens\n const imodel1 = SnapshotDb.openFile(filename, { key: \"imodel1\" });\n const imodel2 = SnapshotDb.openFile(filename, { key: \"imodel2\" });\n const imodel3 = SnapshotDb.openFile(filename, { key: \"imodel3\" });\n const imodel4 = SnapshotDb.openFile(filename, { key: \"imodel4\" });\n assert.notEqual(imodel1, imodel2);\n assert.notEqual(imodel2, imodel3);\n expect(imodel1.isOpen).to.be.true;\n expect(imodel2.isOpen).to.be.true;\n expect(imodel3.isOpen).to.be.true;\n imodel4.close(); // make sure it gets removed so we don't try to close it again on shutdown\n await TestUtils.shutdownBackend();\n expect(eventHandler.calledOnce).to.be.true;\n assert.isFalse(imodel1.isOpen, \"shutdown should close iModel1\");\n assert.isFalse(imodel2.isOpen, \"shutdown should close iModel2\");\n assert.isFalse(imodel3.isOpen, \"shutdown should close iModel3\");\n expect(workspaceClose.callCount).eq(1);\n expect(settingClose.callCount).eq(1);\n expect(saveSettings._remove).to.be.undefined;\n });\n\n it(\"should auto-shutdown on process beforeExit event\", async () => {\n await TestUtils.startBackend();\n expect(IModelHost.isValid).to.be.true;\n const eventHandler = sinon.spy();\n IModelHost.onBeforeShutdown.addOnce(eventHandler);\n process.emit(\"beforeExit\", 0);\n await new Promise((resolve) => setImmediate(resolve));\n expect(eventHandler.calledOnce).to.be.true;\n expect(IModelHost.isValid).to.be.false;\n });\n\n it(\"should set the briefcase cache directory to expected locations\", async () => {\n const config: IModelHostOptions = {};\n const cacheSubDir = \"imodels\";\n\n // Test cache default location\n await IModelHost.shutdown();\n await IModelHost.startup(config);\n let expectedDir = path.join(IModelHost.cacheDir, cacheSubDir);\n assert.strictEqual(expectedDir, BriefcaseManager.cacheDir);\n\n // Test custom cache location\n await IModelHost.shutdown();\n config.cacheDir = KnownLocations.tmpdir;\n await IModelHost.startup(config);\n expectedDir = path.join(KnownLocations.tmpdir, cacheSubDir);\n assert.strictEqual(expectedDir, BriefcaseManager.cacheDir);\n });\n\n it(\"should set Azure cloud storage provider for tile cache given credentials\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheAzureCredentials = {\n account: \"testAccount\",\n accessKey: \"testAccessKey\",\n };\n\n await IModelHost.startup(config);\n\n assert.isDefined(IModelHost.tileStorage);\n assert.isDefined(IModelHost.tileStorage!.storage);\n assert.instanceOf(IModelHost.tileStorage!.storage, AzureServerStorage);\n assert.equal((IModelHost.tileStorage?.storage as any)._config.baseUrl, `https://${config.tileCacheAzureCredentials.account}.blob.core.windows.net`)\n });\n\n it(\"should set Azure cloud storage provider for tile cache with custom baseUrl\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheAzureCredentials = {\n account: \"testAccount\",\n accessKey: \"testAccessKey\",\n baseUrl: \"https://custom.blob.core.windows.net\",\n };\n\n await IModelHost.startup(config);\n\n assert.isDefined(IModelHost.tileStorage);\n assert.isDefined(IModelHost.tileStorage!.storage);\n assert.instanceOf(IModelHost.tileStorage!.storage, AzureServerStorage);\n assert.equal((IModelHost.tileStorage?.storage as any)._config.baseUrl, config.tileCacheAzureCredentials.baseUrl)\n });\n\n it(\"should set custom cloud storage provider for tile cache\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheStorage = {} as ServerStorage;\n\n await IModelHost.startup(config);\n\n assert.isDefined(IModelHost.tileStorage);\n assert.equal(IModelHost.tileStorage!.storage, config.tileCacheStorage);\n });\n\n it(\"should throw if both tileCacheStorage and tileCacheAzureCredentials are set\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheAzureCredentials = {\n account: \"testAccount\",\n accessKey: \"testAccessKey\",\n };\n config.tileCacheStorage = {} as ServerStorage;\n\n await expect(IModelHost.startup(config)).to.be.rejectedWith(\"Cannot use both Azure and custom cloud storage providers for tile cache.\");\n });\n\n it(\"should use local cache if cloud storage provider for tile cache is not set\", async () => {\n await IModelHost.startup(opts);\n\n assert.isUndefined(IModelHost.tileStorage);\n });\n\n it(\"should cleanup tileStorage on shutdown\", async () => {\n const config: IModelHostOptions = {};\n config.tileCacheStorage = {} as ServerStorage;\n\n await IModelHost.startup(config);\n\n assert.equal(IModelHost.tileStorage?.storage, config.tileCacheStorage);\n\n await IModelHost.shutdown();\n\n assert.isUndefined(IModelHost.tileStorage);\n });\n\n it(\"should throw if hubAccess is undefined and getter is called\", async () => {\n await IModelHost.startup(opts);\n expect(IModelHost[_getHubAccess]()).undefined;\n expect(() => IModelHost[_hubAccess]).throws();\n });\n\n it(\"computeSchemaChecksum\", () => {\n const assetsDir = path.join(KnownTestLocations.assetsDir, \"ECSchemaOps\");\n const schemaXmlPath = path.join(assetsDir, \"SchemaA.ecschema.xml\");\n let referencePaths = [assetsDir];\n let sha1 = IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths });\n expect(sha1).equal(\"3ac6578060902aa0b8426b61d62045fdf7fa0b2b\");\n\n expect(() => IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths, exactMatch: true })).throws(\"Failed to read schema SchemaA.ecschema\");\n\n referencePaths = [path.join(assetsDir, \"exact-match\")];\n sha1 = IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths, exactMatch: true });\n expect(sha1).equal(\"2a618664fbba1df7c05f27d7c0e8f58de250003b\");\n });\n});\n"]}
|