@itwin/core-backend 5.9.0-dev.1 → 5.9.0-dev.10
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 +30 -1
- package/lib/cjs/BackendHubAccess.d.ts +38 -0
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BriefcaseManager.js +3 -3
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/Category.d.ts +37 -7
- package/lib/cjs/Category.d.ts.map +1 -1
- package/lib/cjs/Category.js +33 -42
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +5 -2
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChannelControl.d.ts +29 -0
- package/lib/cjs/ChannelControl.d.ts.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +1 -1
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js +68 -13
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +32 -3
- package/lib/cjs/CodeSpecs.d.ts.map +1 -1
- package/lib/cjs/CodeSpecs.js +48 -20
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +18 -3
- package/lib/cjs/DisplayStyle.d.ts.map +1 -1
- package/lib/cjs/DisplayStyle.js +10 -21
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts +262 -0
- package/lib/cjs/EditTxn.d.ts.map +1 -0
- package/lib/cjs/EditTxn.js +548 -0
- package/lib/cjs/EditTxn.js.map +1 -0
- package/lib/cjs/Element.d.ts +74 -5
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +63 -75
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +10 -0
- package/lib/cjs/ElementAspect.d.ts.map +1 -1
- package/lib/cjs/ElementAspect.js +21 -12
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.d.ts +56 -3
- package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
- package/lib/cjs/ElementTreeWalker.js +53 -40
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/ExternalSource.d.ts +11 -2
- package/lib/cjs/ExternalSource.d.ts.map +1 -1
- package/lib/cjs/ExternalSource.js +10 -8
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +66 -22
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +175 -289
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +58 -1
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +89 -0
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +35 -15
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +47 -7
- package/lib/cjs/LineStyle.d.ts.map +1 -1
- package/lib/cjs/LineStyle.js +38 -33
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LockControl.d.ts +85 -1
- package/lib/cjs/LockControl.d.ts.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.d.ts +8 -1
- package/lib/cjs/Material.d.ts.map +1 -1
- package/lib/cjs/Material.js +6 -12
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.d.ts +59 -20
- package/lib/cjs/Model.d.ts.map +1 -1
- package/lib/cjs/Model.js +38 -80
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +72 -7
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +39 -21
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/SchemaSync.js +4 -4
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SheetIndex.d.ts +9 -0
- package/lib/cjs/SheetIndex.d.ts.map +1 -1
- package/lib/cjs/SheetIndex.js +38 -35
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/StashManager.js +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/Texture.d.ts +6 -0
- package/lib/cjs/Texture.d.ts.map +1 -1
- package/lib/cjs/Texture.js +6 -14
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +105 -9
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +194 -15
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +21 -1
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js +27 -66
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +14 -6
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +33 -27
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +6 -5
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.d.ts +6 -2
- package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js +8 -13
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/GenericElements.d.ts +11 -4
- package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
- package/lib/cjs/domains/GenericElements.js +13 -24
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.d.ts +15 -0
- package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +5 -3
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/HubMock.d.ts +2 -0
- package/lib/cjs/internal/HubMock.d.ts.map +1 -1
- package/lib/cjs/internal/HubMock.js +7 -0
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/NoLocks.d.ts.map +1 -1
- package/lib/cjs/internal/NoLocks.js +6 -0
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.d.ts +12 -0
- package/lib/cjs/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js +285 -4
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.d.ts +4 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +5 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.d.ts +3 -2
- package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
- package/lib/cjs/internal/annotations/fields.js +7 -6
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +18 -3
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js +49 -242
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +0 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +70 -41
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +11 -5
- package/lib/cjs/workspace/Settings.d.ts.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.d.ts +20 -99
- package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsDb.js +23 -7
- package/lib/cjs/workspace/SettingsDb.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.d.ts +40 -226
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js +86 -25
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +7 -11
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +14 -0
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.d.ts +38 -0
- package/lib/esm/BackendHubAccess.d.ts.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BriefcaseManager.js +3 -3
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/Category.d.ts +37 -7
- package/lib/esm/Category.d.ts.map +1 -1
- package/lib/esm/Category.js +33 -42
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +5 -2
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChannelControl.d.ts +29 -0
- package/lib/esm/ChannelControl.d.ts.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +1 -1
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js +69 -14
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeSpecs.d.ts +32 -3
- package/lib/esm/CodeSpecs.d.ts.map +1 -1
- package/lib/esm/CodeSpecs.js +49 -21
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +18 -3
- package/lib/esm/DisplayStyle.d.ts.map +1 -1
- package/lib/esm/DisplayStyle.js +10 -21
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/EditTxn.d.ts +262 -0
- package/lib/esm/EditTxn.d.ts.map +1 -0
- package/lib/esm/EditTxn.js +543 -0
- package/lib/esm/EditTxn.js.map +1 -0
- package/lib/esm/Element.d.ts +74 -5
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +64 -76
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts +10 -0
- package/lib/esm/ElementAspect.d.ts.map +1 -1
- package/lib/esm/ElementAspect.js +22 -13
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementTreeWalker.d.ts +56 -3
- package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
- package/lib/esm/ElementTreeWalker.js +53 -40
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/ExternalSource.d.ts +11 -2
- package/lib/esm/ExternalSource.d.ts.map +1 -1
- package/lib/esm/ExternalSource.js +10 -8
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +66 -22
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +177 -291
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +58 -1
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +91 -2
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +36 -16
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +47 -7
- package/lib/esm/LineStyle.d.ts.map +1 -1
- package/lib/esm/LineStyle.js +38 -33
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LockControl.d.ts +85 -1
- package/lib/esm/LockControl.d.ts.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.d.ts +8 -1
- package/lib/esm/Material.d.ts.map +1 -1
- package/lib/esm/Material.js +6 -12
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.d.ts +59 -20
- package/lib/esm/Model.d.ts.map +1 -1
- package/lib/esm/Model.js +39 -81
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/Relationship.d.ts +72 -7
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +40 -22
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/SchemaSync.js +5 -5
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SheetIndex.d.ts +9 -0
- package/lib/esm/SheetIndex.d.ts.map +1 -1
- package/lib/esm/SheetIndex.js +38 -35
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/StashManager.js +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/Texture.d.ts +6 -0
- package/lib/esm/Texture.d.ts.map +1 -1
- package/lib/esm/Texture.js +6 -14
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +105 -9
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +194 -15
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +21 -1
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js +27 -66
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +14 -6
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +33 -27
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +6 -5
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.d.ts +6 -2
- package/lib/esm/domains/FunctionalElements.d.ts.map +1 -1
- package/lib/esm/domains/FunctionalElements.js +8 -13
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/GenericElements.d.ts +11 -4
- package/lib/esm/domains/GenericElements.d.ts.map +1 -1
- package/lib/esm/domains/GenericElements.js +13 -24
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.d.ts +15 -0
- package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js +6 -4
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/HubMock.d.ts +2 -0
- package/lib/esm/internal/HubMock.d.ts.map +1 -1
- package/lib/esm/internal/HubMock.js +7 -0
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/NoLocks.d.ts.map +1 -1
- package/lib/esm/internal/NoLocks.js +6 -0
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.d.ts +12 -0
- package/lib/esm/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js +286 -5
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.d.ts +4 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +4 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.d.ts +3 -2
- package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
- package/lib/esm/internal/annotations/fields.js +7 -6
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +18 -3
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.js +52 -246
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +0 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +71 -41
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.d.ts +20 -19
- package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.js +111 -96
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js +56 -2
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts +23 -23
- package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
- package/lib/esm/test/IModelTestUtils.js +466 -449
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js +112 -0
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js +2 -2
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js +27 -18
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.d.ts.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js +11 -7
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestEditTxn.d.ts +8 -0
- package/lib/esm/test/TestEditTxn.d.ts.map +1 -0
- package/lib/esm/test/TestEditTxn.js +34 -0
- package/lib/esm/test/TestEditTxn.js.map +1 -0
- package/lib/esm/test/TestUtils.d.ts +1 -0
- package/lib/esm/test/TestUtils.d.ts.map +1 -1
- package/lib/esm/test/TestUtils.js +8 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +82 -90
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +156 -99
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js +5 -3
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js +63 -3
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js +88 -5
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +3 -2
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +2 -2
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +0 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +17 -14
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js +2 -2
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +30 -28
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js +159 -143
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +68 -60
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.d.ts.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js +51 -43
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +37 -38
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js +2 -2
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js +40 -38
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +10 -9
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js +5 -2
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js +43 -11
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js +2 -2
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js +87 -73
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +164 -125
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js +2 -4
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +313 -247
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +322 -247
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.js +31 -31
- package/lib/esm/test/imodel/Code.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js +57 -48
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +419 -344
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js +2 -2
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.d.ts.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js +2 -2
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
- package/lib/esm/test/index.d.ts +1 -0
- package/lib/esm/test/index.d.ts.map +1 -1
- package/lib/esm/test/index.js +1 -0
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +23 -22
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js +36 -34
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js +114 -94
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +2 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js +207 -192
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.d.ts +1 -3
- package/lib/esm/test/sheetindex/SheetIndex.test.d.ts.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js +312 -247
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +101 -82
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +114 -85
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js +43 -40
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js +4 -3
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/EditTxn.test.d.ts +2 -0
- package/lib/esm/test/standalone/EditTxn.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/EditTxn.test.js +219 -0
- package/lib/esm/test/standalone/EditTxn.test.js.map +1 -0
- package/lib/esm/test/standalone/ElementMesh.test.js +16 -13
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +26 -20
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js +11 -15
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js +212 -165
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js +31 -25
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js +11 -8
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.d.ts +2 -2
- package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +184 -142
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/ITwinWorkspace.test.d.ts +2 -0
- package/lib/esm/test/standalone/ITwinWorkspace.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/ITwinWorkspace.test.js +236 -0
- package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -0
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js +25 -22
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js +20 -18
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.d.ts +2 -2
- package/lib/esm/test/standalone/MergeConflict.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js +49 -33
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js +5 -5
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js +3 -2
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js +7 -7
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js +928 -22
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js +26 -4
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js +2 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js +3 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +7 -6
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js +5 -4
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js +5 -3
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js +35 -31
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +700 -653
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js +295 -229
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +72 -22
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.js +28 -456
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
- package/lib/esm/workspace/Settings.d.ts +11 -5
- package/lib/esm/workspace/Settings.d.ts.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.d.ts +20 -99
- package/lib/esm/workspace/SettingsDb.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsDb.js +20 -6
- package/lib/esm/workspace/SettingsDb.js.map +1 -1
- package/lib/esm/workspace/SettingsEditor.d.ts +40 -226
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js +85 -24
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +7 -11
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +14 -0
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +14 -14
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +0 -38
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +0 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +0 -108
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +0 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +0 -14
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +0 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js +0 -40
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +0 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +0 -38
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +0 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.js +0 -104
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +0 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +0 -14
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +0 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.js +0 -36
- package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +0 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { expect } from "chai";
|
|
6
|
+
import * as fs from "fs-extra";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import * as sinon from "sinon";
|
|
9
|
+
import { NativeLibrary } from "@bentley/imodeljs-native";
|
|
10
|
+
import { DbResult, Guid, OpenMode } from "@itwin/core-bentley";
|
|
11
|
+
import { BlobContainer } from "../../BlobContainerService";
|
|
12
|
+
import { IModelHost } from "../../IModelHost";
|
|
13
|
+
import { setOnlineStatus } from "../../internal/OnlineStatus";
|
|
14
|
+
import { WorkspaceSqliteDb } from "../../internal/workspace/WorkspaceSqliteDb";
|
|
15
|
+
import { SettingsPriority } from "../../workspace/Settings";
|
|
16
|
+
import { settingsWorkspaceDbName } from "../../workspace/SettingsDb";
|
|
17
|
+
import { SettingsEditor, settingsResourceName } from "../../workspace/SettingsEditor";
|
|
18
|
+
import { TestUtils } from "../TestUtils";
|
|
19
|
+
describe("ITwin Workspace", () => {
|
|
20
|
+
const opts = { cacheDir: TestUtils.getCacheDir() };
|
|
21
|
+
let savedBlobContainerService;
|
|
22
|
+
function getITwinWorkspaceDir(containerId) {
|
|
23
|
+
return path.join(opts.cacheDir ?? NativeLibrary.defaultCacheDir, "Workspace", containerId);
|
|
24
|
+
}
|
|
25
|
+
function writeSettingsDb(dbFileName, settings, workspaceName) {
|
|
26
|
+
fs.ensureDirSync(path.dirname(dbFileName));
|
|
27
|
+
WorkspaceSqliteDb.createNewDb(dbFileName, { manifest: { workspaceName } });
|
|
28
|
+
const db = new WorkspaceSqliteDb();
|
|
29
|
+
db.openDb(dbFileName, OpenMode.ReadWrite);
|
|
30
|
+
db.withSqliteStatement("INSERT INTO strings(id,value) VALUES(?,?)", (stmt) => {
|
|
31
|
+
stmt.bindString(1, settingsResourceName);
|
|
32
|
+
stmt.bindString(2, JSON.stringify(settings));
|
|
33
|
+
const rc = stmt.step();
|
|
34
|
+
expect(rc).to.equal(DbResult.BE_SQLITE_DONE);
|
|
35
|
+
});
|
|
36
|
+
db.saveChanges();
|
|
37
|
+
db.closeDb();
|
|
38
|
+
}
|
|
39
|
+
function createLocalSettingsDb(containerId, settings) {
|
|
40
|
+
const dbDir = getITwinWorkspaceDir(containerId);
|
|
41
|
+
const dbFileName = path.join(dbDir, "settings-db.itwin-workspace");
|
|
42
|
+
writeSettingsDb(dbFileName, settings, `${containerId} settings`);
|
|
43
|
+
}
|
|
44
|
+
function createSettingsContainerService(iTwinId, containerIds) {
|
|
45
|
+
return {
|
|
46
|
+
create: async () => ({ baseUri: "", containerId: containerIds[0], provider: "azure" }),
|
|
47
|
+
delete: async () => { },
|
|
48
|
+
queryScope: async () => ({ iTwinId }),
|
|
49
|
+
queryMetadata: async () => ({ containerType: "settings", label: "settings" }),
|
|
50
|
+
queryContainersMetadata: async () => containerIds.map((containerId) => ({ containerId, containerType: "settings", label: containerId })),
|
|
51
|
+
updateJson: async () => { },
|
|
52
|
+
requestToken: async ({ containerId }) => ({
|
|
53
|
+
token: "",
|
|
54
|
+
scope: { iTwinId },
|
|
55
|
+
provider: "azure",
|
|
56
|
+
expiration: new Date(Date.now() + 3600000),
|
|
57
|
+
metadata: { containerType: "settings", label: containerId },
|
|
58
|
+
baseUri: "",
|
|
59
|
+
}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
beforeEach(async () => {
|
|
63
|
+
await TestUtils.shutdownBackend();
|
|
64
|
+
savedBlobContainerService = BlobContainer.service;
|
|
65
|
+
setOnlineStatus(true);
|
|
66
|
+
});
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
BlobContainer.service = savedBlobContainerService;
|
|
69
|
+
setOnlineStatus(true);
|
|
70
|
+
sinon.restore();
|
|
71
|
+
});
|
|
72
|
+
after(async () => {
|
|
73
|
+
await TestUtils.startBackend(); // restart normal backend so subsequent test suites aren't left without IModelHost
|
|
74
|
+
});
|
|
75
|
+
it("loads iTwin workspaces from the settings container", async () => {
|
|
76
|
+
const iTwinId = Guid.createValue();
|
|
77
|
+
createLocalSettingsDb("itwin-settings-a", {
|
|
78
|
+
"app/testA": "value-a",
|
|
79
|
+
"app/testB": "value-b",
|
|
80
|
+
});
|
|
81
|
+
BlobContainer.service = createSettingsContainerService(iTwinId, ["itwin-settings-a"]);
|
|
82
|
+
await IModelHost.startup(opts);
|
|
83
|
+
const workspace = await IModelHost.getITwinWorkspace(iTwinId);
|
|
84
|
+
expect(workspace.settings.getString("app/testA")).to.equal("value-a");
|
|
85
|
+
expect(workspace.settings.getString("app/testB")).to.equal("value-b");
|
|
86
|
+
workspace.close();
|
|
87
|
+
});
|
|
88
|
+
it("returns an empty iTwin workspace if no root settings container exists", async () => {
|
|
89
|
+
const iTwinId = Guid.createValue();
|
|
90
|
+
BlobContainer.service = createSettingsContainerService(iTwinId, []);
|
|
91
|
+
await IModelHost.startup(opts);
|
|
92
|
+
const workspace = await IModelHost.getITwinWorkspace(iTwinId);
|
|
93
|
+
expect(workspace.settings.dictionaries.length).to.equal(0);
|
|
94
|
+
expect(workspace.settings.getString("app/testA")).to.be.undefined;
|
|
95
|
+
workspace.close();
|
|
96
|
+
});
|
|
97
|
+
it("fails if multiple iTwin settings containers exist for the same iTwin", async () => {
|
|
98
|
+
const iTwinId = Guid.createValue();
|
|
99
|
+
BlobContainer.service = createSettingsContainerService(iTwinId, ["itwin-settings-a", "itwin-settings-b"]);
|
|
100
|
+
await IModelHost.startup(opts);
|
|
101
|
+
await expect(IModelHost.getITwinWorkspace(iTwinId)).to.be.rejectedWith("Multiple iTwin settings containers were found");
|
|
102
|
+
});
|
|
103
|
+
it("loads iTwin workspace from container props without network calls", async () => {
|
|
104
|
+
const containerId = "itwin-settings-offline";
|
|
105
|
+
createLocalSettingsDb(containerId, { "app/testA": "value-a" });
|
|
106
|
+
const unexpectedNetworkCall = sinon.stub().rejects(new Error("unexpected network call"));
|
|
107
|
+
const queryContainersMetadata = sinon.stub().resolves([]);
|
|
108
|
+
const requestToken = sinon.stub().resolves({
|
|
109
|
+
token: "",
|
|
110
|
+
scope: { iTwinId: Guid.createValue() },
|
|
111
|
+
provider: "azure",
|
|
112
|
+
expiration: new Date(Date.now() + 3600000),
|
|
113
|
+
metadata: { containerType: "settings", label: containerId },
|
|
114
|
+
baseUri: "",
|
|
115
|
+
});
|
|
116
|
+
const networkService = {
|
|
117
|
+
create: unexpectedNetworkCall,
|
|
118
|
+
delete: unexpectedNetworkCall,
|
|
119
|
+
queryScope: unexpectedNetworkCall,
|
|
120
|
+
queryMetadata: unexpectedNetworkCall,
|
|
121
|
+
queryContainersMetadata,
|
|
122
|
+
updateJson: unexpectedNetworkCall,
|
|
123
|
+
requestToken,
|
|
124
|
+
};
|
|
125
|
+
BlobContainer.service = networkService;
|
|
126
|
+
await IModelHost.startup(opts);
|
|
127
|
+
const workspace = await IModelHost.getITwinWorkspace({
|
|
128
|
+
baseUri: "",
|
|
129
|
+
containerId,
|
|
130
|
+
storageType: "azure",
|
|
131
|
+
priority: SettingsPriority.iTwin,
|
|
132
|
+
dbName: settingsWorkspaceDbName,
|
|
133
|
+
includePrerelease: true,
|
|
134
|
+
});
|
|
135
|
+
expect(workspace.settings.getString("app/testA")).to.equal("value-a");
|
|
136
|
+
expect(queryContainersMetadata.called).to.be.false;
|
|
137
|
+
expect(requestToken.called).to.be.false;
|
|
138
|
+
workspace.close();
|
|
139
|
+
});
|
|
140
|
+
it("getITwinWorkspace loads all named dictionaries from the settings container", async () => {
|
|
141
|
+
const iTwinId = Guid.createValue();
|
|
142
|
+
const containerId = "itwin-settings-multi";
|
|
143
|
+
const dbDir = getITwinWorkspaceDir(containerId);
|
|
144
|
+
const dbFileName = path.join(dbDir, "settings-db.itwin-workspace");
|
|
145
|
+
// Create a local SettingsDb with two named dictionary resources
|
|
146
|
+
fs.ensureDirSync(path.dirname(dbFileName));
|
|
147
|
+
WorkspaceSqliteDb.createNewDb(dbFileName, { manifest: { workspaceName: "multi-dict settings" } });
|
|
148
|
+
const db = new WorkspaceSqliteDb();
|
|
149
|
+
db.openDb(dbFileName, OpenMode.ReadWrite);
|
|
150
|
+
db.withSqliteStatement("INSERT INTO strings(id,value) VALUES(?,?)", (stmt) => {
|
|
151
|
+
stmt.bindString(1, "dict-a");
|
|
152
|
+
stmt.bindString(2, JSON.stringify({ "app/testA": "value-a" }));
|
|
153
|
+
expect(stmt.step()).to.equal(DbResult.BE_SQLITE_DONE);
|
|
154
|
+
});
|
|
155
|
+
db.withSqliteStatement("INSERT INTO strings(id,value) VALUES(?,?)", (stmt) => {
|
|
156
|
+
stmt.bindString(1, "dict-b");
|
|
157
|
+
stmt.bindString(2, JSON.stringify({ "app/testB": "value-b" }));
|
|
158
|
+
expect(stmt.step()).to.equal(DbResult.BE_SQLITE_DONE);
|
|
159
|
+
});
|
|
160
|
+
db.saveChanges();
|
|
161
|
+
db.closeDb();
|
|
162
|
+
BlobContainer.service = createSettingsContainerService(iTwinId, [containerId]);
|
|
163
|
+
await IModelHost.startup(opts);
|
|
164
|
+
const workspace = await IModelHost.getITwinWorkspace(iTwinId);
|
|
165
|
+
expect(workspace.settings.getString("app/testA")).to.equal("value-a");
|
|
166
|
+
expect(workspace.settings.getString("app/testB")).to.equal("value-b");
|
|
167
|
+
workspace.close();
|
|
168
|
+
});
|
|
169
|
+
it("saveSettingDictionary saves a named dictionary and closes the editor", async () => {
|
|
170
|
+
const iTwinId = Guid.createValue();
|
|
171
|
+
const updateSettingsResource = sinon.spy();
|
|
172
|
+
const close = sinon.spy();
|
|
173
|
+
const withEditableDb = sinon.stub().callsFake(async (_user, operation) => {
|
|
174
|
+
operation({ updateSettingsResource });
|
|
175
|
+
});
|
|
176
|
+
const constructStub = sinon.stub(SettingsEditor, "constructForITwin").resolves({
|
|
177
|
+
editor: { close },
|
|
178
|
+
container: { withEditableDb },
|
|
179
|
+
});
|
|
180
|
+
await IModelHost.saveSettingDictionary(iTwinId, "myDict", { "app/value": 1, "app/name": "test" });
|
|
181
|
+
expect(constructStub.calledOnceWithExactly(iTwinId)).to.be.true;
|
|
182
|
+
expect(withEditableDb.calledOnce).to.be.true;
|
|
183
|
+
expect(withEditableDb.firstCall.args[0]).to.equal(IModelHost.userMoniker);
|
|
184
|
+
expect(updateSettingsResource.calledOnce).to.be.true;
|
|
185
|
+
expect(updateSettingsResource.firstCall.args[0]).to.deep.equal({ "app/value": 1, "app/name": "test" });
|
|
186
|
+
expect(updateSettingsResource.firstCall.args[1]).to.equal("myDict");
|
|
187
|
+
expect(close.calledOnce).to.be.true;
|
|
188
|
+
});
|
|
189
|
+
it("deleteSettingDictionary is a no-op when no iTwin settings container exists", async () => {
|
|
190
|
+
const iTwinId = Guid.createValue();
|
|
191
|
+
const getEditor = sinon.stub(SettingsEditor, "getForITwin").resolves(undefined);
|
|
192
|
+
const constructStub = sinon.stub(SettingsEditor, "constructForITwin");
|
|
193
|
+
await IModelHost.deleteSettingDictionary(iTwinId, "myDict");
|
|
194
|
+
expect(getEditor.calledOnceWithExactly(iTwinId)).to.be.true;
|
|
195
|
+
expect(constructStub.called).to.be.false;
|
|
196
|
+
});
|
|
197
|
+
it("deleteSettingDictionary removes a named dictionary and closes the editor", async () => {
|
|
198
|
+
const iTwinId = Guid.createValue();
|
|
199
|
+
const removeString = sinon.spy();
|
|
200
|
+
const close = sinon.spy();
|
|
201
|
+
const withEditableDb = sinon.stub().callsFake(async (_user, operation) => {
|
|
202
|
+
operation({ removeString });
|
|
203
|
+
});
|
|
204
|
+
const getEditor = sinon.stub(SettingsEditor, "getForITwin").resolves({
|
|
205
|
+
editor: { close },
|
|
206
|
+
container: { withEditableDb },
|
|
207
|
+
});
|
|
208
|
+
await IModelHost.deleteSettingDictionary(iTwinId, "myDict");
|
|
209
|
+
expect(getEditor.calledOnceWithExactly(iTwinId)).to.be.true;
|
|
210
|
+
expect(withEditableDb.calledOnce).to.be.true;
|
|
211
|
+
expect(withEditableDb.firstCall.args[0]).to.equal(IModelHost.userMoniker);
|
|
212
|
+
expect(removeString.calledOnceWithExactly("myDict")).to.be.true;
|
|
213
|
+
expect(close.calledOnce).to.be.true;
|
|
214
|
+
});
|
|
215
|
+
it("saveSettingDictionary closes editor even on error", async () => {
|
|
216
|
+
const iTwinId = Guid.createValue();
|
|
217
|
+
const close = sinon.spy();
|
|
218
|
+
sinon.stub(SettingsEditor, "constructForITwin").resolves({
|
|
219
|
+
editor: { close },
|
|
220
|
+
container: { withEditableDb: sinon.stub().rejects(new Error("write failed")) },
|
|
221
|
+
});
|
|
222
|
+
await expect(IModelHost.saveSettingDictionary(iTwinId, "x", {})).to.be.rejectedWith("write failed");
|
|
223
|
+
expect(close.calledOnce).to.be.true;
|
|
224
|
+
});
|
|
225
|
+
it("deleteSettingDictionary closes editor even on error", async () => {
|
|
226
|
+
const iTwinId = Guid.createValue();
|
|
227
|
+
const close = sinon.spy();
|
|
228
|
+
sinon.stub(SettingsEditor, "getForITwin").resolves({
|
|
229
|
+
editor: { close },
|
|
230
|
+
container: { withEditableDb: sinon.stub().rejects(new Error("delete failed")) },
|
|
231
|
+
});
|
|
232
|
+
await expect(IModelHost.deleteSettingDictionary(iTwinId, "x")).to.be.rejectedWith("delete failed");
|
|
233
|
+
expect(close.calledOnce).to.be.true;
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=ITwinWorkspace.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ITwinWorkspace.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ITwinWorkspace.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*--------------------------------------------------------------------------------------------*/\n\nimport { expect } from \"chai\";\nimport * as fs from \"fs-extra\";\nimport * as path from \"path\";\nimport * as sinon from \"sinon\";\nimport { NativeLibrary } from \"@bentley/imodeljs-native\";\nimport { DbResult, Guid, OpenMode } from \"@itwin/core-bentley\";\nimport { BlobContainer } from \"../../BlobContainerService\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { setOnlineStatus } from \"../../internal/OnlineStatus\";\nimport { WorkspaceSqliteDb } from \"../../internal/workspace/WorkspaceSqliteDb\";\nimport { SettingsPriority } from \"../../workspace/Settings\";\nimport { settingsWorkspaceDbName } from \"../../workspace/SettingsDb\";\nimport { SettingsEditor, settingsResourceName } from \"../../workspace/SettingsEditor\";\nimport { TestUtils } from \"../TestUtils\";\n\ndescribe(\"ITwin Workspace\", () => {\n const opts = { cacheDir: TestUtils.getCacheDir() };\n let savedBlobContainerService: BlobContainer.ContainerService | undefined;\n\n function getITwinWorkspaceDir(containerId: string): string {\n return path.join(opts.cacheDir ?? NativeLibrary.defaultCacheDir, \"Workspace\", containerId);\n }\n\n function writeSettingsDb(dbFileName: string, settings: Record<string, unknown>, workspaceName: string): void {\n fs.ensureDirSync(path.dirname(dbFileName));\n WorkspaceSqliteDb.createNewDb(dbFileName, { manifest: { workspaceName } });\n\n const db = new WorkspaceSqliteDb();\n db.openDb(dbFileName, OpenMode.ReadWrite);\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, settingsResourceName);\n stmt.bindString(2, JSON.stringify(settings));\n const rc = stmt.step();\n expect(rc).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.saveChanges();\n db.closeDb();\n }\n\n function createLocalSettingsDb(containerId: string, settings: Record<string, unknown>): void {\n const dbDir = getITwinWorkspaceDir(containerId);\n const dbFileName = path.join(dbDir, \"settings-db.itwin-workspace\");\n writeSettingsDb(dbFileName, settings, `${containerId} settings`);\n }\n\n function createSettingsContainerService(iTwinId: string, containerIds: string[]): BlobContainer.ContainerService {\n return {\n create: async () => ({ baseUri: \"\", containerId: containerIds[0], provider: \"azure\" as const }),\n delete: async () => { },\n queryScope: async () => ({ iTwinId }),\n queryMetadata: async () => ({ containerType: \"settings\", label: \"settings\" }),\n queryContainersMetadata: async () => containerIds.map((containerId) => ({ containerId, containerType: \"settings\", label: containerId })),\n updateJson: async () => { },\n requestToken: async ({ containerId }) => ({\n token: \"\",\n scope: { iTwinId },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: containerId },\n baseUri: \"\",\n }),\n };\n }\n\n beforeEach(async () => {\n await TestUtils.shutdownBackend();\n savedBlobContainerService = BlobContainer.service;\n setOnlineStatus(true);\n });\n\n afterEach(() => {\n BlobContainer.service = savedBlobContainerService;\n setOnlineStatus(true);\n sinon.restore();\n });\n\n after(async () => {\n await TestUtils.startBackend(); // restart normal backend so subsequent test suites aren't left without IModelHost\n });\n\n it(\"loads iTwin workspaces from the settings container\", async () => {\n const iTwinId = Guid.createValue();\n createLocalSettingsDb(\"itwin-settings-a\", {\n \"app/testA\": \"value-a\",\n \"app/testB\": \"value-b\",\n });\n BlobContainer.service = createSettingsContainerService(iTwinId, [\"itwin-settings-a\"]);\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(workspace.settings.getString(\"app/testB\")).to.equal(\"value-b\");\n workspace.close();\n });\n\n it(\"returns an empty iTwin workspace if no root settings container exists\", async () => {\n const iTwinId = Guid.createValue();\n BlobContainer.service = createSettingsContainerService(iTwinId, []);\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.dictionaries.length).to.equal(0);\n expect(workspace.settings.getString(\"app/testA\")).to.be.undefined;\n workspace.close();\n });\n\n it(\"fails if multiple iTwin settings containers exist for the same iTwin\", async () => {\n const iTwinId = Guid.createValue();\n BlobContainer.service = createSettingsContainerService(iTwinId, [\"itwin-settings-a\", \"itwin-settings-b\"]);\n\n await IModelHost.startup(opts);\n\n await expect(IModelHost.getITwinWorkspace(iTwinId)).to.be.rejectedWith(\"Multiple iTwin settings containers were found\");\n });\n\n it(\"loads iTwin workspace from container props without network calls\", async () => {\n const containerId = \"itwin-settings-offline\";\n createLocalSettingsDb(containerId, { \"app/testA\": \"value-a\" });\n\n const unexpectedNetworkCall = sinon.stub().rejects(new Error(\"unexpected network call\"));\n const queryContainersMetadata = sinon.stub().resolves([]);\n const requestToken = sinon.stub().resolves({\n token: \"\",\n scope: { iTwinId: Guid.createValue() },\n provider: \"azure\" as const,\n expiration: new Date(Date.now() + 3600000),\n metadata: { containerType: \"settings\", label: containerId },\n baseUri: \"\",\n });\n\n const networkService: BlobContainer.ContainerService = {\n create: unexpectedNetworkCall,\n delete: unexpectedNetworkCall,\n queryScope: unexpectedNetworkCall,\n queryMetadata: unexpectedNetworkCall,\n queryContainersMetadata,\n updateJson: unexpectedNetworkCall,\n requestToken,\n };\n BlobContainer.service = networkService;\n\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace({\n baseUri: \"\",\n containerId,\n storageType: \"azure\",\n priority: SettingsPriority.iTwin,\n dbName: settingsWorkspaceDbName,\n includePrerelease: true,\n });\n\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(queryContainersMetadata.called).to.be.false;\n expect(requestToken.called).to.be.false;\n workspace.close();\n });\n\n it(\"getITwinWorkspace loads all named dictionaries from the settings container\", async () => {\n const iTwinId = Guid.createValue();\n const containerId = \"itwin-settings-multi\";\n const dbDir = getITwinWorkspaceDir(containerId);\n const dbFileName = path.join(dbDir, \"settings-db.itwin-workspace\");\n\n // Create a local SettingsDb with two named dictionary resources\n fs.ensureDirSync(path.dirname(dbFileName));\n WorkspaceSqliteDb.createNewDb(dbFileName, { manifest: { workspaceName: \"multi-dict settings\" } });\n const db = new WorkspaceSqliteDb();\n db.openDb(dbFileName, OpenMode.ReadWrite);\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, \"dict-a\");\n stmt.bindString(2, JSON.stringify({ \"app/testA\": \"value-a\" }));\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.withSqliteStatement(\"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => {\n stmt.bindString(1, \"dict-b\");\n stmt.bindString(2, JSON.stringify({ \"app/testB\": \"value-b\" }));\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_DONE);\n });\n db.saveChanges();\n db.closeDb();\n\n BlobContainer.service = createSettingsContainerService(iTwinId, [containerId]);\n await IModelHost.startup(opts);\n\n const workspace = await IModelHost.getITwinWorkspace(iTwinId);\n expect(workspace.settings.getString(\"app/testA\")).to.equal(\"value-a\");\n expect(workspace.settings.getString(\"app/testB\")).to.equal(\"value-b\");\n workspace.close();\n });\n\n it(\"saveSettingDictionary saves a named dictionary and closes the editor\", async () => {\n const iTwinId = Guid.createValue();\n const updateSettingsResource = sinon.spy();\n const close = sinon.spy();\n\n const withEditableDb = sinon.stub().callsFake(async (_user: string, operation: (db: any) => void) => {\n operation({ updateSettingsResource });\n });\n const constructStub = sinon.stub(SettingsEditor, \"constructForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb } as any,\n });\n\n await IModelHost.saveSettingDictionary(iTwinId, \"myDict\", { \"app/value\": 1, \"app/name\": \"test\" });\n\n expect(constructStub.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(withEditableDb.calledOnce).to.be.true;\n expect(withEditableDb.firstCall.args[0]).to.equal(IModelHost.userMoniker);\n expect(updateSettingsResource.calledOnce).to.be.true;\n expect(updateSettingsResource.firstCall.args[0]).to.deep.equal({ \"app/value\": 1, \"app/name\": \"test\" });\n expect(updateSettingsResource.firstCall.args[1]).to.equal(\"myDict\");\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"deleteSettingDictionary is a no-op when no iTwin settings container exists\", async () => {\n const iTwinId = Guid.createValue();\n const getEditor = sinon.stub(SettingsEditor, \"getForITwin\").resolves(undefined);\n const constructStub = sinon.stub(SettingsEditor, \"constructForITwin\");\n\n await IModelHost.deleteSettingDictionary(iTwinId, \"myDict\");\n\n expect(getEditor.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(constructStub.called).to.be.false;\n });\n\n it(\"deleteSettingDictionary removes a named dictionary and closes the editor\", async () => {\n const iTwinId = Guid.createValue();\n const removeString = sinon.spy();\n const close = sinon.spy();\n\n const withEditableDb = sinon.stub().callsFake(async (_user: string, operation: (db: any) => void) => {\n operation({ removeString });\n });\n const getEditor = sinon.stub(SettingsEditor, \"getForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb } as any,\n });\n\n await IModelHost.deleteSettingDictionary(iTwinId, \"myDict\");\n\n expect(getEditor.calledOnceWithExactly(iTwinId)).to.be.true;\n expect(withEditableDb.calledOnce).to.be.true;\n expect(withEditableDb.firstCall.args[0]).to.equal(IModelHost.userMoniker);\n expect(removeString.calledOnceWithExactly(\"myDict\")).to.be.true;\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"saveSettingDictionary closes editor even on error\", async () => {\n const iTwinId = Guid.createValue();\n const close = sinon.spy();\n sinon.stub(SettingsEditor, \"constructForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb: sinon.stub().rejects(new Error(\"write failed\")) } as any,\n });\n\n await expect(IModelHost.saveSettingDictionary(iTwinId, \"x\", {})).to.be.rejectedWith(\"write failed\");\n expect(close.calledOnce).to.be.true;\n });\n\n it(\"deleteSettingDictionary closes editor even on error\", async () => {\n const iTwinId = Guid.createValue();\n const close = sinon.spy();\n sinon.stub(SettingsEditor, \"getForITwin\").resolves({\n editor: { close } as any,\n container: { withEditableDb: sinon.stub().rejects(new Error(\"delete failed\")) } as any,\n });\n\n await expect(IModelHost.deleteSettingDictionary(iTwinId, \"x\")).to.be.rejectedWith(\"delete failed\");\n expect(close.calledOnce).to.be.true;\n });\n});\n"]}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { expect } from "chai";
|
|
6
6
|
import { Guid, Id64 } from "@itwin/core-bentley";
|
|
7
7
|
import { LineString3d, Loop, Point3d } from "@itwin/core-geometry";
|
|
8
|
+
import { withEditTxn } from "../../EditTxn";
|
|
8
9
|
import { AreaPattern, Code, ColorDef, GeometryParams, GeometryStreamBuilder, GeometryStreamIterator, IModel, } from "@itwin/core-common";
|
|
9
10
|
import { _nativeDb, GenericSchema, GeometricElement3d, GeometryPart, PhysicalModel, PhysicalObject, PhysicalPartition, RenderMaterialElement, SnapshotDb, SpatialCategory, SubCategory, SubjectOwnsPartitionElements, } from "../../core-backend";
|
|
10
11
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
@@ -91,27 +92,29 @@ describe("DgnDb.inlineGeometryPartReferences", () => {
|
|
|
91
92
|
rootSubject: { name: "InlineGeomParts", description: "InlineGeomParts" },
|
|
92
93
|
});
|
|
93
94
|
GenericSchema.registerSchema();
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
withEditTxn(imodel, (txn) => {
|
|
96
|
+
const partitionId = txn.insertElement({
|
|
97
|
+
classFullName: PhysicalPartition.classFullName,
|
|
98
|
+
model: IModel.repositoryModelId,
|
|
99
|
+
parent: new SubjectOwnsPartitionElements(IModel.rootSubjectId),
|
|
100
|
+
code: PhysicalPartition.createCode(imodel, IModel.rootSubjectId, `PhysicalPartition_${Guid.createValue()}`),
|
|
101
|
+
});
|
|
102
|
+
expect(Id64.isValidId64(partitionId)).to.be.true;
|
|
103
|
+
const model = imodel.models.createModel({
|
|
104
|
+
classFullName: PhysicalModel.classFullName,
|
|
105
|
+
modeledElement: { id: partitionId },
|
|
106
|
+
});
|
|
107
|
+
expect(model).instanceOf(PhysicalModel);
|
|
108
|
+
modelId = txn.insertModel(model.toJSON());
|
|
109
|
+
expect(Id64.isValidId64(modelId)).to.be.true;
|
|
110
|
+
categoryId = SpatialCategory.insert(txn, IModel.dictionaryId, "ctgry", { color: ColorDef.blue.toJSON() });
|
|
111
|
+
expect(Id64.isValidId64(categoryId)).to.be.true;
|
|
112
|
+
blueSubCategoryId = IModel.getDefaultSubCategoryId(categoryId);
|
|
113
|
+
redSubCategoryId = SubCategory.insert(txn, categoryId, "red", { color: ColorDef.red.toJSON() });
|
|
114
|
+
expect(Id64.isValidId64(redSubCategoryId)).to.be.true;
|
|
115
|
+
materialId = RenderMaterialElement.insert(txn, IModel.dictionaryId, "mat", { paletteName: "pal" });
|
|
116
|
+
expect(Id64.isValidId64(materialId)).to.be.true;
|
|
99
117
|
});
|
|
100
|
-
expect(Id64.isValidId64(partitionId)).to.be.true;
|
|
101
|
-
const model = imodel.models.createModel({
|
|
102
|
-
classFullName: PhysicalModel.classFullName,
|
|
103
|
-
modeledElement: { id: partitionId },
|
|
104
|
-
});
|
|
105
|
-
expect(model).instanceOf(PhysicalModel);
|
|
106
|
-
modelId = imodel.models.insertModel(model.toJSON());
|
|
107
|
-
expect(Id64.isValidId64(modelId)).to.be.true;
|
|
108
|
-
categoryId = SpatialCategory.insert(imodel, IModel.dictionaryId, "ctgry", { color: ColorDef.blue.toJSON() });
|
|
109
|
-
expect(Id64.isValidId64(categoryId)).to.be.true;
|
|
110
|
-
blueSubCategoryId = IModel.getDefaultSubCategoryId(categoryId);
|
|
111
|
-
redSubCategoryId = SubCategory.insert(imodel, categoryId, "red", { color: ColorDef.red.toJSON() });
|
|
112
|
-
expect(Id64.isValidId64(redSubCategoryId)).to.be.true;
|
|
113
|
-
materialId = RenderMaterialElement.insert(imodel, IModel.dictionaryId, "mat", { paletteName: "pal" });
|
|
114
|
-
expect(Id64.isValidId64(materialId)).to.be.true;
|
|
115
118
|
});
|
|
116
119
|
afterEach(() => {
|
|
117
120
|
imodel.close();
|
|
@@ -126,7 +129,7 @@ describe("DgnDb.inlineGeometryPartReferences", () => {
|
|
|
126
129
|
code: GeometryPart.createCode(imodel, IModel.dictionaryId, Guid.createValue()),
|
|
127
130
|
geom: writer.builder.geometryStream,
|
|
128
131
|
};
|
|
129
|
-
const partId = imodel.
|
|
132
|
+
const partId = withEditTxn(imodel, (txn) => txn.insertElement(props));
|
|
130
133
|
expect(Id64.isValidId64(partId)).to.be.true;
|
|
131
134
|
return partId;
|
|
132
135
|
}
|
|
@@ -147,7 +150,7 @@ describe("DgnDb.inlineGeometryPartReferences", () => {
|
|
|
147
150
|
angles: {},
|
|
148
151
|
},
|
|
149
152
|
};
|
|
150
|
-
const elemId = imodel.
|
|
153
|
+
const elemId = withEditTxn(imodel, (txn) => txn.insertElement(props));
|
|
151
154
|
expect(Id64.isValidId64(elemId)).to.be.true;
|
|
152
155
|
return elemId;
|
|
153
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InlineGeometryPartReferences.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/InlineGeometryPartReferences.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 { expect } from \"chai\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { LineString3d, Loop, Point3d } from \"@itwin/core-geometry\";\nimport {\n AreaPattern,\n Code, ColorDef, GeometricElement3dProps, GeometryParams, GeometryPartProps, GeometryStreamBuilder, GeometryStreamIterator, IModel,\n} from \"@itwin/core-common\";\nimport {\n _nativeDb, GenericSchema, GeometricElement3d, GeometryPart, PhysicalModel, PhysicalObject, PhysicalPartition, RenderMaterialElement, SnapshotDb, SpatialCategory, SubCategory, SubjectOwnsPartitionElements,\n} from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\n// The only geometry in our geometry streams will be squares of 1 meter in x and y, with origin at (pos, 0, 0).\ninterface Primitive { pos: number }\n\ninterface PartRef {\n partId: string;\n origin?: number; // origin in X. y and z are zero.\n}\n\ninterface Symbology {\n categoryId?: string;\n subCategoryId?: string;\n color?: ColorDef;\n materialId?: string;\n patternOrigin?: number;\n}\n\nfunction makeGeomParams(symb: Symbology): GeometryParams {\n const params = new GeometryParams(symb.categoryId ?? Id64.invalid, symb.subCategoryId);\n params.lineColor = symb.color;\n params.materialId = symb.materialId;\n if (symb.patternOrigin)\n params.pattern = AreaPattern.Params.fromJSON({ origin: [symb.patternOrigin, 0, 0] });\n\n return params;\n}\n\ninterface AppendSubRanges { appendSubRanges: true }\n\ntype UnionMember<T, U> = T & { [k in keyof U]?: never };\n\ntype GeomWriterEntry =\n UnionMember<PartRef, Symbology & Primitive & AppendSubRanges> |\n UnionMember<Symbology, PartRef & Primitive & AppendSubRanges> |\n UnionMember<Primitive, PartRef & Symbology & AppendSubRanges> |\n UnionMember<AppendSubRanges, Symbology & Primitive & PartRef>;\n\nclass GeomWriter {\n public readonly builder: GeometryStreamBuilder;\n\n public constructor(symbology?: Symbology) {\n this.builder = new GeometryStreamBuilder();\n if (symbology)\n this.append(symbology);\n }\n\n public append(entry: GeomWriterEntry): void {\n if (entry.partId)\n this.builder.appendGeometryPart3d(entry.partId, new Point3d(entry.origin, 0, 0));\n else if (entry.subCategoryId || entry.categoryId || entry.color || entry.materialId || entry.patternOrigin)\n this.builder.appendGeometryParamsChange(makeGeomParams(entry));\n else if (undefined !== entry.pos)\n this.builder.appendGeometry(Loop.createPolygon([new Point3d(entry.pos, 0, 0), new Point3d(entry.pos + 1, 0, 0), new Point3d(entry.pos + 1, 1, 0), new Point3d(entry.pos, 1, 0)]));\n else if (undefined !== entry.appendSubRanges)\n this.builder.appendGeometryRanges();\n }\n}\n\n// SubGraphicRange where x dimension is 1 meter and y and z are empty.\ninterface SubRange { low: number }\n\ntype GeomStreamEntry =\n UnionMember<PartRef, Symbology & SubRange & Primitive> |\n UnionMember<Symbology, PartRef & SubRange & Primitive> |\n UnionMember<SubRange, PartRef & Symbology & Primitive> |\n UnionMember<Primitive, PartRef & Symbology & SubRange>;\n\nfunction readGeomStream(iter: GeometryStreamIterator): GeomStreamEntry[] & { viewIndependent: boolean } {\n const result: GeomStreamEntry[] = [];\n for (const entry of iter) {\n const symb: Symbology = { categoryId: entry.geomParams.categoryId, subCategoryId: entry.geomParams.subCategoryId };\n\n if (undefined !== entry.geomParams.lineColor)\n symb.color = entry.geomParams.lineColor;\n\n if (undefined !== entry.geomParams.materialId)\n symb.materialId = entry.geomParams.materialId;\n\n if (entry.geomParams.pattern) {\n expect(entry.geomParams.pattern.origin).not.to.be.undefined;\n symb.patternOrigin = entry.geomParams.pattern.origin!.x;\n }\n\n result.push(symb);\n\n if (entry.localRange) {\n expect(entry.localRange.low.y).to.equal(0);\n expect(entry.localRange.low.z).to.equal(0);\n expect(entry.localRange.high.y).to.equal(1);\n expect(entry.localRange.high.z).to.equal(0);\n expect(entry.localRange.high.x - entry.localRange.low.x).to.equal(1);\n\n result.push({ low: entry.localRange.low.x });\n }\n\n if (entry.primitive.type === \"geometryQuery\") {\n expect(entry.primitive.geometry.geometryCategory).to.equal(\"curveCollection\");\n if (entry.primitive.geometry.geometryCategory === \"curveCollection\") {\n expect(entry.primitive.geometry.children.length).to.equal(1);\n expect(entry.primitive.geometry.children[0]).instanceOf(LineString3d);\n\n const pts = (entry.primitive.geometry.children[0] as LineString3d).points;\n expect(pts.length).to.equal(5);\n expect(pts[1].x).to.equal(pts[0].x + 1);\n\n result.push({ pos: pts[0].x });\n }\n } else {\n expect(entry.primitive.type).to.equal(\"partReference\");\n if (entry.primitive.type === \"partReference\") {\n const partRef: PartRef = { partId: entry.primitive.part.id };\n if (entry.primitive.part.toLocal)\n partRef.origin = entry.primitive.part.toLocal.origin.x;\n\n result.push(partRef);\n }\n }\n }\n\n (result as any).viewIndependent = iter.isViewIndependent;\n return result as GeomStreamEntry[] & { viewIndependent: boolean };\n}\n\ndescribe(\"DgnDb.inlineGeometryPartReferences\", () => {\n let imodel: SnapshotDb;\n let modelId: string;\n let categoryId: string;\n let blueSubCategoryId: string;\n let redSubCategoryId: string;\n let materialId: string;\n\n beforeEach(() => {\n imodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"InlineGeomParts\", `${Guid.createValue()}.bim`), {\n rootSubject: { name: \"InlineGeomParts\", description: \"InlineGeomParts\" },\n });\n\n GenericSchema.registerSchema();\n const partitionId = imodel.elements.insertElement({\n classFullName: PhysicalPartition.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsPartitionElements(IModel.rootSubjectId),\n code: PhysicalPartition.createCode(imodel, IModel.rootSubjectId, `PhysicalPartition_${Guid.createValue()}`),\n });\n\n expect(Id64.isValidId64(partitionId)).to.be.true;\n const model = imodel.models.createModel({\n classFullName: PhysicalModel.classFullName,\n modeledElement: { id: partitionId },\n });\n\n expect(model).instanceOf(PhysicalModel);\n\n modelId = imodel.models.insertModel(model.toJSON());\n expect(Id64.isValidId64(modelId)).to.be.true;\n\n categoryId = SpatialCategory.insert(imodel, IModel.dictionaryId, \"ctgry\", { color: ColorDef.blue.toJSON() });\n expect(Id64.isValidId64(categoryId)).to.be.true;\n blueSubCategoryId = IModel.getDefaultSubCategoryId(categoryId);\n redSubCategoryId = SubCategory.insert(imodel, categoryId, \"red\", { color: ColorDef.red.toJSON() });\n expect(Id64.isValidId64(redSubCategoryId)).to.be.true;\n\n materialId = RenderMaterialElement.insert(imodel, IModel.dictionaryId, \"mat\", { paletteName: \"pal\" });\n expect(Id64.isValidId64(materialId)).to.be.true;\n });\n\n afterEach(() => {\n imodel.close();\n });\n\n function insertGeometryPart(geom: GeomWriterEntry[]): string {\n const writer = new GeomWriter();\n for (const entry of geom)\n writer.append(entry);\n\n const props: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: GeometryPart.createCode(imodel, IModel.dictionaryId, Guid.createValue()),\n geom: writer.builder.geometryStream,\n };\n\n const partId = imodel.elements.insertElement(props);\n expect(Id64.isValidId64(partId)).to.be.true;\n return partId;\n }\n\n function insertElement(geom: GeomWriterEntry[], viewIndependent = false): string {\n const writer = new GeomWriter({ categoryId });\n if (viewIndependent)\n writer.builder.isViewIndependent = true;\n\n for (const entry of geom)\n writer.append(entry);\n\n const props: GeometricElement3dProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId,\n code: Code.createEmpty(),\n category: categoryId,\n geom: writer.builder.geometryStream,\n placement: {\n origin: [0, 0, 0],\n angles: { },\n },\n };\n\n const elemId = imodel.elements.insertElement(props);\n expect(Id64.isValidId64(elemId)).to.be.true;\n return elemId;\n }\n\n function readElementGeom(id: string): GeomStreamEntry[] & { viewIndependent: boolean } {\n let iter;\n const elem = imodel.elements.getElement({ id, wantGeometry: true });\n if (elem instanceof GeometryPart) {\n iter = GeometryStreamIterator.fromGeometryPart(elem);\n } else {\n expect(elem).instanceOf(GeometricElement3d);\n iter = GeometryStreamIterator.fromGeometricElement3d(elem as GeometricElement3d);\n }\n\n return readGeomStream(iter);\n }\n\n function expectGeom(actual: GeomStreamEntry[], expected: GeomStreamEntry[]): void {\n expect(actual).to.deep.equal(expected);\n }\n\n function inlinePartRefs(): number {\n const result = imodel[_nativeDb].inlineGeometryPartReferences();\n expect(result.numCandidateParts).to.equal(result.numPartsDeleted);\n expect(result.numRefsInlined).to.equal(result.numCandidateParts);\n return result.numRefsInlined;\n }\n\n it(\"inlines and deletes a simple unique part reference\", () => {\n // Create single reference to a part and perform sanity checks on our geometry validation code.\n const partId = insertGeometryPart([{ pos: 123 }]);\n expectGeom(readElementGeom(partId), [\n { categoryId: \"0\", subCategoryId: \"0\" },\n { pos: 123 },\n ]);\n\n const elemId = insertElement([{ partId }]);\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { partId },\n ]);\n\n // Inline and delete the part.\n expect(inlinePartRefs()).to.equal(1);\n expect(imodel.elements.tryGetElement(partId)).to.be.undefined;\n\n const geom = readElementGeom(elemId);\n expect(geom.viewIndependent).to.be.false;\n expectGeom(geom, [\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 123 },\n { pos: 123 },\n ]);\n });\n\n it(\"inlines and deletes unique parts, ignoring non-unique parts\", () => {\n const part1 = insertGeometryPart([{ pos: 1 }]);\n const part2 = insertGeometryPart([{ pos: 2 }]);\n const part3 = insertGeometryPart([{ pos: 3 }]);\n const part4 = insertGeometryPart([{ pos: 4 }]);\n\n const elem1 = insertElement([{ partId: part1 }]);\n const elem2 = insertElement([{ partId: part2 }, { partId: part3 }]);\n const elem3 = insertElement([{ partId: part3 }]);\n const elem4 = insertElement([{ partId: part4 }]);\n const elem5 = insertElement([{ partId: part4 }]);\n\n expect(inlinePartRefs()).to.equal(2);\n\n const symb = { categoryId, subCategoryId: blueSubCategoryId };\n expectGeom(readElementGeom(elem1), [symb, { low: 1 }, { pos: 1 }]);\n expectGeom(readElementGeom(elem2), [symb, { low: 2 }, { pos: 2 }, symb, { partId: part3 }]);\n expectGeom(readElementGeom(elem3), [symb, { partId: part3 }]);\n expectGeom(readElementGeom(elem4), [symb, { partId: part4 }]);\n expectGeom(readElementGeom(elem5), [symb, { partId: part4 }]);\n });\n\n it(\"applies part transform\", () => {\n const partId = insertGeometryPart([{ pos: -8 }]);\n const elemId = insertElement([{ partId, origin: 50 }]);\n expect(inlinePartRefs()).to.equal(1);\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 42 },\n { pos: 42 },\n ]);\n });\n\n it(\"applies element symbology to part and resets element symbology after embedding part\", () => {\n const part1 = insertGeometryPart([\n { pos: 1 },\n { color: ColorDef.green },\n { pos: 1.5},\n ]);\n\n const part2 = insertGeometryPart([\n { pos: 2 },\n { materialId },\n { pos: 2.5 },\n ]);\n\n // Sanity check.\n expectGeom(readElementGeom(part2), [\n { categoryId: \"0\", subCategoryId: \"0\" },\n { pos: 2 },\n { categoryId: \"0\", subCategoryId: \"0\", materialId },\n { pos: 2.5 },\n ]);\n\n const part3 = insertGeometryPart([\n { pos: 3 },\n { materialId: \"0\" },\n { pos: 3.5 },\n ]);\n\n const elemId = insertElement([\n { pos: -1 },\n { subCategoryId: redSubCategoryId },\n { partId: part1 },\n { pos: -2 },\n { color: ColorDef.black },\n { partId: part2 },\n { pos: -3 },\n { materialId, color: ColorDef.white },\n { partId: part3 },\n { pos: -4 },\n ]);\n\n expect(inlinePartRefs()).to.equal(3);\n\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { pos: -1 },\n { categoryId, subCategoryId: redSubCategoryId },\n { low: 1},\n { pos: 1 },\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.green },\n { low: 1.5 },\n { pos: 1.5 },\n { categoryId, subCategoryId: redSubCategoryId },\n { low: -2 },\n { pos: -2 },\n\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.black },\n { low: 2 },\n { pos: 2 },\n { categoryId, subCategoryId: redSubCategoryId, materialId },\n { low: 2.5 },\n { pos: 2.5 },\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.black },\n { low: -3 },\n { pos: -3 },\n\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.white, materialId },\n { low: 3 },\n { pos: 3 },\n { categoryId, subCategoryId: redSubCategoryId, materialId: \"0\" },\n { low: 3.5 },\n { pos: 3.5 },\n {categoryId, subCategoryId: redSubCategoryId, color: ColorDef.white, materialId },\n { low: -4 },\n { pos: -4 },\n ]);\n });\n\n it(\"inserts subgraphic ranges for parts\", () => {\n const part1 = insertGeometryPart([{ pos: 1 }]);\n const part2 = insertGeometryPart([{ pos: 2 }]);\n const elem = insertElement([\n { pos: -1 },\n { partId: part1 },\n { partId: part2, origin: 5 },\n ]);\n\n expect(inlinePartRefs()).to.equal(2);\n\n expectGeom(readElementGeom(elem), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 1 },\n { pos: 1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 7 },\n { pos: 7 },\n ]);\n });\n\n it(\"preserves existing subgraphic ranges\", () => {\n const partId = insertGeometryPart([{ pos: 0 }]);\n const elem = insertElement([\n { appendSubRanges: true },\n { pos: -1 },\n { partId },\n { pos: 1 },\n ]);\n\n expectGeom(readElementGeom(elem), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: -1 },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { partId },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 1 },\n { pos: 1 },\n ]);\n\n expect(inlinePartRefs()).to.equal(1);\n\n expectGeom(readElementGeom(elem), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: -1 },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 0 },\n { pos: 0 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 1 },\n { pos: 1 },\n ]);\n });\n\n it(\"inserts subgraphic ranges geometry following part\", () => {\n const partId = insertGeometryPart([{ pos: 1 }]);\n const elem = insertElement([\n { pos: 0 },\n { partId },\n { pos: 2 },\n ]);\n\n expect(inlinePartRefs()).to.equal(1);\n\n expectGeom(readElementGeom(elem), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { pos: 0 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 1 },\n { pos: 1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 2 },\n { pos: 2 },\n ]);\n });\n\n it(\"applies transform to patterns\", () => {\n const part1 = insertGeometryPart([{ pos: 1 }]);\n const part2 = insertGeometryPart([{ patternOrigin: 123 }, { pos: 2 }]);\n\n expectGeom(readElementGeom(part2), [\n { categoryId: \"0\", subCategoryId: \"0\", patternOrigin: 123 },\n { pos: 2 },\n ]);\n\n const elemId = insertElement([\n { patternOrigin: 456 },\n { pos: -1 },\n { partId: part1, origin: 8 },\n { pos: -2 },\n { partId: part2, origin: 12 },\n { pos: -3 },\n ]);\n\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { partId: part1, origin: 8 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { pos: -2 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { partId: part2, origin: 12 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { pos: -3 },\n ]);\n\n expect(inlinePartRefs()).to.equal(2);\n\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { low: 1 + 8 },\n { pos: 1 + 8 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { low: -2 },\n { pos: -2 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 123 + 12 },\n { low: 2 + 12 },\n { pos: 2 + 12 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { low: -3 },\n { pos: -3 },\n ]);\n });\n\n it(\"preserves element header flags\", () => {\n const partId = insertGeometryPart([{ pos: 1 }]);\n const elemId = insertElement([{ partId }], true);\n expect(readElementGeom(elemId).viewIndependent).to.be.true;\n\n expect(inlinePartRefs()).to.equal(1);\n expect(readElementGeom(elemId).viewIndependent).to.be.true;\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"InlineGeometryPartReferences.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/InlineGeometryPartReferences.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 { expect } from \"chai\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { LineString3d, Loop, Point3d } from \"@itwin/core-geometry\";\nimport { withEditTxn } from \"../../EditTxn\";\nimport {\n AreaPattern,\n Code, ColorDef, GeometricElement3dProps, GeometryParams, GeometryPartProps, GeometryStreamBuilder, GeometryStreamIterator, IModel,\n} from \"@itwin/core-common\";\nimport {\n _nativeDb, GenericSchema, GeometricElement3d, GeometryPart, PhysicalModel, PhysicalObject, PhysicalPartition, RenderMaterialElement, SnapshotDb, SpatialCategory, SubCategory, SubjectOwnsPartitionElements,\n} from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\n// The only geometry in our geometry streams will be squares of 1 meter in x and y, with origin at (pos, 0, 0).\ninterface Primitive { pos: number }\n\ninterface PartRef {\n partId: string;\n origin?: number; // origin in X. y and z are zero.\n}\n\ninterface Symbology {\n categoryId?: string;\n subCategoryId?: string;\n color?: ColorDef;\n materialId?: string;\n patternOrigin?: number;\n}\n\nfunction makeGeomParams(symb: Symbology): GeometryParams {\n const params = new GeometryParams(symb.categoryId ?? Id64.invalid, symb.subCategoryId);\n params.lineColor = symb.color;\n params.materialId = symb.materialId;\n if (symb.patternOrigin)\n params.pattern = AreaPattern.Params.fromJSON({ origin: [symb.patternOrigin, 0, 0] });\n\n return params;\n}\n\ninterface AppendSubRanges { appendSubRanges: true }\n\ntype UnionMember<T, U> = T & { [k in keyof U]?: never };\n\ntype GeomWriterEntry =\n UnionMember<PartRef, Symbology & Primitive & AppendSubRanges> |\n UnionMember<Symbology, PartRef & Primitive & AppendSubRanges> |\n UnionMember<Primitive, PartRef & Symbology & AppendSubRanges> |\n UnionMember<AppendSubRanges, Symbology & Primitive & PartRef>;\n\nclass GeomWriter {\n public readonly builder: GeometryStreamBuilder;\n\n public constructor(symbology?: Symbology) {\n this.builder = new GeometryStreamBuilder();\n if (symbology)\n this.append(symbology);\n }\n\n public append(entry: GeomWriterEntry): void {\n if (entry.partId)\n this.builder.appendGeometryPart3d(entry.partId, new Point3d(entry.origin, 0, 0));\n else if (entry.subCategoryId || entry.categoryId || entry.color || entry.materialId || entry.patternOrigin)\n this.builder.appendGeometryParamsChange(makeGeomParams(entry));\n else if (undefined !== entry.pos)\n this.builder.appendGeometry(Loop.createPolygon([new Point3d(entry.pos, 0, 0), new Point3d(entry.pos + 1, 0, 0), new Point3d(entry.pos + 1, 1, 0), new Point3d(entry.pos, 1, 0)]));\n else if (undefined !== entry.appendSubRanges)\n this.builder.appendGeometryRanges();\n }\n}\n\n// SubGraphicRange where x dimension is 1 meter and y and z are empty.\ninterface SubRange { low: number }\n\ntype GeomStreamEntry =\n UnionMember<PartRef, Symbology & SubRange & Primitive> |\n UnionMember<Symbology, PartRef & SubRange & Primitive> |\n UnionMember<SubRange, PartRef & Symbology & Primitive> |\n UnionMember<Primitive, PartRef & Symbology & SubRange>;\n\nfunction readGeomStream(iter: GeometryStreamIterator): GeomStreamEntry[] & { viewIndependent: boolean } {\n const result: GeomStreamEntry[] = [];\n for (const entry of iter) {\n const symb: Symbology = { categoryId: entry.geomParams.categoryId, subCategoryId: entry.geomParams.subCategoryId };\n\n if (undefined !== entry.geomParams.lineColor)\n symb.color = entry.geomParams.lineColor;\n\n if (undefined !== entry.geomParams.materialId)\n symb.materialId = entry.geomParams.materialId;\n\n if (entry.geomParams.pattern) {\n expect(entry.geomParams.pattern.origin).not.to.be.undefined;\n symb.patternOrigin = entry.geomParams.pattern.origin!.x;\n }\n\n result.push(symb);\n\n if (entry.localRange) {\n expect(entry.localRange.low.y).to.equal(0);\n expect(entry.localRange.low.z).to.equal(0);\n expect(entry.localRange.high.y).to.equal(1);\n expect(entry.localRange.high.z).to.equal(0);\n expect(entry.localRange.high.x - entry.localRange.low.x).to.equal(1);\n\n result.push({ low: entry.localRange.low.x });\n }\n\n if (entry.primitive.type === \"geometryQuery\") {\n expect(entry.primitive.geometry.geometryCategory).to.equal(\"curveCollection\");\n if (entry.primitive.geometry.geometryCategory === \"curveCollection\") {\n expect(entry.primitive.geometry.children.length).to.equal(1);\n expect(entry.primitive.geometry.children[0]).instanceOf(LineString3d);\n\n const pts = (entry.primitive.geometry.children[0] as LineString3d).points;\n expect(pts.length).to.equal(5);\n expect(pts[1].x).to.equal(pts[0].x + 1);\n\n result.push({ pos: pts[0].x });\n }\n } else {\n expect(entry.primitive.type).to.equal(\"partReference\");\n if (entry.primitive.type === \"partReference\") {\n const partRef: PartRef = { partId: entry.primitive.part.id };\n if (entry.primitive.part.toLocal)\n partRef.origin = entry.primitive.part.toLocal.origin.x;\n\n result.push(partRef);\n }\n }\n }\n\n (result as any).viewIndependent = iter.isViewIndependent;\n return result as GeomStreamEntry[] & { viewIndependent: boolean };\n}\n\ndescribe(\"DgnDb.inlineGeometryPartReferences\", () => {\n let imodel: SnapshotDb;\n let modelId: string;\n let categoryId: string;\n let blueSubCategoryId: string;\n let redSubCategoryId: string;\n let materialId: string;\n\n beforeEach(() => {\n imodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"InlineGeomParts\", `${Guid.createValue()}.bim`), {\n rootSubject: { name: \"InlineGeomParts\", description: \"InlineGeomParts\" },\n });\n\n GenericSchema.registerSchema();\n withEditTxn(imodel, (txn) => {\n const partitionId = txn.insertElement({\n classFullName: PhysicalPartition.classFullName,\n model: IModel.repositoryModelId,\n parent: new SubjectOwnsPartitionElements(IModel.rootSubjectId),\n code: PhysicalPartition.createCode(imodel, IModel.rootSubjectId, `PhysicalPartition_${Guid.createValue()}`),\n });\n\n expect(Id64.isValidId64(partitionId)).to.be.true;\n const model = imodel.models.createModel({\n classFullName: PhysicalModel.classFullName,\n modeledElement: { id: partitionId },\n });\n\n expect(model).instanceOf(PhysicalModel);\n\n modelId = txn.insertModel(model.toJSON());\n expect(Id64.isValidId64(modelId)).to.be.true;\n\n categoryId = SpatialCategory.insert(txn, IModel.dictionaryId, \"ctgry\", { color: ColorDef.blue.toJSON() });\n expect(Id64.isValidId64(categoryId)).to.be.true;\n blueSubCategoryId = IModel.getDefaultSubCategoryId(categoryId);\n redSubCategoryId = SubCategory.insert(txn, categoryId, \"red\", { color: ColorDef.red.toJSON() });\n expect(Id64.isValidId64(redSubCategoryId)).to.be.true;\n\n materialId = RenderMaterialElement.insert(txn, IModel.dictionaryId, \"mat\", { paletteName: \"pal\" });\n expect(Id64.isValidId64(materialId)).to.be.true;\n });\n });\n\n afterEach(() => {\n imodel.close();\n });\n\n function insertGeometryPart(geom: GeomWriterEntry[]): string {\n const writer = new GeomWriter();\n for (const entry of geom)\n writer.append(entry);\n\n const props: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: IModel.dictionaryId,\n code: GeometryPart.createCode(imodel, IModel.dictionaryId, Guid.createValue()),\n geom: writer.builder.geometryStream,\n };\n\n const partId = withEditTxn(imodel, (txn) => txn.insertElement(props));\n expect(Id64.isValidId64(partId)).to.be.true;\n return partId;\n }\n\n function insertElement(geom: GeomWriterEntry[], viewIndependent = false): string {\n const writer = new GeomWriter({ categoryId });\n if (viewIndependent)\n writer.builder.isViewIndependent = true;\n\n for (const entry of geom)\n writer.append(entry);\n\n const props: GeometricElement3dProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId,\n code: Code.createEmpty(),\n category: categoryId,\n geom: writer.builder.geometryStream,\n placement: {\n origin: [0, 0, 0],\n angles: {},\n },\n };\n\n const elemId = withEditTxn(imodel, (txn) => txn.insertElement(props));\n expect(Id64.isValidId64(elemId)).to.be.true;\n return elemId;\n }\n\n function readElementGeom(id: string): GeomStreamEntry[] & { viewIndependent: boolean } {\n let iter;\n const elem = imodel.elements.getElement({ id, wantGeometry: true });\n if (elem instanceof GeometryPart) {\n iter = GeometryStreamIterator.fromGeometryPart(elem);\n } else {\n expect(elem).instanceOf(GeometricElement3d);\n iter = GeometryStreamIterator.fromGeometricElement3d(elem as GeometricElement3d);\n }\n\n return readGeomStream(iter);\n }\n\n function expectGeom(actual: GeomStreamEntry[], expected: GeomStreamEntry[]): void {\n expect(actual).to.deep.equal(expected);\n }\n\n function inlinePartRefs(): number {\n const result = imodel[_nativeDb].inlineGeometryPartReferences();\n expect(result.numCandidateParts).to.equal(result.numPartsDeleted);\n expect(result.numRefsInlined).to.equal(result.numCandidateParts);\n return result.numRefsInlined;\n }\n\n it(\"inlines and deletes a simple unique part reference\", () => {\n // Create single reference to a part and perform sanity checks on our geometry validation code.\n const partId = insertGeometryPart([{ pos: 123 }]);\n expectGeom(readElementGeom(partId), [\n { categoryId: \"0\", subCategoryId: \"0\" },\n { pos: 123 },\n ]);\n\n const elemId = insertElement([{ partId }]);\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { partId },\n ]);\n\n // Inline and delete the part.\n expect(inlinePartRefs()).to.equal(1);\n expect(imodel.elements.tryGetElement(partId)).to.be.undefined;\n\n const geom = readElementGeom(elemId);\n expect(geom.viewIndependent).to.be.false;\n expectGeom(geom, [\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 123 },\n { pos: 123 },\n ]);\n });\n\n it(\"inlines and deletes unique parts, ignoring non-unique parts\", () => {\n const part1 = insertGeometryPart([{ pos: 1 }]);\n const part2 = insertGeometryPart([{ pos: 2 }]);\n const part3 = insertGeometryPart([{ pos: 3 }]);\n const part4 = insertGeometryPart([{ pos: 4 }]);\n\n const elem1 = insertElement([{ partId: part1 }]);\n const elem2 = insertElement([{ partId: part2 }, { partId: part3 }]);\n const elem3 = insertElement([{ partId: part3 }]);\n const elem4 = insertElement([{ partId: part4 }]);\n const elem5 = insertElement([{ partId: part4 }]);\n\n expect(inlinePartRefs()).to.equal(2);\n\n const symb = { categoryId, subCategoryId: blueSubCategoryId };\n expectGeom(readElementGeom(elem1), [symb, { low: 1 }, { pos: 1 }]);\n expectGeom(readElementGeom(elem2), [symb, { low: 2 }, { pos: 2 }, symb, { partId: part3 }]);\n expectGeom(readElementGeom(elem3), [symb, { partId: part3 }]);\n expectGeom(readElementGeom(elem4), [symb, { partId: part4 }]);\n expectGeom(readElementGeom(elem5), [symb, { partId: part4 }]);\n });\n\n it(\"applies part transform\", () => {\n const partId = insertGeometryPart([{ pos: -8 }]);\n const elemId = insertElement([{ partId, origin: 50 }]);\n expect(inlinePartRefs()).to.equal(1);\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 42 },\n { pos: 42 },\n ]);\n });\n\n it(\"applies element symbology to part and resets element symbology after embedding part\", () => {\n const part1 = insertGeometryPart([\n { pos: 1 },\n { color: ColorDef.green },\n { pos: 1.5 },\n ]);\n\n const part2 = insertGeometryPart([\n { pos: 2 },\n { materialId },\n { pos: 2.5 },\n ]);\n\n // Sanity check.\n expectGeom(readElementGeom(part2), [\n { categoryId: \"0\", subCategoryId: \"0\" },\n { pos: 2 },\n { categoryId: \"0\", subCategoryId: \"0\", materialId },\n { pos: 2.5 },\n ]);\n\n const part3 = insertGeometryPart([\n { pos: 3 },\n { materialId: \"0\" },\n { pos: 3.5 },\n ]);\n\n const elemId = insertElement([\n { pos: -1 },\n { subCategoryId: redSubCategoryId },\n { partId: part1 },\n { pos: -2 },\n { color: ColorDef.black },\n { partId: part2 },\n { pos: -3 },\n { materialId, color: ColorDef.white },\n { partId: part3 },\n { pos: -4 },\n ]);\n\n expect(inlinePartRefs()).to.equal(3);\n\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { pos: -1 },\n { categoryId, subCategoryId: redSubCategoryId },\n { low: 1 },\n { pos: 1 },\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.green },\n { low: 1.5 },\n { pos: 1.5 },\n { categoryId, subCategoryId: redSubCategoryId },\n { low: -2 },\n { pos: -2 },\n\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.black },\n { low: 2 },\n { pos: 2 },\n { categoryId, subCategoryId: redSubCategoryId, materialId },\n { low: 2.5 },\n { pos: 2.5 },\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.black },\n { low: -3 },\n { pos: -3 },\n\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.white, materialId },\n { low: 3 },\n { pos: 3 },\n { categoryId, subCategoryId: redSubCategoryId, materialId: \"0\" },\n { low: 3.5 },\n { pos: 3.5 },\n { categoryId, subCategoryId: redSubCategoryId, color: ColorDef.white, materialId },\n { low: -4 },\n { pos: -4 },\n ]);\n });\n\n it(\"inserts subgraphic ranges for parts\", () => {\n const part1 = insertGeometryPart([{ pos: 1 }]);\n const part2 = insertGeometryPart([{ pos: 2 }]);\n const elem = insertElement([\n { pos: -1 },\n { partId: part1 },\n { partId: part2, origin: 5 },\n ]);\n\n expect(inlinePartRefs()).to.equal(2);\n\n expectGeom(readElementGeom(elem), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 1 },\n { pos: 1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 7 },\n { pos: 7 },\n ]);\n });\n\n it(\"preserves existing subgraphic ranges\", () => {\n const partId = insertGeometryPart([{ pos: 0 }]);\n const elem = insertElement([\n { appendSubRanges: true },\n { pos: -1 },\n { partId },\n { pos: 1 },\n ]);\n\n expectGeom(readElementGeom(elem), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: -1 },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { partId },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 1 },\n { pos: 1 },\n ]);\n\n expect(inlinePartRefs()).to.equal(1);\n\n expectGeom(readElementGeom(elem), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: -1 },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 0 },\n { pos: 0 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 1 },\n { pos: 1 },\n ]);\n });\n\n it(\"inserts subgraphic ranges geometry following part\", () => {\n const partId = insertGeometryPart([{ pos: 1 }]);\n const elem = insertElement([\n { pos: 0 },\n { partId },\n { pos: 2 },\n ]);\n\n expect(inlinePartRefs()).to.equal(1);\n\n expectGeom(readElementGeom(elem), [\n { categoryId, subCategoryId: blueSubCategoryId },\n { pos: 0 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 1 },\n { pos: 1 },\n { categoryId, subCategoryId: blueSubCategoryId },\n { low: 2 },\n { pos: 2 },\n ]);\n });\n\n it(\"applies transform to patterns\", () => {\n const part1 = insertGeometryPart([{ pos: 1 }]);\n const part2 = insertGeometryPart([{ patternOrigin: 123 }, { pos: 2 }]);\n\n expectGeom(readElementGeom(part2), [\n { categoryId: \"0\", subCategoryId: \"0\", patternOrigin: 123 },\n { pos: 2 },\n ]);\n\n const elemId = insertElement([\n { patternOrigin: 456 },\n { pos: -1 },\n { partId: part1, origin: 8 },\n { pos: -2 },\n { partId: part2, origin: 12 },\n { pos: -3 },\n ]);\n\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { partId: part1, origin: 8 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { pos: -2 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { partId: part2, origin: 12 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { pos: -3 },\n ]);\n\n expect(inlinePartRefs()).to.equal(2);\n\n expectGeom(readElementGeom(elemId), [\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { pos: -1 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { low: 1 + 8 },\n { pos: 1 + 8 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { low: -2 },\n { pos: -2 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 123 + 12 },\n { low: 2 + 12 },\n { pos: 2 + 12 },\n { categoryId, subCategoryId: blueSubCategoryId, patternOrigin: 456 },\n { low: -3 },\n { pos: -3 },\n ]);\n });\n\n it(\"preserves element header flags\", () => {\n const partId = insertGeometryPart([{ pos: 1 }]);\n const elemId = insertElement([{ partId }], true);\n expect(readElementGeom(elemId).viewIndependent).to.be.true;\n\n expect(inlinePartRefs()).to.equal(1);\n expect(readElementGeom(elemId).viewIndependent).to.be.true;\n });\n});\n"]}
|
|
@@ -9,6 +9,7 @@ import { HubMock } from "../../internal/HubMock";
|
|
|
9
9
|
import { HubWrappers } from "../IModelTestUtils";
|
|
10
10
|
import { IModel } from "@itwin/core-common";
|
|
11
11
|
import { _nativeDb, ChannelControl, Subject, SubjectOwnsSubjects } from "../../core-backend";
|
|
12
|
+
import { withEditTxn } from "../../EditTxn";
|
|
12
13
|
describe("Integrity Check Tests", () => {
|
|
13
14
|
let iModelStub;
|
|
14
15
|
beforeEach(() => {
|
|
@@ -326,19 +327,20 @@ describe("iModelDb integrityCheck Tests", () => {
|
|
|
326
327
|
// Insert two elements
|
|
327
328
|
iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
|
|
328
329
|
await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });
|
|
329
|
-
const element1Id = iModel
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
330
|
+
const [element1Id, element2Id] = withEditTxn(iModel, (txn) => ([
|
|
331
|
+
txn.insertElement({
|
|
332
|
+
classFullName: Subject.classFullName,
|
|
333
|
+
model: IModel.repositoryModelId,
|
|
334
|
+
parent: new SubjectOwnsSubjects(IModel.rootSubjectId),
|
|
335
|
+
code: Subject.createCode(iModel, IModel.rootSubjectId, "Subject1"),
|
|
336
|
+
}),
|
|
337
|
+
txn.insertElement({
|
|
338
|
+
classFullName: Subject.classFullName,
|
|
339
|
+
model: IModel.repositoryModelId,
|
|
340
|
+
parent: new SubjectOwnsSubjects(IModel.rootSubjectId),
|
|
341
|
+
code: Subject.createCode(iModel, IModel.rootSubjectId, "Subject2"),
|
|
342
|
+
}),
|
|
343
|
+
]));
|
|
342
344
|
// Create a relationship between them
|
|
343
345
|
await iModel.locks.acquireLocks({ exclusive: Id64.toIdSet([element1Id, element2Id]) });
|
|
344
346
|
const relationship = iModel.relationships.createInstance({
|
|
@@ -346,13 +348,13 @@ describe("iModelDb integrityCheck Tests", () => {
|
|
|
346
348
|
sourceId: element1Id,
|
|
347
349
|
targetId: element2Id,
|
|
348
350
|
});
|
|
349
|
-
const relationshipId = iModel.
|
|
351
|
+
const relationshipId = withEditTxn(iModel, (txn) => txn.insertRelationship(relationship.toJSON()));
|
|
350
352
|
assert.isTrue(Id64.isValidId64(relationshipId));
|
|
351
|
-
iModel.saveChanges();
|
|
352
353
|
// Delete one element without deleting the relationship to corrupt the iModel
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
354
|
+
withEditTxn(iModel, () => {
|
|
355
|
+
const deleteResult = iModel[_nativeDb].executeSql(`DELETE FROM bis_Element WHERE Id=${element2Id}`);
|
|
356
|
+
expect(deleteResult).to.equal(DbResult.BE_SQLITE_OK);
|
|
357
|
+
});
|
|
356
358
|
// Run integrity check specifically for linktable foreign key Ids
|
|
357
359
|
const results = await iModel.integrityCheck({
|
|
358
360
|
quickCheck: true,
|