@itwin/core-backend 5.15.0-dev.19 → 5.15.0-dev.20

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteDefinitionElements.test.js","sourceRoot":"","sources":["../../../../src/test/element/DeleteDefinitionElements.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert } from \"chai\";\r\nimport * as path from \"path\";\r\nimport { Id64, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nimport { Code, CodeScopeSpec, GeometricElement2dProps, GeometryPartProps, ImageSourceFormat, IModel, PhysicalElementProps, PhysicalTypeProps, QueryBinder, QueryRowFormat, SubCategoryAppearance, TypeDefinitionElementProps } from \"@itwin/core-common\";\r\nimport { EditTxn } from \"../../EditTxn\";\r\nimport {\r\n CategorySelector, ChannelControl, DefinitionContainer, DefinitionModel, DisplayStyle2d, DisplayStyle3d, DocumentListModel, Drawing, DrawingCategory,\r\n DrawingGraphic, DrawingViewDefinition, GenericGraphicalType2d, GenericPhysicalType, GeometryPart,\r\n GraphicalElement2dIsOfType, IModelJsFs, InformationPartitionElement, ModelSelector, OrthographicViewDefinition, PhysicalElementIsOfType,\r\n PhysicalModel, PhysicalPartition, RenderMaterialElement, SnapshotDb, SpatialCategory, SubCategory, Subject, Texture,\r\n} from \"../../core-backend\";\r\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { withEditTxn } from \"../TestEditTxn\";\r\n\r\ndescribe(\"DeleteDefinitionElements\", () => {\r\n const outputDir: string = path.join(KnownTestLocations.outputDir, \"DeleteDefinitionElements\");\r\n\r\n let seedDb: SnapshotDb;\r\n let iModelDb: SnapshotDb;\r\n let subjectId: Id64String;\r\n let definitionModelId: Id64String;\r\n let physicalModelId: Id64String;\r\n let spatialCategoryId: Id64String;\r\n let subCategoryId: Id64String;\r\n let spatialCategorySelectorId: Id64String;\r\n let modelSelectorId: Id64String;\r\n let displayStyle3dId: Id64String;\r\n let viewId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let drawingCategorySelectorId: Id64String;\r\n let displayStyle2dId: Id64String;\r\n let drawingViewId: Id64String;\r\n let geometryPartId: Id64String;\r\n let renderMaterialId: Id64String;\r\n let textureId: Id64String;\r\n let physicalObjectId1: Id64String;\r\n let physicalObjectId2: Id64String;\r\n let physicalObjectId3: Id64String;\r\n\r\n before(async () => {\r\n if (!IModelJsFs.existsSync(KnownTestLocations.outputDir)) {\r\n IModelJsFs.mkdirSync(KnownTestLocations.outputDir);\r\n }\r\n if (!IModelJsFs.existsSync(outputDir)) {\r\n IModelJsFs.mkdirSync(outputDir);\r\n }\r\n\r\n const seedDbFile = IModelTestUtils.prepareOutputFile(\"DeleteDefinitionElements\", \"seed.bim\");\r\n if (IModelJsFs.existsSync(seedDbFile)) {\r\n IModelJsFs.removeSync(seedDbFile);\r\n }\r\n seedDb = SnapshotDb.createEmpty(seedDbFile, { rootSubject: { name: \"DeleteDefinitionElements\" } });\r\n await ExtensiveTestScenario.prepareDb(seedDb);\r\n await ExtensiveTestScenario.populateDb(seedDb);\r\n\r\n // Get ElementIds of DefinitionElements created by populateDb\r\n subjectId = seedDb.elements.queryElementIdByCode(Subject.createCode(seedDb, IModel.rootSubjectId, \"Subject\"))!;\r\n definitionModelId = seedDb.elements.queryElementIdByCode(InformationPartitionElement.createCode(seedDb, subjectId, \"Definition\"))!;\r\n physicalModelId = seedDb.elements.queryElementIdByCode(PhysicalPartition.createCode(seedDb, subjectId, \"Physical\"))!;\r\n spatialCategoryId = seedDb.elements.queryElementIdByCode(SpatialCategory.createCode(seedDb, definitionModelId, \"SpatialCategory\"))!;\r\n subCategoryId = seedDb.elements.queryElementIdByCode(SubCategory.createCode(seedDb, spatialCategoryId, \"SubCategory\"))!;\r\n spatialCategorySelectorId = seedDb.elements.queryElementIdByCode(CategorySelector.createCode(seedDb, definitionModelId, \"SpatialCategories\"))!;\r\n modelSelectorId = seedDb.elements.queryElementIdByCode(ModelSelector.createCode(seedDb, definitionModelId, \"SpatialModels\"))!;\r\n displayStyle3dId = seedDb.elements.queryElementIdByCode(DisplayStyle3d.createCode(seedDb, definitionModelId, \"DisplayStyle3d\"))!;\r\n viewId = seedDb.elements.queryElementIdByCode(OrthographicViewDefinition.createCode(seedDb, definitionModelId, \"Orthographic View\"))!;\r\n drawingCategoryId = seedDb.elements.queryElementIdByCode(DrawingCategory.createCode(seedDb, definitionModelId, \"DrawingCategory\"))!;\r\n drawingCategorySelectorId = seedDb.elements.queryElementIdByCode(CategorySelector.createCode(seedDb, definitionModelId, \"DrawingCategories\"))!;\r\n displayStyle2dId = seedDb.elements.queryElementIdByCode(DisplayStyle2d.createCode(seedDb, definitionModelId, \"DisplayStyle2d\"))!;\r\n drawingViewId = seedDb.elements.queryElementIdByCode(DrawingViewDefinition.createCode(seedDb, definitionModelId, \"Drawing View\"))!;\r\n geometryPartId = seedDb.elements.queryElementIdByCode(GeometryPart.createCode(seedDb, definitionModelId, \"GeometryPart\"))!;\r\n renderMaterialId = seedDb.elements.queryElementIdByCode(RenderMaterialElement.createCode(seedDb, definitionModelId, \"RenderMaterial\"))!;\r\n textureId = seedDb.elements.queryElementIdByCode(Texture.createCode(seedDb, definitionModelId, \"Texture\"))!;\r\n physicalObjectId1 = IModelTestUtils.queryByUserLabel(seedDb, \"PhysicalObject1\");\r\n physicalObjectId2 = IModelTestUtils.queryByUserLabel(seedDb, \"PhysicalObject2\");\r\n physicalObjectId3 = IModelTestUtils.queryByUserLabel(seedDb, \"PhysicalObject3\");\r\n\r\n assert.isTrue(Id64.isValidId64(physicalModelId));\r\n assert.isTrue(Id64.isValidId64(spatialCategoryId));\r\n assert.isTrue(Id64.isValidId64(subCategoryId));\r\n assert.isTrue(Id64.isValidId64(spatialCategorySelectorId));\r\n assert.isTrue(Id64.isValidId64(modelSelectorId));\r\n assert.isTrue(Id64.isValidId64(displayStyle3dId));\r\n assert.isTrue(Id64.isValidId64(viewId));\r\n assert.isTrue(Id64.isValidId64(drawingCategoryId));\r\n assert.isTrue(Id64.isValidId64(drawingCategorySelectorId));\r\n assert.isTrue(Id64.isValidId64(displayStyle2dId));\r\n assert.isTrue(Id64.isValidId64(drawingViewId));\r\n assert.isTrue(Id64.isValidId64(geometryPartId));\r\n assert.isTrue(Id64.isValidId64(renderMaterialId));\r\n assert.isTrue(Id64.isValidId64(textureId));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId1));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId2));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId3));\r\n\r\n withEditTxn(seedDb, \"save changes\", () => { });\r\n });\r\n\r\n beforeEach(async () => {\r\n iModelDb = SnapshotDb.createFrom(seedDb, IModelTestUtils.prepareOutputFile(\"DeleteDefinitionElements\", \"DeleteDefinitionElements.bim\"));\r\n assert.isTrue(iModelDb.isOpen);\r\n iModelDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(() => {\r\n if (iModelDb.isOpen)\r\n iModelDb.close();\r\n });\r\n\r\n after(() => {\r\n if (seedDb.isOpen)\r\n seedDb.close();\r\n });\r\n\r\n it(\"should delete if not used\", async () => {\r\n const txn = new EditTxn(iModelDb, \"delete definition elements\");\r\n txn.start();\r\n\r\n let usedDefinitionElementIds: Id64Set;\r\n const expectDeleteToThrow = (elementId: string) => assert.throws(() => txn.deleteElement(elementId));\r\n\r\n try {\r\n // make sure deleteDefinitionElements skips Elements that are not DefinitionElements\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId1));\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId2));\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId3));\r\n assert.isDefined(iModelDb.elements.tryGetElement(subjectId));\r\n\r\n // make sure deleteDefinitionElements skips invalid Ids\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([Id64.invalid, Id64.invalid]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n\r\n // delete/deleteDefinitionElements for a used GeometryPart should fail\r\n expectDeleteToThrow(geometryPartId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([geometryPartId]);\r\n assert.isTrue(usedDefinitionElementIds.has(geometryPartId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(geometryPartId));\r\n\r\n // deleteDefinitionElements for an unused GeometryPart should succeed, delete should still fail\r\n const unusedGeometryPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: GeometryPart.createCode(iModelDb, definitionModelId, \"Unused GeometryPart\"),\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const unusedGeometryPartId = txn.insertElement(unusedGeometryPartProps);\r\n assert.isTrue(Id64.isValidId64(unusedGeometryPartId));\r\n expectDeleteToThrow(unusedGeometryPartId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedGeometryPartId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedGeometryPartId));\r\n\r\n // delete/deleteDefinitionElements for a used RenderMaterial should fail\r\n expectDeleteToThrow(renderMaterialId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([renderMaterialId]);\r\n assert.isTrue(usedDefinitionElementIds.has(renderMaterialId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(renderMaterialId));\r\n\r\n // deleteDefinitionElements for an unused RenderMaterial should succeed, delete should still fail\r\n const unusedRenderMaterial = RenderMaterialElement.create(iModelDb, definitionModelId, \"Unused RenderMaterial\", { paletteName: \"PaletteName\" });\r\n const unusedRenderMaterialId = txn.insertElement(unusedRenderMaterial.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedRenderMaterialId));\r\n expectDeleteToThrow(unusedRenderMaterialId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedRenderMaterialId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedRenderMaterialId));\r\n\r\n // delete/deleteDefinitionElements for a used Texture should fail\r\n expectDeleteToThrow(textureId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([textureId]);\r\n assert.isTrue(usedDefinitionElementIds.has(textureId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(textureId));\r\n\r\n // deleteDefinitionElements for an unused Texture should succeed, delete should still fail\r\n const textureData = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 3, 0, 0, 0, 3, 8, 2, 0, 0, 0, 217, 74, 34, 232, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, 177, 143, 11, 252, 97, 5, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 14, 195, 0, 0, 14, 195, 1, 199, 111, 168, 100, 0, 0, 0, 24, 73, 68, 65, 84, 24, 87, 99, 248, 15, 4, 12, 12, 64, 4, 198, 64, 46, 132, 5, 162, 254, 51, 0, 0, 195, 90, 10, 246, 127, 175, 154, 145, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130]).toString(\"base64\");\r\n const unusedTexture = Texture.createTexture(iModelDb, definitionModelId, \"Unused Texture\", ImageSourceFormat.Png, textureData, \"Description for Unused Texture\");\r\n const unusedTextureId = txn.insertElement(unusedTexture.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedTextureId));\r\n expectDeleteToThrow(unusedTextureId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedTextureId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedTextureId));\r\n\r\n // delete/deleteDefinitionElements for a used SpatialCategory should fail\r\n expectDeleteToThrow(spatialCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([spatialCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(spatialCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategoryId));\r\n\r\n // delete/deleteDefinitionElements for a default SubCategory should fail\r\n const spatialCategory = iModelDb.elements.getElement<SpatialCategory>(spatialCategoryId, SpatialCategory);\r\n const defaultSpatialSubCategoryId = spatialCategory.myDefaultSubCategoryId();\r\n expectDeleteToThrow(defaultSpatialSubCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([defaultSpatialSubCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(defaultSpatialSubCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(defaultSpatialSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements for a used, non-default SubCategory should fail\r\n expectDeleteToThrow(subCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([subCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(subCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(subCategoryId));\r\n\r\n // deleteDefinitionElements for an unused SubCategory should succeed, delete should still fail\r\n const unusedSubCategory = SubCategory.create(iModelDb, spatialCategoryId, \"Unused SubCategory\", {});\r\n const unusedSubCategoryId = txn.insertElement(unusedSubCategory.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedSubCategoryId));\r\n expectDeleteToThrow(unusedSubCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedSubCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSubCategoryId));\r\n\r\n // deleteDefinitionElements for an unused SpatialCategory should succeed, delete should still fail\r\n const unusedSpatialCategory = SpatialCategory.create(iModelDb, definitionModelId, \"Unused SpatialCategory\");\r\n const unusedSpatialCategoryId = txn.insertElement(unusedSpatialCategory.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryId));\r\n const reloadedSpatialCategory = iModelDb.elements.getElement<SpatialCategory>(unusedSpatialCategoryId, SpatialCategory);\r\n const unusedSpatialCategoryDefaultSubCategoryId = reloadedSpatialCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryDefaultSubCategoryId));\r\n expectDeleteToThrow(unusedSpatialCategoryId);\r\n expectDeleteToThrow(unusedSpatialCategoryDefaultSubCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedSpatialCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryDefaultSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements of a used DrawingCategory should fail\r\n expectDeleteToThrow(drawingCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([drawingCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(drawingCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategoryId));\r\n\r\n // deleteDefinitionElements for an unused DrawingCategory should succeed, delete should still fail\r\n const unusedDrawingCategory = DrawingCategory.create(iModelDb, definitionModelId, \"Unused DrawingCategory\");\r\n const unusedDrawingCategoryId = txn.insertElement(unusedDrawingCategory.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedDrawingCategoryId));\r\n const reloadedDrawingCategory = iModelDb.elements.getElement<DrawingCategory>(unusedDrawingCategoryId, DrawingCategory);\r\n const unusedDrawingSubCategoryId = reloadedDrawingCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedDrawingSubCategoryId));\r\n expectDeleteToThrow(unusedDrawingSubCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedDrawingCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingCategoryId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements of DefinitionElements used by an existing SpatialViewDefinition should fail\r\n expectDeleteToThrow(spatialCategorySelectorId);\r\n expectDeleteToThrow(modelSelectorId);\r\n expectDeleteToThrow(displayStyle3dId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([spatialCategorySelectorId, modelSelectorId, displayStyle3dId]);\r\n assert.isTrue(usedDefinitionElementIds.has(spatialCategorySelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(modelSelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(displayStyle3dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(modelSelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle3dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(viewId));\r\n\r\n // deleteDefinitionElements should succeed when the list includes the SpatialViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n expectDeleteToThrow(viewId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(modelSelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle3dId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(viewId));\r\n\r\n // delete/deleteDefinitionElements of DefinitionElements used by an existing DrawingViewDefinition should fail\r\n expectDeleteToThrow(drawingCategorySelectorId);\r\n expectDeleteToThrow(displayStyle2dId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([drawingCategorySelectorId, displayStyle2dId]);\r\n assert.isTrue(usedDefinitionElementIds.has(drawingCategorySelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(displayStyle2dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle2dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingViewId));\r\n\r\n // deleteDefinitionElements should succeed when the list includes the DrawingViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n expectDeleteToThrow(drawingViewId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([drawingViewId, drawingCategorySelectorId, displayStyle2dId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle2dId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingViewId));\r\n\r\n txn.end();\r\n } finally {\r\n if (txn.isActive)\r\n txn.end(\"abandon\");\r\n\r\n iModelDb.close();\r\n }\r\n });\r\n\r\n describe(\"deleteElements\", () => {\r\n let elementCounter = 0;\r\n\r\n beforeEach(() => { elementCounter = 0; });\r\n\r\n afterEach(() => {\r\n if (iModelDb.isOpen) {\r\n const txn = new EditTxn(iModelDb, \"abandon\");\r\n txn.start();\r\n txn.end(\"abandon\");\r\n }\r\n });\r\n\r\n const insertDefinitionElement = (txn: EditTxn, parentId?: Id64String, modelId?: Id64String): Id64String => {\r\n const props: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: modelId ?? definitionModelId,\r\n code: GeometryPart.createCode(iModelDb, modelId ?? definitionModelId, `TestPart_${++elementCounter}`),\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n /**\r\n * Call deleteElements, verify the returned failed-set, then check which elements survived vs. were deleted.\r\n * Rolls back changes with abandonChanges afterwards.\r\n */\r\n const executeTestCase = (txn: EditTxn, label: string, idsToDelete: Id64Array, expectedDeleted: Id64Array, expectedFailed: Id64Array, expectedRetained: Id64Array, abandonChanges: boolean = true) => {\r\n const failed = txn.deleteElements(idsToDelete);\r\n assert.sameMembers(Array.from(failed.failedIds), expectedFailed, `[${label}] failed set mismatch`);\r\n\r\n for (const id of expectedDeleted)\r\n assert.isUndefined(iModelDb.elements.tryGetElement(id), `error reading element`);\r\n for (const id of expectedRetained)\r\n assert.isDefined(iModelDb.elements.tryGetElement(id), `[${label}] ${id} should have been retained`);\r\n\r\n if (abandonChanges)\r\n txn.abandonChanges();\r\n };\r\n\r\n it(\"should delete only if not used with deleteElements\", async () => {\r\n let usedDefinitionElementIds: Id64Set;\r\n\r\n const txn = new EditTxn(iModelDb, \"delete definition elements\");\r\n txn.start();\r\n\r\n // make sure deleteElements only skips Elements that are being used (subjectId)\r\n usedDefinitionElementIds = txn.deleteElements([physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 1);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physicalObjectId1));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physicalObjectId2));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physicalObjectId3));\r\n assert.isDefined(iModelDb.elements.tryGetElement(subjectId));\r\n\r\n // Reset the db state\r\n txn.abandonChanges();\r\n\r\n // make sure deleteElements throws for invalid Ids\r\n assert.throws(() => txn.deleteElements([Id64.invalid, Id64.invalid]));\r\n\r\n // deleteElement/deleteElements for a used GeometryPart should fail\r\n assert.throws(() => txn.deleteElement(geometryPartId));\r\n usedDefinitionElementIds = txn.deleteElements([geometryPartId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(geometryPartId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(geometryPartId));\r\n\r\n // deleteElements for an unused GeometryPart should succeed, delete should still fail\r\n const unusedGeometryPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: GeometryPart.createCode(iModelDb, definitionModelId, \"Unused GeometryPart\"),\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n // Reset the db state\r\n txn.abandonChanges();\r\n const unusedGeometryPartId = txn.insertElement(unusedGeometryPartProps);\r\n assert.isTrue(Id64.isValidId64(unusedGeometryPartId));\r\n assert.throws(() => txn.deleteElement(unusedGeometryPartId));\r\n usedDefinitionElementIds = txn.deleteElements([unusedGeometryPartId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedGeometryPartId));\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a used RenderMaterial should fail\r\n assert.throws(() => txn.deleteElement(renderMaterialId));\r\n usedDefinitionElementIds = txn.deleteElements([renderMaterialId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(renderMaterialId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(renderMaterialId));\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused RenderMaterial should succeed, delete should still fail\r\n const unusedRenderMaterialId = RenderMaterialElement.insert(txn, definitionModelId, \"Unused RenderMaterial\", { paletteName: \"PaletteName\" });\r\n assert.isTrue(Id64.isValidId64(unusedRenderMaterialId));\r\n assert.throws(() => txn.deleteElement(unusedRenderMaterialId));\r\n usedDefinitionElementIds = txn.deleteElements([unusedRenderMaterialId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedRenderMaterialId));\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a used Texture should fail\r\n assert.throws(() => txn.deleteElement(textureId));\r\n usedDefinitionElementIds = txn.deleteElements([textureId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(textureId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(textureId));\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused Texture should succeed, delete should still fail\r\n const unusedTextureId = IModelTestUtils.insertTextureElement(txn, definitionModelId, \"Unused Texture\");\r\n assert.isTrue(Id64.isValidId64(unusedTextureId));\r\n assert.throws(() => txn.deleteElement(unusedTextureId));\r\n usedDefinitionElementIds = txn.deleteElements([unusedTextureId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedTextureId));\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a used SpatialCategory should fail\r\n assert.throws(() => txn.deleteElement(spatialCategoryId));\r\n usedDefinitionElementIds = txn.deleteElements([spatialCategoryId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(spatialCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategoryId));\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a default SubCategory should fail\r\n const spatialCategory = iModelDb.elements.getElement<SpatialCategory>(spatialCategoryId, SpatialCategory);\r\n const defaultSpatialSubCategoryId = spatialCategory.myDefaultSubCategoryId();\r\n assert.throws(() => txn.deleteElement(defaultSpatialSubCategoryId));\r\n usedDefinitionElementIds = txn.deleteElements([defaultSpatialSubCategoryId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(defaultSpatialSubCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(defaultSpatialSubCategoryId));\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a used, non-default SubCategory should fail\r\n assert.throws(() => txn.deleteElement(subCategoryId));\r\n usedDefinitionElementIds = txn.deleteElements([subCategoryId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(subCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(subCategoryId));\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused SubCategory should succeed, delete should still fail\r\n const unusedSubCategoryId = SubCategory.insert(txn, spatialCategoryId, \"Unused SubCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedSubCategoryId));\r\n assert.throws(() => txn.deleteElement(unusedSubCategoryId));\r\n usedDefinitionElementIds = txn.deleteElements([unusedSubCategoryId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSubCategoryId));\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused SpatialCategory should succeed, delete should still fail\r\n const unusedSpatialCategoryId = SpatialCategory.insert(txn, definitionModelId, \"Unused SpatialCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryId));\r\n const unusedSpatialCategory = iModelDb.elements.getElement<SpatialCategory>(unusedSpatialCategoryId, SpatialCategory);\r\n const unusedSpatialCategoryDefaultSubCategoryId = unusedSpatialCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryDefaultSubCategoryId));\r\n assert.throws(() => txn.deleteElement(unusedSpatialCategoryId));\r\n assert.throws(() => txn.deleteElement(unusedSpatialCategoryDefaultSubCategoryId));\r\n usedDefinitionElementIds = txn.deleteElements([unusedSpatialCategoryId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryDefaultSubCategoryId));\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements of a used DrawingCategory should fail\r\n assert.throws(() => txn.deleteElement(drawingCategoryId));\r\n usedDefinitionElementIds = txn.deleteElements([drawingCategoryId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(drawingCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategoryId));\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused DrawingCategory should succeed, delete should still fail\r\n const unusedDrawingCategoryId = DrawingCategory.insert(txn, definitionModelId, \"Unused DrawingCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedDrawingCategoryId));\r\n const unusedDrawingCategory = iModelDb.elements.getElement<DrawingCategory>(unusedDrawingCategoryId, DrawingCategory);\r\n const unusedDrawingSubCategoryId = unusedDrawingCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedDrawingSubCategoryId));\r\n assert.throws(() => txn.deleteElement(unusedDrawingSubCategoryId));\r\n usedDefinitionElementIds = txn.deleteElements([unusedDrawingCategoryId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingCategoryId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingSubCategoryId));\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements of DefinitionElements used by an existing SpatialViewDefinition should fail\r\n assert.throws(() => txn.deleteElement(spatialCategorySelectorId));\r\n assert.throws(() => txn.deleteElement(modelSelectorId));\r\n assert.throws(() => txn.deleteElement(displayStyle3dId));\r\n usedDefinitionElementIds = txn.deleteElements([spatialCategorySelectorId, modelSelectorId, displayStyle3dId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(spatialCategorySelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(modelSelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(displayStyle3dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(modelSelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle3dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(viewId));\r\n txn.abandonChanges();\r\n\r\n // deleteElements should succeed when the list includes the SpatialViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n assert.throws(() => txn.deleteElement(viewId));\r\n usedDefinitionElementIds = txn.deleteElements([viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(modelSelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle3dId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(viewId));\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements of DefinitionElements used by an existing DrawingViewDefinition should fail\r\n assert.throws(() => txn.deleteElement(drawingCategorySelectorId));\r\n assert.throws(() => txn.deleteElement(displayStyle2dId));\r\n usedDefinitionElementIds = txn.deleteElements([drawingCategorySelectorId, displayStyle2dId]).failedIds;\r\n assert.isTrue(usedDefinitionElementIds.has(drawingCategorySelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(displayStyle2dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle2dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingViewId));\r\n txn.abandonChanges();\r\n\r\n // deleteElements should succeed when the list includes the DrawingViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n assert.throws(() => txn.deleteElement(drawingViewId));\r\n usedDefinitionElementIds = txn.deleteElements([drawingViewId, drawingCategorySelectorId, displayStyle2dId]).failedIds;\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle2dId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingViewId));\r\n\r\n txn.end(\"abandon\");\r\n iModelDb.close();\r\n });\r\n\r\n describe(\"basic tests\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete Definition Elements\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n it(\"deletes a single unused definition element\", () => {\r\n const element = insertDefinitionElement(txn);\r\n executeTestCase(txn, \"single unused definition element\", [element], [element], [], []);\r\n });\r\n\r\n it(\"deletes multiple unused definition elements in one call\", () => {\r\n const element1 = insertDefinitionElement(txn);\r\n const element2 = insertDefinitionElement(txn);\r\n const element3 = insertDefinitionElement(txn);\r\n executeTestCase(txn, \"multiple unused definition elements\", [element1, element2, element3], [element1, element2, element3], [], []);\r\n });\r\n\r\n it(\"returns empty failed-set when given an empty array\", () => {\r\n const failed = txn.deleteElements([]).failedIds;\r\n assert.isEmpty(Array.from(failed), \"empty input should return empty failed set\");\r\n });\r\n\r\n it(\"throws for invalid ids\", () => {\r\n assert.throws(() => txn.deleteElements([Id64.invalid, Id64.invalid]));\r\n });\r\n\r\n it(\"keeps an in-use definition element in the failed set and does not delete it\", () => {\r\n // geometryPartId is referenced by PhysicalObject1's geometry stream\r\n const failed = txn.deleteElements([geometryPartId]);\r\n assert.isTrue(failed.failedIds.has(geometryPartId), \"in-use definition element must be in failed set\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(geometryPartId), \"in-use definition element must not be deleted\");\r\n });\r\n\r\n it(\"returns only the in-use definition element in the failed set when mixing used and unused parts\", () => {\r\n const unusedElement = insertDefinitionElement(txn);\r\n const usedElement = insertDefinitionElement(txn);\r\n\r\n // Reference usedElement from a physical element geometry stream\r\n const physElemProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: Point3d.create(0, 0, 0).toJSON(), angles: {} },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedElement),\r\n };\r\n const physElemId = txn.insertElement(physElemProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"used + unused definition elements\",\r\n [unusedElement, usedElement],\r\n [unusedElement],\r\n [usedElement],\r\n [usedElement, physElemId],\r\n );\r\n });\r\n\r\n it(\"keeps an in-use RenderMaterial in the failed set and does not delete it\", () => {\r\n const failed = txn.deleteElements([renderMaterialId]);\r\n assert.isTrue(failed.failedIds.has(renderMaterialId), \"in-use RenderMaterial must be in failed set\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(renderMaterialId), \"in-use RenderMaterial must not be deleted\");\r\n });\r\n\r\n it(\"deletes an unused RenderMaterial\", () => {\r\n const unusedRenderMaterialId = RenderMaterialElement.insert(txn, definitionModelId, \"Unused RenderMaterial\", { paletteName: \"PaletteName\" });\r\n executeTestCase(txn, \"unused RenderMaterial\", [unusedRenderMaterialId], [unusedRenderMaterialId], [], []);\r\n });\r\n\r\n it(\"keeps an in-use Texture in the failed set and does not delete it\", () => {\r\n const failed = txn.deleteElements([textureId]);\r\n assert.isTrue(failed.failedIds.has(textureId), \"in-use Texture must be in failed set\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(textureId), \"in-use Texture must not be deleted\");\r\n });\r\n\r\n it(\"deletes an unused Texture\", () => {\r\n const unusedTextureId = IModelTestUtils.insertTextureElement(txn, definitionModelId, \"Unused Texture\");\r\n executeTestCase(txn, \"unused Texture\", [unusedTextureId], [unusedTextureId], [], []);\r\n });\r\n\r\n it(\"returns the full input as the failed set when every element is an in-use definition element\", () => {\r\n const usedElement1 = insertDefinitionElement(txn);\r\n const usedElement2 = insertDefinitionElement(txn);\r\n const usedElement3 = insertDefinitionElement(txn);\r\n\r\n // Reference usedElements from a physical element geometry stream\r\n const physElemProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: Point3d.create(0, 0, 0).toJSON(), angles: {} },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedElement1),\r\n };\r\n assert.isTrue(Id64.isValid(txn.insertElement(physElemProps)));\r\n physElemProps.geom = IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedElement2);\r\n assert.isTrue(Id64.isValid(txn.insertElement(physElemProps)));\r\n physElemProps.geom = IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedElement3);\r\n assert.isTrue(Id64.isValid(txn.insertElement(physElemProps)));\r\n\r\n const failedToDelete = txn.deleteElements([usedElement1, usedElement2, usedElement3]);\r\n assert.equal(failedToDelete.failedIds.size, 3, \"all in-use definition elements should be in failed set\");\r\n assert.isTrue(failedToDelete.failedIds.has(usedElement1));\r\n assert.isTrue(failedToDelete.failedIds.has(usedElement2));\r\n assert.isTrue(failedToDelete.failedIds.has(usedElement3));\r\n });\r\n });\r\n\r\n describe(\"category and subcategory tests\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete Definition Elements\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n it(\"keeps an in-use SpatialCategory in the failed set and does not delete it\", () => {\r\n const failed = txn.deleteElements([spatialCategoryId]);\r\n assert.isTrue(failed.failedIds.has(spatialCategoryId), \"in-use SpatialCategory must be in failed set\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategoryId), \"in-use SpatialCategory must not be deleted\");\r\n });\r\n\r\n it(\"keeps the default SubCategory in the failed set when its parent SpatialCategory is in use\", () => {\r\n const spatialCategory = iModelDb.elements.getElement<SpatialCategory>(spatialCategoryId, SpatialCategory);\r\n const defaultSubCategoryId = spatialCategory.myDefaultSubCategoryId();\r\n const failed = txn.deleteElements([defaultSubCategoryId]);\r\n assert.isTrue(failed.failedIds.has(defaultSubCategoryId), \"default SubCategory must be in failed set\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(defaultSubCategoryId), \"default SubCategory must not be deleted\");\r\n });\r\n\r\n it(\"keeps a used non-default SubCategory in the failed set and does not delete it\", () => {\r\n const failed = txn.deleteElements([subCategoryId]);\r\n assert.isTrue(failed.failedIds.has(subCategoryId), \"in-use SubCategory must be in failed set\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(subCategoryId), \"in-use SubCategory must not be deleted\");\r\n });\r\n\r\n it(\"deletes an unused non-default SubCategory\", () => {\r\n const unusedSubCategoryId = SubCategory.insert(txn, spatialCategoryId, \"Unused SubCategory\", {});\r\n executeTestCase(txn, \"unused SubCategory\", [unusedSubCategoryId], [unusedSubCategoryId], [], [spatialCategoryId]);\r\n });\r\n\r\n it(\"deletes an unused SpatialCategory together with its default SubCategory\", () => {\r\n const unusedCategoryId = SpatialCategory.insert(txn, definitionModelId, \"Unused SpatialCategory\", {});\r\n const unusedCategory = iModelDb.elements.getElement<SpatialCategory>(unusedCategoryId, SpatialCategory);\r\n const unusedDefaultSubCategoryId = unusedCategory.myDefaultSubCategoryId();\r\n\r\n executeTestCase(\r\n txn,\r\n \"unused SpatialCategory + default SubCategory\",\r\n [unusedCategoryId],\r\n [unusedCategoryId, unusedDefaultSubCategoryId],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n it(\"deletes an unused DrawingCategory together with its default SubCategory\", () => {\r\n const unusedDrawingCategoryId = DrawingCategory.insert(txn, definitionModelId, \"Unused DrawingCategory\", {});\r\n const unusedDrawingCategory = iModelDb.elements.getElement<DrawingCategory>(unusedDrawingCategoryId, DrawingCategory);\r\n const unusedDrawingSubCategoryId = unusedDrawingCategory.myDefaultSubCategoryId();\r\n\r\n executeTestCase(\r\n txn,\r\n \"unused DrawingCategory + default SubCategory\",\r\n [unusedDrawingCategoryId],\r\n [unusedDrawingCategoryId, unusedDrawingSubCategoryId],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n it(\"keeps CategorySelector, ModelSelector, DisplayStyle3d in the failed set when their view still exists\", () => {\r\n executeTestCase(\r\n txn,\r\n \"view-related still referenced\",\r\n [spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n [],\r\n [spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n [spatialCategorySelectorId, modelSelectorId, displayStyle3dId, viewId],\r\n );\r\n });\r\n\r\n it(\"deletes CategorySelector, ModelSelector, DisplayStyle3d and the SpatialViewDefinition in one call\", () => {\r\n executeTestCase(\r\n txn,\r\n \"view + view-related\",\r\n [viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n [viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n it(\"deletes DrawingCategorySelector, DisplayStyle2d and the DrawingViewDefinition in one call\", () => {\r\n executeTestCase(\r\n txn,\r\n \"drawing view + drawing view-related\",\r\n [drawingViewId, drawingCategorySelectorId, displayStyle2dId],\r\n [drawingViewId, drawingCategorySelectorId, displayStyle2dId],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n it(\"deletes orphaned CategorySelector and DisplayStyle2d (no view references them)\", () => {\r\n // Insert a standalone CategorySelector and DisplayStyle2d that are not referenced by any view\r\n const orphanCategorySelectorId = CategorySelector.insert(txn, definitionModelId, \"OrphanCategorySelector\", [drawingCategoryId]);\r\n const orphanDisplayStyle2dId = DisplayStyle2d.insert(txn, definitionModelId, \"OrphanDisplayStyle2d\");\r\n\r\n executeTestCase(\r\n txn,\r\n \"orphaned view-related elements\",\r\n [orphanCategorySelectorId, orphanDisplayStyle2dId],\r\n [orphanCategorySelectorId, orphanDisplayStyle2dId],\r\n [],\r\n [],\r\n );\r\n });\r\n });\r\n\r\n describe(\"Element hierarchy\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"test\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n it(\"deletes a parent DefinitionElement and automatically deletes its child\", () => {\r\n const parentPart = insertDefinitionElement(txn);\r\n const childPart = insertDefinitionElement(txn, parentPart);\r\n\r\n // Only pass the parent - the child must be pulled in automatically\r\n executeTestCase(\r\n txn,\r\n \"parent + child definition elements\",\r\n [parentPart],\r\n [parentPart, childPart],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n it(\"deletes a parent DefinitionElement and its child explicitly passed\", () => {\r\n const parentPart = insertDefinitionElement(txn);\r\n const childPart = insertDefinitionElement(txn, parentPart);\r\n\r\n // Pass both parent and child explicitly\r\n executeTestCase(\r\n txn,\r\n \"parent + child definition elements\",\r\n [parentPart, childPart],\r\n [parentPart, childPart],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n // Intra-set code scope\r\n // Both partA and partB are in the input set; partB uses partA as its CodeScope.\r\n // The old implementation would fail here because partA's deletion was blocked by partB's\r\n // code scope reference. The new native API resolves all intra-set dependencies first.\r\n it(\"deletes two DefinitionElements related by code scope when both are in the same set\", () => {\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"DefElemScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const partA = insertDefinitionElement(txn);\r\n const partBProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: partA, value: \"partB-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const partB = txn.insertElement(partBProps);\r\n\r\n // Both unused externally; the intra-set code-scope link must not block deletion\r\n executeTestCase(txn, \"intra-set code scope\", [partA, partB], [partA, partB], [], []);\r\n });\r\n\r\n // Multi-level parent-child hierarchy\r\n // Passing only the root must automatically pull in all descendants (leaf-first).\r\n // The old implementation deleted elements in a fixed ECClass order and could not handle\r\n // arbitrary parent-child chains within the set.\r\n it(\"deletes a 3-level parent-child hierarchy by passing only the root\", () => {\r\n const root = insertDefinitionElement(txn);\r\n const child = insertDefinitionElement(txn, root);\r\n const grandchild = insertDefinitionElement(txn, child);\r\n\r\n // Only supply the root - all descendants must be included and deleted leaf-first\r\n executeTestCase(txn, \"3-level hierarchy via root only\", [root], [root, child, grandchild], [], []);\r\n });\r\n\r\n it(\"deletes a 3-level parent-child hierarchy by passing all elements explicitly\", () => {\r\n const root = insertDefinitionElement(txn);\r\n const child = insertDefinitionElement(txn, root);\r\n const grandchild = insertDefinitionElement(txn, child);\r\n\r\n // Pass all elements explicitly\r\n executeTestCase(\r\n txn,\r\n \"3-level hierarchy with all elements\",\r\n [root, child, grandchild],\r\n [root, child, grandchild],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n // Mixed inputs\r\n it(\"deletes a mixed batch of unused DefinitionElements of different types in one call\", () => {\r\n const unusedPart = insertDefinitionElement(txn);\r\n const unusedRenderMaterial = RenderMaterialElement.insert(txn, definitionModelId, \"BatchRenderMaterial\", { paletteName: \"P\" });\r\n const unusedTexture = IModelTestUtils.insertTextureElement(txn, definitionModelId, \"BatchTexture\");\r\n const unusedSubCategory = SubCategory.insert(txn, spatialCategoryId, \"BatchSubCategory\", {});\r\n\r\n executeTestCase(\r\n txn,\r\n \"mixed unused batch\",\r\n [unusedPart, unusedRenderMaterial, unusedTexture, unusedSubCategory],\r\n [unusedPart, unusedRenderMaterial, unusedTexture, unusedSubCategory],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n // Mixed inputs with intra scope violations and parent child hierarchies\r\n it(\"deletes a mixed batch of used and unused DefinitionElements in a hierarchy with conflicting code scopes with child\", () => {\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"DefElemScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const usedPart = insertDefinitionElement(txn);\r\n const unusedPart = insertDefinitionElement(txn);\r\n const childPart = insertDefinitionElement(txn, usedPart);\r\n\r\n const scopedPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: childPart, value: \"scopedPart-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const scopedPart = txn.insertElement(scopedPartProps);\r\n\r\n // Pass both used and unused parts, with a child that has a code scope reference\r\n executeTestCase(\r\n txn,\r\n \"mixed used and unused batch\",\r\n [usedPart, unusedPart, scopedPart],\r\n [usedPart, unusedPart, childPart, scopedPart],\r\n [],\r\n [],\r\n );\r\n });\r\n\r\n // Mixed inputs with intra scope violations and parent child hierarchies\r\n it(\"deletes a mixed batch of used and unused DefinitionElements in a hierarchy with conflicting code scopes\", () => {\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"DefElemScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const usedPart = insertDefinitionElement(txn);\r\n const unusedPart = insertDefinitionElement(txn);\r\n const childPart = insertDefinitionElement(txn, usedPart);\r\n\r\n const scopedPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: usedPart, value: \"scopedPart-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const scopedPart = txn.insertElement(scopedPartProps);\r\n\r\n // Pass both used and unused parts, with a child that has a code scope reference\r\n executeTestCase(\r\n txn,\r\n \"mixed used and unused batch\",\r\n [usedPart, unusedPart],\r\n [unusedPart],\r\n [usedPart],\r\n [usedPart, childPart, scopedPart],\r\n );\r\n });\r\n });\r\n\r\n describe(\"sub-model hierarchy\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"test\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n let containerCounter = 0;\r\n\r\n const insertDefinitionContainer = (parentModelId?: Id64String): Id64String => {\r\n const scopeModelId = parentModelId ?? definitionModelId;\r\n const codeSpecId = iModelDb.codeSpecs.insert(txn, `ContainerCodeSpec_${++containerCounter}`, CodeScopeSpec.Type.Model);\r\n const code = new Code({ spec: codeSpecId, scope: scopeModelId, value: `Container_${containerCounter}` });\r\n return DefinitionContainer.insert(txn, scopeModelId, code);\r\n };\r\n\r\n /** Assert that the model row has been deleted. */\r\n const assertModelDeleted = (id: Id64String, msg: string) =>\r\n assert.isUndefined(iModelDb.models.tryGetModelProps(id), msg);\r\n\r\n /** Assert that the model row still exists. */\r\n const assertModelExists = (id: Id64String, msg: string) =>\r\n assert.isDefined(iModelDb.models.tryGetModelProps(id), msg);\r\n\r\n it(\"deletes unused definition elements from a DefinitionContainer\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const partA = insertDefinitionElement(txn, undefined, containerId);\r\n const partB = insertDefinitionElement(txn, undefined, containerId);\r\n\r\n executeTestCase(\r\n txn,\r\n \"unused elements in container sub-model\",\r\n [partA, partB],\r\n [partA, partB],\r\n [],\r\n [],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer must survive when container is not in the input set\");\r\n });\r\n\r\n it(\"deletes a DefinitionContainer and all definition elements inside it\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const defElem1 = insertDefinitionElement(txn, undefined, containerId);\r\n const defElem2 = insertDefinitionElement(txn, undefined, containerId);\r\n\r\n executeTestCase(\r\n txn,\r\n \"container + sub-model contents deleted via container id\",\r\n [containerId],\r\n [containerId, defElem1, defElem2],\r\n [],\r\n [],\r\n );\r\n // Sub-model row is deleted once the container element is successfully purged.\r\n assertModelDeleted(containerId, \"DefinitionModel sub-model row must be deleted after container is purged\");\r\n });\r\n\r\n it(\"keeps an in-use element inside a DefinitionContainer sub-model in the failed set\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const usedPart = insertDefinitionElement(txn, undefined, containerId);\r\n const unusedPart = insertDefinitionElement(txn, undefined, containerId);\r\n // Reference usedPart from a physical element geometry stream.\r\n const physElemProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedPart),\r\n };\r\n const physElemId = txn.insertElement(physElemProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"one used + one unused in container sub-model\",\r\n [usedPart, unusedPart],\r\n [unusedPart],\r\n [usedPart],\r\n [usedPart, physElemId],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when an element inside it is blocked\");\r\n });\r\n\r\n it(\"parent blocked in failed set when its child inside a DefinitionContainer sub-model is in use\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const parent = insertDefinitionElement(txn, undefined, containerId);\r\n const child = insertDefinitionElement(txn, parent, containerId);\r\n // Reference child from a physical element geometry stream.\r\n const physElemProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, child),\r\n };\r\n const physElemId = txn.insertElement(physElemProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"parent blocked when child inside container sub-model is in use\",\r\n [parent],\r\n [],\r\n [parent],\r\n [parent, child, physElemId],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when elements inside it are blocked\");\r\n });\r\n\r\n it(\"deletes two elements inside a DefinitionContainer sub-model related by intra-delete-set code scope\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"NestedDefScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const partA = insertDefinitionElement(txn, undefined, containerId);\r\n const partBProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: containerId,\r\n code: { spec: scopeSpecId, scope: partA, value: \"partB-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const partB = txn.insertElement(partBProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"intra-set code scope in container sub-model\",\r\n [partA, partB],\r\n [partA, partB],\r\n [],\r\n [],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when container is not in the input set\");\r\n });\r\n\r\n it(\"element inside a DefinitionContainer sub-model blocked when used as external code scope\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"ExtScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const partA = insertDefinitionElement(txn, undefined, containerId);\r\n const partB = insertDefinitionElement(txn, undefined, containerId);\r\n // external lives in the top-level definition model — scoped to partA but NOT in the input set.\r\n const externalProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: partA, value: \"external-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const externalId = txn.insertElement(externalProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"external code scope blocks element inside container sub-model\",\r\n [partA, partB],\r\n [partB],\r\n [partA],\r\n [partA, externalId],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when an element inside it is blocked\");\r\n });\r\n\r\n it(\"cross-container intra-set code scope: both elements deleted cleanly\", () => {\r\n const container1 = insertDefinitionContainer();\r\n const container2 = insertDefinitionContainer();\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"CrossModelScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const partA = insertDefinitionElement(txn, undefined, container1);\r\n const partBProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: container2,\r\n code: { spec: scopeSpecId, scope: partA, value: \"partB-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const partB = txn.insertElement(partBProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"cross-container intra-set code scope\",\r\n [partA, partB],\r\n [partA, partB],\r\n [],\r\n [],\r\n false,\r\n );\r\n assertModelExists(container1, \"container1 sub-model row must survive when container is not in the input set\");\r\n assertModelExists(container2, \"container2 sub-model row must survive when container is not in the input set\");\r\n });\r\n\r\n it(\"mixed elements where in-use ones get blocked/ignored, unused get deleted\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const topUnused = insertDefinitionElement(txn, undefined, definitionModelId);\r\n const topUsed = insertDefinitionElement(txn, undefined, definitionModelId);\r\n const nestedUnused = insertDefinitionElement(txn, undefined, containerId);\r\n const nestedUsed = insertDefinitionElement(txn, undefined, containerId);\r\n\r\n const makeUser = (partId: Id64String): Id64String => {\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, partId),\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n const topUsedPhysElem = makeUser(topUsed);\r\n const nestedUsedPhysElem = makeUser(nestedUsed);\r\n\r\n executeTestCase(\r\n txn,\r\n \"mixed top-level and container sub-model: used blocked, unused deleted\",\r\n [topUnused, topUsed, nestedUnused, nestedUsed],\r\n [topUnused, nestedUnused],\r\n [topUsed, nestedUsed],\r\n [topUsed, nestedUsed, topUsedPhysElem, nestedUsedPhysElem],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when an element inside it is blocked\");\r\n });\r\n });\r\n });\r\n\r\n describe(\"TypeDefinition reference nulling\", () => {\r\n let typeDefModelId: Id64String;\r\n let typeDefCounter = 0;\r\n let txn: EditTxn;\r\n\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete Definition Elements\");\r\n txn.start();\r\n typeDefModelId = DefinitionModel.insert(txn, subjectId, `TypeDefModel-${++typeDefCounter}`);\r\n });\r\n\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n const insertPhysicalType = (): Id64String => {\r\n const props: PhysicalTypeProps = {\r\n classFullName: GenericPhysicalType.classFullName,\r\n model: typeDefModelId,\r\n code: Code.createEmpty(),\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n const insertPhysicalObjectWithType = (typeId: Id64String): Id64String => {\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: {} },\r\n typeDefinition: new PhysicalElementIsOfType(typeId),\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n /** Returns the TypeDefinitionId for a 3D element, or undefined if NULL. */\r\n const getTypeDefinitionId3d = (elementId: Id64String): Id64String | undefined => {\r\n return iModelDb.withQueryReader(\r\n \"SELECT TypeDefinition FROM bis.GeometricElement3d WHERE ECInstanceId=?\",\r\n (reader) => reader.step() ? reader.current[0]?.id : undefined,\r\n QueryBinder.from([elementId]),\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\r\n );\r\n };\r\n\r\n it(\"TypeDefinitionId is NULLed on a surviving 3D element when its PhysicalType is deleted\", () => {\r\n const physTypeId = insertPhysicalType();\r\n const physObjId = insertPhysicalObjectWithType(physTypeId);\r\n\r\n assert.strictEqual(getTypeDefinitionId3d(physObjId), physTypeId, \"TypeDefinitionId should be set before deletion\");\r\n\r\n txn.deleteElements([physTypeId]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physTypeId), \"PhysicalType should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(physObjId), \"PhysicalObject should survive\");\r\n assert.isUndefined(getTypeDefinitionId3d(physObjId), \"TypeDefinitionId should be NULL after its target type is deleted\");\r\n });\r\n\r\n it(\"TypeDefinitionId is NULLed on multiple surviving 3D elements when their shared PhysicalType is deleted\", () => {\r\n const physTypeId = insertPhysicalType();\r\n const obj1 = insertPhysicalObjectWithType(physTypeId);\r\n const obj2 = insertPhysicalObjectWithType(physTypeId);\r\n const obj3 = insertPhysicalObjectWithType(physTypeId);\r\n\r\n txn.deleteElements([physTypeId]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physTypeId), \"PhysicalType should be deleted\");\r\n for (const id of [obj1, obj2, obj3]) {\r\n assert.isDefined(iModelDb.elements.tryGetElement(id), \"PhysicalObject should survive\");\r\n assert.isUndefined(getTypeDefinitionId3d(id), \"TypeDefinitionId should be NULL on all surviving objects\");\r\n }\r\n });\r\n\r\n it(\"TypeDefinitionId is not disturbed on elements whose PhysicalType is NOT deleted\", () => {\r\n const typeToDelete = insertPhysicalType();\r\n const typeToKeep = insertPhysicalType();\r\n const objReferencingDeleted = insertPhysicalObjectWithType(typeToDelete);\r\n const objReferencingKept = insertPhysicalObjectWithType(typeToKeep);\r\n\r\n txn.deleteElements([typeToDelete]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(typeToDelete), \"typeToDelete should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(typeToKeep), \"typeToKeep should survive\");\r\n assert.isUndefined(getTypeDefinitionId3d(objReferencingDeleted), \"TypeDefinitionId should be NULL on the affected object\");\r\n assert.strictEqual(getTypeDefinitionId3d(objReferencingKept), typeToKeep, \"TypeDefinitionId should be unchanged on the unaffected object\");\r\n });\r\n\r\n it(\"TypeDefinitionId is NULLed on a surviving 3D element when its PhysicalType is deleted together with a non-definition element\", () => {\r\n const physTypeId = insertPhysicalType();\r\n const physObjId = insertPhysicalObjectWithType(physTypeId);\r\n const unrelated = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: {} },\r\n } as PhysicalElementProps);\r\n\r\n txn.deleteElements([physTypeId, unrelated]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physTypeId), \"PhysicalType should be deleted\");\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unrelated), \"unrelated element should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(physObjId), \"PhysicalObject should survive\");\r\n assert.isUndefined(getTypeDefinitionId3d(physObjId), \"TypeDefinitionId should be NULL after its target type is deleted\");\r\n });\r\n\r\n it(\"TypeDefinitionId is NULLed on a surviving 2D element when its GraphicalType2d is deleted\", () => {\r\n const documentListModelId = DocumentListModel.insert(txn, subjectId, `DocList-${typeDefCounter}`);\r\n const drawingId = Drawing.insert(txn, documentListModelId, `Drawing-${typeDefCounter}`);\r\n const drawingCatId = DrawingCategory.insert(txn, typeDefModelId, `DrawingCat-${typeDefCounter}`, new SubCategoryAppearance());\r\n\r\n const graphicalTypeProps: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: typeDefModelId,\r\n code: Code.createEmpty(),\r\n };\r\n const graphicalTypeId = txn.insertElement(graphicalTypeProps);\r\n\r\n const drawingElemProps: GeometricElement2dProps = {\r\n classFullName: DrawingGraphic.classFullName,\r\n model: drawingId,\r\n category: drawingCatId,\r\n code: Code.createEmpty(),\r\n typeDefinition: new GraphicalElement2dIsOfType(graphicalTypeId),\r\n };\r\n const drawingElemId = txn.insertElement(drawingElemProps);\r\n\r\n const getTypeDefinitionId2d = (elemId: Id64String): Id64String | undefined => {\r\n return iModelDb.withQueryReader(\r\n \"SELECT TypeDefinition FROM bis.GeometricElement2d WHERE ECInstanceId=?\",\r\n (reader) => reader.step() ? reader.current[0]?.id : undefined,\r\n QueryBinder.from([elemId]),\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\r\n );\r\n };\r\n\r\n assert.strictEqual(getTypeDefinitionId2d(drawingElemId), graphicalTypeId, \"TypeDefinitionId should be set before deletion\");\r\n\r\n txn.deleteElements([graphicalTypeId]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(graphicalTypeId), \"GraphicalType2d should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingElemId), \"DrawingGraphic should survive\");\r\n assert.isUndefined(getTypeDefinitionId2d(drawingElemId), \"TypeDefinitionId should be NULL after its 2D type is deleted\");\r\n });\r\n\r\n it(\"TypeDefinitionId is NOT NULLed when deleteElements deletes the type and NULLs the reference\", () => {\r\n const physTypeId = insertPhysicalType();\r\n const physObjId = insertPhysicalObjectWithType(physTypeId);\r\n\r\n const failed = txn.deleteElements([physTypeId]);\r\n\r\n assert.isFalse(failed.failedIds.has(physTypeId), \"physTypeId should NOT be in the failed set — TypeDefinitionId refs do not block deleteElements\");\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physTypeId), \"PhysicalType should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(physObjId), \"PhysicalObject should still exist\");\r\n assert.isUndefined(getTypeDefinitionId3d(physObjId), \"TypeDefinitionId should be NULLed since the type was deleted\");\r\n });\r\n });\r\n\r\n describe(\"ModelSelector link-table cleanup on model deletion\", () => {\r\n let msCounter = 0;\r\n let msDefModelId: Id64String;\r\n let txn: EditTxn;\r\n\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete definition elements\");\r\n txn.start();\r\n msDefModelId = DefinitionModel.insert(txn, subjectId, `MSDefModel-${++msCounter}`);\r\n });\r\n\r\n const getModelSelectorModels = (selectorId: Id64String): Id64String[] => {\r\n return iModelDb.withQueryReader(\r\n \"SELECT TargetECInstanceId FROM bis.ModelSelectorRefersToModels WHERE SourceECInstanceId=?\",\r\n (reader) => {\r\n const ids: Id64String[] = [];\r\n for (const row of reader)\r\n ids.push(row[0] as Id64String);\r\n return ids;\r\n },\r\n QueryBinder.from([selectorId]),\r\n );\r\n };\r\n\r\n\r\n it(\"removes the ModelSelectorRefersToModels row when the referenced model is deleted\", () => {\r\n const partitionId = PhysicalModel.insert(txn, subjectId, `MSPartition-${msCounter}`);\r\n const selectorId = ModelSelector.insert(txn, msDefModelId, `MSSelector-${msCounter}`, [partitionId]);\r\n\r\n assert.include(getModelSelectorModels(selectorId), partitionId, \"ModelSelector should reference the partition before deletion\");\r\n\r\n txn.deleteElements([partitionId]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(partitionId), \"partition should be deleted\");\r\n assert.notInclude(getModelSelectorModels(selectorId), partitionId, \"ModelSelectorRefersToModels row should be removed after model deletion\");\r\n });\r\n\r\n it(\"removes only the deleted model's rows from ModelSelector when multiple models are referenced\", () => {\r\n const partition1 = PhysicalModel.insert(txn, subjectId, `MSMulti1-${msCounter}`);\r\n const partition2 = PhysicalModel.insert(txn, subjectId, `MSMulti2-${msCounter}`);\r\n const partition3 = PhysicalModel.insert(txn, subjectId, `MSMulti3-${msCounter}`);\r\n const selectorId = ModelSelector.insert(txn, msDefModelId, `MSMultiSelector-${msCounter}`, [partition1, partition2, partition3]);\r\n\r\n assert.equal(getModelSelectorModels(selectorId).length, 3, \"ModelSelector should start with 3 entries\");\r\n\r\n txn.deleteElements([partition1]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(partition1), \"partition1 should be deleted\");\r\n const remaining = getModelSelectorModels(selectorId);\r\n assert.equal(remaining.length, 2, \"ModelSelector should have 2 remaining entries\");\r\n assert.notInclude(remaining, partition1, \"partition1 row should be removed\");\r\n assert.include(remaining, partition2, \"partition2 row should remain\");\r\n assert.include(remaining, partition3, \"partition3 row should remain\");\r\n });\r\n\r\n it(\"removes ModelSelectorRefersToModels rows for all models when multiple partitions are deleted in one call\", () => {\r\n const partition1 = PhysicalModel.insert(txn, subjectId, `MSBulk1-${msCounter}`);\r\n const partition2 = PhysicalModel.insert(txn, subjectId, `MSBulk2-${msCounter}`);\r\n const selectorId = ModelSelector.insert(txn, msDefModelId, `MSBulkSelector-${msCounter}`, [partition1, partition2]);\r\n\r\n txn.deleteElements([partition1, partition2]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(partition1), \"partition1 should be deleted\");\r\n assert.isUndefined(iModelDb.elements.tryGetElement(partition2), \"partition2 should be deleted\");\r\n assert.isEmpty(getModelSelectorModels(selectorId), \"all ModelSelectorRefersToModels rows should be gone\");\r\n });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"DeleteDefinitionElements.test.js","sourceRoot":"","sources":["../../../../src/test/element/DeleteDefinitionElements.test.ts"],"names":[],"mappings":"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,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert } from \"chai\";\r\nimport * as path from \"path\";\r\nimport { DbResult, Id64, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport { Point3d, Range3d } from \"@itwin/core-geometry\";\r\nimport { Code, CodeScopeSpec, GeometricElement2dProps, GeometryPartProps, ImageSourceFormat, IModel, PhysicalElementProps, PhysicalTypeProps, QueryBinder, QueryRowFormat, SubCategoryAppearance, TypeDefinitionElementProps } from \"@itwin/core-common\";\r\nimport { BulkDeleteElementsResult, BulkDeleteElementsStatus, BulkDeleteFailure, BulkDeleteFailureReason, EditTxn } from \"../../EditTxn\";\r\nimport {\r\n _nativeDb, CategorySelector, ChannelControl, DefinitionContainer, DefinitionModel, DisplayStyle2d, DisplayStyle3d, DocumentListModel, Drawing, DrawingCategory,\r\n DrawingGraphic, DrawingViewDefinition, GenericGraphicalType2d, GenericPhysicalType, GeometryPart,\r\n GraphicalElement2dIsOfType, IModelJsFs, InformationPartitionElement, ModelSelector, OrthographicViewDefinition, PhysicalElementIsOfType,\r\n PhysicalModel, PhysicalPartition, RenderMaterialElement, SnapshotDb, SpatialCategory, SubCategory, Subject, Texture,\r\n} from \"../../core-backend\";\r\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { withEditTxn } from \"../TestEditTxn\";\r\n\r\n/** Expected shape of a [[BulkDeleteElementsResult]]. `sqlDeleteStatus` defaults to `BE_SQLITE_OK`. `failures` must match exactly (order-insensitive). */\r\ninterface ExpectedResult {\r\n status: BulkDeleteElementsStatus;\r\n sqlDeleteStatus?: DbResult;\r\n failures: BulkDeleteFailure[];\r\n}\r\n\r\nconst success: ExpectedResult = { status: BulkDeleteElementsStatus.Success, sqlDeleteStatus: DbResult.BE_SQLITE_OK, failures: [] };\r\n/** Nothing is deleted; `failures` lists the direct violators (one entry per element, `ReferencedByForeignKey` wins over `DefinitionInUse`). */\r\nconst constraintViolation = (...failures: BulkDeleteFailure[]): ExpectedResult => ({ status: BulkDeleteElementsStatus.ConstraintViolation, failures });\r\n\r\n/** The element is a DefinitionElement still used (e.g. via a GeometryStream) by elements outside the delete set. */\r\nconst definitionInUse = (elementId: Id64String): BulkDeleteFailure => ({ elementId, reason: BulkDeleteFailureReason.DefinitionInUse });\r\n/** The element itself is referenced from outside the delete set via its Code scope. */\r\nconst codeScopeViolator = (elementId: Id64String): BulkDeleteFailure => referencedByForeignKey(elementId);\r\n/** A row outside the delete set references the element via a hard NO ACTION foreign key. */\r\nconst referencedByForeignKey = (elementId: Id64String): BulkDeleteFailure => ({ elementId, reason: BulkDeleteFailureReason.ReferencedByForeignKey });\r\n/** A Category still assigned to a GeometricElement3d outside the delete set (hard FK, so not `DefinitionInUse`). */\r\nconst categoryInUse3d = (elementId: Id64String): BulkDeleteFailure => referencedByForeignKey(elementId);\r\n/** A Category still assigned to a GeometricElement2d outside the delete set (hard FK, so not `DefinitionInUse`). */\r\nconst categoryInUse2d = (elementId: Id64String): BulkDeleteFailure => referencedByForeignKey(elementId);\r\n\r\n/** Assert the result matches `expected` exactly, then check that each id in `deletedIds` is gone and each id in `retainedIds` is still present. */\r\nconst assertResult = (result: BulkDeleteElementsResult, expected: ExpectedResult, deletedIds: Id64Array, retainedIds: Id64Array, iModelDb: SnapshotDb) => {\r\n assert.equal(result.status, expected.status, `Bulk element deletion status is ${BulkDeleteElementsStatus[result.status]}; Expected: ${BulkDeleteElementsStatus[expected.status]}. Actual failures: ${JSON.stringify(result.failures)}`);\r\n assert.equal(result.sqlDeleteStatus, expected.sqlDeleteStatus ?? DbResult.BE_SQLITE_OK, `Bulk element deletion internal sql status is ${result.sqlDeleteStatus}; Expected: ${expected.sqlDeleteStatus ?? DbResult.BE_SQLITE_OK}`);\r\n\r\n assert.equal(result.failures.length, expected.failures.length, `Actual failures don't match the expected. Actual: ${JSON.stringify(result.failures)}; Expected: ${JSON.stringify(expected.failures)}`);\r\n assert.deepEqualInAnyOrder(result.failures.map(({ elementId, reason }) => ({ elementId, reason })), expected.failures);\r\n\r\n for (const retainedId of retainedIds)\r\n assert.isDefined(iModelDb.elements.tryGetElement(retainedId), `${retainedId} should have been retained`);\r\n\r\n for (const deletedId of deletedIds)\r\n assert.isUndefined(iModelDb.elements.tryGetElement(deletedId), `${deletedId} should have been deleted`);\r\n};\r\n\r\ndescribe(\"DeleteDefinitionElements\", () => {\r\n const outputDir: string = path.join(KnownTestLocations.outputDir, \"DeleteDefinitionElements\");\r\n\r\n let seedDb: SnapshotDb;\r\n let iModelDb: SnapshotDb;\r\n let subjectId: Id64String;\r\n let definitionModelId: Id64String;\r\n let physicalModelId: Id64String;\r\n let spatialCategoryId: Id64String;\r\n let subCategoryId: Id64String;\r\n let filteredSubCategoryId: Id64String;\r\n let spatialCategorySelectorId: Id64String;\r\n let modelSelectorId: Id64String;\r\n let displayStyle3dId: Id64String;\r\n let viewId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let drawingCategorySelectorId: Id64String;\r\n let displayStyle2dId: Id64String;\r\n let drawingViewId: Id64String;\r\n let geometryPartId: Id64String;\r\n let renderMaterialId: Id64String;\r\n let textureId: Id64String;\r\n let physicalObjectId1: Id64String;\r\n let physicalObjectId2: Id64String;\r\n let physicalObjectId3: Id64String;\r\n\r\n before(async () => {\r\n if (!IModelJsFs.existsSync(KnownTestLocations.outputDir)) {\r\n IModelJsFs.mkdirSync(KnownTestLocations.outputDir);\r\n }\r\n if (!IModelJsFs.existsSync(outputDir)) {\r\n IModelJsFs.mkdirSync(outputDir);\r\n }\r\n\r\n const seedDbFile = IModelTestUtils.prepareOutputFile(\"DeleteDefinitionElements\", \"seed.bim\");\r\n if (IModelJsFs.existsSync(seedDbFile)) {\r\n IModelJsFs.removeSync(seedDbFile);\r\n }\r\n seedDb = SnapshotDb.createEmpty(seedDbFile, { rootSubject: { name: \"DeleteDefinitionElements\" } });\r\n await ExtensiveTestScenario.prepareDb(seedDb);\r\n await ExtensiveTestScenario.populateDb(seedDb);\r\n\r\n // Get ElementIds of DefinitionElements created by populateDb\r\n subjectId = seedDb.elements.queryElementIdByCode(Subject.createCode(seedDb, IModel.rootSubjectId, \"Subject\"))!;\r\n definitionModelId = seedDb.elements.queryElementIdByCode(InformationPartitionElement.createCode(seedDb, subjectId, \"Definition\"))!;\r\n physicalModelId = seedDb.elements.queryElementIdByCode(PhysicalPartition.createCode(seedDb, subjectId, \"Physical\"))!;\r\n spatialCategoryId = seedDb.elements.queryElementIdByCode(SpatialCategory.createCode(seedDb, definitionModelId, \"SpatialCategory\"))!;\r\n subCategoryId = seedDb.elements.queryElementIdByCode(SubCategory.createCode(seedDb, spatialCategoryId, \"SubCategory\"))!;\r\n filteredSubCategoryId = seedDb.elements.queryElementIdByCode(SubCategory.createCode(seedDb, spatialCategoryId, \"FilteredSubCategory\"))!;\r\n spatialCategorySelectorId = seedDb.elements.queryElementIdByCode(CategorySelector.createCode(seedDb, definitionModelId, \"SpatialCategories\"))!;\r\n modelSelectorId = seedDb.elements.queryElementIdByCode(ModelSelector.createCode(seedDb, definitionModelId, \"SpatialModels\"))!;\r\n displayStyle3dId = seedDb.elements.queryElementIdByCode(DisplayStyle3d.createCode(seedDb, definitionModelId, \"DisplayStyle3d\"))!;\r\n viewId = seedDb.elements.queryElementIdByCode(OrthographicViewDefinition.createCode(seedDb, definitionModelId, \"Orthographic View\"))!;\r\n drawingCategoryId = seedDb.elements.queryElementIdByCode(DrawingCategory.createCode(seedDb, definitionModelId, \"DrawingCategory\"))!;\r\n drawingCategorySelectorId = seedDb.elements.queryElementIdByCode(CategorySelector.createCode(seedDb, definitionModelId, \"DrawingCategories\"))!;\r\n displayStyle2dId = seedDb.elements.queryElementIdByCode(DisplayStyle2d.createCode(seedDb, definitionModelId, \"DisplayStyle2d\"))!;\r\n drawingViewId = seedDb.elements.queryElementIdByCode(DrawingViewDefinition.createCode(seedDb, definitionModelId, \"Drawing View\"))!;\r\n geometryPartId = seedDb.elements.queryElementIdByCode(GeometryPart.createCode(seedDb, definitionModelId, \"GeometryPart\"))!;\r\n renderMaterialId = seedDb.elements.queryElementIdByCode(RenderMaterialElement.createCode(seedDb, definitionModelId, \"RenderMaterial\"))!;\r\n textureId = seedDb.elements.queryElementIdByCode(Texture.createCode(seedDb, definitionModelId, \"Texture\"))!;\r\n physicalObjectId1 = IModelTestUtils.queryByUserLabel(seedDb, \"PhysicalObject1\");\r\n physicalObjectId2 = IModelTestUtils.queryByUserLabel(seedDb, \"PhysicalObject2\");\r\n physicalObjectId3 = IModelTestUtils.queryByUserLabel(seedDb, \"PhysicalObject3\");\r\n\r\n assert.isTrue(Id64.isValidId64(physicalModelId));\r\n assert.isTrue(Id64.isValidId64(spatialCategoryId));\r\n assert.isTrue(Id64.isValidId64(subCategoryId));\r\n assert.isTrue(Id64.isValidId64(spatialCategorySelectorId));\r\n assert.isTrue(Id64.isValidId64(modelSelectorId));\r\n assert.isTrue(Id64.isValidId64(displayStyle3dId));\r\n assert.isTrue(Id64.isValidId64(viewId));\r\n assert.isTrue(Id64.isValidId64(drawingCategoryId));\r\n assert.isTrue(Id64.isValidId64(drawingCategorySelectorId));\r\n assert.isTrue(Id64.isValidId64(displayStyle2dId));\r\n assert.isTrue(Id64.isValidId64(drawingViewId));\r\n assert.isTrue(Id64.isValidId64(geometryPartId));\r\n assert.isTrue(Id64.isValidId64(renderMaterialId));\r\n assert.isTrue(Id64.isValidId64(textureId));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId1));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId2));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId3));\r\n\r\n withEditTxn(seedDb, \"save changes\", () => { });\r\n });\r\n\r\n beforeEach(async () => {\r\n iModelDb = SnapshotDb.createFrom(seedDb, IModelTestUtils.prepareOutputFile(\"DeleteDefinitionElements\", \"DeleteDefinitionElements.bim\"));\r\n assert.isTrue(iModelDb.isOpen);\r\n iModelDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(() => {\r\n if (iModelDb.isOpen)\r\n iModelDb.close();\r\n });\r\n\r\n after(() => {\r\n if (seedDb.isOpen)\r\n seedDb.close();\r\n });\r\n\r\n it(\"should delete if not used\", async () => {\r\n const txn = new EditTxn(iModelDb, \"delete definition elements\");\r\n txn.start();\r\n\r\n let usedDefinitionElementIds: Id64Set;\r\n const expectDeleteToThrow = (elementId: string) => assert.throws(() => txn.deleteElement(elementId));\r\n\r\n try {\r\n // make sure deleteDefinitionElements skips Elements that are not DefinitionElements\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId1));\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId2));\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId3));\r\n assert.isDefined(iModelDb.elements.tryGetElement(subjectId));\r\n\r\n // make sure deleteDefinitionElements skips invalid Ids\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([Id64.invalid, Id64.invalid]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n\r\n // delete/deleteDefinitionElements for a used GeometryPart should fail\r\n expectDeleteToThrow(geometryPartId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([geometryPartId]);\r\n assert.isTrue(usedDefinitionElementIds.has(geometryPartId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(geometryPartId));\r\n\r\n // deleteDefinitionElements for an unused GeometryPart should succeed, delete should still fail\r\n const unusedGeometryPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: GeometryPart.createCode(iModelDb, definitionModelId, \"Unused GeometryPart\"),\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const unusedGeometryPartId = txn.insertElement(unusedGeometryPartProps);\r\n assert.isTrue(Id64.isValidId64(unusedGeometryPartId));\r\n expectDeleteToThrow(unusedGeometryPartId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedGeometryPartId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedGeometryPartId));\r\n\r\n // delete/deleteDefinitionElements for a used RenderMaterial should fail\r\n expectDeleteToThrow(renderMaterialId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([renderMaterialId]);\r\n assert.isTrue(usedDefinitionElementIds.has(renderMaterialId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(renderMaterialId));\r\n\r\n // deleteDefinitionElements for an unused RenderMaterial should succeed, delete should still fail\r\n const unusedRenderMaterial = RenderMaterialElement.create(iModelDb, definitionModelId, \"Unused RenderMaterial\", { paletteName: \"PaletteName\" });\r\n const unusedRenderMaterialId = txn.insertElement(unusedRenderMaterial.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedRenderMaterialId));\r\n expectDeleteToThrow(unusedRenderMaterialId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedRenderMaterialId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedRenderMaterialId));\r\n\r\n // delete/deleteDefinitionElements for a used Texture should fail\r\n expectDeleteToThrow(textureId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([textureId]);\r\n assert.isTrue(usedDefinitionElementIds.has(textureId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(textureId));\r\n\r\n // deleteDefinitionElements for an unused Texture should succeed, delete should still fail\r\n const textureData = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 3, 0, 0, 0, 3, 8, 2, 0, 0, 0, 217, 74, 34, 232, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, 177, 143, 11, 252, 97, 5, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 14, 195, 0, 0, 14, 195, 1, 199, 111, 168, 100, 0, 0, 0, 24, 73, 68, 65, 84, 24, 87, 99, 248, 15, 4, 12, 12, 64, 4, 198, 64, 46, 132, 5, 162, 254, 51, 0, 0, 195, 90, 10, 246, 127, 175, 154, 145, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130]).toString(\"base64\");\r\n const unusedTexture = Texture.createTexture(iModelDb, definitionModelId, \"Unused Texture\", ImageSourceFormat.Png, textureData, \"Description for Unused Texture\");\r\n const unusedTextureId = txn.insertElement(unusedTexture.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedTextureId));\r\n expectDeleteToThrow(unusedTextureId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedTextureId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedTextureId));\r\n\r\n // delete/deleteDefinitionElements for a used SpatialCategory should fail\r\n expectDeleteToThrow(spatialCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([spatialCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(spatialCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategoryId));\r\n\r\n // delete/deleteDefinitionElements for a default SubCategory should fail\r\n const spatialCategory = iModelDb.elements.getElement<SpatialCategory>(spatialCategoryId, SpatialCategory);\r\n const defaultSpatialSubCategoryId = spatialCategory.myDefaultSubCategoryId();\r\n expectDeleteToThrow(defaultSpatialSubCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([defaultSpatialSubCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(defaultSpatialSubCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(defaultSpatialSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements for a used, non-default SubCategory should fail\r\n expectDeleteToThrow(subCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([subCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(subCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(subCategoryId));\r\n\r\n // deleteDefinitionElements for an unused SubCategory should succeed, delete should still fail\r\n const unusedSubCategory = SubCategory.create(iModelDb, spatialCategoryId, \"Unused SubCategory\", {});\r\n const unusedSubCategoryId = txn.insertElement(unusedSubCategory.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedSubCategoryId));\r\n expectDeleteToThrow(unusedSubCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedSubCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSubCategoryId));\r\n\r\n // deleteDefinitionElements for an unused SpatialCategory should succeed, delete should still fail\r\n const unusedSpatialCategory = SpatialCategory.create(iModelDb, definitionModelId, \"Unused SpatialCategory\");\r\n const unusedSpatialCategoryId = txn.insertElement(unusedSpatialCategory.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryId));\r\n const reloadedSpatialCategory = iModelDb.elements.getElement<SpatialCategory>(unusedSpatialCategoryId, SpatialCategory);\r\n const unusedSpatialCategoryDefaultSubCategoryId = reloadedSpatialCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryDefaultSubCategoryId));\r\n expectDeleteToThrow(unusedSpatialCategoryId);\r\n expectDeleteToThrow(unusedSpatialCategoryDefaultSubCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedSpatialCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryDefaultSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements of a used DrawingCategory should fail\r\n expectDeleteToThrow(drawingCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([drawingCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(drawingCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategoryId));\r\n\r\n // deleteDefinitionElements for an unused DrawingCategory should succeed, delete should still fail\r\n const unusedDrawingCategory = DrawingCategory.create(iModelDb, definitionModelId, \"Unused DrawingCategory\");\r\n const unusedDrawingCategoryId = txn.insertElement(unusedDrawingCategory.toJSON());\r\n assert.isTrue(Id64.isValidId64(unusedDrawingCategoryId));\r\n const reloadedDrawingCategory = iModelDb.elements.getElement<DrawingCategory>(unusedDrawingCategoryId, DrawingCategory);\r\n const unusedDrawingSubCategoryId = reloadedDrawingCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedDrawingSubCategoryId));\r\n expectDeleteToThrow(unusedDrawingSubCategoryId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([unusedDrawingCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingCategoryId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements of DefinitionElements used by an existing SpatialViewDefinition should fail\r\n expectDeleteToThrow(spatialCategorySelectorId);\r\n expectDeleteToThrow(modelSelectorId);\r\n expectDeleteToThrow(displayStyle3dId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([spatialCategorySelectorId, modelSelectorId, displayStyle3dId]);\r\n assert.isTrue(usedDefinitionElementIds.has(spatialCategorySelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(modelSelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(displayStyle3dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(modelSelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle3dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(viewId));\r\n\r\n // deleteDefinitionElements should succeed when the list includes the SpatialViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n expectDeleteToThrow(viewId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(modelSelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle3dId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(viewId));\r\n\r\n // delete/deleteDefinitionElements of DefinitionElements used by an existing DrawingViewDefinition should fail\r\n expectDeleteToThrow(drawingCategorySelectorId);\r\n expectDeleteToThrow(displayStyle2dId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([drawingCategorySelectorId, displayStyle2dId]);\r\n assert.isTrue(usedDefinitionElementIds.has(drawingCategorySelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(displayStyle2dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle2dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingViewId));\r\n\r\n // deleteDefinitionElements should succeed when the list includes the DrawingViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n expectDeleteToThrow(drawingViewId);\r\n usedDefinitionElementIds = txn.deleteDefinitionElements([drawingViewId, drawingCategorySelectorId, displayStyle2dId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle2dId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingViewId));\r\n\r\n txn.end();\r\n } finally {\r\n if (txn.isActive)\r\n txn.end(\"abandon\");\r\n\r\n iModelDb.close();\r\n }\r\n });\r\n\r\n describe(\"deleteElements\", () => {\r\n let elementCounter = 0;\r\n\r\n beforeEach(() => { elementCounter = 0; });\r\n\r\n afterEach(() => {\r\n if (iModelDb.isOpen) {\r\n const txn = new EditTxn(iModelDb, \"abandon\");\r\n txn.start();\r\n txn.end(\"abandon\");\r\n }\r\n });\r\n\r\n const insertDefinitionElement = (txn: EditTxn, parentId?: Id64String, modelId?: Id64String): Id64String => {\r\n const props: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: modelId ?? definitionModelId,\r\n code: GeometryPart.createCode(iModelDb, modelId ?? definitionModelId, `TestPart_${++elementCounter}`),\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n /**\r\n * Failures reported when the used `spatialCategoryId` is requested on its own. Validation runs once over the expanded set\r\n * (no pruning between the FK pass and the definition-usage pass), so the used SpatialCategory is reported via its hard FK and\r\n * its used non-default SubCategories (pulled into the set as children) are reported as `DefinitionInUse` as well.\r\n */\r\n const usedSpatialCategoryViolations = (): BulkDeleteFailure[] => [\r\n categoryInUse3d(spatialCategoryId),\r\n definitionInUse(subCategoryId),\r\n definitionInUse(filteredSubCategoryId),\r\n ];\r\n\r\n /**\r\n * Call deleteElements, compare the returned result object against `expected`, then check which elements survived vs. were deleted.\r\n * Rolls back changes with abandonChanges afterwards.\r\n */\r\n const executeTestCase = (txn: EditTxn, _label: string, idsToDelete: Id64Array, deletedIds: Id64Array, expected: ExpectedResult, retainedIds: Id64Array, abandonChanges: boolean = true) => {\r\n const result = txn.deleteElements(idsToDelete);\r\n assertResult(result, expected, deletedIds, retainedIds, iModelDb);\r\n\r\n if (abandonChanges)\r\n txn.abandonChanges();\r\n };\r\n\r\n it(\"should delete only if not used with deleteElements\", async () => {\r\n const txn = new EditTxn(iModelDb, \"delete definition elements\");\r\n txn.start();\r\n\r\n /** Run deleteElements and compare the returned result object against `expected`, then check deleted / retained ids. */\r\n const expectDelete = (idsToDelete: Id64Array, expected: ExpectedResult, deletedIds: Id64Array, retainedIds: Id64Array) =>\r\n assertResult(txn.deleteElements(idsToDelete), expected, deletedIds, retainedIds, iModelDb);\r\n\r\n try {\r\n // Deleting the Subject expands the delete set to everything beneath it (partitions, sub-models and their contents).\r\n // Every element in this iModel lives under that Subject, so all usages of the categories / GeometryPart / RenderMaterial\r\n // in the Definition model are *intra-set* and must not block the deletion: everything is deleted.\r\n expectDelete(\r\n [physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId],\r\n success,\r\n [physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId, definitionModelId, physicalModelId, spatialCategoryId, geometryPartId, renderMaterialId],\r\n [],\r\n );\r\n\r\n // Reset the db state\r\n txn.abandonChanges();\r\n\r\n // make sure deleteElements throws for invalid Ids\r\n assert.throws(() => txn.deleteElements([Id64.invalid, Id64.invalid]));\r\n\r\n // deleteElement/deleteElements for a used GeometryPart should fail\r\n assert.throws(() => txn.deleteElement(geometryPartId));\r\n expectDelete([geometryPartId], constraintViolation(definitionInUse(geometryPartId)), [], [geometryPartId]);\r\n\r\n // deleteElements for an unused GeometryPart should succeed, delete should still fail\r\n const unusedGeometryPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: GeometryPart.createCode(iModelDb, definitionModelId, \"Unused GeometryPart\"),\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n // Reset the db state\r\n txn.abandonChanges();\r\n const unusedGeometryPartId = txn.insertElement(unusedGeometryPartProps);\r\n assert.isTrue(Id64.isValidId64(unusedGeometryPartId));\r\n assert.throws(() => txn.deleteElement(unusedGeometryPartId));\r\n expectDelete([unusedGeometryPartId], success, [unusedGeometryPartId], []);\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a used RenderMaterial should fail\r\n assert.throws(() => txn.deleteElement(renderMaterialId));\r\n expectDelete([renderMaterialId], constraintViolation(definitionInUse(renderMaterialId)), [], [renderMaterialId]);\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused RenderMaterial should succeed, delete should still fail\r\n const unusedRenderMaterialId = RenderMaterialElement.insert(txn, definitionModelId, \"Unused RenderMaterial\", { paletteName: \"PaletteName\" });\r\n assert.isTrue(Id64.isValidId64(unusedRenderMaterialId));\r\n assert.throws(() => txn.deleteElement(unusedRenderMaterialId));\r\n expectDelete([unusedRenderMaterialId], success, [unusedRenderMaterialId], []);\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a used Texture should fail\r\n assert.throws(() => txn.deleteElement(textureId));\r\n expectDelete([textureId], constraintViolation(definitionInUse(textureId)), [], [textureId]);\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused Texture should succeed, delete should still fail\r\n const unusedTextureId = IModelTestUtils.insertTextureElement(txn, definitionModelId, \"Unused Texture\");\r\n assert.isTrue(Id64.isValidId64(unusedTextureId));\r\n assert.throws(() => txn.deleteElement(unusedTextureId));\r\n expectDelete([unusedTextureId], success, [unusedTextureId], []);\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a used SpatialCategory should fail (hard FK from GeometricElement3d.CategoryId, so not DefinitionInUse).\r\n // Its used non-default SubCategories are pulled into the set as children and are reported as well.\r\n assert.throws(() => txn.deleteElement(spatialCategoryId));\r\n expectDelete([spatialCategoryId], constraintViolation(...usedSpatialCategoryViolations()), [], [spatialCategoryId, subCategoryId, filteredSubCategoryId]);\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a default SubCategory should fail\r\n const spatialCategory = iModelDb.elements.getElement<SpatialCategory>(spatialCategoryId, SpatialCategory);\r\n const defaultSpatialSubCategoryId = spatialCategory.myDefaultSubCategoryId();\r\n assert.throws(() => txn.deleteElement(defaultSpatialSubCategoryId));\r\n expectDelete([defaultSpatialSubCategoryId], constraintViolation(definitionInUse(defaultSpatialSubCategoryId)), [], [defaultSpatialSubCategoryId]);\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements for a used, non-default SubCategory should fail\r\n assert.throws(() => txn.deleteElement(subCategoryId));\r\n expectDelete([subCategoryId], constraintViolation(definitionInUse(subCategoryId)), [], [subCategoryId]);\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused SubCategory should succeed, delete should still fail\r\n const unusedSubCategoryId = SubCategory.insert(txn, spatialCategoryId, \"Unused SubCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedSubCategoryId));\r\n assert.throws(() => txn.deleteElement(unusedSubCategoryId));\r\n expectDelete([unusedSubCategoryId], success, [unusedSubCategoryId], []);\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused SpatialCategory should succeed, delete should still fail\r\n const unusedSpatialCategoryId = SpatialCategory.insert(txn, definitionModelId, \"Unused SpatialCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryId));\r\n const unusedSpatialCategory = iModelDb.elements.getElement<SpatialCategory>(unusedSpatialCategoryId, SpatialCategory);\r\n const unusedSpatialCategoryDefaultSubCategoryId = unusedSpatialCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryDefaultSubCategoryId));\r\n assert.throws(() => txn.deleteElement(unusedSpatialCategoryId));\r\n assert.throws(() => txn.deleteElement(unusedSpatialCategoryDefaultSubCategoryId));\r\n expectDelete([unusedSpatialCategoryId], success, [unusedSpatialCategoryId, unusedSpatialCategoryDefaultSubCategoryId], []);\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements of a used DrawingCategory should fail (hard FK from GeometricElement2d.CategoryId, so not DefinitionInUse)\r\n assert.throws(() => txn.deleteElement(drawingCategoryId));\r\n expectDelete([drawingCategoryId], constraintViolation(categoryInUse2d(drawingCategoryId)), [], [drawingCategoryId]);\r\n txn.abandonChanges();\r\n\r\n // deleteElements for an unused DrawingCategory should succeed, delete should still fail\r\n const unusedDrawingCategoryId = DrawingCategory.insert(txn, definitionModelId, \"Unused DrawingCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedDrawingCategoryId));\r\n const unusedDrawingCategory = iModelDb.elements.getElement<DrawingCategory>(unusedDrawingCategoryId, DrawingCategory);\r\n const unusedDrawingSubCategoryId = unusedDrawingCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedDrawingSubCategoryId));\r\n assert.throws(() => txn.deleteElement(unusedDrawingSubCategoryId));\r\n expectDelete([unusedDrawingCategoryId], success, [unusedDrawingCategoryId, unusedDrawingSubCategoryId], []);\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements of DefinitionElements used by an existing SpatialViewDefinition should fail\r\n assert.throws(() => txn.deleteElement(spatialCategorySelectorId));\r\n assert.throws(() => txn.deleteElement(modelSelectorId));\r\n assert.throws(() => txn.deleteElement(displayStyle3dId));\r\n expectDelete(\r\n [spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n constraintViolation(definitionInUse(spatialCategorySelectorId), definitionInUse(modelSelectorId), definitionInUse(displayStyle3dId)),\r\n [],\r\n [spatialCategorySelectorId, modelSelectorId, displayStyle3dId, viewId],\r\n );\r\n txn.abandonChanges();\r\n\r\n // deleteElements should succeed when the list includes the SpatialViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n assert.throws(() => txn.deleteElement(viewId));\r\n expectDelete(\r\n [viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n success,\r\n [viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n [],\r\n );\r\n txn.abandonChanges();\r\n\r\n // deleteElement/deleteElements of DefinitionElements used by an existing DrawingViewDefinition should fail\r\n assert.throws(() => txn.deleteElement(drawingCategorySelectorId));\r\n assert.throws(() => txn.deleteElement(displayStyle2dId));\r\n expectDelete(\r\n [drawingCategorySelectorId, displayStyle2dId],\r\n constraintViolation(definitionInUse(drawingCategorySelectorId), definitionInUse(displayStyle2dId)),\r\n [],\r\n [drawingCategorySelectorId, displayStyle2dId, drawingViewId],\r\n );\r\n txn.abandonChanges();\r\n\r\n // deleteElements should succeed when the list includes the DrawingViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n assert.throws(() => txn.deleteElement(drawingViewId));\r\n expectDelete(\r\n [drawingViewId, drawingCategorySelectorId, displayStyle2dId],\r\n success,\r\n [drawingViewId, drawingCategorySelectorId, displayStyle2dId],\r\n [],\r\n );\r\n } finally {\r\n if (txn.isActive)\r\n txn.end(\"abandon\");\r\n }\r\n });\r\n\r\n it(\"deleting a Subject is rejected when a definition beneath it is used from outside its subtree\", () => {\r\n const txn = new EditTxn(iModelDb, \"delete subject with outside user\");\r\n txn.start();\r\n try {\r\n // A PhysicalObject in a model that is NOT under the Subject uses the SpatialCategory. The category is a hard FK violator\r\n // (bis_GeometricElement3d.CategoryId, so ReferencedByForeignKey rather than DefinitionInUse). Its SubCategories are only\r\n // used by elements inside the Subject's subtree, so they are not reported. The whole call is rejected - the requested\r\n // PhysicalObjects survive as well, even though nothing references them.\r\n const outsideModelId = PhysicalModel.insert(txn, IModel.rootSubjectId, \"OutsideSubject\");\r\n const outsideUserProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: outsideModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: Point3d.create(0, 0, 0).toJSON(), angles: {} },\r\n };\r\n const outsideUserId = txn.insertElement(outsideUserProps);\r\n txn.saveChanges();\r\n\r\n executeTestCase(\r\n txn,\r\n \"subject rejected by outside user of its category\",\r\n [physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId],\r\n [],\r\n constraintViolation(categoryInUse3d(spatialCategoryId)),\r\n [physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId, definitionModelId, physicalModelId, spatialCategoryId, IModel.getDefaultSubCategoryId(spatialCategoryId), outsideUserId],\r\n );\r\n } finally {\r\n if (txn.isActive)\r\n txn.end(\"abandon\");\r\n }\r\n });\r\n\r\n describe(\"basic tests\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete Definition Elements\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n it(\"deletes a single unused definition element\", () => {\r\n const element = insertDefinitionElement(txn);\r\n executeTestCase(txn, \"single unused definition element\", [element], [element], success, []);\r\n });\r\n\r\n it(\"deletes multiple unused definition elements in one call\", () => {\r\n const element1 = insertDefinitionElement(txn);\r\n const element2 = insertDefinitionElement(txn);\r\n const element3 = insertDefinitionElement(txn);\r\n executeTestCase(txn, \"multiple unused definition elements\", [element1, element2, element3], [element1, element2, element3], success, []);\r\n });\r\n\r\n it(\"returns a Success result when given an empty array\", () => {\r\n executeTestCase(txn, \"empty input\", [], [], success, []);\r\n });\r\n\r\n it(\"throws for invalid ids\", () => {\r\n assert.throws(() => txn.deleteElements([Id64.invalid, Id64.invalid]));\r\n });\r\n\r\n it(\"reports an in-use definition element as a failure and does not delete it\", () => {\r\n // geometryPartId is referenced by PhysicalObject1's geometry stream\r\n executeTestCase(txn, \"in-use GeometryPart\", [geometryPartId], [], constraintViolation(definitionInUse(geometryPartId)), [geometryPartId]);\r\n });\r\n\r\n it(\"reports only the in-use definition element as a failure when mixing used and unused parts, and deletes nothing\", () => {\r\n const unusedElement = insertDefinitionElement(txn);\r\n const usedElement = insertDefinitionElement(txn);\r\n\r\n // Reference usedElement from a physical element geometry stream\r\n const physElemProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: Point3d.create(0, 0, 0).toJSON(), angles: {} },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedElement),\r\n };\r\n const physElemId = txn.insertElement(physElemProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"used + unused definition elements\",\r\n [unusedElement, usedElement],\r\n [],\r\n constraintViolation(definitionInUse(usedElement)),\r\n [unusedElement, usedElement, physElemId],\r\n );\r\n });\r\n\r\n it(\"reports an in-use RenderMaterial as a failure and does not delete it\", () => {\r\n executeTestCase(txn, \"in-use RenderMaterial\", [renderMaterialId], [], constraintViolation(definitionInUse(renderMaterialId)), [renderMaterialId]);\r\n });\r\n\r\n it(\"deletes an unused RenderMaterial\", () => {\r\n const unusedRenderMaterialId = RenderMaterialElement.insert(txn, definitionModelId, \"Unused RenderMaterial\", { paletteName: \"PaletteName\" });\r\n executeTestCase(txn, \"unused RenderMaterial\", [unusedRenderMaterialId], [unusedRenderMaterialId], success, []);\r\n });\r\n\r\n it(\"reports an in-use Texture as a failure and does not delete it\", () => {\r\n executeTestCase(txn, \"in-use Texture\", [textureId], [], constraintViolation(definitionInUse(textureId)), [textureId]);\r\n });\r\n\r\n it(\"deletes an unused Texture\", () => {\r\n const unusedTextureId = IModelTestUtils.insertTextureElement(txn, definitionModelId, \"Unused Texture\");\r\n executeTestCase(txn, \"unused Texture\", [unusedTextureId], [unusedTextureId], success, []);\r\n });\r\n\r\n it(\"reports every element as a failure when all are in-use definition elements\", () => {\r\n const usedElement1 = insertDefinitionElement(txn);\r\n const usedElement2 = insertDefinitionElement(txn);\r\n const usedElement3 = insertDefinitionElement(txn);\r\n\r\n // Reference usedElements from a physical element geometry stream\r\n const physElemProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: Point3d.create(0, 0, 0).toJSON(), angles: {} },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedElement1),\r\n };\r\n assert.isTrue(Id64.isValid(txn.insertElement(physElemProps)));\r\n physElemProps.geom = IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedElement2);\r\n assert.isTrue(Id64.isValid(txn.insertElement(physElemProps)));\r\n physElemProps.geom = IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedElement3);\r\n assert.isTrue(Id64.isValid(txn.insertElement(physElemProps)));\r\n\r\n // Every requested element is in use - all three are reported and nothing is deleted.\r\n executeTestCase(\r\n txn,\r\n \"all in-use\",\r\n [usedElement1, usedElement2, usedElement3],\r\n [],\r\n constraintViolation(definitionInUse(usedElement1), definitionInUse(usedElement2), definitionInUse(usedElement3)),\r\n [usedElement1, usedElement2, usedElement3],\r\n );\r\n });\r\n\r\n it(\"a definition used only by elements inside the delete set is not DefinitionInUse\", () => {\r\n const insertPhysicalObject = (model: Id64String, category: Id64String): Id64String => {\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n // Case 1: the only user of the category is requested directly.\r\n const directCategory = SpatialCategory.insert(txn, definitionModelId, \"DirectUserCategory\", new SubCategoryAppearance());\r\n const directUser = insertPhysicalObject(physicalModelId, directCategory);\r\n\r\n // Case 2: the only user of the category lives in a sub-model that is reached through the partition cascade, i.e. it is in the\r\n // *expanded* delete set but not in the requested ids.\r\n const cascadeCategory = SpatialCategory.insert(txn, definitionModelId, \"CascadeUserCategory\", new SubCategoryAppearance());\r\n const partitionId = PhysicalModel.insert(txn, subjectId, \"CascadeUserModel\");\r\n const cascadeUser = insertPhysicalObject(partitionId, cascadeCategory);\r\n txn.saveChanges();\r\n\r\n const directSubCategory = IModel.getDefaultSubCategoryId(directCategory);\r\n const cascadeSubCategory = IModel.getDefaultSubCategoryId(cascadeCategory);\r\n\r\n executeTestCase(txn, \"category + its direct user\", [directCategory, directUser], [directCategory, directSubCategory, directUser], success, [cascadeCategory, cascadeSubCategory, cascadeUser]);\r\n executeTestCase(txn, \"category + partition containing its only user\", [cascadeCategory, partitionId], [cascadeCategory, cascadeSubCategory, partitionId, cascadeUser], success, [directCategory, directSubCategory, directUser]);\r\n });\r\n });\r\n\r\n describe(\"category and subcategory tests\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete Definition Elements\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n it(\"reports an in-use SpatialCategory as an FK violator (plus its used SubCategories) and does not delete it\", () => {\r\n executeTestCase(txn, \"in-use SpatialCategory\", [spatialCategoryId], [], constraintViolation(...usedSpatialCategoryViolations()), [spatialCategoryId, subCategoryId, filteredSubCategoryId]);\r\n });\r\n\r\n it(\"reports the default SubCategory as a failure when its parent SpatialCategory is in use\", () => {\r\n const spatialCategory = iModelDb.elements.getElement<SpatialCategory>(spatialCategoryId, SpatialCategory);\r\n const defaultSubCategoryId = spatialCategory.myDefaultSubCategoryId();\r\n executeTestCase(txn, \"default SubCategory\", [defaultSubCategoryId], [], constraintViolation(definitionInUse(defaultSubCategoryId)), [defaultSubCategoryId]);\r\n });\r\n\r\n it(\"reports a used non-default SubCategory as a failure and does not delete it\", () => {\r\n executeTestCase(txn, \"in-use SubCategory\", [subCategoryId], [], constraintViolation(definitionInUse(subCategoryId)), [subCategoryId]);\r\n });\r\n\r\n it(\"deletes an unused non-default SubCategory\", () => {\r\n const unusedSubCategoryId = SubCategory.insert(txn, spatialCategoryId, \"Unused SubCategory\", {});\r\n executeTestCase(txn, \"unused SubCategory\", [unusedSubCategoryId], [unusedSubCategoryId], success, [spatialCategoryId]);\r\n });\r\n\r\n it(\"deletes an unused SpatialCategory together with its default SubCategory\", () => {\r\n const unusedCategoryId = SpatialCategory.insert(txn, definitionModelId, \"Unused SpatialCategory\", {});\r\n const unusedCategory = iModelDb.elements.getElement<SpatialCategory>(unusedCategoryId, SpatialCategory);\r\n const unusedDefaultSubCategoryId = unusedCategory.myDefaultSubCategoryId();\r\n\r\n executeTestCase(\r\n txn,\r\n \"unused SpatialCategory + default SubCategory\",\r\n [unusedCategoryId],\r\n [unusedCategoryId, unusedDefaultSubCategoryId],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n it(\"deletes an unused DrawingCategory together with its default SubCategory\", () => {\r\n const unusedDrawingCategoryId = DrawingCategory.insert(txn, definitionModelId, \"Unused DrawingCategory\", {});\r\n const unusedDrawingCategory = iModelDb.elements.getElement<DrawingCategory>(unusedDrawingCategoryId, DrawingCategory);\r\n const unusedDrawingSubCategoryId = unusedDrawingCategory.myDefaultSubCategoryId();\r\n\r\n executeTestCase(\r\n txn,\r\n \"unused DrawingCategory + default SubCategory\",\r\n [unusedDrawingCategoryId],\r\n [unusedDrawingCategoryId, unusedDrawingSubCategoryId],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n it(\"reports CategorySelector, ModelSelector, DisplayStyle3d as failures when their view still exists\", () => {\r\n executeTestCase(\r\n txn,\r\n \"view-related still referenced\",\r\n [spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n [],\r\n constraintViolation(definitionInUse(spatialCategorySelectorId), definitionInUse(modelSelectorId), definitionInUse(displayStyle3dId)),\r\n [spatialCategorySelectorId, modelSelectorId, displayStyle3dId, viewId],\r\n );\r\n });\r\n\r\n it(\"deletes CategorySelector, ModelSelector, DisplayStyle3d and the SpatialViewDefinition in one call\", () => {\r\n executeTestCase(\r\n txn,\r\n \"view + view-related\",\r\n [viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n [viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n it(\"deletes DrawingCategorySelector, DisplayStyle2d and the DrawingViewDefinition in one call\", () => {\r\n executeTestCase(\r\n txn,\r\n \"drawing view + drawing view-related\",\r\n [drawingViewId, drawingCategorySelectorId, displayStyle2dId],\r\n [drawingViewId, drawingCategorySelectorId, displayStyle2dId],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n it(\"deletes orphaned CategorySelector and DisplayStyle2d (no view references them)\", () => {\r\n // Insert a standalone CategorySelector and DisplayStyle2d that are not referenced by any view\r\n const orphanCategorySelectorId = CategorySelector.insert(txn, definitionModelId, \"OrphanCategorySelector\", [drawingCategoryId]);\r\n const orphanDisplayStyle2dId = DisplayStyle2d.insert(txn, definitionModelId, \"OrphanDisplayStyle2d\");\r\n\r\n executeTestCase(\r\n txn,\r\n \"orphaned view-related elements\",\r\n [orphanCategorySelectorId, orphanDisplayStyle2dId],\r\n [orphanCategorySelectorId, orphanDisplayStyle2dId],\r\n success,\r\n [],\r\n );\r\n });\r\n });\r\n\r\n describe(\"Element hierarchy\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"test\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n it(\"deletes a parent DefinitionElement and automatically deletes its child\", () => {\r\n const parentPart = insertDefinitionElement(txn);\r\n const childPart = insertDefinitionElement(txn, parentPart);\r\n\r\n // Only pass the parent - the child must be pulled in automatically\r\n executeTestCase(\r\n txn,\r\n \"parent + child definition elements\",\r\n [parentPart],\r\n [parentPart, childPart],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n it(\"deletes a parent DefinitionElement and its child explicitly passed\", () => {\r\n const parentPart = insertDefinitionElement(txn);\r\n const childPart = insertDefinitionElement(txn, parentPart);\r\n\r\n // Pass both parent and child explicitly\r\n executeTestCase(\r\n txn,\r\n \"parent + child definition elements\",\r\n [parentPart, childPart],\r\n [parentPart, childPart],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n // Intra-set code scope\r\n // Both partA and partB are in the input set; partB uses partA as its CodeScope.\r\n // The old implementation would fail here because partA's deletion was blocked by partB's\r\n // code scope reference. The new native API resolves all intra-set dependencies first.\r\n it(\"deletes two DefinitionElements related by code scope when both are in the same set\", () => {\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"DefElemScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const partA = insertDefinitionElement(txn);\r\n const partBProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: partA, value: \"partB-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const partB = txn.insertElement(partBProps);\r\n\r\n // Both unused externally; the intra-set code-scope link must not block deletion\r\n executeTestCase(txn, \"intra-set code scope\", [partA, partB], [partA, partB], success, []);\r\n });\r\n\r\n // Multi-level parent-child hierarchy\r\n // Passing only the root must automatically pull in all descendants (leaf-first).\r\n // The old implementation deleted elements in a fixed ECClass order and could not handle\r\n // arbitrary parent-child chains within the set.\r\n it(\"deletes a 3-level parent-child hierarchy by passing only the root\", () => {\r\n const root = insertDefinitionElement(txn);\r\n const child = insertDefinitionElement(txn, root);\r\n const grandchild = insertDefinitionElement(txn, child);\r\n\r\n // Only supply the root - all descendants must be included and deleted leaf-first\r\n executeTestCase(txn, \"3-level hierarchy via root only\", [root], [root, child, grandchild], success, []);\r\n });\r\n\r\n it(\"deletes a 3-level parent-child hierarchy by passing all elements explicitly\", () => {\r\n const root = insertDefinitionElement(txn);\r\n const child = insertDefinitionElement(txn, root);\r\n const grandchild = insertDefinitionElement(txn, child);\r\n\r\n // Pass all elements explicitly\r\n executeTestCase(\r\n txn,\r\n \"3-level hierarchy with all elements\",\r\n [root, child, grandchild],\r\n [root, child, grandchild],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n // Mixed inputs\r\n it(\"deletes a mixed batch of unused DefinitionElements of different types in one call\", () => {\r\n const unusedPart = insertDefinitionElement(txn);\r\n const unusedRenderMaterial = RenderMaterialElement.insert(txn, definitionModelId, \"BatchRenderMaterial\", { paletteName: \"P\" });\r\n const unusedTexture = IModelTestUtils.insertTextureElement(txn, definitionModelId, \"BatchTexture\");\r\n const unusedSubCategory = SubCategory.insert(txn, spatialCategoryId, \"BatchSubCategory\", {});\r\n\r\n executeTestCase(\r\n txn,\r\n \"mixed unused batch\",\r\n [unusedPart, unusedRenderMaterial, unusedTexture, unusedSubCategory],\r\n [unusedPart, unusedRenderMaterial, unusedTexture, unusedSubCategory],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n // Mixed inputs with intra scope violations and parent child hierarchies\r\n it(\"deletes a mixed batch of used and unused DefinitionElements in a hierarchy with conflicting code scopes with child\", () => {\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"DefElemScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const usedPart = insertDefinitionElement(txn);\r\n const unusedPart = insertDefinitionElement(txn);\r\n const childPart = insertDefinitionElement(txn, usedPart);\r\n\r\n const scopedPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: childPart, value: \"scopedPart-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const scopedPart = txn.insertElement(scopedPartProps);\r\n\r\n // Pass both used and unused parts, with a child that has a code scope reference\r\n executeTestCase(\r\n txn,\r\n \"mixed used and unused batch\",\r\n [usedPart, unusedPart, scopedPart],\r\n [usedPart, unusedPart, childPart, scopedPart],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n // Mixed inputs with intra scope violations and parent child hierarchies\r\n it(\"deletes a mixed batch of used and unused DefinitionElements in a hierarchy with conflicting code scopes\", () => {\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"DefElemScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const usedPart = insertDefinitionElement(txn);\r\n const unusedPart = insertDefinitionElement(txn);\r\n const childPart = insertDefinitionElement(txn, usedPart);\r\n\r\n const scopedPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: usedPart, value: \"scopedPart-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const scopedPart = txn.insertElement(scopedPartProps);\r\n\r\n // Pass both used and unused parts; usedPart is the code scope of scopedPart (outside the set) so it is a direct FK violator\r\n // and the whole call is rejected (unusedPart survives too).\r\n executeTestCase(\r\n txn,\r\n \"mixed used and unused batch\",\r\n [usedPart, unusedPart],\r\n [],\r\n constraintViolation(codeScopeViolator(usedPart)),\r\n [usedPart, unusedPart, childPart, scopedPart],\r\n );\r\n });\r\n });\r\n\r\n describe(\"sub-model hierarchy\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"test\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n let containerCounter = 0;\r\n\r\n const insertDefinitionContainer = (parentModelId?: Id64String): Id64String => {\r\n const scopeModelId = parentModelId ?? definitionModelId;\r\n const codeSpecId = iModelDb.codeSpecs.insert(txn, `ContainerCodeSpec_${++containerCounter}`, CodeScopeSpec.Type.Model);\r\n const code = new Code({ spec: codeSpecId, scope: scopeModelId, value: `Container_${containerCounter}` });\r\n return DefinitionContainer.insert(txn, scopeModelId, code);\r\n };\r\n\r\n /** Assert that the model row has been deleted. */\r\n const assertModelDeleted = (id: Id64String, msg: string) =>\r\n assert.isUndefined(iModelDb.models.tryGetModelProps(id), msg);\r\n\r\n /** Assert that the model row still exists. */\r\n const assertModelExists = (id: Id64String, msg: string) =>\r\n assert.isDefined(iModelDb.models.tryGetModelProps(id), msg);\r\n\r\n it(\"deletes unused definition elements from a DefinitionContainer\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const partA = insertDefinitionElement(txn, undefined, containerId);\r\n const partB = insertDefinitionElement(txn, undefined, containerId);\r\n\r\n executeTestCase(\r\n txn,\r\n \"unused elements in container sub-model\",\r\n [partA, partB],\r\n [partA, partB],\r\n success,\r\n [],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer must survive when container is not in the input set\");\r\n });\r\n\r\n it(\"deletes a DefinitionContainer and all definition elements inside it\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const defElem1 = insertDefinitionElement(txn, undefined, containerId);\r\n const defElem2 = insertDefinitionElement(txn, undefined, containerId);\r\n\r\n executeTestCase(\r\n txn,\r\n \"container + sub-model contents deleted via container id\",\r\n [containerId],\r\n [containerId, defElem1, defElem2],\r\n success,\r\n [],\r\n );\r\n // Sub-model row is deleted once the container element is successfully purged.\r\n assertModelDeleted(containerId, \"DefinitionModel sub-model row must be deleted after container is purged\");\r\n });\r\n\r\n it(\"reports an in-use element inside a DefinitionContainer sub-model as a failure\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const usedPart = insertDefinitionElement(txn, undefined, containerId);\r\n const unusedPart = insertDefinitionElement(txn, undefined, containerId);\r\n // Reference usedPart from a physical element geometry stream.\r\n const physElemProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, usedPart),\r\n };\r\n const physElemId = txn.insertElement(physElemProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"one used + one unused in container sub-model\",\r\n [usedPart, unusedPart],\r\n [],\r\n constraintViolation(definitionInUse(usedPart)),\r\n [usedPart, unusedPart, physElemId],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when the call is rejected\");\r\n });\r\n\r\n it(\"call rejected when the child of a requested parent inside a DefinitionContainer sub-model is in use\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const parent = insertDefinitionElement(txn, undefined, containerId);\r\n const child = insertDefinitionElement(txn, parent, containerId);\r\n // Reference child from a physical element geometry stream.\r\n const physElemProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, child),\r\n };\r\n const physElemId = txn.insertElement(physElemProps);\r\n\r\n // child (pulled into the set via parent) is a DefinitionInUse violator; only the direct violator is reported.\r\n executeTestCase(\r\n txn,\r\n \"parent rejected when child inside container sub-model is in use\",\r\n [parent],\r\n [],\r\n constraintViolation(definitionInUse(child)),\r\n [parent, child, physElemId],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when the call is rejected\");\r\n });\r\n\r\n it(\"deletes two elements inside a DefinitionContainer sub-model related by intra-delete-set code scope\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"NestedDefScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const partA = insertDefinitionElement(txn, undefined, containerId);\r\n const partBProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: containerId,\r\n code: { spec: scopeSpecId, scope: partA, value: \"partB-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const partB = txn.insertElement(partBProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"intra-set code scope in container sub-model\",\r\n [partA, partB],\r\n [partA, partB],\r\n success,\r\n [],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when container is not in the input set\");\r\n });\r\n\r\n it(\"element inside a DefinitionContainer sub-model rejects the call when used as external code scope\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"ExtScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const partA = insertDefinitionElement(txn, undefined, containerId);\r\n const partB = insertDefinitionElement(txn, undefined, containerId);\r\n // external lives in the top-level definition model — scoped to partA but NOT in the input set.\r\n const externalProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: partA, value: \"external-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const externalId = txn.insertElement(externalProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"external code scope rejects element inside container sub-model\",\r\n [partA, partB],\r\n [],\r\n constraintViolation(codeScopeViolator(partA)),\r\n [partA, partB, externalId],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when the call is rejected\");\r\n });\r\n\r\n it(\"cross-container intra-set code scope: both elements deleted cleanly\", () => {\r\n const container1 = insertDefinitionContainer();\r\n const container2 = insertDefinitionContainer();\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"CrossModelScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const partA = insertDefinitionElement(txn, undefined, container1);\r\n const partBProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: container2,\r\n code: { spec: scopeSpecId, scope: partA, value: \"partB-code\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const partB = txn.insertElement(partBProps);\r\n\r\n executeTestCase(\r\n txn,\r\n \"cross-container intra-set code scope\",\r\n [partA, partB],\r\n [partA, partB],\r\n success,\r\n [],\r\n false,\r\n );\r\n assertModelExists(container1, \"container1 sub-model row must survive when container is not in the input set\");\r\n assertModelExists(container2, \"container2 sub-model row must survive when container is not in the input set\");\r\n });\r\n\r\n it(\"mixed elements where in-use ones reject the call and nothing is deleted\", () => {\r\n const containerId = insertDefinitionContainer();\r\n const topUnused = insertDefinitionElement(txn, undefined, definitionModelId);\r\n const topUsed = insertDefinitionElement(txn, undefined, definitionModelId);\r\n const nestedUnused = insertDefinitionElement(txn, undefined, containerId);\r\n const nestedUsed = insertDefinitionElement(txn, undefined, containerId);\r\n\r\n const makeUser = (partId: Id64String): Id64String => {\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, partId),\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n const topUsedPhysElem = makeUser(topUsed);\r\n const nestedUsedPhysElem = makeUser(nestedUsed);\r\n\r\n executeTestCase(\r\n txn,\r\n \"mixed top-level and container sub-model: used reported, nothing deleted\",\r\n [topUnused, topUsed, nestedUnused, nestedUsed],\r\n [],\r\n constraintViolation(definitionInUse(topUsed), definitionInUse(nestedUsed)),\r\n [topUnused, topUsed, nestedUnused, nestedUsed, topUsedPhysElem, nestedUsedPhysElem],\r\n false,\r\n );\r\n assertModelExists(containerId, \"DefinitionContainer sub-model row must survive when the call is rejected\");\r\n });\r\n });\r\n\r\n describe(\"definition and its users deleted together\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete definition + users\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n const insertPhysicalObject = (opts: { categoryId?: Id64String, subCategoryId?: Id64String, renderMaterialId?: Id64String, geometryPartId?: Id64String } = {}): Id64String => {\r\n const category = opts.categoryId ?? spatialCategoryId;\r\n // A material is only recorded in the geometry stream together with a sub-category.\r\n const subCategory = opts.subCategoryId ?? (opts.renderMaterialId ? IModel.getDefaultSubCategoryId(category) : undefined);\r\n return txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), category, subCategory, opts.renderMaterialId, opts.geometryPartId),\r\n } as PhysicalElementProps);\r\n };\r\n\r\n it(\"a GeometryPart with two users is still in use when only one user is in the delete set\", () => {\r\n const part = insertDefinitionElement(txn);\r\n const user1 = insertPhysicalObject({ geometryPartId: part });\r\n const user2 = insertPhysicalObject({ geometryPartId: part });\r\n executeTestCase(txn, \"part + one of two users\", [part, user1], [], constraintViolation(definitionInUse(part)), [part, user1, user2]);\r\n });\r\n\r\n it(\"a DisplayStyle shared by two views is reported in use when only one view is in the delete set\", () => {\r\n const categorySelectorB = CategorySelector.insert(txn, definitionModelId, \"CategorySelectorB\", [spatialCategoryId]);\r\n const modelSelectorB = ModelSelector.insert(txn, definitionModelId, \"ModelSelectorB\", [physicalModelId]);\r\n const viewB = OrthographicViewDefinition.insert(txn, definitionModelId, \"ViewB\", modelSelectorB, categorySelectorB, displayStyle3dId, new Range3d(0, 0, 0, 1, 1, 1));\r\n\r\n executeTestCase(\r\n txn,\r\n \"view A + its selectors + shared style\",\r\n [viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId],\r\n [],\r\n constraintViolation(definitionInUse(displayStyle3dId)),\r\n [viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId, viewB, categorySelectorB, modelSelectorB],\r\n false,\r\n );\r\n\r\n // Deleting both views releases the shared style.\r\n executeTestCase(\r\n txn,\r\n \"both views + everything they reference\",\r\n [viewId, viewB, spatialCategorySelectorId, modelSelectorId, categorySelectorB, modelSelectorB, displayStyle3dId],\r\n [viewId, viewB, spatialCategorySelectorId, modelSelectorId, categorySelectorB, modelSelectorB, displayStyle3dId],\r\n success,\r\n [],\r\n );\r\n });\r\n\r\n it(\"an element referenced through several foreign keys is reported once\", () => {\r\n // A fresh category used by a physical object (CategoryId FK) AND used as the Code scope of a GeometryPart (CodeScopeId FK).\r\n const category = SpatialCategory.insert(txn, definitionModelId, \"DoublyReferencedCategory\", {});\r\n const user = insertPhysicalObject({ categoryId: category });\r\n const scopeSpecId = iModelDb.codeSpecs.insert(txn, \"CategoryScopedSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const scopedPart = txn.insertElement({\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: { spec: scopeSpecId, scope: category, value: \"scoped-part\" },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n } as GeometryPartProps);\r\n\r\n const result = txn.deleteElements([category]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.ConstraintViolation);\r\n assert.equal(result.failures.length, 1, `expected a single failure, got ${JSON.stringify(result.failures)}`);\r\n assert.equal(result.failures[0].elementId, category);\r\n assert.equal(result.failures[0].reason, BulkDeleteFailureReason.ReferencedByForeignKey);\r\n for (const id of [category, user, scopedPart])\r\n assert.isDefined(iModelDb.elements.tryGetElement(id));\r\n });\r\n });\r\n\r\n describe(\"all-or-nothing semantics with definition elements\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"all-or-nothing\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n it(\"DefinitionInUse is a constraint violation: nothing is deleted, including unused elements in the same call\", () => {\r\n const unusedPart = insertDefinitionElement(txn);\r\n const result = txn.deleteElements([geometryPartId, unusedPart]);\r\n assertResult(result, constraintViolation(definitionInUse(geometryPartId)), [], [geometryPartId, unusedPart], iModelDb);\r\n });\r\n\r\n it(\"a used Category is a constraint violation and every violator in the expanded set is reported\", () => {\r\n const unusedPart = insertDefinitionElement(txn);\r\n const result = txn.deleteElements([spatialCategoryId, unusedPart]);\r\n assertResult(result, constraintViolation(...usedSpatialCategoryViolations()), [], [spatialCategoryId, subCategoryId, filteredSubCategoryId, unusedPart], iModelDb);\r\n });\r\n\r\n it(\"reports the in-use cascaded child (not the requested parent) when the violator is a child\", () => {\r\n const parent = insertDefinitionElement(txn);\r\n const child = insertDefinitionElement(txn, parent);\r\n const user = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1), spatialCategoryId, undefined, undefined, child),\r\n } as PhysicalElementProps);\r\n const result = txn.deleteElements([parent]);\r\n assertResult(result, constraintViolation(definitionInUse(child)), [], [parent, child, user], iModelDb);\r\n });\r\n\r\n it(\"deprecated skipFKConstraintValidations flag is ignored and DefinitionInUse is still detected\", () => {\r\n // There is no way to bypass the definition usage check: geometry-stream references are not SQLite foreign keys, so\r\n // skipping validation would silently leave dangling references. The deprecated flag is ignored.\r\n const unusedPart = insertDefinitionElement(txn);\r\n for (const skipFKConstraintValidations of [true, false]) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const result = txn.deleteElements([geometryPartId, unusedPart], { skipFKConstraintValidations });\r\n assertResult(result, constraintViolation(definitionInUse(geometryPartId)), [], [geometryPartId, unusedPart], iModelDb);\r\n }\r\n });\r\n\r\n it(\"ConstraintViolation for a used Category (hard FK) leaves the txn clean\", () => {\r\n txn.saveChanges();\r\n const result = txn.deleteElements([spatialCategoryId]);\r\n assertResult(result, constraintViolation(...usedSpatialCategoryViolations()), [], [spatialCategoryId], iModelDb);\r\n assert.isFalse(iModelDb[_nativeDb].hasUnsavedChanges(), \"a rejected delete must not dirty the txn\");\r\n });\r\n });\r\n\r\n describe(\"cache coherence for cascaded definition elements\", () => {\r\n let txn: EditTxn;\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"cache\");\r\n txn.start();\r\n });\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n it(\"a cached default SubCategory is not readable after its Category is deleted\", () => {\r\n const category = SpatialCategory.insert(txn, definitionModelId, \"CachedCategory\", {});\r\n const defaultSubCategory = iModelDb.elements.getElement<SpatialCategory>(category, SpatialCategory).myDefaultSubCategoryId();\r\n assert.isDefined(iModelDb.elements.getElement(defaultSubCategory)); // prime the cache\r\n\r\n executeTestCase(txn, \"category with cached default subcategory\", [category], [category, defaultSubCategory], success, [], false);\r\n assert.isUndefined(iModelDb.elements.tryGetElementProps(defaultSubCategory), \"cached default SubCategory props must not be served after deletion\");\r\n });\r\n\r\n it(\"cached contents of a deleted DefinitionContainer are not readable afterwards\", () => {\r\n const codeSpecId = iModelDb.codeSpecs.insert(txn, \"CachedContainerSpec\", CodeScopeSpec.Type.Model);\r\n const containerId = DefinitionContainer.insert(txn, definitionModelId, new Code({ spec: codeSpecId, scope: definitionModelId, value: \"CachedContainer\" }));\r\n const inner = insertDefinitionElement(txn, undefined, containerId);\r\n assert.isDefined(iModelDb.elements.getElement(inner));\r\n assert.isDefined(iModelDb.models.getModelProps(containerId));\r\n\r\n executeTestCase(txn, \"container with cached contents\", [containerId], [containerId, inner], success, [], false);\r\n assert.isUndefined(iModelDb.elements.tryGetElementProps(inner));\r\n assert.isUndefined(iModelDb.models.tryGetModelProps(containerId));\r\n });\r\n });\r\n });\r\n\r\n describe(\"TypeDefinition reference nulling\", () => {\r\n let typeDefModelId: Id64String;\r\n let typeDefCounter = 0;\r\n let txn: EditTxn;\r\n\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete Definition Elements\");\r\n txn.start();\r\n typeDefModelId = DefinitionModel.insert(txn, subjectId, `TypeDefModel-${++typeDefCounter}`);\r\n });\r\n\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n });\r\n\r\n const insertPhysicalType = (): Id64String => {\r\n const props: PhysicalTypeProps = {\r\n classFullName: GenericPhysicalType.classFullName,\r\n model: typeDefModelId,\r\n code: Code.createEmpty(),\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n const insertPhysicalObjectWithType = (typeId: Id64String): Id64String => {\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: {} },\r\n typeDefinition: new PhysicalElementIsOfType(typeId),\r\n };\r\n return txn.insertElement(props);\r\n };\r\n\r\n /** Returns the TypeDefinitionId for a 3D element, or undefined if NULL. */\r\n const getTypeDefinitionId3d = (elementId: Id64String): Id64String | undefined => {\r\n return iModelDb.withQueryReader(\r\n \"SELECT TypeDefinition FROM bis.GeometricElement3d WHERE ECInstanceId=?\",\r\n (reader) => reader.step() ? reader.current[0]?.id : undefined,\r\n QueryBinder.from([elementId]),\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\r\n );\r\n };\r\n\r\n it(\"TypeDefinitionId is NULLed on a surviving 3D element when its PhysicalType is deleted\", () => {\r\n const physTypeId = insertPhysicalType();\r\n const physObjId = insertPhysicalObjectWithType(physTypeId);\r\n\r\n assert.strictEqual(getTypeDefinitionId3d(physObjId), physTypeId, \"TypeDefinitionId should be set before deletion\");\r\n\r\n txn.deleteElements([physTypeId]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physTypeId), \"PhysicalType should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(physObjId), \"PhysicalObject should survive\");\r\n assert.isUndefined(getTypeDefinitionId3d(physObjId), \"TypeDefinitionId should be NULL after its target type is deleted\");\r\n });\r\n\r\n it(\"TypeDefinitionId is NULLed on multiple surviving 3D elements when their shared PhysicalType is deleted\", () => {\r\n const physTypeId = insertPhysicalType();\r\n const obj1 = insertPhysicalObjectWithType(physTypeId);\r\n const obj2 = insertPhysicalObjectWithType(physTypeId);\r\n const obj3 = insertPhysicalObjectWithType(physTypeId);\r\n\r\n txn.deleteElements([physTypeId]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physTypeId), \"PhysicalType should be deleted\");\r\n for (const id of [obj1, obj2, obj3]) {\r\n assert.isDefined(iModelDb.elements.tryGetElement(id), \"PhysicalObject should survive\");\r\n assert.isUndefined(getTypeDefinitionId3d(id), \"TypeDefinitionId should be NULL on all surviving objects\");\r\n }\r\n });\r\n\r\n it(\"TypeDefinitionId is not disturbed on elements whose PhysicalType is NOT deleted\", () => {\r\n const typeToDelete = insertPhysicalType();\r\n const typeToKeep = insertPhysicalType();\r\n const objReferencingDeleted = insertPhysicalObjectWithType(typeToDelete);\r\n const objReferencingKept = insertPhysicalObjectWithType(typeToKeep);\r\n\r\n txn.deleteElements([typeToDelete]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(typeToDelete), \"typeToDelete should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(typeToKeep), \"typeToKeep should survive\");\r\n assert.isUndefined(getTypeDefinitionId3d(objReferencingDeleted), \"TypeDefinitionId should be NULL on the affected object\");\r\n assert.strictEqual(getTypeDefinitionId3d(objReferencingKept), typeToKeep, \"TypeDefinitionId should be unchanged on the unaffected object\");\r\n });\r\n\r\n it(\"TypeDefinitionId is NULLed on a surviving 3D element when its PhysicalType is deleted together with a non-definition element\", () => {\r\n const physTypeId = insertPhysicalType();\r\n const physObjId = insertPhysicalObjectWithType(physTypeId);\r\n const unrelated = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: physicalModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: {} },\r\n } as PhysicalElementProps);\r\n\r\n txn.deleteElements([physTypeId, unrelated]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(physTypeId), \"PhysicalType should be deleted\");\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unrelated), \"unrelated element should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(physObjId), \"PhysicalObject should survive\");\r\n assert.isUndefined(getTypeDefinitionId3d(physObjId), \"TypeDefinitionId should be NULL after its target type is deleted\");\r\n });\r\n\r\n it(\"TypeDefinitionId is NULLed on a surviving 2D element when its GraphicalType2d is deleted\", () => {\r\n const documentListModelId = DocumentListModel.insert(txn, subjectId, `DocList-${typeDefCounter}`);\r\n const drawingId = Drawing.insert(txn, documentListModelId, `Drawing-${typeDefCounter}`);\r\n const drawingCatId = DrawingCategory.insert(txn, typeDefModelId, `DrawingCat-${typeDefCounter}`, new SubCategoryAppearance());\r\n\r\n const graphicalTypeProps: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: typeDefModelId,\r\n code: Code.createEmpty(),\r\n };\r\n const graphicalTypeId = txn.insertElement(graphicalTypeProps);\r\n\r\n const drawingElemProps: GeometricElement2dProps = {\r\n classFullName: DrawingGraphic.classFullName,\r\n model: drawingId,\r\n category: drawingCatId,\r\n code: Code.createEmpty(),\r\n typeDefinition: new GraphicalElement2dIsOfType(graphicalTypeId),\r\n };\r\n const drawingElemId = txn.insertElement(drawingElemProps);\r\n\r\n const getTypeDefinitionId2d = (elemId: Id64String): Id64String | undefined => {\r\n return iModelDb.withQueryReader(\r\n \"SELECT TypeDefinition FROM bis.GeometricElement2d WHERE ECInstanceId=?\",\r\n (reader) => reader.step() ? reader.current[0]?.id : undefined,\r\n QueryBinder.from([elemId]),\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\r\n );\r\n };\r\n\r\n assert.strictEqual(getTypeDefinitionId2d(drawingElemId), graphicalTypeId, \"TypeDefinitionId should be set before deletion\");\r\n\r\n txn.deleteElements([graphicalTypeId]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(graphicalTypeId), \"GraphicalType2d should be deleted\");\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingElemId), \"DrawingGraphic should survive\");\r\n assert.isUndefined(getTypeDefinitionId2d(drawingElemId), \"TypeDefinitionId should be NULL after its 2D type is deleted\");\r\n });\r\n\r\n it(\"TypeDefinitionId is NOT NULLed when deleteElements deletes the type and NULLs the reference\", () => {\r\n const physTypeId = insertPhysicalType();\r\n const physObjId = insertPhysicalObjectWithType(physTypeId);\r\n\r\n const result = txn.deleteElements([physTypeId]);\r\n\r\n // TypeDefinitionId refs do not block deleteElements - the type is deleted, the referencing object survives, and no failures are reported.\r\n assertResult(result, success, [physTypeId], [physObjId], iModelDb);\r\n assert.isUndefined(getTypeDefinitionId3d(physObjId), \"TypeDefinitionId should be NULLed since the type was deleted\");\r\n });\r\n });\r\n\r\n describe(\"ModelSelector link-table cleanup on model deletion\", () => {\r\n let msCounter = 0;\r\n let msDefModelId: Id64String;\r\n let txn: EditTxn;\r\n\r\n beforeEach(() => {\r\n txn = new EditTxn(iModelDb, \"delete definition elements\");\r\n txn.start();\r\n msDefModelId = DefinitionModel.insert(txn, subjectId, `MSDefModel-${++msCounter}`);\r\n });\r\n\r\n const getModelSelectorModels = (selectorId: Id64String): Id64String[] => {\r\n return iModelDb.withQueryReader(\r\n \"SELECT TargetECInstanceId FROM bis.ModelSelectorRefersToModels WHERE SourceECInstanceId=?\",\r\n (reader) => {\r\n const ids: Id64String[] = [];\r\n for (const row of reader)\r\n ids.push(row[0] as Id64String);\r\n return ids;\r\n },\r\n QueryBinder.from([selectorId]),\r\n );\r\n };\r\n\r\n\r\n it(\"removes the ModelSelectorRefersToModels row when the referenced model is deleted\", () => {\r\n const partitionId = PhysicalModel.insert(txn, subjectId, `MSPartition-${msCounter}`);\r\n const selectorId = ModelSelector.insert(txn, msDefModelId, `MSSelector-${msCounter}`, [partitionId]);\r\n\r\n assert.include(getModelSelectorModels(selectorId), partitionId, \"ModelSelector should reference the partition before deletion\");\r\n\r\n txn.deleteElements([partitionId]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(partitionId), \"partition should be deleted\");\r\n assert.notInclude(getModelSelectorModels(selectorId), partitionId, \"ModelSelectorRefersToModels row should be removed after model deletion\");\r\n });\r\n\r\n it(\"removes only the deleted model's rows from ModelSelector when multiple models are referenced\", () => {\r\n const partition1 = PhysicalModel.insert(txn, subjectId, `MSMulti1-${msCounter}`);\r\n const partition2 = PhysicalModel.insert(txn, subjectId, `MSMulti2-${msCounter}`);\r\n const partition3 = PhysicalModel.insert(txn, subjectId, `MSMulti3-${msCounter}`);\r\n const selectorId = ModelSelector.insert(txn, msDefModelId, `MSMultiSelector-${msCounter}`, [partition1, partition2, partition3]);\r\n\r\n assert.equal(getModelSelectorModels(selectorId).length, 3, \"ModelSelector should start with 3 entries\");\r\n\r\n txn.deleteElements([partition1]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(partition1), \"partition1 should be deleted\");\r\n const remaining = getModelSelectorModels(selectorId);\r\n assert.equal(remaining.length, 2, \"ModelSelector should have 2 remaining entries\");\r\n assert.notInclude(remaining, partition1, \"partition1 row should be removed\");\r\n assert.include(remaining, partition2, \"partition2 row should remain\");\r\n assert.include(remaining, partition3, \"partition3 row should remain\");\r\n });\r\n\r\n it(\"removes ModelSelectorRefersToModels rows for all models when multiple partitions are deleted in one call\", () => {\r\n const partition1 = PhysicalModel.insert(txn, subjectId, `MSBulk1-${msCounter}`);\r\n const partition2 = PhysicalModel.insert(txn, subjectId, `MSBulk2-${msCounter}`);\r\n const selectorId = ModelSelector.insert(txn, msDefModelId, `MSBulkSelector-${msCounter}`, [partition1, partition2]);\r\n\r\n txn.deleteElements([partition1, partition2]);\r\n\r\n assert.isUndefined(iModelDb.elements.tryGetElement(partition1), \"partition1 should be deleted\");\r\n assert.isUndefined(iModelDb.elements.tryGetElement(partition2), \"partition2 should be deleted\");\r\n assert.isEmpty(getModelSelectorModels(selectorId), \"all ModelSelectorRefersToModels rows should be gone\");\r\n });\r\n });\r\n});\r\n"]}