@itwin/core-backend 5.16.0-dev.5 → 5.16.0-dev.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/lib/cjs/EditTxn.d.ts +56 -19
  3. package/lib/cjs/EditTxn.d.ts.map +1 -1
  4. package/lib/cjs/EditTxn.js +54 -19
  5. package/lib/cjs/EditTxn.js.map +1 -1
  6. package/lib/cjs/IModelDb.d.ts +3 -3
  7. package/lib/cjs/IModelDb.d.ts.map +1 -1
  8. package/lib/cjs/IModelDb.js +4 -3
  9. package/lib/cjs/IModelDb.js.map +1 -1
  10. package/lib/cjs/SQLiteDb.d.ts +52 -5
  11. package/lib/cjs/SQLiteDb.d.ts.map +1 -1
  12. package/lib/cjs/SQLiteDb.js +40 -5
  13. package/lib/cjs/SQLiteDb.js.map +1 -1
  14. package/lib/cjs/TxnManager.d.ts.map +1 -1
  15. package/lib/cjs/TxnManager.js +11 -6
  16. package/lib/cjs/TxnManager.js.map +1 -1
  17. package/lib/cjs/internal/ChangesetConflictArgs.d.ts +4 -0
  18. package/lib/cjs/internal/ChangesetConflictArgs.d.ts.map +1 -1
  19. package/lib/cjs/internal/ChangesetConflictArgs.js +1 -0
  20. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  21. package/lib/esm/EditTxn.d.ts +56 -19
  22. package/lib/esm/EditTxn.d.ts.map +1 -1
  23. package/lib/esm/EditTxn.js +53 -18
  24. package/lib/esm/EditTxn.js.map +1 -1
  25. package/lib/esm/IModelDb.d.ts +3 -3
  26. package/lib/esm/IModelDb.d.ts.map +1 -1
  27. package/lib/esm/IModelDb.js +4 -3
  28. package/lib/esm/IModelDb.js.map +1 -1
  29. package/lib/esm/SQLiteDb.d.ts +52 -5
  30. package/lib/esm/SQLiteDb.d.ts.map +1 -1
  31. package/lib/esm/SQLiteDb.js +40 -5
  32. package/lib/esm/SQLiteDb.js.map +1 -1
  33. package/lib/esm/TxnManager.d.ts.map +1 -1
  34. package/lib/esm/TxnManager.js +12 -7
  35. package/lib/esm/TxnManager.js.map +1 -1
  36. package/lib/esm/internal/ChangesetConflictArgs.d.ts +4 -0
  37. package/lib/esm/internal/ChangesetConflictArgs.d.ts.map +1 -1
  38. package/lib/esm/internal/ChangesetConflictArgs.js +1 -0
  39. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  40. package/lib/esm/test/element/DeleteDefinitionElements.test.js +403 -249
  41. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  42. package/lib/esm/test/standalone/ChangeMerge.test.js +71 -1
  43. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  44. package/lib/esm/test/standalone/DeleteElements.test.js +962 -83
  45. package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
  46. package/lib/esm/test/standalone/IModelWrite.test.js +6 -2
  47. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  48. package/lib/esm/test/standalone/MergeConflict.test.js +15 -0
  49. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  50. package/lib/esm/test/standalone/SQLiteDb.test.d.ts.map +1 -1
  51. package/lib/esm/test/standalone/SQLiteDb.test.js +422 -1
  52. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  53. package/package.json +17 -17
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteElements.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/DeleteElements.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from \"chai\";\r\nimport { DbResult, Id64, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { Code, CodeScopeSpec, IModel, PhysicalElementProps, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport { BulkDeleteElementsResult, BulkDeleteElementsStatus, ChannelControl, EditTxn, IModelJsFs, PhysicalModel, SnapshotDb, SpatialCategory, Subject } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { withEditTxn } from \"../TestEditTxn\";\r\n\r\ndescribe(\"deleteElements (native bulk delete API)\", () => {\r\n let seedDb: SnapshotDb;\r\n let iModelDb: SnapshotDb;\r\n let modelId: Id64String;\r\n let categoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let txn: EditTxn;\r\n\r\n before(async () => {\r\n IModelJsFs.recursiveMkDirSync(KnownTestLocations.outputDir);\r\n const seedFile = IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"seed.bim\");\r\n seedDb = SnapshotDb.createEmpty(seedFile, { rootSubject: { name: \"DeleteElements\" } });\r\n\r\n await withEditTxn(seedDb, \"create elements\", async (editTxn) => {\r\n modelId = PhysicalModel.insert(editTxn, IModel.rootSubjectId, \"TestModel\");\r\n categoryId = SpatialCategory.insert(editTxn, IModel.dictionaryId, \"TestCategory\", new SubCategoryAppearance());\r\n codeSpecId = seedDb.codeSpecs.insert(editTxn, \"TestScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n assert.isNotEmpty(modelId, \"Expected a valid PhysicalModel id\");\r\n assert.isNotEmpty(categoryId, \"Expected a valid SpatialCategory id\");\r\n assert.isNotEmpty(codeSpecId, \"Expected a valid CodeSpec id\");\r\n });\r\n });\r\n\r\n beforeEach(() => {\r\n iModelDb = SnapshotDb.createFrom(seedDb, IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"DeleteElements.bim\"));\r\n assert.isTrue(iModelDb.isOpen);\r\n txn = new EditTxn(iModelDb, \"delete elements\");\r\n txn.start();\r\n iModelDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n if (iModelDb.isOpen) {\r\n iModelDb.close();\r\n }\r\n });\r\n\r\n after(() => {\r\n if (seedDb.isOpen)\r\n seedDb.close();\r\n });\r\n\r\n const insertElement = (opts: { parentId?: Id64String; codeScope?: Id64String; codeValue?: string } = {}): Id64String => {\r\n const { parentId, codeScope, codeValue } = opts;\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: modelId,\r\n category: categoryId,\r\n code: codeScope && codeValue ? { spec: codeSpecId, scope: codeScope, value: codeValue } : Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n };\r\n const id = txn.insertElement(props);\r\n assert.isNotEmpty(id, \"insertElement must return a valid ID\");\r\n txn.saveChanges();\r\n return id;\r\n };\r\n\r\n /** Assert that the element with the given id exists or has been deleted. */\r\n const assertExists = (id: Id64String, msg: string) => assert.isDefined(iModelDb.elements.tryGetElement(id), msg);\r\n const assertDeleted = (id: Id64String, msg: string) => assert.isUndefined(iModelDb.elements.tryGetElement(id), msg);\r\n\r\n // Run deleteElements, then verify the returned failed set, check each id in `deleted` is gone and each id in `retained` is still present.\r\n const executeTestCase = (label: string, idsToDelete: Id64Array, deleted: Id64Array, retained: Id64Array, expectedFailed: Id64Array = []) => {\r\n const resultStatus: BulkDeleteElementsResult = txn.deleteElements(idsToDelete);\r\n if (expectedFailed.length === 0)\r\n assert.equal(resultStatus.status, BulkDeleteElementsStatus.Success);\r\n else\r\n assert.equal(resultStatus.status, (expectedFailed.length === idsToDelete.length) ? BulkDeleteElementsStatus.DeletionFailed : BulkDeleteElementsStatus.PartialSuccess);\r\n\r\n assert.sameMembers(Array.from(resultStatus.failedIds), expectedFailed, `[${label}] failed set mismatch`);\r\n\r\n for (const id of deleted)\r\n assertDeleted(id, `[${label}] ${id} should have been deleted`);\r\n\r\n for (const id of retained)\r\n assertExists(id, `[${label}] ${id} should have been retained`);\r\n\r\n txn.abandonChanges();\r\n\r\n // Verify that the same test case produces the same result when using the deprecated iModelDb.elements.deleteElements API, to ensure that the deprecation does not cause any regressions.\r\n executeTestCaseDeprecated(label, idsToDelete, deleted, retained, expectedFailed);\r\n };\r\n\r\n const executeTestCaseDeprecated = (label: string, idsToDelete: Id64Array, deleted: Id64Array, retained: Id64Array, expectedFailed: Id64Array = []) => {\r\n const previousEnforcement = EditTxn.implicitWriteEnforcement;\r\n EditTxn.implicitWriteEnforcement = \"allow\";\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const resultStatus: BulkDeleteElementsResult = iModelDb.elements.deleteElements(idsToDelete);\r\n\r\n if (expectedFailed.length === 0)\r\n assert.equal(resultStatus.status, BulkDeleteElementsStatus.Success);\r\n else\r\n assert.equal(resultStatus.status, (expectedFailed.length === idsToDelete.length) ? BulkDeleteElementsStatus.DeletionFailed : BulkDeleteElementsStatus.PartialSuccess);\r\n\r\n assert.sameMembers(Array.from(resultStatus.failedIds), expectedFailed, `[${label}] failed set mismatch`);\r\n\r\n for (const id of deleted)\r\n assertDeleted(id, `[${label}] ${id} should have been deleted`);\r\n\r\n for (const id of retained)\r\n assertExists(id, `[${label}] ${id} should have been retained`);\r\n } finally {\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n iModelDb.abandonChanges();\r\n EditTxn.implicitWriteEnforcement = previousEnforcement;\r\n }\r\n };\r\n\r\n /**\r\n * Shared hierarchy used throughout the parent-child tests:\r\n *\r\n * parentA parentB standalone\r\n * ├─ childA1 ├─ childB1 └─ childS1\r\n * │ └─ grandchildA1 └─ childB2\r\n * ├─ childA2\r\n * │ └─ grandchildA2\r\n * └─ childA3\r\n */\r\n describe(\"basic tests\", () => {\r\n let parentA: Id64String, childA1: Id64String, grandchildA1: Id64String;\r\n let childA2: Id64String, grandchildA2: Id64String, childA3: Id64String;\r\n let parentB: Id64String, childB1: Id64String, childB2: Id64String;\r\n let standalone: Id64String, childS1: Id64String;\r\n let all: Id64Array;\r\n\r\n beforeEach(() => {\r\n parentA = insertElement();\r\n childA1 = insertElement({ parentId: parentA });\r\n grandchildA1 = insertElement({ parentId: childA1 });\r\n childA2 = insertElement({ parentId: parentA });\r\n grandchildA2 = insertElement({ parentId: childA2 });\r\n childA3 = insertElement({ parentId: parentA });\r\n parentB = insertElement();\r\n childB1 = insertElement({ parentId: parentB });\r\n childB2 = insertElement({ parentId: parentB });\r\n standalone = insertElement();\r\n childS1 = insertElement({ parentId: standalone });\r\n all = [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3,\r\n parentB, childB1, childB2, standalone, childS1];\r\n });\r\n\r\n it(\"delete a root element\", () => {\r\n executeTestCase(\"root cascades\",\r\n [parentA],\r\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\r\n [parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"Second call to deleteElement fails if a read cursor on a temp table is open\", () => {\r\n // Create a temp table on the same SQLite connection that the native bulk-delete will use to simulate a shared temp table lock\r\n iModelDb.withSqliteStatement(\"CREATE TABLE IF NOT EXISTS temp.temp_table (x INTEGER)\", (s) => s.step());\r\n iModelDb.withSqliteStatement(\"INSERT INTO temp.temp_table VALUES (1)\", (s) => s.step());\r\n\r\n const lockStmt = iModelDb.prepareSqliteStatement(\"SELECT x FROM temp.temp_table\");\r\n assert.equal(lockStmt.step(), DbResult.BE_SQLITE_ROW);\r\n\r\n const el1 = insertElement();\r\n const el2 = insertElement();\r\n\r\n const result1 = txn.deleteElements([el1]);\r\n const result2 = txn.deleteElements([el2]);\r\n\r\n for (const result of [result1, result2]) {\r\n assert.equal(result.failedIds.size, 0);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success, \"deleteElements call must succeed\");\r\n assert.equal(result.sqlDeleteStatus, DbResult.BE_SQLITE_OK);\r\n }\r\n\r\n // Would have been the case if \"DROP TABLE IF EXISTS...\" was used (bug)\r\n assert.notEqual(result2.status, BulkDeleteElementsStatus.DeletionFailed);\r\n assert.notEqual(result2.sqlDeleteStatus, DbResult.BE_SQLITE_LOCKED);\r\n\r\n lockStmt[Symbol.dispose](); // release the simulated read-lock\r\n\r\n txn.abandonChanges();\r\n });\r\n\r\n it(\"explicitly delete the whole tree\", () => {\r\n executeTestCase(\"redundant descendants in input\",\r\n [parentA, childA1, grandchildA1, childA2],\r\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\r\n [parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting all roots removes every element\", () => {\r\n executeTestCase(\"delete all roots\",\r\n [parentA, parentB, standalone],\r\n all,\r\n []);\r\n });\r\n\r\n it(\"empty input set is a no-op\", () => {\r\n executeTestCase(\"empty set\",\r\n [],\r\n [],\r\n all);\r\n });\r\n\r\n it(\"duplicate IDs should be handled\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement();\r\n\r\n // rootA appears twice - should not throw and should be deleted exactly once.\r\n assert.equal(txn.deleteElements([rootA, rootA, rootB]).status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(rootA, \"rootA should be deleted\");\r\n assertDeleted(rootB, \"rootB should be deleted\");\r\n });\r\n\r\n it(\"invalid IDs in the input throw an exception\", () => {\r\n const rootA = insertElement();\r\n\r\n assert.throws(() => txn.deleteElements([Id64.invalid, rootA]), `Invalid element ids: 0`);\r\n assert.throws(() => txn.deleteElements([\"not-an-id\", rootA]), `Invalid element ids: not-an-id`);\r\n\r\n assertExists(rootA, \"rootA should not have been deleted after a throw\");\r\n });\r\n\r\n it(\"deleting a child removes its subtree but leaves the parent\", () => {\r\n executeTestCase(\"delete depth-1 child\",\r\n [childA1],\r\n [childA1, grandchildA1],\r\n [parentA, childA2, grandchildA2, childA3, parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting two mid-tree siblings leaves their parent and unrelated siblings\", () => {\r\n executeTestCase(\"delete two depth-1 siblings\",\r\n [childA1, childA2],\r\n [childA1, grandchildA1, childA2, grandchildA2],\r\n [parentA, childA3, parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting a child from one tree and a child from another tree\", () => {\r\n executeTestCase(\"cross-tree mid-tree delete\",\r\n [childA1, childB2],\r\n [childA1, grandchildA1, childB2],\r\n [parentA, childA2, grandchildA2, childA3, parentB, childB1, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting mid-tree nodes mixed with a root\", () => {\r\n executeTestCase(\"mid-tree + roots mixed\",\r\n [childA1, childA3, parentB, standalone],\r\n [childA1, grandchildA1, childA3, parentB, childB1, childB2, standalone, childS1],\r\n [parentA, childA2, grandchildA2]);\r\n });\r\n\r\n it(\"deleting only grandchildren leaves all ancestors\", () => {\r\n executeTestCase(\"delete leaves only\",\r\n [grandchildA1, grandchildA2],\r\n [grandchildA1, grandchildA2],\r\n [parentA, childA1, childA2, childA3, parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting leaves from different subtrees simultaneously\", () => {\r\n executeTestCase(\"leaves from multiple subtrees\",\r\n [grandchildA1, childB1, childS1],\r\n [grandchildA1, childB1, childS1],\r\n [parentA, childA1, childA2, grandchildA2, childA3, parentB, childB2, standalone]);\r\n });\r\n\r\n it(\"deleting root, mid-tree and leaf\", () => {\r\n executeTestCase(\"root + child + grandchild + leaf\",\r\n [childA1, grandchildA2, parentB, childS1],\r\n [childA1, grandchildA1, grandchildA2, parentB, childB1, childB2, childS1],\r\n [parentA, childA2, childA3, standalone]);\r\n });\r\n\r\n it(\"parent and its grandchild\", () => {\r\n executeTestCase(\"parent + grandchild redundant\",\r\n [parentA, grandchildA1],\r\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\r\n [parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n });\r\n\r\n describe(\"intra-set code scope dependency\", () => {\r\n it(\"child element is the code scope for an unrelated element\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: childA, codeValue: \"rootB-code\" });\r\n executeTestCase(\"depth-1 child scopes unrelated root - delete child+root directly\",\r\n [childA, rootB],\r\n [childA, rootB],\r\n [rootA]);\r\n\r\n executeTestCase(\"depth-1 child scopes unrelated root - delete child only\",\r\n [childA],\r\n [],\r\n [rootA, childA, rootB],\r\n [childA]);\r\n\r\n executeTestCase(\"depth-1 child scopes unrelated root - delete root only\",\r\n [rootB],\r\n [rootB],\r\n [rootA, childA]);\r\n });\r\n\r\n it(\"grandchild is the code scope for an unrelated root\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const grandchildA = insertElement({ parentId: childA });\r\n const rootB = insertElement({ codeScope: grandchildA, codeValue: \"rootB-code\" });\r\n executeTestCase(\"depth-2 grandchild scopes unrelated root - delete both roots\",\r\n [rootA, rootB],\r\n [rootA, childA, grandchildA, rootB],\r\n []);\r\n\r\n executeTestCase(\"depth-2 grandchild scopes unrelated root - delete grandchild+root directly\",\r\n [grandchildA, rootB],\r\n [grandchildA, rootB],\r\n [rootA, childA]);\r\n });\r\n\r\n it(\"root element scopes a child in another subtree\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement();\r\n const childB = insertElement({ parentId: rootB, codeScope: rootA, codeValue: \"childB-code\" });\r\n executeTestCase(\"root scopes depth-1 child in sibling tree\",\r\n [rootA, rootB],\r\n [rootA, rootB, childB],\r\n []);\r\n });\r\n\r\n it(\"scope chains\", () => {\r\n // C -> B -> A\r\n // Test all combinations of inputs\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\r\n executeTestCase(\"scope chain single A\", [rootA], [], [rootA, rootB, rootC], [rootA]);\r\n executeTestCase(\"scope chain single B\", [rootB], [], [rootA, rootB, rootC], [rootB]);\r\n executeTestCase(\"scope chain single C\", [rootC], [rootC], [rootA, rootB]);\r\n\r\n executeTestCase(\"scope chain forward\", [rootA, rootB, rootC], [rootA, rootB, rootC], []);\r\n executeTestCase(\"scope chain reversed\", [rootC, rootB, rootA], [rootA, rootB, rootC], []);\r\n executeTestCase(\"scope chain middle-first\", [rootB, rootA, rootC], [rootA, rootB, rootC], []);\r\n });\r\n\r\n it(\"scope chain A -> B -> C -> D where only A and D are in the delete set\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\r\n const rootD = insertElement({ codeScope: rootC, codeValue: \"rootD-code\" });\r\n\r\n // Only A and D in the delete set. B is external -> A ignored. D's scope (C) is not being deleted -> D is safe.\r\n executeTestCase(\"deep gap chain: A ignored, D deleted\",\r\n [rootA, rootD],\r\n [rootD],\r\n [rootA, rootB, rootC],\r\n [rootA]);\r\n });\r\n\r\n it(\"scope chain delete with skipping constraint validation should fail\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\r\n const rootD = insertElement({ codeScope: rootC, codeValue: \"rootD-code\" });\r\n\r\n const resultStatus: BulkDeleteElementsResult = txn.deleteElements([rootA, rootD], { skipFKConstraintValidations: true });\r\n assert.equal(resultStatus.status, BulkDeleteElementsStatus.DeletionFailed);\r\n assert.equal(resultStatus.sqlDeleteStatus, DbResult.BE_SQLITE_CONSTRAINT_FOREIGNKEY);\r\n });\r\n\r\n it(\"two elements using the same scope\", () => {\r\n // A is the code scope for both B and C independently.\r\n // A\r\n // / \\\r\n // B C (code scope, not parent-child)\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const rootC = insertElement({ codeScope: rootA, codeValue: \"rootC-code\" });\r\n executeTestCase(\"delete all three\",\r\n [rootA, rootB, rootC],\r\n [rootA, rootB, rootC],\r\n []);\r\n\r\n executeTestCase(\"delete only B and C\",\r\n [rootB, rootC],\r\n [rootB, rootC],\r\n [rootA]);\r\n });\r\n\r\n it(\"parent is also the code scope of its own child\", () => {\r\n const rootP = insertElement();\r\n const childC = insertElement({ parentId: rootP, codeScope: rootP, codeValue: \"childC-code\" });\r\n executeTestCase(\"parent is code scope of child - delete parent\",\r\n [rootP],\r\n [rootP, childC],\r\n []);\r\n });\r\n\r\n it(\"sibling scopes it's own sibling\", () => {\r\n // parent\r\n // ├─ childA (code scope for childB)\r\n // └─ childB (scoped by childA)\r\n const parent = insertElement();\r\n const childA = insertElement({ parentId: parent });\r\n const childB = insertElement({ parentId: parent, codeScope: childA, codeValue: \"childB-code\" });\r\n\r\n // Delete via parent cascade - sibling scope must not block deletion.\r\n executeTestCase(\"sibling scope - delete via parent\",\r\n [parent],\r\n [parent, childA, childB],\r\n []);\r\n\r\n // Delete both siblings directly - intra-set scope, no external violation.\r\n executeTestCase(\"sibling scope - delete both directly\",\r\n [childA, childB],\r\n [childA, childB],\r\n [parent]);\r\n\r\n // Delete only the scoped child - its scope (childA) is not being deleted, safe to delete.\r\n executeTestCase(\"sibling scope - delete only scoped child\",\r\n [childB],\r\n [childB],\r\n [parent, childA]);\r\n\r\n // Delete only the scope element - childB is external -> childA ignored.\r\n executeTestCase(\"sibling scope - delete only scope element, ignored due to external childB\",\r\n [childA],\r\n [],\r\n [parent, childA, childB],\r\n [childA]);\r\n });\r\n });\r\n\r\n describe(\"Code scope violations to test delete set element pruning\", () => {\r\n it(\"root is code scope for an external element\", () => {\r\n const rootA = insertElement();\r\n const external = insertElement({ codeScope: rootA, codeValue: \"ext-code\" });\r\n const rootB = insertElement();\r\n executeTestCase(\"external scopes root\",\r\n [rootA, rootB],\r\n [rootB],\r\n [rootA, external],\r\n [rootA]);\r\n });\r\n\r\n it(\"depth-1 child is code scope for external\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\r\n const rootB = insertElement();\r\n executeTestCase(\"external scopes depth-1 child - parent subtree ignored\",\r\n [rootA, rootB],\r\n [rootB],\r\n [rootA, childA, external],\r\n [rootA]);\r\n });\r\n\r\n it(\"depth-2 grandchild is code scope for external\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const grandchildA = insertElement({ parentId: childA });\r\n const external = insertElement({ codeScope: grandchildA, codeValue: \"ext-code\" });\r\n const rootB = insertElement();\r\n executeTestCase(\"external scopes depth-2 grandchild - grandparent subtree ignored\",\r\n [rootA, rootB],\r\n [rootB],\r\n [rootA, childA, grandchildA, external],\r\n [rootA]);\r\n });\r\n\r\n it(\"only the child is passed for deletion\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\r\n executeTestCase(\"external scopes requested child\",\r\n [childA],\r\n [],\r\n [rootA, childA, external],\r\n [childA]);\r\n });\r\n\r\n it(\"root has both an external scope dependent AND an intra-set scope dependent\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const external = insertElement({ codeScope: rootA, codeValue: \"ext-code\" });\r\n executeTestCase(\"root ignored due to external; sibling still deleted\",\r\n [rootA, rootB],\r\n [rootB],\r\n [rootA, external],\r\n [rootA]);\r\n });\r\n\r\n it(\"two independent external scope violations\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement();\r\n const extX = insertElement({ codeScope: rootA, codeValue: \"extX\" });\r\n const extY = insertElement({ codeScope: rootB, codeValue: \"extY\" });\r\n const rootC = insertElement();\r\n executeTestCase(\"two independent violations\",\r\n [rootA, rootB, rootC],\r\n [rootC],\r\n [rootA, rootB, extX, extY],\r\n [rootA, rootB]);\r\n });\r\n });\r\n\r\n describe(\"mixed element hierarchy and code scope violations\", () => {\r\n it(\"root scopes another root - delete both roots, all descendants removed\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const childA2 = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const childB1 = insertElement({ parentId: rootB });\r\n executeTestCase(\"root scopes root - delete both roots\",\r\n [rootA, rootB],\r\n [rootA, childA1, childA2, rootB, childB1],\r\n []);\r\n });\r\n\r\n it(\"depth-1 child scopes an unrelated root\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\r\n const childB1 = insertElement({ parentId: rootB });\r\n executeTestCase(\"depth-1 child scopes root - delete both via parents\",\r\n [rootA, rootB],\r\n [rootA, childA1, rootB, childB1],\r\n []);\r\n // Reverse input order - result must be identical\r\n executeTestCase(\"depth-1 child scopes root - reverse input order\",\r\n [rootB, rootA],\r\n [rootA, childA1, rootB, childB1],\r\n []);\r\n });\r\n\r\n it(\"depth-1 child scopes an unrelated root - delete child and root directly (parent survives)\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\r\n const childB1 = insertElement({ parentId: rootB });\r\n // Only childA1 and rootB - rootA is NOT in the delete set.\r\n executeTestCase(\"depth-1 child scopes root - delete child + scoped root directly\",\r\n [childA1, rootB],\r\n [childA1, rootB, childB1],\r\n [rootA]);\r\n });\r\n\r\n it(\"depth-1 child scopes an unrelated root - deleting only the child cascades into the scoped root's subtree\", () => {\r\n // childA1 is the code scope of rootB. When childA1 is deleted, rootB loses its scope\r\n // element -> rootB (and its children) must also be deleted.\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\r\n const childB1 = insertElement({ parentId: rootB });\r\n executeTestCase(\"delete child only - scoped root also removed\",\r\n [childA1],\r\n [],\r\n [rootA, childA1, rootB, childB1],\r\n [childA1]);\r\n });\r\n\r\n it(\"root scopes a depth-1 child in sibling tree - delete both roots, all descendants removed\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement();\r\n const childB1 = insertElement({ parentId: rootB, codeScope: rootA, codeValue: \"childB1-code\" });\r\n executeTestCase(\"root scopes depth-1 child - delete both roots\",\r\n [rootA, rootB],\r\n [rootA, childA1, rootB, childB1],\r\n []);\r\n });\r\n\r\n it(\"depth-1 child scopes a depth-1 child in sibling tree - delete both children directly (parents survive)\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement();\r\n const childB1 = insertElement({ parentId: rootB, codeScope: childA1, codeValue: \"childB1-code\" });\r\n const childB2 = insertElement({ parentId: rootB });\r\n executeTestCase(\"sibling-child scope - delete both children directly\",\r\n [childA1, childB1],\r\n [childA1, childB1],\r\n [rootA, rootB, childB2]);\r\n });\r\n\r\n it(\"depth-2 grandchild scopes an unrelated root - delete grandparent + scoped root\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const grandchildA = insertElement({ parentId: childA });\r\n const rootB = insertElement({ codeScope: grandchildA, codeValue: \"rootB-code\" });\r\n const childB = insertElement({ parentId: rootB });\r\n executeTestCase(\"depth-2 grandchild scopes root - delete both roots\",\r\n [rootA, rootB],\r\n [rootA, childA, grandchildA, rootB, childB],\r\n []);\r\n\r\n // Delete grandchild and scoped root directly (rootA and childA survive)\r\n executeTestCase(\"depth-2 grandchild scopes root - delete grandchild + root directly\",\r\n [grandchildA, rootB],\r\n [grandchildA, rootB, childB],\r\n [rootA, childA]);\r\n });\r\n\r\n it(\"external element scopes a depth-2 grandchild, mixed with an unrelated deletion\", () => {\r\n // Unique case: grandchild has an external scope violation, but an unrelated element from\r\n // another tree (childB) is also requested and has no violation - it should be deleted.\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const grandchildA = insertElement({ parentId: childA });\r\n const rootB = insertElement();\r\n const childB = insertElement({ parentId: rootB });\r\n const external = insertElement({ codeScope: grandchildA, codeValue: \"ext-code\" });\r\n executeTestCase(\"external scopes depth-2 grandchild, unrelated childB deleted\",\r\n [grandchildA, rootA, childB],\r\n [childB],\r\n [rootA, childA, grandchildA, rootB, external],\r\n [rootA, grandchildA]);\r\n });\r\n\r\n it(\"two trees: one has external scope violation, other is deleted cleanly\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const gcA = insertElement({ parentId: childA });\r\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\r\n const rootB = insertElement();\r\n const childB1 = insertElement({ parentId: rootB });\r\n const childB2 = insertElement({ parentId: rootB });\r\n const gcB = insertElement({ parentId: childB1 });\r\n executeTestCase(\"one tree ignored, other fully deleted\",\r\n [rootA, rootB],\r\n [rootB, childB1, childB2, gcB],\r\n [rootA, childA, gcA, external],\r\n [rootA]);\r\n });\r\n });\r\n\r\n describe(\"sub-model hierarchy\", () => {\r\n let partitionCounter = 0;\r\n\r\n const insertSubModel = (): Id64String => {\r\n const name = `SubModelPartition-${++partitionCounter}`;\r\n return PhysicalModel.insert(txn, IModel.rootSubjectId, name);\r\n };\r\n\r\n const insertElementInModel = (subModelId: Id64String, opts: { parentId?: Id64String } = {}): Id64String => {\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: subModelId,\r\n category: categoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n ...(opts.parentId ? { parent: { id: opts.parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n };\r\n const id = txn.insertElement(props);\r\n assert.isNotEmpty(id, \"insertElementInModel must return a valid ID\");\r\n txn.saveChanges();\r\n return id;\r\n };\r\n\r\n /** Assert that the sub-model 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 sub-model still exists. */\r\n const assertModelExists = (id: Id64String, msg: string) =>\r\n assert.isDefined(iModelDb.models.tryGetModelProps(id), msg);\r\n\r\n it(\"delete a modeled element cascades into its sub-model\", () => {\r\n const partitionId = insertSubModel();\r\n const elem1 = insertElementInModel(partitionId);\r\n const elem2 = insertElementInModel(partitionId);\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assert.isEmpty(result.failedIds);\r\n assertDeleted(partitionId, \"partition element should be deleted\");\r\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\r\n assertDeleted(elem1, \"elem1 inside sub-model should be deleted\");\r\n assertDeleted(elem2, \"elem2 inside sub-model should be deleted\");\r\n assertExists(unrelated, \"unrelated element should be retained\");\r\n });\r\n\r\n /**\r\n * Scenario: Subject -> partition (parent-child) -> modeled-element.\r\n *\r\n * subjectA\r\n * └─ [P:childPartition]\r\n * [M:childPartition] -> elem1\r\n * unrelated\r\n */\r\n it(\"delete a parent whose child is a modeled element cascades into the sub-model\", () => {\r\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `SubjectA-${++partitionCounter}`);\r\n const childPartitionId = PhysicalModel.insert(txn, subjectA, `ChildPartition-${partitionCounter}`);\r\n const elem1 = insertElementInModel(childPartitionId);\r\n const unrelated = insertElement();\r\n\r\n // Deleting subjectA cascades (parent-child) to childPartitionId, which then cascades (modeled-element) into elem1.\r\n const result = txn.deleteElements([subjectA]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(subjectA, \"subject should be deleted\");\r\n assertDeleted(childPartitionId, \"child partition element should be deleted\");\r\n assertModelDeleted(childPartitionId, \"child partition sub-model should be deleted\");\r\n assertDeleted(elem1, \"elem1 inside child partition sub-model should be deleted\");\r\n assertExists(unrelated, \"unrelated element should be retained\");\r\n });\r\n\r\n /**\r\n * Scenario: sub-model elements have their own children; all should be removed transitively.\r\n *\r\n * [P:partition]\r\n * [M:partition] -> elem1\r\n * └─ childOfElem1\r\n * └─ grandchildOfElem1\r\n * elem2\r\n * unrelated element\r\n */\r\n it(\"delete a modeled element whose sub-model elements have children\", () => {\r\n const partitionId = insertSubModel();\r\n const elem1 = insertElementInModel(partitionId);\r\n const childOfElem1 = insertElementInModel(partitionId, { parentId: elem1 });\r\n const grandchildOfElem1 = insertElementInModel(partitionId, { parentId: childOfElem1 });\r\n const elem2 = insertElementInModel(partitionId);\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(partitionId, \"partition should be deleted\");\r\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\r\n assertDeleted(elem1, \"elem1 should be deleted\");\r\n assertDeleted(childOfElem1, \"child of elem1 should be deleted\");\r\n assertDeleted(grandchildOfElem1, \"grandchild of elem1 should be deleted\");\r\n assertDeleted(elem2, \"elem2 should be deleted\");\r\n assertExists(unrelated, \"unrelated should be retained\");\r\n });\r\n\r\n /**\r\n * Scenario: element inside a sub-model is a code scope for an element outside the delete set. The whole partition subtree must be ignored from the delete set.\r\n *\r\n * [P:partition]\r\n * [M:partition] -> scopingElem <- code scope for `external`\r\n * otherElem\r\n * external (not in delete set)\r\n * unrelated\r\n */\r\n it(\"partition ignored when a sub-model element is a code scope for an external element\", () => {\r\n const partitionId = insertSubModel();\r\n const scopingElem = insertElementInModel(partitionId);\r\n const otherElem = insertElementInModel(partitionId);\r\n const external = insertElement({ codeScope: scopingElem, codeValue: \"ext-code\" });\r\n const unrelated = insertElement();\r\n\r\n // `external` is NOT in the delete set and uses scopingElem as its code scope -> the\r\n // entire partition subtree (including the sub-model) must be ignored from the delete set.\r\n const result = txn.deleteElements([partitionId, unrelated]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.PartialSuccess);\r\n assertExists(partitionId, \"partition should be ignored (retained)\");\r\n assertModelExists(partitionId, \"sub-model should be retained\");\r\n assertExists(scopingElem, \"scopingElem should be retained\");\r\n assertExists(otherElem, \"otherElem should be retained\");\r\n assertExists(external, \"external should be retained\");\r\n assertDeleted(unrelated, \"unrelated should still be deleted\");\r\n });\r\n\r\n /**\r\n * Scenario: the sub-model element of one partition is used as a code scope for an element\r\n * inside a *different* partition's sub-model that is also in the delete set.\r\n * Both partitions and all contents should be deleted.\r\n *\r\n * [P:p1] [M:p1] -> scopingElem\r\n * [P:p2] [M:p2] -> dependentElem (codeScope = scopingElem)\r\n */\r\n it(\"cross-sub-model intra-set code scope dependency: both partitions deleted cleanly\", () => {\r\n const p1 = insertSubModel();\r\n const scopingElem = insertElementInModel(p1);\r\n const p2 = insertSubModel();\r\n const dependentElem = insertElementInModel(p2, {});\r\n // Manually assign the code scope after insertion is not possible through insertElementInModel,\r\n // so use a dedicated insert call.\r\n const dependentId = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: p2,\r\n category: categoryId,\r\n code: { spec: codeSpecId, scope: scopingElem, value: \"dep-code\" },\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n\r\n const result = txn.deleteElements([p1, p2]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(p1, \"p1 should be deleted\");\r\n assertModelDeleted(p1, \"sub-model of p1 should be deleted\");\r\n assertDeleted(scopingElem, \"scopingElem should be deleted\");\r\n assertDeleted(p2, \"p2 should be deleted\");\r\n assertModelDeleted(p2, \"sub-model of p2 should be deleted\");\r\n assertDeleted(dependentElem, \"dependentElem should be deleted\");\r\n assertDeleted(dependentId, \"dependentId should be deleted\");\r\n });\r\n\r\n /**\r\n * Scenario: three-level Subject cascade: deleting a grandparent Subject removes a child\r\n * Subject, which removes a partition (parent-child), which cascades into the sub-model.\r\n *\r\n * grandparentSubject\r\n * └─ childSubject\r\n * └─ [P:grandchildPartition]\r\n * [M:grandchildPartition] -> innerElem1, innerElem2\r\n * unrelated\r\n */\r\n it(\"deep cascade: grandparent Subject -> child Subject -> partition -> sub-model elements\", () => {\r\n const grandparentSubjectId = Subject.insert(txn, IModel.rootSubjectId, `GrandparentSubject-${++partitionCounter}`);\r\n const childSubjectId = Subject.insert(txn, grandparentSubjectId, `ChildSubject-${partitionCounter}`);\r\n const grandchildPartitionId = PhysicalModel.insert(txn, childSubjectId, `GrandchildPartition-${partitionCounter}`);\r\n const innerElem1 = insertElementInModel(grandchildPartitionId);\r\n const innerElem2 = insertElementInModel(grandchildPartitionId);\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([grandparentSubjectId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(grandparentSubjectId, \"grandparent subject should be deleted\");\r\n assertDeleted(childSubjectId, \"child subject should be deleted\");\r\n assertDeleted(grandchildPartitionId, \"grandchild partition should be deleted\");\r\n assertModelDeleted(grandchildPartitionId, \"grandchild sub-model should be deleted\");\r\n assertDeleted(innerElem1, \"innerElem1 should be deleted\");\r\n assertDeleted(innerElem2, \"innerElem2 should be deleted\");\r\n assertExists(unrelated, \"unrelated should be retained\");\r\n });\r\n\r\n /**\r\n * Scenario: empty sub-model: partition with no elements in its sub-model.\r\n *\r\n * [P:partition] [M:partition] (empty)\r\n * unrelated\r\n */\r\n it(\"delete a modeled element whose sub-model is empty\", () => {\r\n const partitionId = insertSubModel();\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(partitionId, \"partition should be deleted\");\r\n assertModelDeleted(partitionId, \"empty sub-model should be deleted\");\r\n assertExists(unrelated, \"unrelated should be retained\");\r\n });\r\n\r\n /**\r\n * Scenario: a regular element has two children, one of which is a partition with a\r\n * sub-model, while the other is an ordinary element. Deleting the regular parent\r\n * removes both children and all sub-model contents.\r\n *\r\n * regularParent (lives in modelId)\r\n * ├─ ordinaryChild\r\n * └─ [P:partitionChild]\r\n * [M:partitionChild] -> subElem1, subElem2\r\n * unrelated\r\n */\r\n it(\"deleting a regular element with a mix of ordinary and partition children cascades correctly\", () => {\r\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `MixedChildSubject-${++partitionCounter}`);\r\n const partitionChild = PhysicalModel.insert(txn, subjectA, `MixedChildPartition-${partitionCounter}`);\r\n const subElem1 = insertElementInModel(partitionChild);\r\n const subElem2 = insertElementInModel(partitionChild);\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([subjectA]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(subjectA, \"subjectA should be deleted\");\r\n assertDeleted(partitionChild, \"partition child should be deleted\");\r\n assertModelDeleted(partitionChild, \"sub-model of partition child should be deleted\");\r\n assertDeleted(subElem1, \"subElem1 should be deleted\");\r\n assertDeleted(subElem2, \"subElem2 should be deleted\");\r\n assertExists(unrelated, \"unrelated should be retained\");\r\n });\r\n\r\n /**\r\n * Scenario: a regular element's grandchild is a partition. Passing the partition's\r\n * direct parent (not the grandparent root) for deletion cascades into the sub-model while\r\n * the grandparent survives.\r\n *\r\n * grandparent (lives in modelId)\r\n * └─ parent <- passed for deletion\r\n * └─ [P:partition]\r\n * [M:partition] -> subElem1, subElem2\r\n */\r\n it(\"deleting a mid-tree regular element whose child is a partition cascades into the sub-model; grandparent survives\", () => {\r\n const subjectGP = Subject.insert(txn, IModel.rootSubjectId, `MidTreeGP-${++partitionCounter}`);\r\n const subjectP = Subject.insert(txn, subjectGP, `MidTreeP-${partitionCounter}`);\r\n const partitionId = PhysicalModel.insert(txn, subjectP, `MidTreePartition-${partitionCounter}`);\r\n const subElem1 = insertElementInModel(partitionId);\r\n const subElem2 = insertElementInModel(partitionId);\r\n\r\n // Only pass subjectP - grandparent must survive, everything below subjectP must go.\r\n const result = txn.deleteElements([subjectP]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertExists(subjectGP, \"grandparent should survive\");\r\n assertDeleted(subjectP, \"parent should be deleted\");\r\n assertDeleted(partitionId, \"partition should be deleted\");\r\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\r\n assertDeleted(subElem1, \"subElem1 should be deleted\");\r\n assertDeleted(subElem2, \"subElem2 should be deleted\");\r\n });\r\n\r\n it(\"deleting a partition element directly (not via its regular parent) cascades into the sub-model; parent survives\", () => {\r\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `DirectPartSubject-${++partitionCounter}`);\r\n const partitionId = PhysicalModel.insert(txn, subjectA, `DirectPartPartition-${partitionCounter}`);\r\n const subElem1 = insertElementInModel(partitionId);\r\n const subElem2 = insertElementInModel(partitionId);\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertExists(subjectA, \"subject (regular parent) should survive\");\r\n assertDeleted(partitionId, \"partition should be deleted\");\r\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\r\n assertDeleted(subElem1, \"subElem1 should be deleted\");\r\n assertDeleted(subElem2, \"subElem2 should be deleted\");\r\n });\r\n });\r\n});"]}
1
+ {"version":3,"file":"DeleteElements.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/DeleteElements.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from \"chai\";\r\nimport { DbResult, Id64, Id64Array, Id64Set, Id64String, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nimport { Code, CodeScopeSpec, ExternalSourceAspectProps, GeometryPartProps, IModel, PhysicalElementProps, QueryBinder, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport {\r\n _nativeDb, BulkDeleteElementsResult, BulkDeleteElementsStatus, BulkDeleteFailureReason, ChannelControl, DefinitionModel, EditTxn, ElementDrivesElement, ElementDrivesElementProps, ElementGroupsMembers, ExternalSourceAspect,\r\n GeometryPart, Group, GroupInformationPartition, GroupModel, IModelDb, IModelJsFs, ModelSelector, PhysicalModel, RenderMaterialElement, SnapshotDb, SpatialCategory, StandaloneDb, SubCategory, Subject, SubjectOwnsPartitionElements,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { withEditTxn } from \"../TestEditTxn\";\r\n\r\n/**\r\n * Expected failure entry. Omit `reason` to only require that the element is reported (regardless of why).\r\n */\r\ninterface ExpectedFailure {\r\n elementId: Id64String;\r\n reason?: BulkDeleteFailureReason;\r\n}\r\n\r\n/** Expected shape of a [[BulkDeleteElementsResult]]. `sqlDeleteStatus` defaults to `BE_SQLITE_OK`. */\r\ninterface ExpectedResult {\r\n status: BulkDeleteElementsStatus;\r\n sqlDeleteStatus?: DbResult;\r\n failures: ExpectedFailure[];\r\n failedIds?: Id64Set;\r\n}\r\n\r\nconst success: ExpectedResult = { status: BulkDeleteElementsStatus.Success, sqlDeleteStatus: DbResult.BE_SQLITE_OK, failures: [], failedIds: new Set() };\r\n/**\r\n * Nothing is deleted; `failures` lists the *direct* violators only. The bulk delete validates the expanded delete set exactly\r\n * once (no pruning fixpoint), so an element that would only become a violator after another violator is excluded is NOT reported.\r\n */\r\nconst constraintViolation = (failedIds: Id64Set, ...failures: ExpectedFailure[]): ExpectedResult => ({ status: BulkDeleteElementsStatus.ConstraintViolation, sqlDeleteStatus: DbResult.BE_SQLITE_OK, failures, failedIds });\r\n\r\n/** The element itself is referenced from outside the delete set via its Code scope. */\r\nconst codeScopeViolator = (elementId: Id64String): ExpectedFailure => ({ 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): ExpectedFailure => ({ elementId, reason: BulkDeleteFailureReason.ReferencedByForeignKey });\r\n/** A DefinitionElement still used (e.g. via a GeometryStream) by elements outside the delete set. No SQLite foreign key is involved. */\r\nconst definitionInUse = (elementId: Id64String): ExpectedFailure => ({ elementId, reason: BulkDeleteFailureReason.DefinitionInUse });\r\n\r\nconst assertNoFkViolations = (db: IModelDb) => {\r\n const rows = db.withSqliteStatement(\"PRAGMA foreign_key_check\", (stmt) => {\r\n const out: string[] = [];\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n out.push(`${stmt.getValueString(0)} rowid=${stmt.getValueInteger(1)} -> ${stmt.getValueString(2)} fk#${stmt.getValueInteger(3)}`);\r\n return out;\r\n });\r\n assert.isEmpty(rows, `PRAGMA foreign_key_check reported violations after bulk delete: ${rows.join(\"; \")}`);\r\n};\r\n\r\n/**\r\n * Minimal domain schema with a navigation property on an Element subclass. Navigation properties declared in domain\r\n * schemas are NOT backed by a SQLite foreign key (only BisCore can declare FK-enforced nav props), so the bulk delete\r\n * has to detect and NULL them itself rather than relying on `PRAGMA foreign_key_list`.\r\n */\r\nconst navTestSchemaXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ECSchema schemaName=\"DeleteElementsNavTest\" alias=\"dent\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"NavObject\">\r\n <BaseClass>bis:PhysicalElement</BaseClass>\r\n <ECNavigationProperty propertyName=\"Target\" relationshipName=\"NavObjectRefersToElement\" direction=\"Forward\"/>\r\n </ECEntityClass>\r\n <ECRelationshipClass typeName=\"NavObjectRefersToElement\" strength=\"referencing\" modifier=\"Sealed\">\r\n <Source multiplicity=\"(0..*)\" roleLabel=\"refers to\" polymorphic=\"true\">\r\n <Class class=\"NavObject\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..1)\" roleLabel=\"is referred to by\" polymorphic=\"true\">\r\n <Class class=\"bis:Element\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n</ECSchema>`;\r\n\r\ndescribe(\"deleteElements (native bulk delete API)\", () => {\r\n let seedDb: SnapshotDb;\r\n let iModelDb: SnapshotDb;\r\n let modelId: Id64String;\r\n let categoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let txn: EditTxn;\r\n\r\n before(async () => {\r\n IModelJsFs.recursiveMkDirSync(KnownTestLocations.outputDir);\r\n const seedFile = IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"seed.bim\");\r\n seedDb = SnapshotDb.createEmpty(seedFile, { rootSubject: { name: \"DeleteElements\" } });\r\n await seedDb.importSchemaStrings([navTestSchemaXml]);\r\n\r\n await withEditTxn(seedDb, \"create elements\", async (editTxn) => {\r\n modelId = PhysicalModel.insert(editTxn, IModel.rootSubjectId, \"TestModel\");\r\n categoryId = SpatialCategory.insert(editTxn, IModel.dictionaryId, \"TestCategory\", new SubCategoryAppearance());\r\n codeSpecId = seedDb.codeSpecs.insert(editTxn, \"TestScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n assert.isNotEmpty(modelId, \"Expected a valid PhysicalModel id\");\r\n assert.isNotEmpty(categoryId, \"Expected a valid SpatialCategory id\");\r\n assert.isNotEmpty(codeSpecId, \"Expected a valid CodeSpec id\");\r\n });\r\n });\r\n\r\n beforeEach(() => {\r\n iModelDb = SnapshotDb.createFrom(seedDb, IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"DeleteElements.bim\"));\r\n assert.isTrue(iModelDb.isOpen);\r\n txn = new EditTxn(iModelDb, \"delete elements\");\r\n txn.start();\r\n iModelDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(() => {\r\n txn.end(\"abandon\");\r\n if (iModelDb.isOpen) {\r\n iModelDb.close();\r\n }\r\n });\r\n\r\n after(() => {\r\n if (seedDb.isOpen)\r\n seedDb.close();\r\n });\r\n\r\n const insertElement = (opts: { parentId?: Id64String; codeScope?: Id64String; codeValue?: string } = {}): Id64String => {\r\n const { parentId, codeScope, codeValue } = opts;\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: modelId,\r\n category: categoryId,\r\n code: codeScope && codeValue ? { spec: codeSpecId, scope: codeScope, value: codeValue } : Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n };\r\n const id = txn.insertElement(props);\r\n assert.isNotEmpty(id, \"insertElement must return a valid ID\");\r\n txn.saveChanges();\r\n return id;\r\n };\r\n\r\n /** Assert that the element with the given id exists or has been deleted. */\r\n const assertExists = (id: Id64String, msg?: string) => assert.isDefined(iModelDb.elements.tryGetElement(id), msg);\r\n const assertDeleted = (id: Id64String, msg?: string) => assert.isUndefined(iModelDb.elements.tryGetElement(id), msg);\r\n\r\n /** Assert the result matches `expected` and that elements in the delete set are the only ones reported; then check which elements were deleted / retained. */\r\n const assertResult = (result: BulkDeleteElementsResult, expected: ExpectedResult, deletedIds: Id64Array, retainedIds: Id64Array) => {\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 assertExists(retainedId);\r\n\r\n for (const deletedId of deletedIds)\r\n assertDeleted(deletedId);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.deepEqual(result.failedIds, expected.failedIds ?? new Set());\r\n\r\n assertNoFkViolations(iModelDb);\r\n };\r\n\r\n // Run deleteElements, compare the returned result object against `expected`, then check each id in `deleted` is gone and each id in `retained` is still present.\r\n const executeTestCase = (_label: string, idsToDelete: Id64Array, deletedIds: Id64Array, retainedIds: Id64Array, expected: ExpectedResult = success) => {\r\n const result = txn.deleteElements(idsToDelete);\r\n assertResult(result, expected, deletedIds, retainedIds);\r\n txn.abandonChanges();\r\n };\r\n\r\n /**\r\n * Run a delete that must be rejected with `ConstraintViolation`: nothing is deleted, so every id in `retained` must still exist,\r\n * and `failures` / `failedIds` must list exactly the given direct violators. Changes are rolled back afterwards.\r\n */\r\n const expectRejected = (label: string, idsToDelete: Id64Array, retained: Id64Array, failedIds: Id64Set, ...failures: ExpectedFailure[]) =>\r\n executeTestCase(label, idsToDelete, [], retained, constraintViolation(failedIds, ...failures));\r\n\r\n /**\r\n * Shared hierarchy used throughout the parent-child tests:\r\n *\r\n * parentA parentB standalone\r\n * ├─ childA1 ├─ childB1 └─ childS1\r\n * │ └─ grandchildA1 └─ childB2\r\n * ├─ childA2\r\n * │ └─ grandchildA2\r\n * └─ childA3\r\n */\r\n describe(\"basic tests\", () => {\r\n let parentA: Id64String, childA1: Id64String, grandchildA1: Id64String;\r\n let childA2: Id64String, grandchildA2: Id64String, childA3: Id64String;\r\n let parentB: Id64String, childB1: Id64String, childB2: Id64String;\r\n let standalone: Id64String, childS1: Id64String;\r\n let all: Id64Array;\r\n\r\n beforeEach(() => {\r\n parentA = insertElement();\r\n childA1 = insertElement({ parentId: parentA });\r\n grandchildA1 = insertElement({ parentId: childA1 });\r\n childA2 = insertElement({ parentId: parentA });\r\n grandchildA2 = insertElement({ parentId: childA2 });\r\n childA3 = insertElement({ parentId: parentA });\r\n parentB = insertElement();\r\n childB1 = insertElement({ parentId: parentB });\r\n childB2 = insertElement({ parentId: parentB });\r\n standalone = insertElement();\r\n childS1 = insertElement({ parentId: standalone });\r\n all = [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3,\r\n parentB, childB1, childB2, standalone, childS1];\r\n });\r\n\r\n it(\"delete a root element\", () => {\r\n executeTestCase(\"root cascades\",\r\n [parentA],\r\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\r\n [parentB, childB1, childB2, standalone, childS1]\r\n );\r\n });\r\n\r\n it(\"Second call to deleteElement fails if a read cursor on a temp table is open\", () => {\r\n // Create a temp table on the same SQLite connection that the native bulk-delete will use to simulate a shared temp table lock\r\n iModelDb.withSqliteStatement(\"CREATE TABLE IF NOT EXISTS temp.temp_table (x INTEGER)\", (s) => s.step());\r\n iModelDb.withSqliteStatement(\"INSERT INTO temp.temp_table VALUES (1)\", (s) => s.step());\r\n\r\n const lockStmt = iModelDb.prepareSqliteStatement(\"SELECT x FROM temp.temp_table\");\r\n assert.equal(lockStmt.step(), DbResult.BE_SQLITE_ROW);\r\n\r\n const el1 = insertElement();\r\n const el2 = insertElement();\r\n\r\n const result1 = txn.deleteElements([el1]);\r\n const result2 = txn.deleteElements([el2]);\r\n\r\n for (const result of [result1, result2]) {\r\n assert.isEmpty(result.failures);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success, \"deleteElements call must succeed\");\r\n assert.equal(result.sqlDeleteStatus, DbResult.BE_SQLITE_OK);\r\n }\r\n\r\n // Would have been the case if \"DROP TABLE IF EXISTS...\" was used (bug)\r\n assert.notEqual(result2.status, BulkDeleteElementsStatus.DeletionFailed);\r\n assert.notEqual(result2.sqlDeleteStatus, DbResult.BE_SQLITE_LOCKED);\r\n\r\n lockStmt[Symbol.dispose](); // release the simulated read-lock\r\n\r\n txn.abandonChanges();\r\n });\r\n\r\n it(\"explicitly delete the whole tree\", () => {\r\n executeTestCase(\"redundant descendants in input\",\r\n [parentA, childA1, grandchildA1, childA2],\r\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\r\n [parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting all roots removes every element\", () => {\r\n executeTestCase(\"delete all roots\",\r\n [parentA, parentB, standalone],\r\n all,\r\n []);\r\n });\r\n\r\n it(\"empty input set is a no-op\", () => {\r\n executeTestCase(\"empty set\",\r\n [],\r\n [],\r\n all);\r\n });\r\n\r\n it(\"duplicate IDs should be handled\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement();\r\n\r\n // rootA appears twice - should not throw and should be deleted exactly once.\r\n assert.equal(txn.deleteElements([rootA, rootA, rootB]).status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(rootA, \"rootA should be deleted\");\r\n assertDeleted(rootB, \"rootB should be deleted\");\r\n });\r\n\r\n it(\"invalid IDs in the input throw an exception\", () => {\r\n const rootA = insertElement();\r\n\r\n assert.throws(() => txn.deleteElements([Id64.invalid, rootA]), `Invalid element ids: 0`);\r\n assert.throws(() => txn.deleteElements([\"not-an-id\", rootA]), `Invalid element ids: not-an-id`);\r\n\r\n assertExists(rootA, \"rootA should not have been deleted after a throw\");\r\n });\r\n\r\n it(\"deleting a child removes its subtree but leaves the parent\", () => {\r\n executeTestCase(\"delete depth-1 child\",\r\n [childA1],\r\n [childA1, grandchildA1],\r\n [parentA, childA2, grandchildA2, childA3, parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting two mid-tree siblings leaves their parent and unrelated siblings\", () => {\r\n executeTestCase(\"delete two depth-1 siblings\",\r\n [childA1, childA2],\r\n [childA1, grandchildA1, childA2, grandchildA2],\r\n [parentA, childA3, parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting a child from one tree and a child from another tree\", () => {\r\n executeTestCase(\"cross-tree mid-tree delete\",\r\n [childA1, childB2],\r\n [childA1, grandchildA1, childB2],\r\n [parentA, childA2, grandchildA2, childA3, parentB, childB1, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting mid-tree nodes mixed with a root\", () => {\r\n executeTestCase(\"mid-tree + roots mixed\",\r\n [childA1, childA3, parentB, standalone],\r\n [childA1, grandchildA1, childA3, parentB, childB1, childB2, standalone, childS1],\r\n [parentA, childA2, grandchildA2]);\r\n });\r\n\r\n it(\"deleting only grandchildren leaves all ancestors\", () => {\r\n executeTestCase(\"delete leaves only\",\r\n [grandchildA1, grandchildA2],\r\n [grandchildA1, grandchildA2],\r\n [parentA, childA1, childA2, childA3, parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n\r\n it(\"deleting leaves from different subtrees simultaneously\", () => {\r\n executeTestCase(\"leaves from multiple subtrees\",\r\n [grandchildA1, childB1, childS1],\r\n [grandchildA1, childB1, childS1],\r\n [parentA, childA1, childA2, grandchildA2, childA3, parentB, childB2, standalone]);\r\n });\r\n\r\n it(\"deleting root, mid-tree and leaf\", () => {\r\n executeTestCase(\"root + child + grandchild + leaf\",\r\n [childA1, grandchildA2, parentB, childS1],\r\n [childA1, grandchildA1, grandchildA2, parentB, childB1, childB2, childS1],\r\n [parentA, childA2, childA3, standalone]);\r\n });\r\n\r\n it(\"parent and its grandchild\", () => {\r\n executeTestCase(\"parent + grandchild redundant\",\r\n [parentA, grandchildA1],\r\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\r\n [parentB, childB1, childB2, standalone, childS1]);\r\n });\r\n });\r\n\r\n describe(\"intra-set code scope dependency\", () => {\r\n it(\"child element is the code scope for an unrelated element\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: childA, codeValue: \"rootB-code\" });\r\n executeTestCase(\"depth-1 child scopes unrelated root - delete child+root directly\",\r\n [childA, rootB],\r\n [childA, rootB],\r\n [rootA]);\r\n\r\n executeTestCase(\"depth-1 child scopes unrelated root - delete child only\",\r\n [childA],\r\n [],\r\n [rootA, childA, rootB],\r\n constraintViolation(new Set([childA]), codeScopeViolator(childA)));\r\n\r\n executeTestCase(\"depth-1 child scopes unrelated root - delete root only\",\r\n [rootB],\r\n [rootB],\r\n [rootA, childA]);\r\n });\r\n\r\n it(\"grandchild is the code scope for an unrelated root\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const grandchildA = insertElement({ parentId: childA });\r\n const rootB = insertElement({ codeScope: grandchildA, codeValue: \"rootB-code\" });\r\n executeTestCase(\"depth-2 grandchild scopes unrelated root - delete both roots\",\r\n [rootA, rootB],\r\n [rootA, childA, grandchildA, rootB],\r\n []);\r\n\r\n executeTestCase(\"depth-2 grandchild scopes unrelated root - delete grandchild+root directly\",\r\n [grandchildA, rootB],\r\n [grandchildA, rootB],\r\n [rootA, childA]);\r\n });\r\n\r\n it(\"root element scopes a child in another subtree\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement();\r\n const childB = insertElement({ parentId: rootB, codeScope: rootA, codeValue: \"childB-code\" });\r\n executeTestCase(\"root scopes depth-1 child in sibling tree\",\r\n [rootA, rootB],\r\n [rootA, rootB, childB],\r\n []);\r\n });\r\n\r\n it(\"scope chains\", () => {\r\n // C -> B -> A\r\n // Test all combinations of inputs\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\r\n executeTestCase(\"scope chain single A\", [rootA], [], [rootA, rootB, rootC], constraintViolation(new Set([rootA]), codeScopeViolator(rootA)));\r\n executeTestCase(\"scope chain single B\", [rootB], [], [rootA, rootB, rootC], constraintViolation(new Set([rootB]), codeScopeViolator(rootB)));\r\n executeTestCase(\"scope chain single C\", [rootC], [rootC], [rootA, rootB]);\r\n\r\n executeTestCase(\"scope chain forward\", [rootA, rootB, rootC], [rootA, rootB, rootC], []);\r\n executeTestCase(\"scope chain reversed\", [rootC, rootB, rootA], [rootA, rootB, rootC], []);\r\n executeTestCase(\"scope chain middle-first\", [rootB, rootA, rootC], [rootA, rootB, rootC], []);\r\n });\r\n\r\n it(\"scope chain A -> B -> C -> D where only A and D are in the delete set\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\r\n const rootD = insertElement({ codeScope: rootC, codeValue: \"rootD-code\" });\r\n\r\n // Only A and D in the delete set. B is external -> A is a violator, which rejects the whole call even though D itself is safe.\r\n executeTestCase(\"deep gap chain: A violates, nothing deleted\",\r\n [rootA, rootD],\r\n [],\r\n [rootA, rootB, rootC, rootD],\r\n constraintViolation(new Set([rootA]), codeScopeViolator(rootA)));\r\n });\r\n\r\n it(\"two elements using the same scope\", () => {\r\n // A is the code scope for both B and C independently.\r\n // A\r\n // / \\\r\n // B C (code scope, not parent-child)\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const rootC = insertElement({ codeScope: rootA, codeValue: \"rootC-code\" });\r\n executeTestCase(\"delete all three\",\r\n [rootA, rootB, rootC],\r\n [rootA, rootB, rootC],\r\n []);\r\n\r\n executeTestCase(\"delete only B and C\",\r\n [rootB, rootC],\r\n [rootB, rootC],\r\n [rootA]);\r\n });\r\n\r\n it(\"parent is also the code scope of its own child\", () => {\r\n const rootP = insertElement();\r\n const childC = insertElement({ parentId: rootP, codeScope: rootP, codeValue: \"childC-code\" });\r\n executeTestCase(\"parent is code scope of child - delete parent\",\r\n [rootP],\r\n [rootP, childC],\r\n []);\r\n });\r\n\r\n it(\"sibling scopes it's own sibling\", () => {\r\n // parent\r\n // ├─ childA (code scope for childB)\r\n // └─ childB (scoped by childA)\r\n const parent = insertElement();\r\n const childA = insertElement({ parentId: parent });\r\n const childB = insertElement({ parentId: parent, codeScope: childA, codeValue: \"childB-code\" });\r\n\r\n // Delete via parent cascade - sibling scope must not block deletion.\r\n executeTestCase(\"sibling scope - delete via parent\",\r\n [parent],\r\n [parent, childA, childB],\r\n []);\r\n\r\n // Delete both siblings directly - intra-set scope, no external violation.\r\n executeTestCase(\"sibling scope - delete both directly\",\r\n [childA, childB],\r\n [childA, childB],\r\n [parent]);\r\n\r\n // Delete only the scoped child - its scope (childA) is not being deleted, safe to delete.\r\n executeTestCase(\"sibling scope - delete only scoped child\",\r\n [childB],\r\n [childB],\r\n [parent, childA]);\r\n\r\n // Delete only the scope element - childB is external -> childA is a violator.\r\n executeTestCase(\"sibling scope - delete only scope element, rejected due to external childB\",\r\n [childA],\r\n [],\r\n [parent, childA, childB],\r\n constraintViolation(new Set([childA]), codeScopeViolator(childA)));\r\n });\r\n });\r\n\r\n describe(\"all-or-nothing semantics and validation rounds\", () => {\r\n /** A -> B -> C -> D code-scope chain (each element is the code scope of the next). */\r\n const insertScopeChain = () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\r\n const rootD = insertElement({ codeScope: rootC, codeValue: \"rootD-code\" });\r\n return { rootA, rootB, rootC, rootD };\r\n };\r\n\r\n it(\"reports each FK violator with the referencing table.column and deletes nothing\", () => {\r\n const { rootA, rootB, rootC, rootD } = insertScopeChain();\r\n const all = [rootA, rootB, rootC, rootD];\r\n\r\n // A is scoped by B (external) -> violator. D is safe, but the call is all-or-nothing.\r\n executeTestCase(\"Delete A and D\", [rootA, rootD], [], all, constraintViolation(new Set([rootA]), codeScopeViolator(rootA)));\r\n\r\n // Only the *direct* violators are reported: A is scoped by B which is in the set, so only B (scoped by external C) is reported.\r\n executeTestCase(\"Delete A and B\", [rootA, rootB], [], all, constraintViolation(new Set([rootB]), codeScopeViolator(rootB)));\r\n executeTestCase(\"Delete B and C\", [rootB, rootC], [], all, constraintViolation(new Set([rootC]), codeScopeViolator(rootC)));\r\n executeTestCase(\"Delete A, B and D\", [rootA, rootB, rootD], [], all, constraintViolation(new Set([rootB]), codeScopeViolator(rootB)));\r\n\r\n // Tail of the chain has no external dependents.\r\n executeTestCase(\"Delete C and D\", [rootC, rootD], [rootC, rootD], [rootA, rootB], success);\r\n executeTestCase(\"Delete all the roots\", all, all, [], success);\r\n });\r\n\r\n it(\"succeeds when the whole chain is in the delete set, regardless of input order\", () => {\r\n const { rootA, rootB, rootC, rootD } = insertScopeChain();\r\n executeTestCase(\"forward\", [rootA, rootB, rootC, rootD], [rootA, rootB, rootC, rootD], []);\r\n executeTestCase(\"reversed\", [rootD, rootC, rootB, rootA], [rootA, rootB, rootC, rootD], []);\r\n });\r\n\r\n it(\"an unrelated deletable element does not rescue a call that contains a violator\", () => {\r\n const { rootA, rootB, rootC, rootD } = insertScopeChain();\r\n const unrelated = insertElement();\r\n expectRejected(\"violator + unrelated\", [rootA, rootD, unrelated], [rootA, rootB, rootC, rootD, unrelated],\r\n new Set([rootA]), codeScopeViolator(rootA));\r\n });\r\n\r\n it(\"reports only first-round violators (no pruning fixpoint) - known limitation\", () => {\r\n // Chain A <- B <- C <- D; delete [A, B, D]. C is external and scopes B, so B is a violator. A is scoped by B, which is\r\n // *in* the set, so A is not a violator in the single validation round that runs. If the caller drops B from the input and\r\n // retries, A will then be reported. Pinned here so a change in the native validation strategy is deliberate.\r\n const { rootA, rootB, rootC, rootD } = insertScopeChain();\r\n\r\n const result = txn.deleteElements([rootA, rootB, rootD]);\r\n assertResult(result, constraintViolation(new Set([rootB]), codeScopeViolator(rootB)), [], [rootA, rootB, rootC, rootD]);\r\n assert.isFalse(result.failures.some((f) => f.elementId === rootA), \"transitive violators (A) are not reported; update this test if the native fixpoint changes\");\r\n\r\n txn.abandonChanges();\r\n const retry = txn.deleteElements([rootA, rootD]);\r\n assertResult(retry, constraintViolation(new Set([rootA]), codeScopeViolator(rootA)), [], [rootA, rootB, rootC, rootD]);\r\n });\r\n\r\n it(\"a rejected delete does not evict anything from the element cache\", () => {\r\n const { rootA, rootD } = insertScopeChain();\r\n // Prime the cache.\r\n const before = iModelDb.elements.getElement(rootA);\r\n\r\n expectRejected(\"rejected delete keeps cache\", [rootA, rootD], [rootA, rootD], new Set([rootA]), codeScopeViolator(rootA));\r\n\r\n const after = iModelDb.elements.getElement(rootA);\r\n assert.strictEqual(after.id, before.id);\r\n assertExists(rootD, \"rootD must still exist\");\r\n });\r\n\r\n it(\"ConstraintViolation leaves no side effects behind (aspects, subclass rows, sub-models)\", async () => {\r\n // Validation runs before anything is modified, so unlike DeletionFailed nothing needs to be abandoned.\r\n const { rootA, rootB, rootC, rootD } = insertScopeChain();\r\n const aspectId = txn.insertAspect({\r\n classFullName: ExternalSourceAspect.classFullName,\r\n element: { id: rootD },\r\n scope: { id: IModel.rootSubjectId },\r\n identifier: \"src-rootD\",\r\n kind: \"Element\",\r\n } as ExternalSourceAspectProps);\r\n const partitionId = PhysicalModel.insert(txn, IModel.rootSubjectId, \"NoSideEffects\");\r\n txn.saveChanges();\r\n const aspectExists = async (): Promise<boolean> => {\r\n const reader = iModelDb.createQueryReader(\"SELECT 1 FROM bis.ElementMultiAspect WHERE ECInstanceId=?\", new QueryBinder().bindId(1, aspectId));\r\n return reader.step();\r\n };\r\n const geomRowExists = (id: Id64String) => iModelDb.withPreparedSqliteStatement(\"SELECT 1 FROM bis_GeometricElement3d WHERE ElementId=?\", (stmt) => { stmt.bindId(1, id); return stmt.step() === DbResult.BE_SQLITE_ROW; });\r\n\r\n const result = txn.deleteElements([rootA, rootD, partitionId]);\r\n assertResult(result, constraintViolation(new Set([rootA]), codeScopeViolator(rootA)), [], [rootA, rootB, rootC, rootD, partitionId]);\r\n assert.isTrue(await aspectExists(), \"aspect must not be touched\");\r\n assert.isTrue(geomRowExists(rootD), \"subclass rows must not be touched\");\r\n assert.isDefined(iModelDb.models.tryGetModelProps(partitionId), \"sub-model must not be touched\");\r\n assert.isFalse(iModelDb[_nativeDb].hasUnsavedChanges(), \"a rejected delete must not dirty the txn\");\r\n });\r\n\r\n it(\"deprecated skipFKConstraintValidations flag is ignored (either value)\", () => {\r\n const { rootA, rootB, rootC, rootD } = insertScopeChain();\r\n\r\n for (const skipFKConstraintValidations of [true, false]) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const result = txn.deleteElements([rootA, rootD], { skipFKConstraintValidations });\r\n assertResult(result, constraintViolation(new Set([rootA]), codeScopeViolator(rootA)), [], [rootA, rootB, rootC, rootD]);\r\n\r\n // ...and succeeds when nothing is referenced from outside the set.\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const ok = txn.deleteElements([rootA, rootB, rootC, rootD], { skipFKConstraintValidations });\r\n assertResult(ok, success, [rootA, rootB, rootC, rootD], []);\r\n txn.abandonChanges();\r\n }\r\n });\r\n });\r\n\r\n describe(\"Code scope violations from outside the delete set\", () => {\r\n it(\"root is code scope for an external element\", () => {\r\n const rootA = insertElement();\r\n const external = insertElement({ codeScope: rootA, codeValue: \"ext-code\" });\r\n const rootB = insertElement();\r\n expectRejected(\"external scopes root\", [rootA, rootB], [rootA, rootB, external],\r\n new Set([rootA]), codeScopeViolator(rootA));\r\n });\r\n\r\n it(\"depth-1 child is code scope for external\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\r\n const rootB = insertElement();\r\n // The cascaded child is the violator; the requested parent is not itself reported.\r\n expectRejected(\"external scopes depth-1 child\", [rootA, rootB], [rootA, childA, external, rootB],\r\n new Set([childA]), codeScopeViolator(childA));\r\n });\r\n\r\n it(\"depth-2 grandchild is code scope for external\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const grandchildA = insertElement({ parentId: childA });\r\n const external = insertElement({ codeScope: grandchildA, codeValue: \"ext-code\" });\r\n const rootB = insertElement();\r\n expectRejected(\"external scopes depth-2 grandchild\", [rootA, rootB], [rootA, childA, grandchildA, external, rootB],\r\n new Set([grandchildA]), codeScopeViolator(grandchildA));\r\n });\r\n\r\n it(\"only the child is passed for deletion\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\r\n expectRejected(\"external scopes requested child\", [childA], [rootA, childA, external],\r\n new Set([childA]), codeScopeViolator(childA));\r\n });\r\n\r\n it(\"root has both an external scope dependent AND an intra-set scope dependent\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const external = insertElement({ codeScope: rootA, codeValue: \"ext-code\" });\r\n expectRejected(\"root rejected due to external\", [rootA, rootB], [rootA, rootB, external],\r\n new Set([rootA]), codeScopeViolator(rootA));\r\n });\r\n\r\n it(\"two independent external scope violations are both reported\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement();\r\n const extX = insertElement({ codeScope: rootA, codeValue: \"extX\" });\r\n const extY = insertElement({ codeScope: rootB, codeValue: \"extY\" });\r\n const rootC = insertElement();\r\n expectRejected(\"two independent violations\", [rootA, rootB, rootC], [rootA, rootB, rootC, extX, extY],\r\n new Set([rootA, rootB]), codeScopeViolator(rootA), codeScopeViolator(rootB));\r\n });\r\n });\r\n\r\n describe(\"mixed element hierarchy and code scope violations\", () => {\r\n it(\"root scopes another root - delete both roots, all descendants removed\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const childA2 = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\r\n const childB1 = insertElement({ parentId: rootB });\r\n executeTestCase(\"root scopes root - delete both roots\",\r\n [rootA, rootB],\r\n [rootA, childA1, childA2, rootB, childB1],\r\n []);\r\n });\r\n\r\n it(\"depth-1 child scopes an unrelated root\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\r\n const childB1 = insertElement({ parentId: rootB });\r\n executeTestCase(\"depth-1 child scopes root - delete both via parents\",\r\n [rootA, rootB],\r\n [rootA, childA1, rootB, childB1],\r\n []);\r\n // Reverse input order - result must be identical\r\n executeTestCase(\"depth-1 child scopes root - reverse input order\",\r\n [rootB, rootA],\r\n [rootA, childA1, rootB, childB1],\r\n []);\r\n });\r\n\r\n it(\"depth-1 child scopes an unrelated root - delete child and root directly (parent survives)\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\r\n const childB1 = insertElement({ parentId: rootB });\r\n // Only childA1 and rootB - rootA is NOT in the delete set.\r\n executeTestCase(\"depth-1 child scopes root - delete child + scoped root directly\",\r\n [childA1, rootB],\r\n [childA1, rootB, childB1],\r\n [rootA]);\r\n });\r\n\r\n it(\"depth-1 child scopes an unrelated root - deleting only the child is rejected because the scoped root is outside the set\", () => {\r\n // childA1 is the code scope of rootB. rootB is not in the delete set, so childA1 is still referenced and the call is rejected.\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\r\n const childB1 = insertElement({ parentId: rootB });\r\n expectRejected(\"delete child only - scoped root is external\", [childA1], [rootA, childA1, rootB, childB1],\r\n new Set([childA1]), codeScopeViolator(childA1));\r\n });\r\n\r\n it(\"root scopes a depth-1 child in sibling tree - delete both roots, all descendants removed\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement();\r\n const childB1 = insertElement({ parentId: rootB, codeScope: rootA, codeValue: \"childB1-code\" });\r\n executeTestCase(\"root scopes depth-1 child - delete both roots\",\r\n [rootA, rootB],\r\n [rootA, childA1, rootB, childB1],\r\n []);\r\n });\r\n\r\n it(\"depth-1 child scopes a depth-1 child in sibling tree - delete both children directly (parents survive)\", () => {\r\n const rootA = insertElement();\r\n const childA1 = insertElement({ parentId: rootA });\r\n const rootB = insertElement();\r\n const childB1 = insertElement({ parentId: rootB, codeScope: childA1, codeValue: \"childB1-code\" });\r\n const childB2 = insertElement({ parentId: rootB });\r\n executeTestCase(\"sibling-child scope - delete both children directly\",\r\n [childA1, childB1],\r\n [childA1, childB1],\r\n [rootA, rootB, childB2]);\r\n });\r\n\r\n it(\"depth-2 grandchild scopes an unrelated root - delete grandparent + scoped root\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const grandchildA = insertElement({ parentId: childA });\r\n const rootB = insertElement({ codeScope: grandchildA, codeValue: \"rootB-code\" });\r\n const childB = insertElement({ parentId: rootB });\r\n executeTestCase(\"depth-2 grandchild scopes root - delete both roots\",\r\n [rootA, rootB],\r\n [rootA, childA, grandchildA, rootB, childB],\r\n []);\r\n\r\n // Delete grandchild and scoped root directly (rootA and childA survive)\r\n executeTestCase(\"depth-2 grandchild scopes root - delete grandchild + root directly\",\r\n [grandchildA, rootB],\r\n [grandchildA, rootB, childB],\r\n [rootA, childA]);\r\n });\r\n\r\n it(\"external element scopes a depth-2 grandchild, mixed with an unrelated deletion\", () => {\r\n // The grandchild has an external scope violation. An unrelated element from another tree (childB) is also requested and\r\n // has no violation, but the call is all-or-nothing so it survives as well.\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const grandchildA = insertElement({ parentId: childA });\r\n const rootB = insertElement();\r\n const childB = insertElement({ parentId: rootB });\r\n const external = insertElement({ codeScope: grandchildA, codeValue: \"ext-code\" });\r\n expectRejected(\"external scopes depth-2 grandchild, unrelated childB retained\",\r\n [grandchildA, rootA, childB],\r\n [rootA, childA, grandchildA, rootB, childB, external],\r\n new Set([grandchildA]), codeScopeViolator(grandchildA));\r\n });\r\n\r\n it(\"two trees: one has external scope violation, neither is deleted\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const gcA = insertElement({ parentId: childA });\r\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\r\n const rootB = insertElement();\r\n const childB1 = insertElement({ parentId: rootB });\r\n const childB2 = insertElement({ parentId: rootB });\r\n const gcB = insertElement({ parentId: childB1 });\r\n expectRejected(\"one tree violates, both retained\",\r\n [rootA, rootB],\r\n [rootA, childA, gcA, external, rootB, childB1, childB2, gcB],\r\n new Set([childA]), codeScopeViolator(childA));\r\n });\r\n });\r\n\r\n describe(\"sub-model hierarchy\", () => {\r\n let partitionCounter = 0;\r\n\r\n const insertSubModel = (): Id64String => {\r\n const name = `SubModelPartition-${++partitionCounter}`;\r\n return PhysicalModel.insert(txn, IModel.rootSubjectId, name);\r\n };\r\n\r\n const insertElementInModel = (subModelId: Id64String, opts: { parentId?: Id64String } = {}): Id64String => {\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: subModelId,\r\n category: categoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n ...(opts.parentId ? { parent: { id: opts.parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n };\r\n const id = txn.insertElement(props);\r\n assert.isNotEmpty(id, \"insertElementInModel must return a valid ID\");\r\n txn.saveChanges();\r\n return id;\r\n };\r\n\r\n /** Assert that the sub-model 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 sub-model still exists. */\r\n const assertModelExists = (id: Id64String, msg: string) =>\r\n assert.isDefined(iModelDb.models.tryGetModelProps(id), msg);\r\n\r\n it(\"delete a modeled element cascades into its sub-model\", () => {\r\n const partitionId = insertSubModel();\r\n const elem1 = insertElementInModel(partitionId);\r\n const elem2 = insertElementInModel(partitionId);\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assert.isEmpty(result.failures);\r\n assertDeleted(partitionId, \"partition element should be deleted\");\r\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\r\n assertDeleted(elem1, \"elem1 inside sub-model should be deleted\");\r\n assertDeleted(elem2, \"elem2 inside sub-model should be deleted\");\r\n assertExists(unrelated, \"unrelated element should be retained\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n /**\r\n * Scenario: Subject -> partition (parent-child) -> modeled-element.\r\n *\r\n * subjectA\r\n * └─ [P:childPartition]\r\n * [M:childPartition] -> elem1\r\n * unrelated\r\n */\r\n it(\"delete a parent whose child is a modeled element cascades into the sub-model\", () => {\r\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `SubjectA-${++partitionCounter}`);\r\n const childPartitionId = PhysicalModel.insert(txn, subjectA, `ChildPartition-${partitionCounter}`);\r\n const elem1 = insertElementInModel(childPartitionId);\r\n const unrelated = insertElement();\r\n\r\n // Deleting subjectA cascades (parent-child) to childPartitionId, which then cascades (modeled-element) into elem1.\r\n const result = txn.deleteElements([subjectA]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(subjectA, \"subject should be deleted\");\r\n assertDeleted(childPartitionId, \"child partition element should be deleted\");\r\n assertModelDeleted(childPartitionId, \"child partition sub-model should be deleted\");\r\n assertDeleted(elem1, \"elem1 inside child partition sub-model should be deleted\");\r\n assertExists(unrelated, \"unrelated element should be retained\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n /**\r\n * Scenario: sub-model elements have their own children; all should be removed transitively.\r\n *\r\n * [P:partition]\r\n * [M:partition] -> elem1\r\n * └─ childOfElem1\r\n * └─ grandchildOfElem1\r\n * elem2\r\n * unrelated element\r\n */\r\n it(\"delete a modeled element whose sub-model elements have children\", () => {\r\n const partitionId = insertSubModel();\r\n const elem1 = insertElementInModel(partitionId);\r\n const childOfElem1 = insertElementInModel(partitionId, { parentId: elem1 });\r\n const grandchildOfElem1 = insertElementInModel(partitionId, { parentId: childOfElem1 });\r\n const elem2 = insertElementInModel(partitionId);\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(partitionId, \"partition should be deleted\");\r\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\r\n assertDeleted(elem1, \"elem1 should be deleted\");\r\n assertDeleted(childOfElem1, \"child of elem1 should be deleted\");\r\n assertDeleted(grandchildOfElem1, \"grandchild of elem1 should be deleted\");\r\n assertDeleted(elem2, \"elem2 should be deleted\");\r\n assertExists(unrelated, \"unrelated should be retained\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n /**\r\n * Scenario: element inside a sub-model is a code scope for an element outside the delete set. The whole partition subtree must be ignored from the delete set.\r\n *\r\n * [P:partition]\r\n * [M:partition] -> scopingElem <- code scope for `external`\r\n * otherElem\r\n * external (not in delete set)\r\n * unrelated\r\n */\r\n it(\"partition rejected when a sub-model element is a code scope for an external element\", () => {\r\n const partitionId = insertSubModel();\r\n const scopingElem = insertElementInModel(partitionId);\r\n const otherElem = insertElementInModel(partitionId);\r\n const external = insertElement({ codeScope: scopingElem, codeValue: \"ext-code\" });\r\n const unrelated = insertElement();\r\n\r\n // `external` is NOT in the delete set and uses scopingElem as its code scope -> the cascaded sub-model member is a\r\n // violator and the whole call is rejected, including the unrelated element.\r\n const result = txn.deleteElements([partitionId, unrelated]);\r\n assertResult(result, constraintViolation(new Set([scopingElem]), codeScopeViolator(scopingElem)), [], [partitionId, scopingElem, otherElem, external, unrelated]);\r\n assertModelExists(partitionId, \"sub-model should be retained\");\r\n });\r\n\r\n /**\r\n * Scenario: the sub-model element of one partition is used as a code scope for an element\r\n * inside a *different* partition's sub-model that is also in the delete set.\r\n * Both partitions and all contents should be deleted.\r\n *\r\n * [P:p1] [M:p1] -> scopingElem\r\n * [P:p2] [M:p2] -> dependentElem (codeScope = scopingElem)\r\n */\r\n it(\"cross-sub-model intra-set code scope dependency: both partitions deleted cleanly\", () => {\r\n const p1 = insertSubModel();\r\n const scopingElem = insertElementInModel(p1);\r\n const p2 = insertSubModel();\r\n const dependentElem = insertElementInModel(p2, {});\r\n // Manually assign the code scope after insertion is not possible through insertElementInModel,\r\n // so use a dedicated insert call.\r\n const dependentId = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: p2,\r\n category: categoryId,\r\n code: { spec: codeSpecId, scope: scopingElem, value: \"dep-code\" },\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n\r\n const result = txn.deleteElements([p1, p2]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(p1, \"p1 should be deleted\");\r\n assertModelDeleted(p1, \"sub-model of p1 should be deleted\");\r\n assertDeleted(scopingElem, \"scopingElem should be deleted\");\r\n assertDeleted(p2, \"p2 should be deleted\");\r\n assertModelDeleted(p2, \"sub-model of p2 should be deleted\");\r\n assertDeleted(dependentElem, \"dependentElem should be deleted\");\r\n assertDeleted(dependentId, \"dependentId should be deleted\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n /**\r\n * Scenario: three-level Subject cascade: deleting a grandparent Subject removes a child\r\n * Subject, which removes a partition (parent-child), which cascades into the sub-model.\r\n *\r\n * grandparentSubject\r\n * └─ childSubject\r\n * └─ [P:grandchildPartition]\r\n * [M:grandchildPartition] -> innerElem1, innerElem2\r\n * unrelated\r\n */\r\n it(\"deep cascade: grandparent Subject -> child Subject -> partition -> sub-model elements\", () => {\r\n const grandparentSubjectId = Subject.insert(txn, IModel.rootSubjectId, `GrandparentSubject-${++partitionCounter}`);\r\n const childSubjectId = Subject.insert(txn, grandparentSubjectId, `ChildSubject-${partitionCounter}`);\r\n const grandchildPartitionId = PhysicalModel.insert(txn, childSubjectId, `GrandchildPartition-${partitionCounter}`);\r\n const innerElem1 = insertElementInModel(grandchildPartitionId);\r\n const innerElem2 = insertElementInModel(grandchildPartitionId);\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([grandparentSubjectId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(grandparentSubjectId, \"grandparent subject should be deleted\");\r\n assertDeleted(childSubjectId, \"child subject should be deleted\");\r\n assertDeleted(grandchildPartitionId, \"grandchild partition should be deleted\");\r\n assertModelDeleted(grandchildPartitionId, \"grandchild sub-model should be deleted\");\r\n assertDeleted(innerElem1, \"innerElem1 should be deleted\");\r\n assertDeleted(innerElem2, \"innerElem2 should be deleted\");\r\n assertExists(unrelated, \"unrelated should be retained\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n /**\r\n * Scenario: empty sub-model: partition with no elements in its sub-model.\r\n *\r\n * [P:partition] [M:partition] (empty)\r\n * unrelated\r\n */\r\n it(\"delete a modeled element whose sub-model is empty\", () => {\r\n const partitionId = insertSubModel();\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(partitionId, \"partition should be deleted\");\r\n assertModelDeleted(partitionId, \"empty sub-model should be deleted\");\r\n assertExists(unrelated, \"unrelated should be retained\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n /**\r\n * Scenario: a regular element has two children, one of which is a partition with a\r\n * sub-model, while the other is an ordinary element. Deleting the regular parent\r\n * removes both children and all sub-model contents.\r\n *\r\n * regularParent (lives in modelId)\r\n * ├─ ordinaryChild\r\n * └─ [P:partitionChild]\r\n * [M:partitionChild] -> subElem1, subElem2\r\n * unrelated\r\n */\r\n it(\"deleting a regular element with a mix of ordinary and partition children cascades correctly\", () => {\r\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `MixedChildSubject-${++partitionCounter}`);\r\n const partitionChild = PhysicalModel.insert(txn, subjectA, `MixedChildPartition-${partitionCounter}`);\r\n const subElem1 = insertElementInModel(partitionChild);\r\n const subElem2 = insertElementInModel(partitionChild);\r\n const unrelated = insertElement();\r\n\r\n const result = txn.deleteElements([subjectA]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(subjectA, \"subjectA should be deleted\");\r\n assertDeleted(partitionChild, \"partition child should be deleted\");\r\n assertModelDeleted(partitionChild, \"sub-model of partition child should be deleted\");\r\n assertDeleted(subElem1, \"subElem1 should be deleted\");\r\n assertDeleted(subElem2, \"subElem2 should be deleted\");\r\n assertExists(unrelated, \"unrelated should be retained\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n /**\r\n * Scenario: a regular element's grandchild is a partition. Passing the partition's\r\n * direct parent (not the grandparent root) for deletion cascades into the sub-model while\r\n * the grandparent survives.\r\n *\r\n * grandparent (lives in modelId)\r\n * └─ parent <- passed for deletion\r\n * └─ [P:partition]\r\n * [M:partition] -> subElem1, subElem2\r\n */\r\n it(\"deleting a mid-tree regular element whose child is a partition cascades into the sub-model; grandparent survives\", () => {\r\n const subjectGP = Subject.insert(txn, IModel.rootSubjectId, `MidTreeGP-${++partitionCounter}`);\r\n const subjectP = Subject.insert(txn, subjectGP, `MidTreeP-${partitionCounter}`);\r\n const partitionId = PhysicalModel.insert(txn, subjectP, `MidTreePartition-${partitionCounter}`);\r\n const subElem1 = insertElementInModel(partitionId);\r\n const subElem2 = insertElementInModel(partitionId);\r\n\r\n // Only pass subjectP - grandparent must survive, everything below subjectP must go.\r\n const result = txn.deleteElements([subjectP]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertExists(subjectGP, \"grandparent should survive\");\r\n assertDeleted(subjectP, \"parent should be deleted\");\r\n assertDeleted(partitionId, \"partition should be deleted\");\r\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\r\n assertDeleted(subElem1, \"subElem1 should be deleted\");\r\n assertDeleted(subElem2, \"subElem2 should be deleted\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n it(\"deleting a partition element directly (not via its regular parent) cascades into the sub-model; parent survives\", () => {\r\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `DirectPartSubject-${++partitionCounter}`);\r\n const partitionId = PhysicalModel.insert(txn, subjectA, `DirectPartPartition-${partitionCounter}`);\r\n const subElem1 = insertElementInModel(partitionId);\r\n const subElem2 = insertElementInModel(partitionId);\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assertExists(subjectA, \"subject (regular parent) should survive\");\r\n assertDeleted(partitionId, \"partition should be deleted\");\r\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\r\n assertDeleted(subElem1, \"subElem1 should be deleted\");\r\n assertDeleted(subElem2, \"subElem2 should be deleted\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n });\r\n\r\n /**\r\n * Members of a sub-model that are *also* listed explicitly in the input. Native expands the delete set from the element itself\r\n * (children + sub-model contents), so a violator inside the sub-model must reject the call regardless of whether it was\r\n * requested or cascaded, and a rejected call must never delete the model row out from under explicitly-requested members.\r\n *\r\n * [P:defPartition] [M:defPartition] -> catA (used by wall1, outside the set), catB (unused)\r\n * wall1 (in modelId, category = catA)\r\n */\r\n describe(\"explicit sub-model members\", () => {\r\n let defPartition: Id64String;\r\n let catA: Id64String, catB: Id64String;\r\n let subA: Id64String, subB: Id64String;\r\n let wall1: Id64String;\r\n\r\n beforeEach(() => {\r\n defPartition = DefinitionModel.insert(txn, IModel.rootSubjectId, \"DefPartition\");\r\n catA = SpatialCategory.insert(txn, defPartition, \"CatA\", new SubCategoryAppearance());\r\n catB = SpatialCategory.insert(txn, defPartition, \"CatB\", new SubCategoryAppearance());\r\n subA = IModel.getDefaultSubCategoryId(catA);\r\n subB = IModel.getDefaultSubCategoryId(catB);\r\n wall1 = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: modelId, category: catA, code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n txn.saveChanges();\r\n });\r\n\r\n const assertPartitionIntact = () => {\r\n assert.isDefined(iModelDb.models.tryGetModelProps(defPartition), \"sub-model row must survive when the call is rejected\");\r\n assert.equal(iModelDb.elements.getElement(catA).model, defPartition, \"catA must still live in the sub-model\");\r\n };\r\n\r\n it(\"Only the modeled element requested: violator inside rejects it, nothing deleted\", () => {\r\n expectRejected(\"partition only\", [defPartition], [defPartition, catA, subA, catB, subB, wall1],\r\n new Set([catA]), categoryInUse3d(catA));\r\n assertPartitionIntact();\r\n });\r\n\r\n it(\"Modeled element + members requested explicitly: nothing deleted, only the direct violator is reported\", () => {\r\n // The reviewer's case: pre-fix native treated catB as a root (it was requested) and deleted it together with the model row\r\n // while catA survived, leaving catA pointing at a model that no longer existed.\r\n expectRejected(\"partition + members\", [defPartition, catA, catB], [defPartition, catA, subA, catB, subB, wall1],\r\n new Set([catA]), categoryInUse3d(catA));\r\n assertPartitionIntact();\r\n });\r\n\r\n it(\"Only members requested (modeled element not listed): the in-use one rejects the call, the model survives\", () => {\r\n expectRejected(\"members only\", [catA, catB], [defPartition, catA, subA, catB, subB, wall1],\r\n new Set([catA]), categoryInUse3d(catA));\r\n assertPartitionIntact();\r\n });\r\n\r\n it(\"Only the unused member requested: deleted, the model survives\", () => {\r\n executeTestCase(\"unused member only\", [catB], [catB, subB], [defPartition, catA, subA, wall1]);\r\n assertPartitionIntact();\r\n });\r\n\r\n it(\"Once the external user is gone, modeled element + members delete cleanly\", () => {\r\n txn.deleteElement(wall1);\r\n txn.saveChanges();\r\n const result = txn.deleteElements([defPartition, catA, catB]);\r\n assertResult(result, success, [defPartition, catA, subA, catB, subB], []);\r\n assert.isUndefined(iModelDb.models.tryGetModelProps(defPartition), \"sub-model row must be deleted with its modeled element\");\r\n });\r\n\r\n it(\"Requested member deep in a parent chain inside the sub-model rejects the call\", () => {\r\n const partition = PhysicalModel.insert(txn, IModel.rootSubjectId, \"ChainPartition\");\r\n const insertIn = (parentId?: Id64String) => txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: partition, category: categoryId, code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n } as PhysicalElementProps);\r\n const p = insertIn();\r\n const c = insertIn(p);\r\n const g = insertIn(c);\r\n txn.saveChanges();\r\n const external = insertElement({ codeScope: g, codeValue: \"ext-g\" });\r\n\r\n // g is requested *and* a cascaded grandchild of a sub-model member; it is a violator either way.\r\n expectRejected(\"partition + deep member\", [partition, g], [partition, p, c, g, external],\r\n new Set([g]), codeScopeViolator(g));\r\n assert.isDefined(iModelDb.models.tryGetModelProps(partition));\r\n });\r\n });\r\n\r\n /**\r\n * `DefinitionInUse` is reported for definitions referenced from geometry streams or other non-FK usages. Every category test\r\n * elsewhere in this file is caught by the `CategoryId` *foreign key* path first, so these are the only tests that reach\r\n * `DefinitionElementUsageInfo`. The RenderMaterial / GeometryPart cases force a full geometry-stream scan natively; fine on\r\n * a tiny db, do not copy this pattern into a performance test.\r\n *\r\n * [M:defModel] -> cat (-> sub, non-default), mat, part\r\n * elem (in modelId, category = cat): geometry uses sub, mat and part\r\n */\r\n describe(\"DefinitionInUse via geometry streams\", () => {\r\n let defModel: Id64String;\r\n let cat: Id64String, sub: Id64String, defaultSub: Id64String, mat: Id64String, part: Id64String;\r\n let elem: Id64String;\r\n\r\n beforeEach(() => {\r\n defModel = DefinitionModel.insert(txn, IModel.rootSubjectId, \"Defs\");\r\n cat = SpatialCategory.insert(txn, defModel, \"Cat\", new SubCategoryAppearance());\r\n defaultSub = IModel.getDefaultSubCategoryId(cat);\r\n sub = SubCategory.insert(txn, cat, \"Sub\", new SubCategoryAppearance());\r\n mat = RenderMaterialElement.insert(txn, defModel, \"Mat\", { paletteName: \"p\" });\r\n part = txn.insertElement({\r\n classFullName: GeometryPart.classFullName, model: defModel, code: GeometryPart.createCode(iModelDb, defModel, \"Part\"),\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n } as GeometryPartProps);\r\n elem = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: modelId, category: cat, 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), cat, sub, mat, part),\r\n } as PhysicalElementProps);\r\n txn.saveChanges();\r\n });\r\n\r\n it(\"A non-default SubCategory referenced from a geometry stream is DefinitionInUse\", () => {\r\n expectRejected(\"sub-category in geometry\", [sub], [cat, defaultSub, sub, elem], new Set([sub]), definitionInUse(sub));\r\n });\r\n\r\n it(\"A in-use Category rejects the call that also requests its SubCategory (nothing deleted)\", () => {\r\n // Pre-fix native pruned only *upwards* from the violator: `sub` was deleted while `cat` survived. With all-or-nothing\r\n // semantics the sub-category must survive together with its category.\r\n const elem2 = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: modelId, category: cat, code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n txn.saveChanges();\r\n // Remove the geometry-stream user so the only thing keeping `cat` alive is the CategoryId FK from elem2.\r\n txn.deleteElement(elem);\r\n txn.saveChanges();\r\n\r\n expectRejected(\"category + sub-category\", [cat, sub], [cat, defaultSub, sub, elem2], new Set([cat]), categoryInUse3d(cat));\r\n });\r\n\r\n it(\"A RenderMaterial referenced from a geometry stream is DefinitionInUse\", () => {\r\n expectRejected(\"material in geometry\", [mat], [mat, elem], new Set([mat]), definitionInUse(mat));\r\n });\r\n\r\n it(\"A GeometryPart referenced from a geometry stream is DefinitionInUse\", () => {\r\n expectRejected(\"part in geometry\", [part], [part, elem], new Set([part]), definitionInUse(part));\r\n });\r\n\r\n it(\"Definitions whose only user is in the delete set are deleted with it\", () => {\r\n executeTestCase(\"definitions + their user\", [mat, part, sub, elem], [mat, part, sub, elem], [cat, defaultSub]);\r\n });\r\n });\r\n\r\n describe(\"input validation and txn state\", () => {\r\n it(\"throws when the EditTxn is not active\", () => {\r\n const el = insertElement();\r\n txn.end(\"abandon\");\r\n assert.throws(() => txn.deleteElements([el]), \"EditTxn is not active\");\r\n\r\n // Re-activate so afterEach can end it.\r\n txn = new EditTxn(iModelDb, \"delete elements\");\r\n txn.start();\r\n assertExists(el, \"nothing may be deleted by an inactive txn\");\r\n });\r\n\r\n it(\"throws before touching the iModel when any id is invalid, even if other ids are deletable\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement();\r\n assert.throws(() => txn.deleteElements([rootA, \"0x\", rootB]));\r\n assert.throws(() => txn.deleteElements([rootA, \"\", rootB]));\r\n assertExists(rootA);\r\n assertExists(rootB);\r\n });\r\n\r\n it(\"well-formed ids that do not exist are ignored\", () => {\r\n const rootA = insertElement();\r\n const missing = \"0xffffffffffff\";\r\n assert.isUndefined(iModelDb.elements.tryGetElement(missing));\r\n executeTestCase(\"missing id\", [rootA, missing], [rootA], [], success);\r\n });\r\n\r\n it(\"second deletion of an already-deleted element is a no-op\", () => {\r\n const rootA = insertElement();\r\n const rootB = insertElement();\r\n assert.equal(txn.deleteElements([rootA]).status, BulkDeleteElementsStatus.Success);\r\n assertDeleted(rootA);\r\n\r\n // rootA no longer exists; the call must still succeed and delete rootB.\r\n const result = txn.deleteElements([rootA, rootB]);\r\n assertResult(result, success, [rootA, rootB], []);\r\n });\r\n\r\n it(\"does not auto-save: abandonChanges restores every deleted element\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const result = txn.deleteElements([rootA]);\r\n assertResult(result, success, [rootA, childA], []);\r\n\r\n txn.abandonChanges();\r\n assertExists(rootA, \"abandon must restore rootA\");\r\n assertExists(childA, \"abandon must restore childA\");\r\n });\r\n\r\n it(\"an element referenced through several foreign keys is reported exactly once\", () => {\r\n // A fresh category referenced from outside the delete set via two distinct NO ACTION foreign keys:\r\n // - bis_GeometricElement3d.CategoryId (a PhysicalObject assigned to it)\r\n // - bis_Element.CodeScopeId (another element using it as code scope)\r\n const multiRefCategory = SpatialCategory.insert(txn, IModel.dictionaryId, \"MultiRefCategory\", new SubCategoryAppearance());\r\n const usesAsCategoryProps: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: modelId,\r\n category: multiRefCategory,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n };\r\n const usesAsCategory = txn.insertElement(usesAsCategoryProps);\r\n const usesAsCodeScope = insertElement({ codeScope: multiRefCategory, codeValue: \"scoped-by-category\" });\r\n txn.saveChanges();\r\n\r\n const result = txn.deleteElements([multiRefCategory]);\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 const [failure] = result.failures;\r\n assert.equal(failure.elementId, multiRefCategory);\r\n assert.equal(failure.reason, BulkDeleteFailureReason.ReferencedByForeignKey);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.deepEqual(result.failedIds, new Set([multiRefCategory]));\r\n for (const id of [multiRefCategory, usesAsCategory, usesAsCodeScope])\r\n assertExists(id);\r\n\r\n // Once both referencing elements are in the delete set the category is no longer a violator.\r\n const retry = txn.deleteElements([multiRefCategory, usesAsCategory, usesAsCodeScope]);\r\n assertResult(retry, success, [multiRefCategory, usesAsCategory, usesAsCodeScope], []);\r\n });\r\n });\r\n\r\n describe(\"cache coherence\", () => {\r\n /** Load an element (or model) so that it is held in the in-memory cache. */\r\n const prime = (ids: Id64Array) => {\r\n for (const id of ids)\r\n assert.isDefined(iModelDb.elements.getElement(id));\r\n };\r\n\r\n it(\"cascaded descendants that were cached are no longer readable after their ancestor is deleted\", () => {\r\n const parent = insertElement();\r\n const child = insertElement({ parentId: parent });\r\n const grandchild = insertElement({ parentId: child });\r\n prime([parent, child, grandchild]);\r\n\r\n const result = txn.deleteElements([parent]);\r\n assertResult(result, success, [parent, child, grandchild], []);\r\n assert.isUndefined(iModelDb.elements.tryGetElementProps(child), \"cached child props must not be served after deletion\");\r\n assert.isUndefined(iModelDb.elements.tryGetElementProps(grandchild), \"cached grandchild props must not be served after deletion\");\r\n assert.throws(() => iModelDb.elements.getElement(child));\r\n });\r\n\r\n it(\"cached sub-model contents and the model itself are no longer readable after the modeled element is deleted\", () => {\r\n const partitionId = PhysicalModel.insert(txn, IModel.rootSubjectId, \"CachedSubModelPartition\");\r\n const inner = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: partitionId,\r\n category: categoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n txn.saveChanges();\r\n prime([partitionId, inner]);\r\n assert.isDefined(iModelDb.models.getModelProps(partitionId));\r\n assert.isDefined(iModelDb.models.getModel(partitionId));\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assertResult(result, success, [partitionId, inner], []);\r\n assert.isUndefined(iModelDb.models.tryGetModelProps(partitionId), \"cached model props must not be served after deletion\");\r\n assert.isUndefined(iModelDb.models.tryGetModel(partitionId), \"cached model must not be served after deletion\");\r\n assert.isUndefined(iModelDb.elements.tryGetElementProps(inner), \"cached sub-model element must not be served after deletion\");\r\n });\r\n\r\n it(\"on ConstraintViolation, every cached element stays readable\", () => {\r\n const rootA = insertElement();\r\n const external = insertElement({ codeScope: rootA, codeValue: \"ext\" });\r\n const rootB = insertElement();\r\n const childB = insertElement({ parentId: rootB });\r\n prime([rootA, external, rootB, childB]);\r\n\r\n const result = txn.deleteElements([rootA, rootB]);\r\n assertResult(result, constraintViolation(new Set([rootA]), codeScopeViolator(rootA)), [], [rootA, external, rootB, childB]);\r\n for (const id of [rootA, external, rootB, childB])\r\n assert.strictEqual(iModelDb.elements.getElement(id).id, id);\r\n });\r\n\r\n it(\"a cached parent reflects the removal of its children\", () => {\r\n const parent = insertElement();\r\n const child = insertElement({ parentId: parent });\r\n prime([parent, child]);\r\n assert.deepEqual(iModelDb.elements.queryChildren(parent), [child]);\r\n\r\n const result = txn.deleteElements([child]);\r\n assertResult(result, success, [child], [parent]);\r\n assert.isEmpty(iModelDb.elements.queryChildren(parent));\r\n assert.strictEqual(iModelDb.elements.getElement(parent).id, parent);\r\n });\r\n });\r\n\r\n describe(\"related data cleanup\", () => {\r\n const countAspects = async (elementId: Id64String): Promise<number> => {\r\n const reader = iModelDb.createQueryReader(\"SELECT COUNT(*) FROM bis.ElementMultiAspect WHERE Element.Id=?\", new QueryBinder().bindId(1, elementId), { usePrimaryConn: true });\r\n assert.isTrue(await reader.step());\r\n return reader.current.toArray()[0];\r\n };\r\n\r\n const insertAspect = (elementId: Id64String, scopeId: Id64String = IModel.rootSubjectId): Id64String =>\r\n txn.insertAspect({\r\n classFullName: ExternalSourceAspect.classFullName,\r\n element: { id: elementId },\r\n scope: { id: scopeId },\r\n identifier: `src-${elementId}`,\r\n kind: \"Element\",\r\n } as ExternalSourceAspectProps);\r\n\r\n it(\"aspects owned by deleted elements (including cascaded descendants) are removed\", async () => {\r\n const parent = insertElement();\r\n const child = insertElement({ parentId: parent });\r\n const survivor = insertElement();\r\n insertAspect(parent);\r\n insertAspect(child);\r\n insertAspect(child);\r\n const survivorAspect = insertAspect(survivor);\r\n assert.equal(await countAspects(parent), 1);\r\n assert.equal(await countAspects(child), 2);\r\n\r\n const result = txn.deleteElements([parent]);\r\n assertResult(result, success, [parent, child], [survivor]);\r\n assert.equal(await countAspects(parent), 0, \"aspects of the deleted parent must be removed\");\r\n assert.equal(await countAspects(child), 0, \"aspects of the cascaded child must be removed\");\r\n assert.equal(await countAspects(survivor), 1, \"aspects of unrelated elements must be untouched\");\r\n assert.isDefined(iModelDb.elements.getAspect(survivorAspect));\r\n });\r\n\r\n it(\"an element used as the Scope of another element's ExternalSourceAspect\", () => {\r\n const scopeElem = insertElement();\r\n const owner = insertElement();\r\n const aspectId = insertAspect(owner, scopeElem);\r\n\r\n // Deleting both the scope element and the aspect owner is fine: the aspect goes away with its owner.\r\n const result = txn.deleteElements([scopeElem, owner]);\r\n assertResult(result, success, [scopeElem, owner], []);\r\n assert.throws(() => iModelDb.elements.getAspect(aspectId));\r\n });\r\n\r\n it(\"Aspects owned by cascaded sub-model members are removed\", async () => {\r\n // Existing aspect tests only cover parent/child cascades; sub-model members reach the delete set through a different path.\r\n const partitionId = PhysicalModel.insert(txn, IModel.rootSubjectId, \"AspectPartition\");\r\n const insertMember = () => txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: partitionId, category: categoryId, code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n const member1 = insertMember();\r\n const member2 = insertMember();\r\n insertAspect(member1);\r\n insertAspect(member2);\r\n insertAspect(member2);\r\n txn.saveChanges();\r\n assert.equal(await countAspects(member1), 1);\r\n assert.equal(await countAspects(member2), 2);\r\n\r\n const result = txn.deleteElements([partitionId]);\r\n assertResult(result, success, [partitionId, member1, member2], []);\r\n assert.equal(await countAspects(member1), 0, \"aspects of cascaded sub-model member must be removed\");\r\n assert.equal(await countAspects(member2), 0, \"aspects of cascaded sub-model member must be removed\");\r\n });\r\n\r\n describe(\"domain-schema navigation properties (no FK constraint)\", () => {\r\n const navObjectClass = \"DeleteElementsNavTest:NavObject\";\r\n const navRelClass = \"DeleteElementsNavTest:NavObjectRefersToElement\";\r\n\r\n /** Insert a `NavObject` that optionally points at `targetId` through its (non-FK) `Target` navigation property. */\r\n const insertNavObject = (targetId?: Id64String, parentId?: Id64String): Id64String => {\r\n const id = txn.insertElement({\r\n classFullName: navObjectClass, model: modelId, category: categoryId, code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n ...(targetId ? { target: { id: targetId, relClassName: navRelClass } } : {}),\r\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n } as PhysicalElementProps);\r\n assert.isNotEmpty(id);\r\n txn.saveChanges();\r\n return id;\r\n };\r\n\r\n /** Returns the raw `Target.Id` stored for `navObjectId`, or `undefined` if the column is NULL. */\r\n const queryTargetId = async (navObjectId: Id64String): Promise<Id64String | undefined> => {\r\n const reader = iModelDb.createQueryReader(\"SELECT Target.Id FROM dent.NavObject WHERE ECInstanceId=?\", new QueryBinder().bindId(1, navObjectId), { usePrimaryConn: true });\r\n assert.isTrue(await reader.step(), `NavObject ${navObjectId} must still exist`);\r\n const value = reader.current.toArray()[0];\r\n return value === undefined || value === null ? undefined : value;\r\n };\r\n\r\n it(\"the nav property is not FK-enforced, so the reference alone must not block the delete\", async () => {\r\n const target = insertElement();\r\n const referrer = insertNavObject(target);\r\n assert.equal(await queryTargetId(referrer), target);\r\n\r\n // Sanity check the premise of this test suite: the domain nav property has no SQLite FK behind it.\r\n const fkColumns = iModelDb.withSqliteStatement(\"PRAGMA foreign_key_list(dent_NavObject)\", (stmt) => {\r\n const cols: string[] = [];\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n cols.push(stmt.getValueString(3));\r\n return cols;\r\n });\r\n assert.notInclude(fkColumns, \"TargetId\", \"domain-schema nav props must not be FK-enforced; otherwise this test exercises the wrong code path\");\r\n\r\n const result = txn.deleteElements([target]);\r\n assertResult(result, success, [target], [referrer]);\r\n });\r\n\r\n it(\"nav property on a surviving element is set to NULL when its target is deleted\", async () => {\r\n const target = insertElement();\r\n const referrer = insertNavObject(target);\r\n const unrelatedTarget = insertElement();\r\n const unrelatedReferrer = insertNavObject(unrelatedTarget);\r\n\r\n const result = txn.deleteElements([target]);\r\n assertResult(result, success, [target], [referrer, unrelatedTarget, unrelatedReferrer]);\r\n assert.isUndefined(await queryTargetId(referrer), \"the dangling Target reference must be NULLed, not left pointing at a deleted element\");\r\n assert.equal(await queryTargetId(unrelatedReferrer), unrelatedTarget, \"references to elements outside the delete set must be untouched\");\r\n\r\n // The surviving referrer must still be readable through the element API with the nav prop cleared.\r\n const props = iModelDb.elements.getElementProps<PhysicalElementProps & { target?: { id: Id64String } }>(referrer);\r\n assert.isTrue(props.target === undefined || props.target.id === undefined || !Id64.isValid(props.target.id), `expected cleared nav prop, got ${JSON.stringify(props.target)}`);\r\n });\r\n\r\n it(\"a cached surviving referrer does not keep a stale nav property after its target is deleted\", () => {\r\n const target = insertElement();\r\n const referrer = insertNavObject(target);\r\n const cached = iModelDb.elements.getElementProps<PhysicalElementProps & { target?: { id: Id64String } }>(referrer);\r\n assert.equal(cached.target?.id, target, \"premise: the cached referrer points at the target\");\r\n\r\n assertResult(txn.deleteElements([target]), success, [target], [referrer]);\r\n\r\n const reloaded = iModelDb.elements.getElementProps<PhysicalElementProps & { target?: { id: Id64String } }>(referrer);\r\n assert.isUndefined(reloaded.target?.id, \"referrer must be reloaded, not served stale from the cache\");\r\n });\r\n\r\n it(\"updating a surviving referrer from props read before the delete cannot resurrect the dangling reference\", async () => {\r\n const target = insertElement();\r\n const referrer = insertNavObject(target);\r\n\r\n iModelDb.elements.getElementProps<PhysicalElementProps & { target?: { id: Id64String } }>(referrer);\r\n\r\n const result = txn.deleteElements([target]);\r\n assertResult(result, success, [target], [referrer]);\r\n\r\n const reloaded = iModelDb.elements.getElementProps<PhysicalElementProps & { target?: { id: Id64String } }>(referrer);\r\n reloaded.userLabel = \"edited-after-delete\";\r\n txn.updateElement(reloaded);\r\n txn.saveChanges();\r\n\r\n assert.isUndefined(await queryTargetId(referrer), \"an update from freshly loaded props must not write the deleted target id back\");\r\n assert.equal(iModelDb.elements.getElementProps<PhysicalElementProps & { target?: { id: Id64String } }>(referrer).userLabel, \"edited-after-delete\");\r\n });\r\n\r\n it(\"nav property pointing at a cascaded descendant is NULLed too\", async () => {\r\n const parent = insertElement();\r\n const child = insertElement({ parentId: parent });\r\n const referrer = insertNavObject(child);\r\n\r\n const result = txn.deleteElements([parent]);\r\n assertResult(result, success, [parent, child], [referrer]);\r\n assert.isUndefined(await queryTargetId(referrer), \"a reference to a cascaded child must be NULLed\");\r\n });\r\n\r\n it(\"multiple referrers of the same target are all NULLed\", async () => {\r\n const target = insertElement();\r\n const referrers = [insertNavObject(target), insertNavObject(target), insertNavObject(target)];\r\n\r\n const result = txn.deleteElements([target]);\r\n assertResult(result, success, [target], referrers);\r\n for (const referrer of referrers)\r\n assert.isUndefined(await queryTargetId(referrer));\r\n });\r\n\r\n it(\"referrer inside the delete set is simply deleted along with its target\", async () => {\r\n const target = insertElement();\r\n const referrer = insertNavObject(target);\r\n const childReferrer = insertNavObject(target, target); // child of target, so cascaded into the set\r\n\r\n const result = txn.deleteElements([target, referrer]);\r\n assertResult(result, success, [target, referrer, childReferrer], []);\r\n });\r\n\r\n it(\"NULLing is rolled back when the txn is abandoned\", async () => {\r\n const target = insertElement();\r\n const referrer = insertNavObject(target);\r\n\r\n const result = txn.deleteElements([target]);\r\n assertResult(result, success, [target], [referrer]);\r\n assert.isUndefined(await queryTargetId(referrer));\r\n\r\n txn.abandonChanges();\r\n assertExists(target);\r\n assert.equal(await queryTargetId(referrer), target, \"abandoning the txn must restore the nav property\");\r\n });\r\n });\r\n\r\n describe(\"ElementDrivesElement link table\", () => {\r\n const countDrives = async (): Promise<number> => {\r\n const reader = iModelDb.createQueryReader(\"SELECT COUNT(*) FROM bis.ElementDrivesElement\", undefined, { usePrimaryConn: true });\r\n assert.isTrue(await reader.step());\r\n return reader.current.toArray()[0];\r\n };\r\n\r\n const insertDrives = (sourceId: Id64String, targetId: Id64String): Id64String =>\r\n txn.insertRelationship({ classFullName: ElementDrivesElement.classFullName, sourceId, targetId, status: 0, priority: 0 } as ElementDrivesElementProps);\r\n\r\n it(\"deleting the source removes the row; the target survives\", async () => {\r\n const a = insertElement();\r\n const b = insertElement();\r\n insertDrives(a, b);\r\n txn.saveChanges();\r\n assert.equal(await countDrives(), 1);\r\n\r\n const result = txn.deleteElements([a]);\r\n assertResult(result, success, [a], [b]);\r\n assert.equal(await countDrives(), 0, \"ElementDrivesElement row referencing the deleted source must be removed\");\r\n });\r\n\r\n it(\"deleting the target removes the row; the source survives\", async () => {\r\n const a = insertElement();\r\n const b = insertElement();\r\n insertDrives(a, b);\r\n txn.saveChanges();\r\n assert.equal(await countDrives(), 1);\r\n\r\n const result = txn.deleteElements([b]);\r\n assertResult(result, success, [b], [a]);\r\n assert.equal(await countDrives(), 0, \"ElementDrivesElement row referencing the deleted target must be removed\");\r\n });\r\n });\r\n\r\n describe(\"ElementRefersToElements link table\", () => {\r\n let groupModelId: Id64String;\r\n let groupCounter = 0;\r\n\r\n beforeEach(() => {\r\n const partitionId = txn.insertElement({\r\n classFullName: GroupInformationPartition.classFullName,\r\n model: IModel.repositoryModelId,\r\n parent: new SubjectOwnsPartitionElements(IModel.rootSubjectId),\r\n code: GroupInformationPartition.createCode(iModelDb, IModel.rootSubjectId, `GroupPartition-${++groupCounter}`),\r\n });\r\n groupModelId = txn.insertModel({ classFullName: GroupModel.classFullName, modeledElement: { id: partitionId } });\r\n txn.saveChanges();\r\n });\r\n\r\n const insertGroup = (): Id64String => txn.insertElement({ classFullName: Group.classFullName, model: groupModelId, code: Code.createEmpty() });\r\n\r\n const countMemberships = async (groupId: Id64String): Promise<number> => {\r\n const reader = iModelDb.createQueryReader(\"SELECT COUNT(*) FROM bis.ElementGroupsMembers WHERE SourceECInstanceId=?\", new QueryBinder().bindId(1, groupId), { usePrimaryConn: true });\r\n assert.isTrue(await reader.step());\r\n return reader.current.toArray()[0];\r\n };\r\n\r\n it(\"deleting a member removes only its membership row; the group and other members survive\", async () => {\r\n const group = insertGroup();\r\n const member1 = insertElement();\r\n const member2 = insertElement();\r\n const rel1 = txn.insertRelationship(ElementGroupsMembers.create(iModelDb, group, member1, 0).toJSON());\r\n const rel2 = txn.insertRelationship(ElementGroupsMembers.create(iModelDb, group, member2, 1).toJSON());\r\n txn.saveChanges();\r\n assert.equal(await countMemberships(group), 2);\r\n\r\n const result = txn.deleteElements([member1]);\r\n assertResult(result, success, [member1], [group, member2]);\r\n assert.equal(await countMemberships(group), 1);\r\n assert.isUndefined(iModelDb.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, rel1));\r\n assert.isDefined(iModelDb.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, rel2));\r\n });\r\n\r\n it(\"deleting the group removes all of its membership rows; the members survive\", async () => {\r\n const group = insertGroup();\r\n const member1 = insertElement();\r\n const member2 = insertElement();\r\n txn.insertRelationship(ElementGroupsMembers.create(iModelDb, group, member1, 0).toJSON());\r\n txn.insertRelationship(ElementGroupsMembers.create(iModelDb, group, member2, 1).toJSON());\r\n txn.saveChanges();\r\n\r\n const result = txn.deleteElements([group]);\r\n assertResult(result, success, [group], [member1, member2]);\r\n assert.equal(await countMemberships(group), 0);\r\n });\r\n\r\n it(\"deleting a parent whose cascaded child is a group member removes the membership row\", () => {\r\n const group = insertGroup();\r\n const parent = insertElement();\r\n const child = insertElement({ parentId: parent });\r\n const rel = txn.insertRelationship(ElementGroupsMembers.create(iModelDb, group, child, 0).toJSON());\r\n txn.saveChanges();\r\n\r\n const result = txn.deleteElements([parent]);\r\n assertResult(result, success, [parent, child], [group]);\r\n assert.isUndefined(iModelDb.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, rel));\r\n });\r\n });\r\n\r\n describe(\"ModelSelectorRefersToModels link table\", () => {\r\n let selectorCounter = 0;\r\n\r\n /** Insert a partition + PhysicalModel and return the partition id (which doubles as the model id). */\r\n const insertPhysicalModel = (name: string): Id64String => {\r\n const id = PhysicalModel.insert(txn, IModel.rootSubjectId, name);\r\n txn.saveChanges();\r\n return id;\r\n };\r\n\r\n const insertModelSelector = (models: Id64Array): Id64String => {\r\n const id = ModelSelector.insert(txn, IModel.dictionaryId, `Selector-${++selectorCounter}`, models);\r\n txn.saveChanges();\r\n return id;\r\n };\r\n\r\n /** Count link-table rows, optionally restricted to a given selector (source) or model (target). */\r\n const countRows = async (filter: { sourceId?: Id64String, targetId?: Id64String } = {}): Promise<number> => {\r\n const clauses: string[] = [];\r\n const binder = new QueryBinder();\r\n let idx = 1;\r\n if (filter.sourceId) {\r\n clauses.push(`SourceECInstanceId=?`);\r\n binder.bindId(idx++, filter.sourceId);\r\n }\r\n if (filter.targetId) {\r\n clauses.push(`TargetECInstanceId=?`);\r\n binder.bindId(idx++, filter.targetId);\r\n }\r\n const where = clauses.length > 0 ? ` WHERE ${clauses.join(\" AND \")}` : \"\";\r\n const reader = iModelDb.createQueryReader(`SELECT COUNT(*) FROM bis.ModelSelectorRefersToModels${where}`, binder, { usePrimaryConn: true });\r\n assert.isTrue(await reader.step());\r\n return reader.current.toArray()[0];\r\n };\r\n\r\n /** Rows whose source (ModelSelector) or target (modeled element) no longer exists in bis.Element. */\r\n const countDanglingRows = async (): Promise<number> => {\r\n const reader = iModelDb.createQueryReader(\r\n `SELECT COUNT(*) FROM bis.ModelSelectorRefersToModels r\r\n WHERE NOT EXISTS (SELECT 1 FROM bis.Element e WHERE e.ECInstanceId = r.SourceECInstanceId)\r\n OR NOT EXISTS (SELECT 1 FROM bis.Element e WHERE e.ECInstanceId = r.TargetECInstanceId)`,\r\n undefined, { usePrimaryConn: true });\r\n assert.isTrue(await reader.step());\r\n return reader.current.toArray()[0];\r\n };\r\n\r\n it(\"deleting a referenced model (target) removes only its rows; the selector and other models survive\", async () => {\r\n const modelA = insertPhysicalModel(\"MsTargetA\");\r\n const modelB = insertPhysicalModel(\"MsTargetB\");\r\n const selector = insertModelSelector([modelA, modelB]);\r\n assert.equal(await countRows({ sourceId: selector }), 2);\r\n\r\n const result = txn.deleteElements([modelA]);\r\n assertResult(result, success, [modelA], [modelB, selector]);\r\n assert.equal(await countRows({ targetId: modelA }), 0, \"rows targeting the deleted model must be removed\");\r\n assert.equal(await countRows({ sourceId: selector, targetId: modelB }), 1, \"rows targeting a surviving model must be untouched\");\r\n assert.equal(await countDanglingRows(), 0);\r\n });\r\n\r\n it(\"deleting the ModelSelector itself (source) removes all of its rows; the referenced models survive\", async () => {\r\n // Regression: cleanup used to only match on TargetId, so deleting the selector left its rows dangling on the source side.\r\n const modelA = insertPhysicalModel(\"MsSourceA\");\r\n const modelB = insertPhysicalModel(\"MsSourceB\");\r\n const selector = insertModelSelector([modelA, modelB]);\r\n assert.equal(await countRows({ sourceId: selector }), 2);\r\n\r\n const result = txn.deleteElements([selector]);\r\n assertResult(result, success, [selector], [modelA, modelB]);\r\n assert.equal(await countRows({ sourceId: selector }), 0, \"rows sourced from the deleted ModelSelector must be removed\");\r\n assert.equal(await countDanglingRows(), 0, \"no ModelSelectorRefersToModels row may reference a deleted element\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n it(\"deleting one selector leaves another selector's rows for the same models untouched\", async () => {\r\n const modelA = insertPhysicalModel(\"MsSharedA\");\r\n const selector1 = insertModelSelector([modelA]);\r\n const selector2 = insertModelSelector([modelA]);\r\n assert.equal(await countRows({ targetId: modelA }), 2);\r\n\r\n const result = txn.deleteElements([selector1]);\r\n assertResult(result, success, [selector1], [selector2, modelA]);\r\n assert.equal(await countRows({ sourceId: selector1 }), 0);\r\n assert.equal(await countRows({ sourceId: selector2, targetId: modelA }), 1, \"the surviving selector's row must be untouched\");\r\n assert.equal(await countDanglingRows(), 0);\r\n });\r\n\r\n it(\"deleting both a selector and one of its models in the same call removes every affected row\", async () => {\r\n const modelA = insertPhysicalModel(\"MsBothA\");\r\n const modelB = insertPhysicalModel(\"MsBothB\");\r\n const selector = insertModelSelector([modelA, modelB]);\r\n const otherSelector = insertModelSelector([modelB]);\r\n assert.equal(await countRows(), 3);\r\n\r\n const result = txn.deleteElements([selector, modelA]);\r\n assertResult(result, success, [selector, modelA], [modelB, otherSelector]);\r\n assert.equal(await countRows({ sourceId: selector }), 0);\r\n assert.equal(await countRows({ targetId: modelA }), 0);\r\n assert.equal(await countRows({ sourceId: otherSelector, targetId: modelB }), 1);\r\n assert.equal(await countDanglingRows(), 0);\r\n });\r\n\r\n it(\"link-table cleanup is rolled back when the txn is abandoned\", async () => {\r\n const modelA = insertPhysicalModel(\"MsUndoA\");\r\n const selector = insertModelSelector([modelA]);\r\n assert.equal(await countRows({ sourceId: selector }), 1);\r\n\r\n const result = txn.deleteElements([selector]);\r\n assertResult(result, success, [selector], [modelA]);\r\n assert.equal(await countRows({ sourceId: selector }), 0);\r\n\r\n txn.abandonChanges();\r\n assertExists(selector);\r\n assert.equal(await countRows({ sourceId: selector, targetId: modelA }), 1, \"abandoning the txn must restore the link-table row\");\r\n assert.isTrue((iModelDb.elements.getElement<ModelSelector>(selector)).models.includes(modelA));\r\n });\r\n });\r\n });\r\n\r\n describe(\"rejection with hierarchy\", () => {\r\n it(\"reports the cascaded child violator (not the requested ancestor) and deletes nothing\", () => {\r\n const rootA = insertElement();\r\n const childA = insertElement({ parentId: rootA });\r\n const external = insertElement({ codeScope: childA, codeValue: \"ext\" });\r\n const unrelated = insertElement();\r\n\r\n expectRejected(\"violator is a cascaded child\", [rootA, unrelated], [rootA, childA, external, unrelated],\r\n new Set([childA]), codeScopeViolator(childA));\r\n });\r\n\r\n it(\"sub-model partition rejected by an element inside its sub-model\", () => {\r\n const partitionId = PhysicalModel.insert(txn, IModel.rootSubjectId, \"RejectedPartition\");\r\n const inner = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: partitionId,\r\n category: categoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n txn.saveChanges();\r\n const external = insertElement({ codeScope: inner, codeValue: \"ext\" });\r\n\r\n expectRejected(\"violator is inside the sub-model\", [partitionId], [partitionId, inner, external],\r\n new Set([inner]), codeScopeViolator(inner));\r\n assert.isDefined(iModelDb.models.tryGetModelProps(partitionId), \"sub-model must survive a rejection\");\r\n });\r\n });\r\n\r\n describe(\"undo / redo (StandaloneDb)\", () => {\r\n let sdb: StandaloneDb;\r\n let sModelId: Id64String;\r\n let sCategoryId: Id64String;\r\n\r\n before(() => {\r\n sdb = StandaloneDb.createEmpty(IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"UndoRedo.bim\"), {\r\n rootSubject: { name: \"DeleteElementsUndo\" },\r\n enableTransactions: true,\r\n });\r\n sdb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n withEditTxn(sdb, \"setup\", (t) => {\r\n sModelId = PhysicalModel.insert(t, IModel.rootSubjectId, \"UndoModel\");\r\n sCategoryId = SpatialCategory.insert(t, IModel.dictionaryId, \"UndoCategory\", new SubCategoryAppearance());\r\n });\r\n });\r\n\r\n after(() => {\r\n if (sdb?.isOpen)\r\n sdb.close();\r\n });\r\n\r\n const insertInStandalone = (t: EditTxn, parentId?: Id64String): Id64String => t.insertElement({\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: sModelId,\r\n category: sCategoryId,\r\n code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\r\n } as PhysicalElementProps);\r\n\r\n it(\"a bulk delete is recorded as a single undoable txn and can be reversed and reinstated\", () => {\r\n const { parent, child, partition, inner, survivor } = withEditTxn(sdb, \"insert\", (t) => {\r\n const p = insertInStandalone(t);\r\n const c = insertInStandalone(t, p);\r\n const part = PhysicalModel.insert(t, IModel.rootSubjectId, \"UndoPartition\");\r\n const i = t.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: part, category: sCategoryId, code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n return { parent: p, child: c, partition: part, inner: i, survivor: insertInStandalone(t) };\r\n });\r\n\r\n withEditTxn(sdb, \"bulk delete\", (t) => {\r\n const result = t.deleteElements([parent, partition]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\r\n assert.isEmpty(result.failures);\r\n });\r\n assertNoFkViolations(sdb);\r\n for (const id of [parent, child, partition, inner])\r\n assert.isUndefined(sdb.elements.tryGetElement(id));\r\n assert.isUndefined(sdb.models.tryGetModelProps(partition));\r\n assert.isDefined(sdb.elements.tryGetElement(survivor));\r\n\r\n // Undo: everything the bulk delete removed (requested, cascaded children, sub-model + contents) comes back in one step.\r\n assert.isTrue(sdb.txns.isUndoPossible);\r\n assert.equal(sdb.txns.reverseSingleTxn(), IModelStatus.Success);\r\n for (const id of [parent, child, partition, inner, survivor])\r\n assert.isDefined(sdb.elements.tryGetElement(id), `${id} must be restored by undo`);\r\n assert.isDefined(sdb.models.tryGetModelProps(partition), \"sub-model must be restored by undo\");\r\n assertNoFkViolations(sdb);\r\n\r\n // Redo: deleted again.\r\n assert.isTrue(sdb.txns.isRedoPossible);\r\n assert.equal(sdb.txns.reinstateTxn(), IModelStatus.Success);\r\n for (const id of [parent, child, partition, inner])\r\n assert.isUndefined(sdb.elements.tryGetElement(id), `${id} must be deleted again by redo`);\r\n assert.isUndefined(sdb.models.tryGetModelProps(partition));\r\n assert.isDefined(sdb.elements.tryGetElement(survivor));\r\n assertNoFkViolations(sdb);\r\n });\r\n\r\n it(\"a rejected (ConstraintViolation) delete records nothing to undo\", () => {\r\n const { rootA, external, rootB } = withEditTxn(sdb, \"insert\", (t) => {\r\n const a = insertInStandalone(t);\r\n const specId = sdb.codeSpecs.insert(t, \"UndoScopeSpec\", CodeScopeSpec.Type.RelatedElement);\r\n const ext = t.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: sModelId, category: sCategoryId,\r\n code: { spec: specId, scope: a, value: \"ext\" },\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n return { rootA: a, external: ext, rootB: insertInStandalone(t) };\r\n });\r\n\r\n withEditTxn(sdb, \"rejected delete\", (t) => {\r\n const result = t.deleteElements([rootA, rootB]);\r\n assert.equal(result.status, BulkDeleteElementsStatus.ConstraintViolation);\r\n assert.isFalse(sdb[_nativeDb].hasUnsavedChanges(), \"a rejected delete must not dirty the txn\");\r\n });\r\n for (const id of [rootA, external, rootB])\r\n assert.isDefined(sdb.elements.tryGetElement(id));\r\n assertNoFkViolations(sdb);\r\n\r\n // The only undoable txn is the insert above; undoing it must remove all three, proving the rejected delete left no txn behind.\r\n assert.isTrue(sdb.txns.isUndoPossible);\r\n assert.equal(sdb.txns.reverseSingleTxn(), IModelStatus.Success);\r\n for (const id of [rootA, external, rootB])\r\n assert.isUndefined(sdb.elements.tryGetElement(id), `${id} must be removed by undoing the insert txn`);\r\n\r\n assert.equal(sdb.txns.reinstateTxn(), IModelStatus.Success);\r\n for (const id of [rootA, external, rootB])\r\n assert.isDefined(sdb.elements.tryGetElement(id));\r\n });\r\n });\r\n\r\n describe(\"robustness / negative path tests\", () => {\r\n it(\"deleting the root Subject does not delete anything\", () => {\r\n // The root Subject is the modeled element of the RepositoryModel, which in turn contains the root Subject: a cycle in\r\n // the expansion graph. The call must terminate; it must never remove the root of the iModel.\r\n const sentinel = insertElement();\r\n const result = txn.deleteElements([IModel.rootSubjectId]);\r\n assert.notEqual(result.status, BulkDeleteElementsStatus.Success, \"root Subject must not be deletable\");\r\n assert.notEqual(result.status, BulkDeleteElementsStatus.DeletionFailed, \"root Subject delete must be rejected by validation, not by a SQLite error\");\r\n assertExists(IModel.rootSubjectId, \"root Subject must survive\");\r\n assert.isDefined(iModelDb.models.tryGetModelProps(IModel.repositoryModelId), \"RepositoryModel must survive\");\r\n assert.isDefined(iModelDb.models.tryGetModelProps(IModel.dictionaryId), \"DictionaryModel must survive\");\r\n assertExists(modelId, \"seed partition must survive\");\r\n assertExists(categoryId, \"seed category must survive\");\r\n assertExists(sentinel, \"unrelated element must survive\");\r\n assertNoFkViolations(iModelDb);\r\n });\r\n\r\n it(\"plain element, parent tree, partition, in-use category and unused material in one call\", () => {\r\n const plainElem = insertElement();\r\n const parent = insertElement();\r\n const child1 = insertElement({ parentId: parent });\r\n const child2 = insertElement({ parentId: parent });\r\n const partition = PhysicalModel.insert(txn, IModel.rootSubjectId, \"TestPartition\");\r\n const inner = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: partition, category: categoryId, code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n const violatorCat = SpatialCategory.insert(txn, IModel.dictionaryId, \"TestCategory2\", new SubCategoryAppearance());\r\n const violatorSub = IModel.getDefaultSubCategoryId(violatorCat);\r\n const externalUser = txn.insertElement({\r\n classFullName: \"Generic:PhysicalObject\", model: modelId, category: violatorCat, code: Code.createEmpty(),\r\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\r\n } as PhysicalElementProps);\r\n const unusedMat = RenderMaterialElement.insert(txn, IModel.dictionaryId, \"TestMaterial\", { paletteName: \"p\" });\r\n txn.saveChanges();\r\n\r\n // One in-use category rejects the whole call: the plain element, the tree, the partition and the unused material all survive.\r\n expectRejected(\"test rejection with FK violators\",\r\n [plainElem, parent, partition, violatorCat, unusedMat],\r\n [plainElem, parent, child1, child2, partition, inner, unusedMat, violatorCat, violatorSub, externalUser],\r\n new Set([violatorCat]), categoryInUse3d(violatorCat));\r\n assert.isDefined(iModelDb.models.tryGetModelProps(partition), \"partition sub-model must be untouched\");\r\n\r\n // Without the violator everything else goes in one call.\r\n executeTestCase(\"success without violators\",\r\n [plainElem, parent, partition, unusedMat],\r\n [plainElem, parent, child1, child2, partition, inner, unusedMat],\r\n [violatorCat, violatorSub, externalUser]);\r\n });\r\n });\r\n});"]}