@itwin/core-backend 5.3.0-dev.9 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +14 -0
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +2 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.d.ts.map +1 -1
- package/lib/cjs/DisplayStyle.js +4 -4
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/Element.d.ts +31 -3
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +55 -3
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +24 -1
- package/lib/cjs/ElementAspect.d.ts.map +1 -1
- package/lib/cjs/ElementAspect.js +102 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +26 -3
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +60 -5
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js +2 -2
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/Material.d.ts +1 -1
- package/lib/cjs/Material.d.ts.map +1 -1
- package/lib/cjs/Material.js +2 -2
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/NavigationRelationship.d.ts +15 -0
- package/lib/cjs/NavigationRelationship.d.ts.map +1 -1
- package/lib/cjs/NavigationRelationship.js +22 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +5 -0
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +7 -0
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +8 -0
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +30 -2
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +1 -1
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js +2 -2
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +15 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +36 -23
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts +13 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +88 -10
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +6 -5
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +33 -14
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js +2 -1
- package/lib/cjs/annotations/TextBlockLayout.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 +12 -5
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +14 -0
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +2 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.d.ts.map +1 -1
- package/lib/esm/DisplayStyle.js +4 -4
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/Element.d.ts +31 -3
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +55 -4
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts +24 -1
- package/lib/esm/ElementAspect.d.ts.map +1 -1
- package/lib/esm/ElementAspect.js +101 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +26 -3
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +60 -5
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/esm/IModelElementCloneContext.js +2 -2
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/Material.d.ts +1 -1
- package/lib/esm/Material.d.ts.map +1 -1
- package/lib/esm/Material.js +2 -2
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/NavigationRelationship.d.ts +15 -0
- package/lib/esm/NavigationRelationship.d.ts.map +1 -1
- package/lib/esm/NavigationRelationship.js +19 -0
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/Relationship.d.ts +5 -0
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +7 -0
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +8 -0
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +30 -2
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +1 -1
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js +2 -2
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +15 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +37 -24
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts +13 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +89 -12
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +6 -5
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +33 -14
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js +2 -1
- package/lib/esm/annotations/TextBlockLayout.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 +11 -5
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.d.ts +93 -0
- package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -0
- package/lib/esm/test/ElementDrivesElement.test.js +862 -0
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -0
- package/lib/esm/test/ElementLRUCache.test.js +13 -0
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +44 -0
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +47 -2
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +120 -31
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +2 -2
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +33 -2
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.d.ts +2 -0
- package/lib/esm/test/element/ProjectInformationRecord.test.d.ts.map +1 -0
- package/lib/esm/test/element/ProjectInformationRecord.test.js +80 -0
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -0
- package/lib/esm/test/element/SheetInformationAspect.test.d.ts +2 -0
- package/lib/esm/test/element/SheetInformationAspect.test.d.ts.map +1 -0
- package/lib/esm/test/element/SheetInformationAspect.test.js +182 -0
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -0
- package/lib/esm/test/hubaccess/Rebase.test.js +169 -2
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +175 -2
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +63 -60
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js +6 -6
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js +75 -6
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js +4 -4
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +33 -5
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rebase.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/Rebase.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 * as chai from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\nimport { BriefcaseDb, BriefcaseManager, ChannelControl, DrawingCategory, IModelHost, SqliteChangesetReader, TxnProps } from \"../../core-backend\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { Suite } from \"mocha\";\nimport { Code, GeometricElement2dProps, IModel, RelatedElementProps, SubCategoryAppearance } from \"@itwin/core-common\";\nimport { Guid, Id64String } from \"@itwin/core-bentley\";\nimport { StashManager } from \"../../StashManager\";\nchai.use(chaiAsPromised);\n\nclass TestIModel {\n public iModelId: Id64String = \"\";\n public drawingModelId: Id64String = \"\";\n public drawingCategoryId: Id64String = \"\";\n public briefcases: BriefcaseDb[] = [];\n private _data = 0;\n public constructor() { }\n public async startup() {\n HubMock.startup(\"TestIModel\", KnownTestLocations.outputDir);\n this.iModelId = await HubMock.createNewIModel({ iTwinId: HubMock.iTwinId, iModelName: \"Test\", description: \"TestSubject\" });\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId: this.iModelId });\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n b1.saveChanges();\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"a1\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\n </ECEntityClass>\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\n <Class class=\"a1\"/>\n </Source>\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\n <Class class=\"a1\"/>\n </Target>\n </ECRelationshipClass>\n </ECSchema>`;\n\n await b1.importSchemaStrings([schema1]);\n chai.expect(b1.txns.hasPendingTxns).to.be.true\n await b1.pushChanges({ description: \"schema1\" });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\n this.drawingModelId = IModelTestUtils.createAndInsertDrawingPartitionAndModel(b1, codeProps, true)[1];\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(b1, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(b1, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\n this.drawingCategoryId = drawingCategoryId;\n b1.saveChanges();\n await b1.pushChanges({ description: \"drawing category\" });\n b1.close();\n }\n public async openBriefcase(): Promise<BriefcaseDb> {\n const b = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId: this.iModelId });\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n b.saveChanges();\n this.briefcases.push(b);\n return b;\n }\n public async insertElement(b: BriefcaseDb, markAsIndirect?: true) {\n await b.locks.acquireLocks({ shared: [this.drawingModelId] });\n const baseProps = {\n classFullName: \"TestDomain:a1\",\n model: this.drawingModelId,\n category: this.drawingCategoryId,\n code: Code.createEmpty(),\n };\n let id: Id64String = \"\";\n if (markAsIndirect) {\n b.txns.withIndirectTxnMode(() => {\n id = b.elements.insertElement({ ...baseProps, prop1: `${this._data++}` } as any);\n });\n return id;\n }\n return b.elements.insertElement({ ...baseProps, prop1: `${this._data++}` } as any);\n }\n public async insertElement2(b: BriefcaseDb, args?: { prop1?: string, markAsIndirect?: true, parent?: RelatedElementProps }) {\n await b.locks.acquireLocks({ shared: [this.drawingModelId] });\n\n const props: GeometricElement2dProps & { prop1: string } = {\n classFullName: \"TestDomain:a1\",\n model: this.drawingModelId,\n category: this.drawingCategoryId,\n code: Code.createEmpty(),\n parent: args?.parent,\n prop1: args?.prop1 ?? `${this._data++}`\n };\n\n let id: Id64String = \"\";\n if (args?.markAsIndirect) {\n b.txns.withIndirectTxnMode(() => {\n id = b.elements.insertElement(props as any);\n });\n return id;\n }\n return b.elements.insertElement(props as any);\n }\n public async updateElement(b: BriefcaseDb, id: Id64String, markAsIndirect?: true) {\n await b.locks.acquireLocks({ shared: [this.drawingModelId], exclusive: [id] });\n const elProps = b.elements.getElementProps(id);\n\n if (markAsIndirect) {\n b.txns.withIndirectTxnMode(() => {\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` } as any);\n });\n } else {\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` } as any);\n }\n }\n public async deleteElement(b: BriefcaseDb, id: Id64String, markAsIndirect?: true) {\n await b.locks.acquireLocks({ shared: [this.drawingModelId], exclusive: [id] });\n if (markAsIndirect) {\n b.txns.withIndirectTxnMode(() => {\n b.elements.deleteElement(id);\n });\n } else {\n b.elements.deleteElement(id);\n }\n }\n public async shutdown(): Promise<void> {\n this.briefcases.forEach(b => b.close());\n HubMock.shutdown();\n }\n}\n\ndescribe(\"rebase changes & stashing api\", function (this: Suite) {\n let testIModel: TestIModel;\n before(async () => {\n if (!IModelHost.isValid)\n await IModelHost.startup();\n });\n this.beforeEach(async () => {\n testIModel = new TestIModel();\n await testIModel.startup();\n });\n this.afterEach(async () => {\n await testIModel.shutdown();\n });\n it(\"save changes args\", async () => {\n const b1 = await testIModel.openBriefcase();\n await testIModel.insertElement(b1)\n b1.saveChanges({\n source: \"test\",\n description: \"test description\",\n appData: {\n test: \"test\",\n foo: [1, 2, 3],\n bar: { baz: \"qux\" }\n }\n });\n\n let lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isDefined(lastTxn);\n if (lastTxn) {\n chai.expect(lastTxn.props.source).to.be.equals(\"test\");\n chai.expect(lastTxn.props.description).to.be.equals(\"test description\");\n chai.expect(lastTxn.props.appData).to.not.be.undefined;\n chai.expect(lastTxn.props.appData?.test).to.be.eq(\"test\");\n chai.expect(lastTxn.props.appData?.foo).to.be.deep.eq([1, 2, 3]);\n chai.expect(lastTxn.props.appData?.bar).to.be.deep.eq({ baz: \"qux\" });\n chai.expect(lastTxn.nextId).to.be.undefined;\n chai.expect(lastTxn.prevId).to.be.undefined;\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\n chai.expect(lastTxn.id).to.be.eq('0x100000000');\n chai.expect(lastTxn.reversed).to.be.false;\n chai.expect(lastTxn.grouped).to.be.false;\n }\n\n await testIModel.insertElement(b1)\n b1.saveChanges({\n source: \"test2\",\n description: \"test description 2\",\n appData: {\n test: \"test 2\",\n foo: [11, 12, 13],\n bar: { baz: \"qux2\" }\n }\n });\n\n lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isDefined(lastTxn);\n if (lastTxn) {\n chai.expect(lastTxn.props.source).to.be.equals(\"test2\");\n chai.expect(lastTxn.props.description).to.be.equals(\"test description 2\");\n chai.expect(lastTxn.props.appData).to.not.be.undefined;\n chai.expect(lastTxn.props.appData?.test).to.be.eq(\"test 2\");\n chai.expect(lastTxn.props.appData?.foo).to.be.deep.eq([11, 12, 13]);\n chai.expect(lastTxn.props.appData?.bar).to.be.deep.eq({ baz: \"qux2\" });\n chai.expect(lastTxn.nextId).to.be.undefined;\n chai.expect(lastTxn.prevId).to.be.equal('0x100000000');\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\n chai.expect(lastTxn.id).to.be.eq('0x100000001');\n chai.expect(lastTxn.reversed).to.be.false;\n chai.expect(lastTxn.grouped).to.be.false;\n }\n\n await testIModel.insertElement(b1)\n b1.saveChanges(\"new element\");\n lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isDefined(lastTxn);\n if (lastTxn) {\n chai.expect(lastTxn.props.source).is.undefined;\n chai.expect(lastTxn.props.description).to.be.equals(\"new element\");\n chai.expect(lastTxn.props.appData).to.be.undefined;\n chai.expect(lastTxn.nextId).to.be.undefined;\n chai.expect(lastTxn.prevId).to.be.equal('0x100000001');\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\n chai.expect(lastTxn.id).to.be.eq('0x100000002');\n chai.expect(lastTxn.reversed).to.be.false;\n chai.expect(lastTxn.grouped).to.be.false;\n }\n\n await b1.pushChanges({ description: \"new element\" });\n chai.expect(b1.txns.isUndoPossible).is.false;\n chai.expect(b1.txns.isRedoPossible).is.false;\n lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isUndefined(lastTxn);\n });\n\n it(\"direct / indirect\", async () => {\n const b1 = await testIModel.openBriefcase();\n const directElId = await testIModel.insertElement(b1);\n const indirectElId = await testIModel.insertElement(b1, true);\n chai.expect(directElId).to.not.be.undefined;\n chai.expect(indirectElId).to.not.be.undefined;\n b1.saveChanges({ description: \"insert element 1 direct and 1 indirect\" });\n const txn = b1.txns.getLastSavedTxnProps();\n chai.assert.isDefined(txn);\n if (txn) {\n let checkCount = 0;\n const reader = SqliteChangesetReader.openTxn({ txnId: txn?.id, db: b1 });\n while (reader.step()) {\n if (reader.primaryKeyValues.length === 0) continue;\n if (reader.tableName !== \"bis_Element\") continue;\n const iid = reader.primaryKeyValues[0] as Id64String;\n if (iid === directElId) {\n chai.expect(reader.isIndirect).to.be.false;\n }\n if (iid === indirectElId) {\n chai.expect(reader.isIndirect).to.be.true;\n }\n checkCount++;\n }\n chai.expect(checkCount).to.be.equals(2);\n }\n\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\n chai.expect(b1.txns.isUndoPossible).is.false;\n chai.expect(b1.txns.isRedoPossible).is.false;\n const lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isUndefined(lastTxn);\n });\n\n it(\"rebase handler\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n const e1 = await testIModel.insertElement(b1);\n const e2 = await testIModel.insertElement(b1, true);\n b1.saveChanges();\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\n\n await b2.pullChanges();\n\n await testIModel.updateElement(b1, e1);\n await testIModel.updateElement(b1, e2, true);\n b1.saveChanges();\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\n\n\n await testIModel.insertElement(b2);\n await testIModel.insertElement(b2, true);\n b2.saveChanges(\"first change\");\n\n await testIModel.insertElement(b2);\n await testIModel.insertElement(b2, true);\n b2.saveChanges(\"second change\");\n\n await testIModel.insertElement(b2);\n await testIModel.insertElement(b2, true);\n b2.saveChanges(\"third change\");\n\n b2.txns.rebaser.setCustomHandler({\n shouldReinstate: (_txn: TxnProps) => {\n return true;\n },\n recompute: async (_txn: TxnProps): Promise<void> => {\n await testIModel.insertElement(b2);\n await testIModel.insertElement(b2, true);\n },\n });\n await b1.pullChanges();\n });\n it(\"stash & drop\", async () => {\n const b1 = await testIModel.openBriefcase();\n const e1 = await testIModel.insertElement(b1);\n b1.saveChanges();\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\n\n const e2 = await testIModel.insertElement(b1);\n b1.saveChanges();\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\n\n await testIModel.insertElement(b1);\n b1.saveChanges(`first`);\n await testIModel.updateElement(b1, e1);\n b1.saveChanges(`second`);\n await testIModel.deleteElement(b1, e2);\n b1.saveChanges(`third`);\n await testIModel.insertElement(b1);\n b1.saveChanges(`fourth`);\n\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\" });\n\n chai.expect(stash1).to.exist;\n chai.assert(Guid.isGuid(stash1.id));\n chai.expect(stash1.description).to.equals(\"stash test 1\");\n chai.expect(stash1.briefcaseId).equals(b1.briefcaseId);\n chai.expect(stash1.iModelId).to.equals(b1.iModelId);\n chai.expect(stash1.timestamp).to.exist;\n chai.expect(stash1.description).to.exist;\n chai.expect(stash1.hash).length(64);\n chai.expect(stash1.parentChangeset).to.exist;\n chai.expect(stash1.idSequences.element).to.equals(\"0x30000000004\");\n chai.expect(stash1.idSequences.instance).to.equals(\"0x30000000000\");\n chai.expect(stash1.acquiredLocks).equals(4);\n chai.expect(stash1.txns).to.exist;\n\n chai.expect(stash1.txns).to.have.lengthOf(4);\n chai.expect(stash1.txns[0].props.description).to.equal(\"first\");\n chai.expect(stash1.txns[1].props.description).to.equal(\"second\");\n chai.expect(stash1.txns[2].props.description).to.equal(\"third\");\n chai.expect(stash1.txns[3].props.description).to.equal(\"fourth\");\n\n chai.expect(stash1.txns[0].id).to.equals(\"0x100000000\");\n chai.expect(stash1.txns[1].id).to.equals(\"0x100000001\");\n chai.expect(stash1.txns[2].id).to.equals(\"0x100000002\");\n chai.expect(stash1.txns[3].id).to.equals(\"0x100000003\");\n\n await testIModel.insertElement(b1);\n b1.saveChanges(`fifth`);\n await testIModel.updateElement(b1, e1);\n b1.saveChanges(`sixth`);\n await testIModel.insertElement(b1);\n b1.saveChanges(`seventh`);\n\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\" });\n chai.expect(stash2).to.exist;\n chai.expect(stash2.description).to.equals(\"stash test 2\");\n chai.expect(stash2.hash).length(64);\n chai.expect(stash2.parentChangeset).to.exist;\n chai.expect(stash2.idSequences.element).to.equals(\"0x30000000006\");\n chai.expect(stash2.idSequences.instance).to.equals(\"0x30000000000\");\n chai.expect(stash2.acquiredLocks).equals(4);\n chai.expect(stash2.txns).to.exist;\n\n chai.expect(stash2.txns).to.have.lengthOf(7);\n chai.expect(stash2.txns[0].props.description).to.equal(\"first\");\n chai.expect(stash2.txns[1].props.description).to.equal(\"second\");\n chai.expect(stash2.txns[2].props.description).to.equal(\"third\");\n chai.expect(stash2.txns[3].props.description).to.equal(\"fourth\");\n chai.expect(stash2.txns[4].props.description).to.equal(\"fifth\");\n chai.expect(stash2.txns[5].props.description).to.equal(\"sixth\");\n chai.expect(stash2.txns[6].props.description).to.equal(\"seventh\");\n\n chai.expect(stash2.txns[0].id).to.equals(\"0x100000000\");\n chai.expect(stash2.txns[1].id).to.equals(\"0x100000001\");\n chai.expect(stash2.txns[2].id).to.equals(\"0x100000002\");\n chai.expect(stash2.txns[3].id).to.equals(\"0x100000003\");\n chai.expect(stash2.txns[4].id).to.equals(\"0x100000004\");\n chai.expect(stash2.txns[5].id).to.equals(\"0x100000005\");\n chai.expect(stash2.txns[6].id).to.equals(\"0x100000006\");\n\n const stashes = StashManager.getStashes(b1);\n chai.expect(stashes).to.have.lengthOf(2);\n chai.expect(stashes[0].description).to.equals(\"stash test 2\");\n chai.expect(stashes[1].description).to.equals(\"stash test 1\");\n chai.expect(stashes[0]).to.deep.equal(stash2);\n chai.expect(stashes[1]).to.deep.equal(stash1);\n\n StashManager.dropAllStashes(b1);\n chai.expect(StashManager.getStashes(b1)).to.have.lengthOf(0);\n });\n it(\"should restore mutually exclusive stashes\", async () => {\n const b1 = await testIModel.openBriefcase();\n\n // stash 1\n const e1 = await testIModel.insertElement(b1);\n chai.expect(e1).to.exist;\n b1.saveChanges(\"first\");\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\", discardLocalChanges: true, retainLocks: true });\n chai.expect(stash1).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.txns.isUndoPossible).to.be.false;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // stash 2\n const e2 = await testIModel.insertElement(b1);\n chai.expect(e2).to.exist;\n b1.saveChanges(\"second\");\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\", discardLocalChanges: true, retainLocks: true });\n chai.expect(stash2).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.txns.isUndoPossible).to.be.false;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // stash 3\n const e3 = await testIModel.insertElement(b1);\n chai.expect(e3).to.exist;\n b1.saveChanges(\"third\");\n const stash3 = await StashManager.stash({ db: b1, description: \"stash test 3\", discardLocalChanges: true, retainLocks: true });\n chai.expect(stash3).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n chai.expect(b1.txns.isUndoPossible).to.be.false;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n chai.expect(e1).not.equals(e2);\n chai.expect(e1).not.equals(e3);\n chai.expect(e2).not.equals(e3);\n\n const stashes = StashManager.getStashes(b1);\n chai.expect(stashes).to.have.lengthOf(3);\n chai.expect(stashes[0].description).to.equals(\"stash test 3\");\n chai.expect(stashes[1].description).to.equals(\"stash test 2\");\n chai.expect(stashes[2].description).to.equals(\"stash test 1\");\n\n // restore stash 1\n await StashManager.restore({ db: b1, stash: stash1 });\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n\n // restore stash 2\n await StashManager.restore({ db: b1, stash: stash2 });\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n\n // restore stash 3\n await StashManager.restore({ db: b1, stash: stash3 });\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\n });\n it(\"should restore stash in any order\", async () => {\n const b1 = await testIModel.openBriefcase();\n\n // stash 1\n const e1 = await testIModel.insertElement(b1);\n chai.expect(e1).to.exist;\n b1.saveChanges(\"first\");\n // do not discard local changes\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\" });\n chai.expect(stash1).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.txns.isUndoPossible).to.be.true;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // stash 2\n const e2 = await testIModel.insertElement(b1);\n chai.expect(e2).to.exist;\n b1.saveChanges(\"second\");\n // do not discard local changes\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\" });\n chai.expect(stash2).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.txns.isUndoPossible).to.be.true;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // stash 3\n const e3 = await testIModel.insertElement(b1);\n chai.expect(e3).to.exist;\n b1.saveChanges(\"third\");\n // do not discard local changes\n const stash3 = await StashManager.stash({ db: b1, description: \"stash test 3\" });\n chai.expect(stash3).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\n chai.expect(b1.txns.isUndoPossible).to.be.true;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n const stashes = StashManager.getStashes(b1);\n chai.expect(stashes).to.have.lengthOf(3);\n chai.expect(stashes[0].description).to.equals(\"stash test 3\");\n chai.expect(stashes[1].description).to.equals(\"stash test 2\");\n chai.expect(stashes[2].description).to.equals(\"stash test 1\");\n\n await b1.discardChanges({ retainLocks: true });\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n chai.expect(b1.txns.isUndoPossible).to.be.false;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // restore stash 1\n await StashManager.restore({ db: b1, stash: stash1 });\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n\n\n // restore stash 2\n await StashManager.restore({ db: b1, stash: stash2 });\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n\n // restore stash 3\n await StashManager.restore({ db: b1, stash: stash3 });\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\n\n });\n it(\"should restore stash when briefcase has advanced to latest changeset\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n chai.expect(b1.changeset.index).to.equals(2);\n chai.expect(b2.changeset.index).to.equals(2);\n\n const e1 = await testIModel.insertElement(b1);\n chai.expect(e1).to.exist;\n b1.saveChanges();\n await b1.pushChanges({ description: `${e1} inserted` });\n\n chai.expect(b1.changeset.index).to.equals(3);\n\n const e2 = await testIModel.insertElement(b2);\n chai.expect(e2).to.exist;\n b2.saveChanges();\n\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\n\n const b2Stash1 = await StashManager.stash({ db: b2, description: \"stash test 1\", discardLocalChanges: true });\n chai.expect(b2Stash1.parentChangeset.index).to.equals(2);\n\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b2.elements.tryGetElement(e2)).to.undefined;\n\n await b2.pullChanges();\n chai.expect(b2.changeset.index).to.equals(3);\n\n chai.expect(b2.elements.tryGetElement(e1)).to.exist;\n chai.expect(b2.elements.tryGetElement(e2)).to.undefined;\n\n // stash restore should downgrade briefcase to older changeset as specified in stash\n await StashManager.restore({ db: b2, stash: b2Stash1 });\n chai.expect(b2.changeset.index).to.equals(2);\n\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\n\n await b2.pullChanges();\n chai.expect(b2.changeset.index).to.equals(3);\n chai.expect(b2.elements.tryGetElement(e1)).to.exist;\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\n\n await b2.pushChanges({ description: \"test\" });\n chai.expect(b2.changeset.index).to.equals(4);\n });\n it(\"restore stash that has element changed by another briefcase\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n chai.expect(b1.changeset.index).to.equals(2);\n chai.expect(b2.changeset.index).to.equals(2);\n\n const e1 = await testIModel.insertElement(b1);\n chai.expect(e1).to.exist;\n b1.saveChanges();\n await b1.pushChanges({ description: `${e1} inserted` });\n\n chai.expect(b1.changeset.index).to.equals(3);\n\n await b2.pullChanges();\n chai.expect(b2.changeset.index).to.equals(3);\n await testIModel.updateElement(b2, e1);\n b2.saveChanges();\n\n chai.expect(b2.locks.holdsExclusiveLock(e1)).to.be.true;\n const b2Stash1 = await StashManager.stash({ db: b2, description: \"stash test 1\", discardLocalChanges: true });\n chai.expect(b2Stash1.parentChangeset.index).to.equals(3);\n chai.expect(b2.locks.holdsExclusiveLock(e1)).to.be.false;\n\n // stash release lock so b2 should have released lock and b1 should be able to update.\n await testIModel.updateElement(b1, e1);\n b1.saveChanges();\n\n // restore stash should fail because of lock not obtained on e1\n await chai.expect(StashManager.restore({ db: b2, stash: b2Stash1 })).to.be.rejectedWith(\"exclusive lock is already held\");\n\n // push b1 changes to release lock\n await b1.pushChanges({ description: `${e1} inserted` });\n\n // restore stash should fail because pull is required to obtain lock\n await chai.expect(StashManager.restore({ db: b2, stash: b2Stash1 })).to.be.rejectedWith(\"pull is required to obtain lock\");\n\n await b2.pullChanges();\n\n chai.expect(b2.changeset.index).to.equals(4);\n const elBefore = b2.elements.tryGetElementProps(e1);\n chai.expect((elBefore as any).prop1).to.equals(\"2\");\n // restore stash should succeed as now it can obtain lock\n await StashManager.restore({ db: b2, stash: b2Stash1 });\n\n const elAfter = b2.elements.tryGetElementProps(e1);\n chai.expect((elAfter as any).prop1).to.equals(\"1\");\n await b2.pushChanges({ description: `${e1} updated` });\n });\n it(\"schema change should not be stashed\", async () => {\n const b1 = await testIModel.openBriefcase();\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.01\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"a1\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\n <ECProperty propertyName=\"prop2\" typeName=\"string\" />\n </ECEntityClass>\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\n <Class class=\"a1\"/>\n </Source>\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\n <Class class=\"a1\"/>\n </Target>\n </ECRelationshipClass>\n </ECSchema>`;\n await b1.importSchemaStrings([schema1]);\n b1.saveChanges();\n\n await chai.expect(StashManager.stash({ db: b1, description: \"stash test 1\" })).to.not.rejectedWith(\"Bad Arg: Pending schema changeset stashing is not currently supported\");\n });\n it(\"abort rebase\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n const e1 = await testIModel.insertElement(b1);\n b1.saveChanges();\n await b1.pushChanges({ description: `${e1} inserted` });\n\n const e2 = await testIModel.insertElement(b2);\n chai.expect(e2).to.exist;\n let e3 = \"\";\n b2.saveChanges();\n b2.txns.rebaser.setCustomHandler({\n shouldReinstate: (_txnProps: TxnProps) => {\n return true;\n },\n recompute: async (_txnProps: TxnProps) => {\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\n e3 = await testIModel.insertElement(b2);\n throw new Error(\"Rebase failed\");\n },\n });\n\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined;\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined;\n chai.expect(b2.changeset.index).to.equals(2);\n await chai.expect(b2.pullChanges()).to.be.rejectedWith(\"Rebase failed\");\n\n chai.expect(b2.changeset.index).to.equals(3);\n chai.expect(e3).to.exist;\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist; // came from incoming changeset\n chai.expect(b2.elements.tryGetElementProps(e2)).to.undefined; // was local change and reversed during rebase.\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // was insert by reCompute() but due to exception the rebase attempt was abandoned.\n\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\n\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\n await b2.txns.rebaser.abort();\n\n chai.expect(b2.changeset.index).to.equals(2);\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined; // reset briefcase should move tip back to where it was before pull\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist; // abort should put back e2 which was only change at the time of pull\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // add by rebase so should not exist either\n\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.false;\n });\n it(\"getStash() should throw exception\", async () => {\n const b1 = await testIModel.openBriefcase();\n chai.expect(() => StashManager.getStash({ db: b1, stash: \"invalid_stash\" })).to.throw(\"Invalid stash\");\n chai.expect(StashManager.tryGetStash({ db: b1, stash: \"invalid_stash\" })).to.be.undefined;\n });\n it(\"edge case: a indirect update can cause FK violation\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n const parentId = await testIModel.insertElement(b1);\n const childId = await testIModel.insertElement2(b1, { parent: { id: parentId, relClassName: \"TestDomain:A1OwnsA1\" } });\n b1.saveChanges(\"insert parent and child\");\n await b1.pushChanges({ description: `inserted parent ${parentId} and child ${childId}` });\n await b2.pullChanges();\n\n // b1 delete childId while b1 create a child of childId as indirect change\n await testIModel.deleteElement(b1, childId);\n b1.saveChanges(\"delete child\");\n // no exclusive lock required on child1\n const grandChildId = await testIModel.insertElement2(b2, { parent: { id: childId, relClassName: \"TestDomain:A1OwnsA1\" }, markAsIndirect: true });\n b2.saveChanges(\"delete child and insert grandchild\");\n\n await b1.pushChanges({ description: `deleted child ${childId}` });\n\n // should fail to pull and rebase changes.\n await chai.expect(b2.pushChanges({ description: `deleted child ${childId} and inserted grandchild ${grandChildId}` }))\n .to.be.rejectedWith(\"Foreign key conflicts in ChangeSet. Aborting rebase.\");\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"Rebase.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/Rebase.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 { Guid, Id64String } from \"@itwin/core-bentley\";\nimport { Code, GeometricElement2dProps, IModel, QueryBinder, RelatedElementProps, SubCategoryAppearance } from \"@itwin/core-common\";\nimport * as chai from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { Suite } from \"mocha\";\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\nimport { BriefcaseDb, BriefcaseManager, ChannelControl, DrawingCategory, IModelHost, SqliteChangesetReader, TxnProps } from \"../../core-backend\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { StashManager } from \"../../StashManager\";\nimport { existsSync, unlinkSync, writeFileSync } from \"fs\";\nimport * as path from \"path\";\nchai.use(chaiAsPromised);\n\nclass TestIModel {\n public iModelId: Id64String = \"\";\n public drawingModelId: Id64String = \"\";\n public drawingCategoryId: Id64String = \"\";\n public briefcases: BriefcaseDb[] = [];\n private _data = 0;\n public constructor() { }\n public async startup() {\n HubMock.startup(\"TestIModel\", KnownTestLocations.outputDir);\n this.iModelId = await HubMock.createNewIModel({ iTwinId: HubMock.iTwinId, iModelName: \"Test\", description: \"TestSubject\" });\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId: this.iModelId });\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n b1.saveChanges();\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"a1\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\n </ECEntityClass>\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\n <Class class=\"a1\"/>\n </Source>\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\n <Class class=\"a1\"/>\n </Target>\n </ECRelationshipClass>\n </ECSchema>`;\n\n await b1.importSchemaStrings([schema1]);\n chai.expect(b1.txns.hasPendingTxns).to.be.true\n await b1.pushChanges({ description: \"schema1\" });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\n this.drawingModelId = IModelTestUtils.createAndInsertDrawingPartitionAndModel(b1, codeProps, true)[1];\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(b1, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(b1, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\n this.drawingCategoryId = drawingCategoryId;\n b1.saveChanges();\n await b1.pushChanges({ description: \"drawing category\" });\n b1.close();\n }\n public async openBriefcase(): Promise<BriefcaseDb> {\n const b = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId: this.iModelId });\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n b.saveChanges();\n this.briefcases.push(b);\n return b;\n }\n public async insertElement(b: BriefcaseDb, markAsIndirect?: true) {\n await b.locks.acquireLocks({ shared: [this.drawingModelId] });\n const baseProps = {\n classFullName: \"TestDomain:a1\",\n model: this.drawingModelId,\n category: this.drawingCategoryId,\n code: Code.createEmpty(),\n };\n let id: Id64String = \"\";\n if (markAsIndirect) {\n b.txns.withIndirectTxnMode(() => {\n id = b.elements.insertElement({ ...baseProps, prop1: `${this._data++}` } as any);\n });\n return id;\n }\n return b.elements.insertElement({ ...baseProps, prop1: `${this._data++}` } as any);\n }\n public async insertElement2(b: BriefcaseDb, args?: { prop1?: string, markAsIndirect?: true, parent?: RelatedElementProps }) {\n await b.locks.acquireLocks({ shared: [this.drawingModelId] });\n\n const props: GeometricElement2dProps & { prop1: string } = {\n classFullName: \"TestDomain:a1\",\n model: this.drawingModelId,\n category: this.drawingCategoryId,\n code: Code.createEmpty(),\n parent: args?.parent,\n prop1: args?.prop1 ?? `${this._data++}`\n };\n\n let id: Id64String = \"\";\n if (args?.markAsIndirect) {\n b.txns.withIndirectTxnMode(() => {\n id = b.elements.insertElement(props as any);\n });\n return id;\n }\n return b.elements.insertElement(props as any);\n }\n public async updateElement(b: BriefcaseDb, id: Id64String, markAsIndirect?: true) {\n await b.locks.acquireLocks({ shared: [this.drawingModelId], exclusive: [id] });\n const elProps = b.elements.getElementProps(id);\n\n if (markAsIndirect) {\n b.txns.withIndirectTxnMode(() => {\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` } as any);\n });\n } else {\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` } as any);\n }\n }\n public async deleteElement(b: BriefcaseDb, id: Id64String, markAsIndirect?: true) {\n await b.locks.acquireLocks({ shared: [this.drawingModelId], exclusive: [id] });\n if (markAsIndirect) {\n b.txns.withIndirectTxnMode(() => {\n b.elements.deleteElement(id);\n });\n } else {\n b.elements.deleteElement(id);\n }\n }\n public async shutdown(): Promise<void> {\n this.briefcases.forEach(b => b.close());\n HubMock.shutdown();\n }\n}\n\ndescribe(\"rebase changes & stashing api\", function (this: Suite) {\n let testIModel: TestIModel;\n before(async () => {\n if (!IModelHost.isValid)\n await IModelHost.startup();\n });\n this.beforeEach(async () => {\n testIModel = new TestIModel();\n await testIModel.startup();\n });\n this.afterEach(async () => {\n await testIModel.shutdown();\n });\n it(\"save changes args\", async () => {\n const b1 = await testIModel.openBriefcase();\n await testIModel.insertElement(b1)\n b1.saveChanges({\n source: \"test\",\n description: \"test description\",\n appData: {\n test: \"test\",\n foo: [1, 2, 3],\n bar: { baz: \"qux\" }\n }\n });\n\n let lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isDefined(lastTxn);\n if (lastTxn) {\n chai.expect(lastTxn.props.source).to.be.equals(\"test\");\n chai.expect(lastTxn.props.description).to.be.equals(\"test description\");\n chai.expect(lastTxn.props.appData).to.not.be.undefined;\n chai.expect(lastTxn.props.appData?.test).to.be.eq(\"test\");\n chai.expect(lastTxn.props.appData?.foo).to.be.deep.eq([1, 2, 3]);\n chai.expect(lastTxn.props.appData?.bar).to.be.deep.eq({ baz: \"qux\" });\n chai.expect(lastTxn.nextId).to.be.undefined;\n chai.expect(lastTxn.prevId).to.be.undefined;\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\n chai.expect(lastTxn.id).to.be.eq('0x100000000');\n chai.expect(lastTxn.reversed).to.be.false;\n chai.expect(lastTxn.grouped).to.be.false;\n }\n\n await testIModel.insertElement(b1)\n b1.saveChanges({\n source: \"test2\",\n description: \"test description 2\",\n appData: {\n test: \"test 2\",\n foo: [11, 12, 13],\n bar: { baz: \"qux2\" }\n }\n });\n\n lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isDefined(lastTxn);\n if (lastTxn) {\n chai.expect(lastTxn.props.source).to.be.equals(\"test2\");\n chai.expect(lastTxn.props.description).to.be.equals(\"test description 2\");\n chai.expect(lastTxn.props.appData).to.not.be.undefined;\n chai.expect(lastTxn.props.appData?.test).to.be.eq(\"test 2\");\n chai.expect(lastTxn.props.appData?.foo).to.be.deep.eq([11, 12, 13]);\n chai.expect(lastTxn.props.appData?.bar).to.be.deep.eq({ baz: \"qux2\" });\n chai.expect(lastTxn.nextId).to.be.undefined;\n chai.expect(lastTxn.prevId).to.be.equal('0x100000000');\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\n chai.expect(lastTxn.id).to.be.eq('0x100000001');\n chai.expect(lastTxn.reversed).to.be.false;\n chai.expect(lastTxn.grouped).to.be.false;\n }\n\n await testIModel.insertElement(b1)\n b1.saveChanges(\"new element\");\n lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isDefined(lastTxn);\n if (lastTxn) {\n chai.expect(lastTxn.props.source).is.undefined;\n chai.expect(lastTxn.props.description).to.be.equals(\"new element\");\n chai.expect(lastTxn.props.appData).to.be.undefined;\n chai.expect(lastTxn.nextId).to.be.undefined;\n chai.expect(lastTxn.prevId).to.be.equal('0x100000001');\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\n chai.expect(lastTxn.id).to.be.eq('0x100000002');\n chai.expect(lastTxn.reversed).to.be.false;\n chai.expect(lastTxn.grouped).to.be.false;\n }\n\n await b1.pushChanges({ description: \"new element\" });\n chai.expect(b1.txns.isUndoPossible).is.false;\n chai.expect(b1.txns.isRedoPossible).is.false;\n lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isUndefined(lastTxn);\n });\n\n it(\"direct / indirect\", async () => {\n const b1 = await testIModel.openBriefcase();\n const directElId = await testIModel.insertElement(b1);\n const indirectElId = await testIModel.insertElement(b1, true);\n chai.expect(directElId).to.not.be.undefined;\n chai.expect(indirectElId).to.not.be.undefined;\n b1.saveChanges({ description: \"insert element 1 direct and 1 indirect\" });\n const txn = b1.txns.getLastSavedTxnProps();\n chai.assert.isDefined(txn);\n if (txn) {\n let checkCount = 0;\n const reader = SqliteChangesetReader.openTxn({ txnId: txn?.id, db: b1 });\n while (reader.step()) {\n if (reader.primaryKeyValues.length === 0) continue;\n if (reader.tableName !== \"bis_Element\") continue;\n const iid = reader.primaryKeyValues[0] as Id64String;\n if (iid === directElId) {\n chai.expect(reader.isIndirect).to.be.false;\n }\n if (iid === indirectElId) {\n chai.expect(reader.isIndirect).to.be.true;\n }\n checkCount++;\n }\n chai.expect(checkCount).to.be.equals(2);\n }\n\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\n chai.expect(b1.txns.isUndoPossible).is.false;\n chai.expect(b1.txns.isRedoPossible).is.false;\n const lastTxn = b1.txns.getLastSavedTxnProps();\n chai.assert.isUndefined(lastTxn);\n });\n\n it(\"rebase handler\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n const e1 = await testIModel.insertElement(b1);\n const e2 = await testIModel.insertElement(b1, true);\n b1.saveChanges();\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\n\n await b2.pullChanges();\n\n await testIModel.updateElement(b1, e1);\n await testIModel.updateElement(b1, e2, true);\n b1.saveChanges();\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\n\n\n await testIModel.insertElement(b2);\n await testIModel.insertElement(b2, true);\n b2.saveChanges(\"first change\");\n\n await testIModel.insertElement(b2);\n await testIModel.insertElement(b2, true);\n b2.saveChanges(\"second change\");\n\n await testIModel.insertElement(b2);\n await testIModel.insertElement(b2, true);\n b2.saveChanges(\"third change\");\n\n b2.txns.rebaser.setCustomHandler({\n shouldReinstate: (_txn: TxnProps) => {\n return true;\n },\n recompute: async (_txn: TxnProps): Promise<void> => {\n await testIModel.insertElement(b2);\n await testIModel.insertElement(b2, true);\n },\n });\n await b1.pullChanges();\n });\n it(\"stash & drop\", async () => {\n const b1 = await testIModel.openBriefcase();\n const e1 = await testIModel.insertElement(b1);\n b1.saveChanges();\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\n\n const e2 = await testIModel.insertElement(b1);\n b1.saveChanges();\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\n\n await testIModel.insertElement(b1);\n b1.saveChanges(`first`);\n await testIModel.updateElement(b1, e1);\n b1.saveChanges(`second`);\n await testIModel.deleteElement(b1, e2);\n b1.saveChanges(`third`);\n await testIModel.insertElement(b1);\n b1.saveChanges(`fourth`);\n\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\" });\n\n chai.expect(stash1).to.exist;\n chai.assert(Guid.isGuid(stash1.id));\n chai.expect(stash1.description).to.equals(\"stash test 1\");\n chai.expect(stash1.briefcaseId).equals(b1.briefcaseId);\n chai.expect(stash1.iModelId).to.equals(b1.iModelId);\n chai.expect(stash1.timestamp).to.exist;\n chai.expect(stash1.description).to.exist;\n chai.expect(stash1.hash).length(64);\n chai.expect(stash1.parentChangeset).to.exist;\n chai.expect(stash1.idSequences.element).to.equals(\"0x30000000004\");\n chai.expect(stash1.idSequences.instance).to.equals(\"0x30000000000\");\n chai.expect(stash1.acquiredLocks).equals(4);\n chai.expect(stash1.txns).to.exist;\n\n chai.expect(stash1.txns).to.have.lengthOf(4);\n chai.expect(stash1.txns[0].props.description).to.equal(\"first\");\n chai.expect(stash1.txns[1].props.description).to.equal(\"second\");\n chai.expect(stash1.txns[2].props.description).to.equal(\"third\");\n chai.expect(stash1.txns[3].props.description).to.equal(\"fourth\");\n\n chai.expect(stash1.txns[0].id).to.equals(\"0x100000000\");\n chai.expect(stash1.txns[1].id).to.equals(\"0x100000001\");\n chai.expect(stash1.txns[2].id).to.equals(\"0x100000002\");\n chai.expect(stash1.txns[3].id).to.equals(\"0x100000003\");\n\n await testIModel.insertElement(b1);\n b1.saveChanges(`fifth`);\n await testIModel.updateElement(b1, e1);\n b1.saveChanges(`sixth`);\n await testIModel.insertElement(b1);\n b1.saveChanges(`seventh`);\n\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\" });\n chai.expect(stash2).to.exist;\n chai.expect(stash2.description).to.equals(\"stash test 2\");\n chai.expect(stash2.hash).length(64);\n chai.expect(stash2.parentChangeset).to.exist;\n chai.expect(stash2.idSequences.element).to.equals(\"0x30000000006\");\n chai.expect(stash2.idSequences.instance).to.equals(\"0x30000000000\");\n chai.expect(stash2.acquiredLocks).equals(4);\n chai.expect(stash2.txns).to.exist;\n\n chai.expect(stash2.txns).to.have.lengthOf(7);\n chai.expect(stash2.txns[0].props.description).to.equal(\"first\");\n chai.expect(stash2.txns[1].props.description).to.equal(\"second\");\n chai.expect(stash2.txns[2].props.description).to.equal(\"third\");\n chai.expect(stash2.txns[3].props.description).to.equal(\"fourth\");\n chai.expect(stash2.txns[4].props.description).to.equal(\"fifth\");\n chai.expect(stash2.txns[5].props.description).to.equal(\"sixth\");\n chai.expect(stash2.txns[6].props.description).to.equal(\"seventh\");\n\n chai.expect(stash2.txns[0].id).to.equals(\"0x100000000\");\n chai.expect(stash2.txns[1].id).to.equals(\"0x100000001\");\n chai.expect(stash2.txns[2].id).to.equals(\"0x100000002\");\n chai.expect(stash2.txns[3].id).to.equals(\"0x100000003\");\n chai.expect(stash2.txns[4].id).to.equals(\"0x100000004\");\n chai.expect(stash2.txns[5].id).to.equals(\"0x100000005\");\n chai.expect(stash2.txns[6].id).to.equals(\"0x100000006\");\n\n const stashes = StashManager.getStashes(b1);\n chai.expect(stashes).to.have.lengthOf(2);\n chai.expect(stashes[0].description).to.equals(\"stash test 2\");\n chai.expect(stashes[1].description).to.equals(\"stash test 1\");\n chai.expect(stashes[0]).to.deep.equal(stash2);\n chai.expect(stashes[1]).to.deep.equal(stash1);\n\n StashManager.dropAllStashes(b1);\n chai.expect(StashManager.getStashes(b1)).to.have.lengthOf(0);\n });\n it(\"recursively calling withIndirectTxnMode()\", async () => {\n const b1 = await testIModel.openBriefcase();\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\n b1.txns.withIndirectTxnMode(() => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\n\n b1.txns.withIndirectTxnMode(() => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n b1.txns.withIndirectTxnMode(() => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n b1.txns.withIndirectTxnMode(() => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n b1.txns.withIndirectTxnMode(() => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n });\n\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\n\n chai.expect(() =>\n b1.txns.withIndirectTxnMode(() => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n throw new Error(\"Test error\");\n })).to.throw();\n\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\n });\n it(\"should fail to importSchemas() & importSchemaStrings() in indirect scope\", async () => {\n const b1 = await testIModel.openBriefcase();\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"MySchema\" alias=\"ms1\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"my_class\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\n </ECEntityClass>\n </ECSchema>`;\n\n const schemaFile = path.join(KnownTestLocations.outputDir, \"MySchema.01.00.00.ecschema.xml\");\n if (existsSync(schemaFile)) {\n unlinkSync(schemaFile);\n }\n writeFileSync(schemaFile, schema, { encoding: \"utf8\" });\n\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\n await b1.importSchemas([schema]);\n })).to.be.rejectedWith(\"Cannot import schemas while in an indirect change scope\");\n\n b1.abandonChanges();\n\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\n await b1.importSchemaStrings([schema]);\n })).to.be.rejectedWith(\"Cannot import schemas while in an indirect change scope\");\n\n b1.abandonChanges();\n await b1.importSchemaStrings([schema]);\n\n b1.saveChanges();\n await b1.pushChanges({description: \"import schema\"});\n });\n\n it(\"should fail to saveChanges() & pushChanges() in indirect scope\", async () => {\n const b1 = await testIModel.openBriefcase();\n\n await testIModel.insertElement(b1);\n\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\n b1.saveChanges();\n })).to.be.rejectedWith(\"Cannot save changes while in an indirect change scope\");\n\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\n b1.saveChanges();\n })).to.be.throws(\"Cannot save changes while in an indirect change scope\");\n\n b1.saveChanges();\n\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\n await b1.pushChanges({description: \"test\"});\n })).to.be.rejectedWith(\"Cannot push changeset while in an indirect change scope\");\n\n await b1.pushChanges({description: \"test\"});\n });\n\n it(\"should fail to saveFileProperty/deleteFileProperty in indirect scope\", async () => {\n // pull/push/saveFileProperty/deleteFileProperty should be called inside indirect change scope.\n const b1 = await testIModel.openBriefcase();\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"Hello, World\");\n\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"This should fail 1\");\n })).to.be.rejectedWith(\"Cannot save file property while in an indirect change scope\");\n\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\n\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\n b1.deleteFileProperty({ namespace: \"test\", name: \"test\" });\n })).to.be.rejectedWith(\"Cannot delete file property while in an indirect change scope\");\n\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\n\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"This should fail 2\");\n })).to.be.throws(\"Cannot save file property while in an indirect change scope\");\n\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\n\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\n b1.deleteFileProperty({ namespace: \"test\", name: \"test\" });\n })).to.be.throws(\"Cannot delete file property while in an indirect change scope\");\n\n b1.saveChanges();\n });\n\n it(\"recursively calling withIndirectTxnModeAsync()\", async () => {\n const b1 = await testIModel.openBriefcase();\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\n await b1.txns.withIndirectTxnModeAsync(async () => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\n\n await b1.txns.withIndirectTxnModeAsync(async () => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n await b1.txns.withIndirectTxnModeAsync(async () => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n await b1.txns.withIndirectTxnModeAsync(async () => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n await b1.txns.withIndirectTxnModeAsync(async () => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n await b1.txns.withIndirectTxnModeAsync(async () => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n });\n b1.txns.withIndirectTxnMode(() => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n });\n });\n\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\n await chai.expect(\n b1.txns.withIndirectTxnModeAsync(async () => {\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\n throw new Error(\"Test error\");\n })).rejectedWith(Error);\n\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\n });\n it(\"should restore mutually exclusive stashes\", async () => {\n const b1 = await testIModel.openBriefcase();\n\n // stash 1\n const e1 = await testIModel.insertElement(b1);\n chai.expect(e1).to.exist;\n b1.saveChanges(\"first\");\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\", discardLocalChanges: true, retainLocks: true });\n chai.expect(stash1).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.txns.isUndoPossible).to.be.false;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // stash 2\n const e2 = await testIModel.insertElement(b1);\n chai.expect(e2).to.exist;\n b1.saveChanges(\"second\");\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\", discardLocalChanges: true, retainLocks: true });\n chai.expect(stash2).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.txns.isUndoPossible).to.be.false;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // stash 3\n const e3 = await testIModel.insertElement(b1);\n chai.expect(e3).to.exist;\n b1.saveChanges(\"third\");\n const stash3 = await StashManager.stash({ db: b1, description: \"stash test 3\", discardLocalChanges: true, retainLocks: true });\n chai.expect(stash3).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n chai.expect(b1.txns.isUndoPossible).to.be.false;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n chai.expect(e1).not.equals(e2);\n chai.expect(e1).not.equals(e3);\n chai.expect(e2).not.equals(e3);\n\n const stashes = StashManager.getStashes(b1);\n chai.expect(stashes).to.have.lengthOf(3);\n chai.expect(stashes[0].description).to.equals(\"stash test 3\");\n chai.expect(stashes[1].description).to.equals(\"stash test 2\");\n chai.expect(stashes[2].description).to.equals(\"stash test 1\");\n\n // restore stash 1\n await StashManager.restore({ db: b1, stash: stash1 });\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n\n // restore stash 2\n await StashManager.restore({ db: b1, stash: stash2 });\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n\n // restore stash 3\n await StashManager.restore({ db: b1, stash: stash3 });\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\n });\n it(\"should restore stash in any order\", async () => {\n const b1 = await testIModel.openBriefcase();\n\n // stash 1\n const e1 = await testIModel.insertElement(b1);\n chai.expect(e1).to.exist;\n b1.saveChanges(\"first\");\n // do not discard local changes\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\" });\n chai.expect(stash1).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.txns.isUndoPossible).to.be.true;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // stash 2\n const e2 = await testIModel.insertElement(b1);\n chai.expect(e2).to.exist;\n b1.saveChanges(\"second\");\n // do not discard local changes\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\" });\n chai.expect(stash2).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.txns.isUndoPossible).to.be.true;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // stash 3\n const e3 = await testIModel.insertElement(b1);\n chai.expect(e3).to.exist;\n b1.saveChanges(\"third\");\n // do not discard local changes\n const stash3 = await StashManager.stash({ db: b1, description: \"stash test 3\" });\n chai.expect(stash3).to.exist;\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\n chai.expect(b1.txns.isUndoPossible).to.be.true;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n const stashes = StashManager.getStashes(b1);\n chai.expect(stashes).to.have.lengthOf(3);\n chai.expect(stashes[0].description).to.equals(\"stash test 3\");\n chai.expect(stashes[1].description).to.equals(\"stash test 2\");\n chai.expect(stashes[2].description).to.equals(\"stash test 1\");\n\n await b1.discardChanges({ retainLocks: true });\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n chai.expect(b1.txns.isUndoPossible).to.be.false;\n chai.expect(b1.txns.isRedoPossible).to.be.false;\n\n // restore stash 1\n await StashManager.restore({ db: b1, stash: stash1 });\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n\n\n // restore stash 2\n await StashManager.restore({ db: b1, stash: stash2 });\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\n\n // restore stash 3\n await StashManager.restore({ db: b1, stash: stash3 });\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\n\n });\n it(\"should restore stash when briefcase has advanced to latest changeset\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n chai.expect(b1.changeset.index).to.equals(2);\n chai.expect(b2.changeset.index).to.equals(2);\n\n const e1 = await testIModel.insertElement(b1);\n chai.expect(e1).to.exist;\n b1.saveChanges();\n await b1.pushChanges({ description: `${e1} inserted` });\n\n chai.expect(b1.changeset.index).to.equals(3);\n\n const e2 = await testIModel.insertElement(b2);\n chai.expect(e2).to.exist;\n b2.saveChanges();\n\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\n\n const b2Stash1 = await StashManager.stash({ db: b2, description: \"stash test 1\", discardLocalChanges: true });\n chai.expect(b2Stash1.parentChangeset.index).to.equals(2);\n\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b2.elements.tryGetElement(e2)).to.undefined;\n\n await b2.pullChanges();\n chai.expect(b2.changeset.index).to.equals(3);\n\n chai.expect(b2.elements.tryGetElement(e1)).to.exist;\n chai.expect(b2.elements.tryGetElement(e2)).to.undefined;\n\n // stash restore should downgrade briefcase to older changeset as specified in stash\n await StashManager.restore({ db: b2, stash: b2Stash1 });\n chai.expect(b2.changeset.index).to.equals(2);\n\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\n\n await b2.pullChanges();\n chai.expect(b2.changeset.index).to.equals(3);\n chai.expect(b2.elements.tryGetElement(e1)).to.exist;\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\n\n await b2.pushChanges({ description: \"test\" });\n chai.expect(b2.changeset.index).to.equals(4);\n });\n it(\"restore stash that has element changed by another briefcase\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n chai.expect(b1.changeset.index).to.equals(2);\n chai.expect(b2.changeset.index).to.equals(2);\n\n const e1 = await testIModel.insertElement(b1);\n chai.expect(e1).to.exist;\n b1.saveChanges();\n await b1.pushChanges({ description: `${e1} inserted` });\n\n chai.expect(b1.changeset.index).to.equals(3);\n\n await b2.pullChanges();\n chai.expect(b2.changeset.index).to.equals(3);\n await testIModel.updateElement(b2, e1);\n b2.saveChanges();\n\n chai.expect(b2.locks.holdsExclusiveLock(e1)).to.be.true;\n const b2Stash1 = await StashManager.stash({ db: b2, description: \"stash test 1\", discardLocalChanges: true });\n chai.expect(b2Stash1.parentChangeset.index).to.equals(3);\n chai.expect(b2.locks.holdsExclusiveLock(e1)).to.be.false;\n\n // stash release lock so b2 should have released lock and b1 should be able to update.\n await testIModel.updateElement(b1, e1);\n b1.saveChanges();\n\n // restore stash should fail because of lock not obtained on e1\n await chai.expect(StashManager.restore({ db: b2, stash: b2Stash1 })).to.be.rejectedWith(\"exclusive lock is already held\");\n\n // push b1 changes to release lock\n await b1.pushChanges({ description: `${e1} inserted` });\n\n // restore stash should fail because pull is required to obtain lock\n await chai.expect(StashManager.restore({ db: b2, stash: b2Stash1 })).to.be.rejectedWith(\"pull is required to obtain lock\");\n\n await b2.pullChanges();\n\n chai.expect(b2.changeset.index).to.equals(4);\n const elBefore = b2.elements.tryGetElementProps(e1);\n chai.expect((elBefore as any).prop1).to.equals(\"2\");\n // restore stash should succeed as now it can obtain lock\n await StashManager.restore({ db: b2, stash: b2Stash1 });\n\n const elAfter = b2.elements.tryGetElementProps(e1);\n chai.expect((elAfter as any).prop1).to.equals(\"1\");\n await b2.pushChanges({ description: `${e1} updated` });\n });\n it(\"schema change should not be stashed\", async () => {\n const b1 = await testIModel.openBriefcase();\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.01\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"a1\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\n <ECProperty propertyName=\"prop2\" typeName=\"string\" />\n </ECEntityClass>\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\n <Class class=\"a1\"/>\n </Source>\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\n <Class class=\"a1\"/>\n </Target>\n </ECRelationshipClass>\n </ECSchema>`;\n await b1.importSchemaStrings([schema1]);\n b1.saveChanges();\n\n await chai.expect(StashManager.stash({ db: b1, description: \"stash test 1\" })).to.not.rejectedWith(\"Bad Arg: Pending schema changeset stashing is not currently supported\");\n });\n it(\"abort rebase\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n const e1 = await testIModel.insertElement(b1);\n b1.saveChanges();\n await b1.pushChanges({ description: `${e1} inserted` });\n\n const e2 = await testIModel.insertElement(b2);\n chai.expect(e2).to.exist;\n let e3 = \"\";\n b2.saveChanges();\n b2.txns.rebaser.setCustomHandler({\n shouldReinstate: (_txnProps: TxnProps) => {\n return true;\n },\n recompute: async (_txnProps: TxnProps) => {\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\n e3 = await testIModel.insertElement(b2);\n throw new Error(\"Rebase failed\");\n },\n });\n\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined;\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined;\n chai.expect(b2.changeset.index).to.equals(2);\n await chai.expect(b2.pullChanges()).to.be.rejectedWith(\"Rebase failed\");\n\n chai.expect(b2.changeset.index).to.equals(3);\n chai.expect(e3).to.exist;\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist; // came from incoming changeset\n chai.expect(b2.elements.tryGetElementProps(e2)).to.undefined; // was local change and reversed during rebase.\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // was insert by reCompute() but due to exception the rebase attempt was abandoned.\n\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\n\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\n await b2.txns.rebaser.abort();\n\n chai.expect(b2.changeset.index).to.equals(2);\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined; // reset briefcase should move tip back to where it was before pull\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist; // abort should put back e2 which was only change at the time of pull\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // add by rebase so should not exist either\n\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.false;\n });\n it(\"getStash() should throw exception\", async () => {\n const b1 = await testIModel.openBriefcase();\n chai.expect(() => StashManager.getStash({ db: b1, stash: \"invalid_stash\" })).to.throw(\"Invalid stash\");\n chai.expect(StashManager.tryGetStash({ db: b1, stash: \"invalid_stash\" })).to.be.undefined;\n });\n it(\"edge case: a indirect update can cause FK violation\", async () => {\n const b1 = await testIModel.openBriefcase();\n const b2 = await testIModel.openBriefcase();\n\n const parentId = await testIModel.insertElement(b1);\n const childId = await testIModel.insertElement2(b1, { parent: { id: parentId, relClassName: \"TestDomain:A1OwnsA1\" } });\n b1.saveChanges(\"insert parent and child\");\n await b1.pushChanges({ description: `inserted parent ${parentId} and child ${childId}` });\n await b2.pullChanges();\n\n // b1 delete childId while b1 create a child of childId as indirect change\n await testIModel.deleteElement(b1, childId);\n b1.saveChanges(\"delete child\");\n // no exclusive lock required on child1\n const grandChildId = await testIModel.insertElement2(b2, { parent: { id: childId, relClassName: \"TestDomain:A1OwnsA1\" }, markAsIndirect: true });\n b2.saveChanges(\"delete child and insert grandchild\");\n\n await b1.pushChanges({ description: `deleted child ${childId}` });\n\n // should fail to pull and rebase changes.\n await chai.expect(b2.pushChanges({ description: `deleted child ${childId} and inserted grandchild ${grandChildId}` }))\n .to.be.rejectedWith(\"Foreign key conflicts in ChangeSet. Aborting rebase.\");\n });\n\n it(\"ECSqlReader unable to read updates after saveChanges()\", async () => {\n const b1 = await testIModel.openBriefcase();\n const findElement = async (id: Id64String) => {\n const reader = b1.createQueryReader(`SELECT ECInstanceId, ec_className(ECClassId), Prop1 FROM ts.A1 WHERE ECInstanceId = ${id}`, QueryBinder.from([id]));\n if (await reader.step())\n return { id: reader.current[0], className: reader.current[1], prop1: reader.current[2] };\n return undefined;\n }\n\n const runQuery = async (query: string) => {\n const reader = b1.createQueryReader(query);\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n return rows;\n }\n const runQueryParallel = async (query: string, times: number = 1) => {\n return Promise.all(new Array(times).fill(query).map(runQuery));\n }\n\n // Following query have open cached statement against BisCore.Element that will prevent\n // updates from being visible until the statement is finalized.\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\n\n const e1 = await testIModel.insertElement(b1);\n chai.expect(await findElement(e1)).to.be.undefined;\n b1.saveChanges(\"insert element\");\n\n const e1Props = await findElement(e1);\n chai.expect(e1Props).to.exist;\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\n const e2 = await testIModel.insertElement(b1);\n chai.expect(await findElement(e2)).to.be.undefined;\n b1.saveChanges(\"insert second element\");\n\n const e2Props = await findElement(e2);\n chai.expect(e2Props).to.exist;\n\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\n const e3 = await testIModel.insertElement(b1);\n chai.expect(await findElement(e3)).to.be.undefined;\n b1.saveChanges(\"insert third element\");\n\n const e3Props = await findElement(e3);\n chai.expect(e3Props).to.exist;\n });\n});\n\n"]}
|
|
@@ -59,7 +59,7 @@ import * as path from "path";
|
|
|
59
59
|
import * as semver from "semver";
|
|
60
60
|
import * as sinon from "sinon";
|
|
61
61
|
import { DbResult, Guid, Id64, IModelStatus, Logger, OpenMode, ProcessDetector } from "@itwin/core-bentley";
|
|
62
|
-
import { BisCodeSpec, BriefcaseIdValue, Code, CodeScopeSpec, CodeSpec, ColorByName, ColorDef, DisplayStyleSettings, EcefLocation, FontMap, FontType, GeoCoordStatus, GeographicCRS, GeometryParams, GeometryStreamBuilder, ImageSourceFormat, IModel, IModelError, RelatedElement, RenderMode, SchemaState, SubCategoryAppearance, TextureMapping, TextureMapUnits, ViewFlags, } from "@itwin/core-common";
|
|
62
|
+
import { BisCodeSpec, BriefcaseIdValue, Code, CodeScopeSpec, CodeSpec, ColorByName, ColorDef, DisplayStyleSettings, EcefLocation, FontMap, FontType, GeoCoordStatus, GeographicCRS, GeometryParams, GeometryStreamBuilder, ImageSourceFormat, IModel, IModelError, QueryBinder, RelatedElement, RenderMode, SchemaState, SubCategoryAppearance, TextureMapping, TextureMapUnits, ViewFlags, } from "@itwin/core-common";
|
|
63
63
|
import { Geometry, LineString3d, Loop, Matrix4d, Point3d, PolyfaceBuilder, Range3d, StrokeOptions, Transform, YawPitchRollAngles, } from "@itwin/core-geometry";
|
|
64
64
|
import { V2CheckpointManager } from "../../CheckpointManager";
|
|
65
65
|
import { _nativeDb, BisCoreSchema, Category, ClassRegistry, DefinitionContainer, DefinitionGroup, DefinitionGroupGroupsDefinitions, DefinitionModel, DefinitionPartition, DictionaryModel, DisplayStyle3d, DocumentPartition, DrawingGraphic, Element, ElementDrivesElement, ElementGroupsMembers, ElementOwnsChildElements, GenericGraphicalType2d, GeometricElement2d, GeometricElement3d, GeometricModel, GroupInformationPartition, IModelDb, IModelHost, IModelJsFs, InformationPartitionElement, InformationRecordElement, LinkPartition, Model, PhysicalElement, PhysicalModel, PhysicalObject, PhysicalPartition, RenderMaterialElement, SnapshotDb, SpatialCategory, SqliteValueType, StandaloneDb, SubCategory, Subject, Texture, } from "../../core-backend";
|
|
@@ -71,7 +71,7 @@ import { DisableNativeAssertions } from "../TestUtils";
|
|
|
71
71
|
import { samplePngTexture } from "../imageData";
|
|
72
72
|
import { performance } from "perf_hooks";
|
|
73
73
|
import { _hubAccess } from "../../internal/Symbols";
|
|
74
|
-
import { CustomAttributeClass, EntityClass, PropertyType, propertyTypeToString, SchemaItemType } from "@itwin/ecschema-metadata";
|
|
74
|
+
import { CustomAttributeClass, ECVersion, EntityClass, PropertyType, propertyTypeToString, SchemaItemType } from "@itwin/ecschema-metadata";
|
|
75
75
|
// spell-checker: disable
|
|
76
76
|
async function getIModelError(promise) {
|
|
77
77
|
try {
|
|
@@ -2930,5 +2930,178 @@ describe("iModel", () => {
|
|
|
2930
2930
|
}
|
|
2931
2931
|
testImodel.close();
|
|
2932
2932
|
});
|
|
2933
|
+
it("should update codeValues that are switched between elements", async () => {
|
|
2934
|
+
const dbFileName = IModelTestUtils.prepareOutputFile("IModel", "change-codeValues.bim");
|
|
2935
|
+
const imodelDb = SnapshotDb.createEmpty(dbFileName, {
|
|
2936
|
+
rootSubject: { name: "change-codeValues" },
|
|
2937
|
+
});
|
|
2938
|
+
let categoryA = SpatialCategory.create(imodelDb, IModel.dictionaryId, "A");
|
|
2939
|
+
let categoryB = SpatialCategory.create(imodelDb, IModel.dictionaryId, "B");
|
|
2940
|
+
categoryA.userLabel = "A";
|
|
2941
|
+
categoryB.userLabel = "B";
|
|
2942
|
+
categoryA.insert();
|
|
2943
|
+
categoryB.insert();
|
|
2944
|
+
imodelDb.saveChanges();
|
|
2945
|
+
categoryA = imodelDb.elements.getElement(SpatialCategory.createCode(imodelDb, IModel.dictionaryId, "A"));
|
|
2946
|
+
categoryB = imodelDb.elements.getElement(SpatialCategory.createCode(imodelDb, IModel.dictionaryId, "B"));
|
|
2947
|
+
categoryA.code.value = "temp";
|
|
2948
|
+
categoryA.update();
|
|
2949
|
+
categoryB.code.value = "A";
|
|
2950
|
+
categoryB.update();
|
|
2951
|
+
categoryA.code.value = "B";
|
|
2952
|
+
categoryA.update();
|
|
2953
|
+
imodelDb.saveChanges();
|
|
2954
|
+
categoryA = imodelDb.elements.getElement(SpatialCategory.createCode(imodelDb, IModel.dictionaryId, "A"));
|
|
2955
|
+
categoryB = imodelDb.elements.getElement(SpatialCategory.createCode(imodelDb, IModel.dictionaryId, "B"));
|
|
2956
|
+
expect(categoryA.userLabel).to.equal("B", `categoryA.userLabel mismatch in ${imodelDb.name}`);
|
|
2957
|
+
expect(categoryB.userLabel).to.equal("A", `categoryB.userLabel mismatch in ${imodelDb.name}`);
|
|
2958
|
+
imodelDb.close();
|
|
2959
|
+
});
|
|
2960
|
+
it("should provide meaningful error when querying a closed iModel", () => {
|
|
2961
|
+
const testImodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile("IModel", "QueryingClosedImodel.bim"), { rootSubject: { name: "QueryClosedTest" } });
|
|
2962
|
+
assert.isTrue(testImodel.isOpen);
|
|
2963
|
+
// Close the iModel for the tests
|
|
2964
|
+
testImodel.close();
|
|
2965
|
+
assert.isFalse(testImodel.isOpen);
|
|
2966
|
+
const closedDbError = "Cannot query a closed Db";
|
|
2967
|
+
expect(() => testImodel.withPreparedSqliteStatement("SELECT 1", () => { })).to.throw(closedDbError);
|
|
2968
|
+
expect(() => testImodel.withPreparedSqliteStatement("SELECT 1", () => { })).to.throw(closedDbError);
|
|
2969
|
+
expect(() => testImodel.prepareSqliteStatement("SELECT 1")).to.throw(closedDbError);
|
|
2970
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
2971
|
+
expect(() => testImodel.prepareStatement("SELECT 1")).to.throw(closedDbError);
|
|
2972
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
2973
|
+
expect(() => testImodel.withPreparedStatement("SELECT ECInstanceId FROM BisCore:Element LIMIT 1", () => { })).to.throw(closedDbError);
|
|
2974
|
+
expect(() => testImodel.elements.queryChildren(IModel.rootSubjectId)).to.throw(closedDbError);
|
|
2975
|
+
expect(() => testImodel.elements.getAspects("0x1", "WrongSchema:WrongClass")).to.throw("db is not open");
|
|
2976
|
+
expect(() => testImodel.createQueryReader("SELECT 1")).to.throw("db not open");
|
|
2977
|
+
});
|
|
2978
|
+
describe("Delete relationship instances", () => {
|
|
2979
|
+
let testImodel;
|
|
2980
|
+
const relationshipClasses = [
|
|
2981
|
+
"BisCore:ElementGroupsMembers",
|
|
2982
|
+
"BisCore:ElementDrivesElement",
|
|
2983
|
+
"BisCore:ElementRefersToDocuments"
|
|
2984
|
+
];
|
|
2985
|
+
afterEach(() => {
|
|
2986
|
+
if (testImodel !== undefined) {
|
|
2987
|
+
const iModelPath = testImodel.pathName;
|
|
2988
|
+
if (testImodel.isOpen)
|
|
2989
|
+
testImodel.close();
|
|
2990
|
+
IModelJsFs.unlinkSync(iModelPath);
|
|
2991
|
+
}
|
|
2992
|
+
});
|
|
2993
|
+
function setupRelationships(numOfRelationships, multipleClasses = false) {
|
|
2994
|
+
testImodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile("IModel", "DeleteRelationshipInstances.bim"), { rootSubject: { name: "DeleteRelationshipInstances" } });
|
|
2995
|
+
assert.isTrue(testImodel.isOpen);
|
|
2996
|
+
const [, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);
|
|
2997
|
+
let spatialCategoryId = SpatialCategory.queryCategoryIdByName(testImodel, IModel.dictionaryId, "MySpatialCategory");
|
|
2998
|
+
if (!spatialCategoryId) {
|
|
2999
|
+
spatialCategoryId = SpatialCategory.insert(testImodel, IModel.dictionaryId, "MySpatialCategory", new SubCategoryAppearance());
|
|
3000
|
+
}
|
|
3001
|
+
const relationships = [];
|
|
3002
|
+
for (let i = 0; i < numOfRelationships; ++i) {
|
|
3003
|
+
const sourceProps = createElemProps(testImodel, newModelId, spatialCategoryId, "Generic:PhysicalObject");
|
|
3004
|
+
const sourceId = testImodel.elements.insertElement(sourceProps);
|
|
3005
|
+
const targetProps = createElemProps(testImodel, newModelId, spatialCategoryId, "Generic:PhysicalObject");
|
|
3006
|
+
const targetId = testImodel.elements.insertElement(targetProps);
|
|
3007
|
+
let relationshipClass = "BisCore:ElementGroupsMembers";
|
|
3008
|
+
if (multipleClasses)
|
|
3009
|
+
relationshipClass = relationshipClasses[i % relationshipClasses.length];
|
|
3010
|
+
const relationshipProps = {
|
|
3011
|
+
classFullName: relationshipClass,
|
|
3012
|
+
sourceId,
|
|
3013
|
+
targetId,
|
|
3014
|
+
};
|
|
3015
|
+
relationshipProps.id = testImodel.relationships.insertInstance(relationshipProps);
|
|
3016
|
+
relationships.push(relationshipProps);
|
|
3017
|
+
}
|
|
3018
|
+
testImodel.saveChanges();
|
|
3019
|
+
return relationships;
|
|
3020
|
+
}
|
|
3021
|
+
async function getRelationshipCount(iModel, relationshipClass) {
|
|
3022
|
+
const reader = iModel.createQueryReader(`SELECT COUNT(*) AS [count] FROM ${relationshipClass}`);
|
|
3023
|
+
await reader.step();
|
|
3024
|
+
return reader.current.count;
|
|
3025
|
+
}
|
|
3026
|
+
it("deleteInstances with an empty array", async () => {
|
|
3027
|
+
const relationships = setupRelationships(10);
|
|
3028
|
+
assert.equal(relationships.length, await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers"));
|
|
3029
|
+
testImodel.relationships.deleteInstances([]);
|
|
3030
|
+
testImodel.saveChanges();
|
|
3031
|
+
assert.equal(relationships.length, await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers"));
|
|
3032
|
+
});
|
|
3033
|
+
it("deleteInstances with a single relationship instance", async () => {
|
|
3034
|
+
const relationships = setupRelationships(10);
|
|
3035
|
+
assert.equal(relationships.length, await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers"), "Should delete exactly one relationship");
|
|
3036
|
+
// Delete just one relationship using deleteInstances method
|
|
3037
|
+
testImodel.relationships.deleteInstances([relationships[0]]);
|
|
3038
|
+
testImodel.saveChanges();
|
|
3039
|
+
const remainingCount = await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers");
|
|
3040
|
+
assert.equal(remainingCount, relationships.length - 1, "Should delete exactly one relationship");
|
|
3041
|
+
});
|
|
3042
|
+
it("deleteInstances with different relationship classes", async () => {
|
|
3043
|
+
const relationships = setupRelationships(500, true);
|
|
3044
|
+
// Verify relationships were created across different classes
|
|
3045
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers") >= Math.floor(relationships.length / 3));
|
|
3046
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementDrivesElement") >= Math.floor(relationships.length / 3));
|
|
3047
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementRefersToDocuments") >= Math.floor(relationships.length / 3));
|
|
3048
|
+
// Test deleteInstances with mixed relationship classes
|
|
3049
|
+
testImodel.relationships.deleteInstances(relationships);
|
|
3050
|
+
testImodel.saveChanges();
|
|
3051
|
+
// Verify all relationships were deleted regardless of their class
|
|
3052
|
+
assert.equal(0, await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers"), "All ElementGroupsMembers relationships should be deleted");
|
|
3053
|
+
assert.equal(0, await getRelationshipCount(testImodel, "BisCore.ElementDrivesElement"), "All ElementDrivesElement relationships should be deleted");
|
|
3054
|
+
assert.equal(0, await getRelationshipCount(testImodel, "BisCore.ElementRefersToDocuments"), "All ElementRefersToDocuments relationships should be deleted");
|
|
3055
|
+
});
|
|
3056
|
+
it("deleteInstances for random relationship instances", async () => {
|
|
3057
|
+
const relationships = setupRelationships(1000, true);
|
|
3058
|
+
// Verify relationships exist before deletion
|
|
3059
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers") >= Math.floor(relationships.length / 3));
|
|
3060
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementDrivesElement") >= Math.floor(relationships.length / 3));
|
|
3061
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementRefersToDocuments") >= Math.floor(relationships.length / 3));
|
|
3062
|
+
// Create a subset of random relationship entries to delete
|
|
3063
|
+
const relationshipsToDelete = [];
|
|
3064
|
+
for (let i = 0; i < 250; ++i) {
|
|
3065
|
+
relationshipsToDelete.push(relationships[Math.floor(Math.random() * (relationships.length + 1))]);
|
|
3066
|
+
}
|
|
3067
|
+
testImodel.relationships.deleteInstances(relationshipsToDelete);
|
|
3068
|
+
testImodel.saveChanges();
|
|
3069
|
+
// Verify all relationships were deleted
|
|
3070
|
+
for (const relClass of relationshipsToDelete) {
|
|
3071
|
+
const reader = testImodel.createQueryReader(`SELECT ECInstanceId FROM ${relClass.classFullName} WHERE SourceECInstanceId=? AND TargetECInstanceId=?`, new QueryBinder().bindId(1, relClass.sourceId).bindId(2, relClass.targetId));
|
|
3072
|
+
assert.isFalse(await reader.step(), `Relationship ${relClass.id} should be deleted`); // No row should be returned
|
|
3073
|
+
}
|
|
3074
|
+
});
|
|
3075
|
+
});
|
|
3076
|
+
});
|
|
3077
|
+
describe("IModelDb.requireMinimumSchemaVersion", () => {
|
|
3078
|
+
let imodel;
|
|
3079
|
+
before(() => imodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile("IModel", "MinSchemaVer.bim"), { rootSubject: { name: "MinSchemaVer" } }));
|
|
3080
|
+
after(() => imodel.close());
|
|
3081
|
+
it("throws if the schema does not exist", () => {
|
|
3082
|
+
expect(() => imodel.requireMinimumSchemaVersion("FakeSchema", new ECVersion(1, 0, 0), "Scrobbles")).to.throw("Scrobbles requires FakeSchema v01.00.00 or newer");
|
|
3083
|
+
});
|
|
3084
|
+
it("throws IFF the schema version is older than the minimum", () => {
|
|
3085
|
+
function test(minVer, expectError) {
|
|
3086
|
+
expect(imodel.meetsMinimumSchemaVersion("BisCore", minVer)).to.equal(!expectError);
|
|
3087
|
+
const require = () => imodel.requireMinimumSchemaVersion("BisCore", minVer, "Scrobbles");
|
|
3088
|
+
if (expectError) {
|
|
3089
|
+
expect(require).to.throw(`Scrobbles requires BisCore v${minVer.toString()} or newer`);
|
|
3090
|
+
}
|
|
3091
|
+
else {
|
|
3092
|
+
require();
|
|
3093
|
+
}
|
|
3094
|
+
}
|
|
3095
|
+
const bisVer = imodel.querySchemaVersionNumbers("BisCore");
|
|
3096
|
+
expect(bisVer.read).to.equal(1);
|
|
3097
|
+
expect(bisVer.write).to.equal(0);
|
|
3098
|
+
expect(bisVer.minor).to.least(24);
|
|
3099
|
+
test(bisVer, false);
|
|
3100
|
+
test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor - 1), false);
|
|
3101
|
+
test(new ECVersion(0, 0, 1), false);
|
|
3102
|
+
test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor + 1), true);
|
|
3103
|
+
test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor + 1), true);
|
|
3104
|
+
test(new ECVersion(bisVer.read + 1, bisVer.write + 1, bisVer.minor), true);
|
|
3105
|
+
});
|
|
2933
3106
|
});
|
|
2934
3107
|
//# sourceMappingURL=IModel.test.js.map
|