@itwin/core-backend 5.3.0-dev.8 → 5.4.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +14 -0
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +11 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.d.ts.map +1 -1
- package/lib/cjs/DisplayStyle.js +4 -4
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/Element.d.ts +2 -2
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +2 -2
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +15 -3
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +42 -5
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js +2 -2
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +1 -2
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +9 -17
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/Material.d.ts +1 -1
- package/lib/cjs/Material.d.ts.map +1 -1
- package/lib/cjs/Material.js +2 -2
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +5 -0
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +7 -0
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/TileStorage.d.ts +1 -1
- package/lib/cjs/TileStorage.d.ts.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +8 -0
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +30 -2
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +1 -1
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js +2 -2
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +4 -4
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +5 -4
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +26 -11
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.d.ts.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js +2 -0
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +14 -0
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +11 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.d.ts.map +1 -1
- package/lib/esm/DisplayStyle.js +4 -4
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/Element.d.ts +2 -2
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +2 -2
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +15 -3
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +42 -5
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/esm/IModelElementCloneContext.js +2 -2
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +1 -2
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +10 -18
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/Material.d.ts +1 -1
- package/lib/esm/Material.d.ts.map +1 -1
- package/lib/esm/Material.js +2 -2
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Relationship.d.ts +5 -0
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +7 -0
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/TileStorage.d.ts +1 -1
- package/lib/esm/TileStorage.d.ts.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +8 -0
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +30 -2
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +1 -1
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js +2 -2
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +4 -4
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +5 -4
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +26 -11
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.d.ts.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js +2 -0
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.d.ts +93 -0
- package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -0
- package/lib/esm/test/ElementDrivesElement.test.js +862 -0
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -0
- package/lib/esm/test/ElementLRUCache.test.js +19 -0
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js +17 -11
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +44 -0
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +71 -25
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +2 -2
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +33 -2
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +169 -2
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.d.ts +2 -0
- package/lib/esm/test/imodel/Code.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/Code.test.js +272 -0
- package/lib/esm/test/imodel/Code.test.js.map +1 -0
- package/lib/esm/test/imodel/IModel.test.js +144 -1
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +64 -55
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js +6 -6
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js +75 -6
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js +4 -4
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +33 -5
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +16 -18
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { assert, expect } from "chai";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { Code } from "@itwin/core-common";
|
|
4
|
+
import { IModelTestUtils } from "../IModelTestUtils";
|
|
5
|
+
import { KnownTestLocations } from "../KnownTestLocations";
|
|
6
|
+
import { Id64 } from "@itwin/core-bentley";
|
|
7
|
+
describe("Code insertion tests", () => {
|
|
8
|
+
let imodel;
|
|
9
|
+
before(async () => {
|
|
10
|
+
IModelTestUtils.registerTestBimSchema();
|
|
11
|
+
const seedFile = IModelTestUtils.resolveAssetFile("test.bim");
|
|
12
|
+
const snapshotFile = IModelTestUtils.prepareOutputFile("IModel", "test.bim");
|
|
13
|
+
imodel = IModelTestUtils.createSnapshotFromSeed(snapshotFile, seedFile);
|
|
14
|
+
const schemaPathname = path.join(KnownTestLocations.assetsDir, "TestBim.ecschema.xml");
|
|
15
|
+
await imodel.importSchemas([schemaPathname]);
|
|
16
|
+
imodel.saveChanges();
|
|
17
|
+
});
|
|
18
|
+
after(() => {
|
|
19
|
+
imodel.close();
|
|
20
|
+
});
|
|
21
|
+
it("should query an element by code", () => {
|
|
22
|
+
assert.exists(imodel.elements);
|
|
23
|
+
const code = new Code({ scope: "0x11", spec: "0x10", value: "RF1.dgn" });
|
|
24
|
+
const elementId = imodel.elements.queryElementIdByCode(code);
|
|
25
|
+
assert.exists(elementId);
|
|
26
|
+
assert.equal(elementId, "0x1e");
|
|
27
|
+
});
|
|
28
|
+
it("should get undefined when querying an element with a bad code value", () => {
|
|
29
|
+
assert.exists(imodel.elements);
|
|
30
|
+
const badCode = new Code({ scope: "0x11", spec: "0x10", value: "RF1_does_not_exist.dgn" });
|
|
31
|
+
const elementId = imodel.elements.queryElementIdByCode(badCode);
|
|
32
|
+
assert.isUndefined(elementId);
|
|
33
|
+
});
|
|
34
|
+
it("should get undefined when querying an element with an empty code", () => {
|
|
35
|
+
assert.exists(imodel.elements);
|
|
36
|
+
const emptyCode = Code.createEmpty();
|
|
37
|
+
const elementId = imodel.elements.queryElementIdByCode(emptyCode);
|
|
38
|
+
assert.isUndefined(elementId);
|
|
39
|
+
});
|
|
40
|
+
it("should throw when querying an element with a NULL code value", () => {
|
|
41
|
+
assert.exists(imodel.elements);
|
|
42
|
+
expect(() => imodel.elements.queryElementIdByCode({
|
|
43
|
+
scope: "0x11", spec: "0x10",
|
|
44
|
+
value: undefined
|
|
45
|
+
})).to.throw("Invalid Code");
|
|
46
|
+
});
|
|
47
|
+
it("should throw when querying an element with an empty code spec", () => {
|
|
48
|
+
assert.exists(imodel.elements);
|
|
49
|
+
const noSpecCode = new Code({ scope: "0x11", spec: "", value: "RF1.dgn" });
|
|
50
|
+
expect(() => imodel.elements.queryElementIdByCode(noSpecCode)).to.throw("Invalid CodeSpec");
|
|
51
|
+
});
|
|
52
|
+
it("should throw when querying an element with a bad code spec", () => {
|
|
53
|
+
assert.exists(imodel.elements);
|
|
54
|
+
const badSpecCode = new Code({ scope: "0x11", spec: "not a real id", value: "RF1.dgn" });
|
|
55
|
+
expect(() => imodel.elements.queryElementIdByCode(badSpecCode)).to.throw("Invalid CodeSpec");
|
|
56
|
+
});
|
|
57
|
+
it("should get undefined when querying for an element id with no scope", () => {
|
|
58
|
+
assert.exists(imodel.elements);
|
|
59
|
+
const noScopeCode = new Code({ scope: "", spec: "0x10", value: "RF1.dgn" });
|
|
60
|
+
const elementId = imodel.elements.queryElementIdByCode(noScopeCode);
|
|
61
|
+
assert.isUndefined(elementId);
|
|
62
|
+
});
|
|
63
|
+
it("should get undefined when querying for an element id with a bad scope", () => {
|
|
64
|
+
assert.exists(imodel.elements);
|
|
65
|
+
const badScopeCode = new Code({ scope: "not a real id", spec: "0x10", value: "RF1.dgn" });
|
|
66
|
+
const elementId = imodel.elements.queryElementIdByCode(badScopeCode);
|
|
67
|
+
assert.isUndefined(elementId);
|
|
68
|
+
});
|
|
69
|
+
it("should insert an element with valid Code", () => {
|
|
70
|
+
assert.exists(imodel.elements);
|
|
71
|
+
const elProps = {
|
|
72
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
73
|
+
code: { scope: "0x1", spec: "0x10", value: "new code" },
|
|
74
|
+
id: '0x1e',
|
|
75
|
+
model: '0x11',
|
|
76
|
+
userLabel: 'RF1.dgn',
|
|
77
|
+
federationGuid: undefined,
|
|
78
|
+
};
|
|
79
|
+
const id = imodel.elements.insertElement(elProps);
|
|
80
|
+
assert.exists(id);
|
|
81
|
+
assert.isTrue(Id64.isValidId64(id));
|
|
82
|
+
});
|
|
83
|
+
it("should fail to insert an element with invalid Code scope", () => {
|
|
84
|
+
assert.exists(imodel.elements);
|
|
85
|
+
const elProps = {
|
|
86
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
87
|
+
code: { scope: "bad scope", spec: "0x10", value: "new code" }, // invalid scope value
|
|
88
|
+
id: '0x1e',
|
|
89
|
+
model: '0x11',
|
|
90
|
+
userLabel: 'RF1.dgn',
|
|
91
|
+
federationGuid: undefined,
|
|
92
|
+
};
|
|
93
|
+
expect(() => imodel.elements.insertElement(elProps)).throws("invalid code scope").to.have.property("metadata");
|
|
94
|
+
elProps.code.scope = "0x34322"; // valid id, but element doesn't exist
|
|
95
|
+
expect(() => imodel.elements.insertElement(elProps)).throws("invalid code scope").to.have.property("metadata");
|
|
96
|
+
elProps.code.scope = undefined; // nothing
|
|
97
|
+
expect(() => imodel.elements.insertElement(elProps)).throws("invalid code scope").to.have.property("metadata");
|
|
98
|
+
});
|
|
99
|
+
it("should fail to insert an element with invalid Code spec", () => {
|
|
100
|
+
assert.exists(imodel.elements);
|
|
101
|
+
const elProps = {
|
|
102
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
103
|
+
code: { scope: "0x1", spec: "0x34322", value: "new code" }, // valid id, but element doesn't exist
|
|
104
|
+
id: '0x1e',
|
|
105
|
+
model: '0x11',
|
|
106
|
+
userLabel: 'RF1.dgn',
|
|
107
|
+
federationGuid: undefined,
|
|
108
|
+
};
|
|
109
|
+
expect(() => imodel.elements.insertElement(elProps)).throws("Error inserting element").to.have.property("metadata");
|
|
110
|
+
// TODO: Non-ID values currently do not throw an error. This should be caught in TS
|
|
111
|
+
// elProps.code.spec = "not a spec in the model"; // not an id
|
|
112
|
+
// expect(() => imodel.elements.insertElement(elProps)).throws("Error inserting element").to.have.property("metadata");
|
|
113
|
+
// elProps.code.spec = undefined as any; // nothing
|
|
114
|
+
// expect(() => imodel.elements.insertElement(elProps)).throws("Error inserting element").to.have.property("metadata");
|
|
115
|
+
});
|
|
116
|
+
it("should fail to insert an element with a duplicate valid code", () => {
|
|
117
|
+
assert.exists(imodel.elements);
|
|
118
|
+
const elProps = {
|
|
119
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
120
|
+
code: { scope: "0x1", spec: "0x10", value: "new code duplicate test" },
|
|
121
|
+
id: '0x1e',
|
|
122
|
+
model: '0x11',
|
|
123
|
+
userLabel: 'RF1.dgn',
|
|
124
|
+
federationGuid: undefined,
|
|
125
|
+
};
|
|
126
|
+
const id = imodel.elements.insertElement(elProps);
|
|
127
|
+
assert.exists(id);
|
|
128
|
+
assert.isTrue(Id64.isValidId64(id));
|
|
129
|
+
const elProps2 = {
|
|
130
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
131
|
+
code: { scope: "0x1", spec: "0x10", value: "new code duplicate test" },
|
|
132
|
+
id: '0x1e',
|
|
133
|
+
model: '0x11',
|
|
134
|
+
userLabel: 'RF1.dgn',
|
|
135
|
+
federationGuid: undefined,
|
|
136
|
+
};
|
|
137
|
+
expect(() => imodel.elements.insertElement(elProps2)).throws("Error inserting element").to.have.property("metadata");
|
|
138
|
+
});
|
|
139
|
+
it("should update an element code to a valid code", () => {
|
|
140
|
+
assert.exists(imodel.elements);
|
|
141
|
+
const elProps = {
|
|
142
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
143
|
+
code: { scope: "0x1", spec: "0x10", value: "newcode update" },
|
|
144
|
+
id: '0x1e',
|
|
145
|
+
model: '0x11',
|
|
146
|
+
userLabel: 'RF1.dgn',
|
|
147
|
+
federationGuid: undefined,
|
|
148
|
+
};
|
|
149
|
+
const elementId = imodel.elements.insertElement(elProps);
|
|
150
|
+
const element = imodel.elements.getElement(elementId);
|
|
151
|
+
assert.equal(element.code.value, elProps.code.value);
|
|
152
|
+
assert.equal(element.code.spec, elProps.code.spec);
|
|
153
|
+
assert.equal(element.code.scope, elProps.code.scope);
|
|
154
|
+
let newCode = new Code({ scope: "0x1", spec: "0x10", value: "UpdatedValue.dgn2" });
|
|
155
|
+
element.code = newCode;
|
|
156
|
+
element.update();
|
|
157
|
+
const updatedElement = imodel.elements.getElement(elementId);
|
|
158
|
+
assert.equal(updatedElement.code.value, newCode.value);
|
|
159
|
+
assert.equal(updatedElement.code.spec, newCode.spec);
|
|
160
|
+
assert.equal(updatedElement.code.scope, newCode.scope);
|
|
161
|
+
newCode = new Code({ scope: "0x12", spec: "0x11", value: "UpdatedValue.dgn2" });
|
|
162
|
+
element.code = newCode;
|
|
163
|
+
element.update();
|
|
164
|
+
const updatedElement2 = imodel.elements.getElement(elementId);
|
|
165
|
+
assert.equal(updatedElement2.code.value, newCode.value);
|
|
166
|
+
assert.equal(updatedElement2.code.spec, newCode.spec);
|
|
167
|
+
assert.equal(updatedElement2.code.scope, newCode.scope);
|
|
168
|
+
});
|
|
169
|
+
it("should fail to update an element code to a duplicate valid code", () => {
|
|
170
|
+
assert.exists(imodel.elements);
|
|
171
|
+
const elProps = {
|
|
172
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
173
|
+
code: { scope: "0x1", spec: "0x10", value: "newcode3" },
|
|
174
|
+
id: '0x1e',
|
|
175
|
+
model: '0x11',
|
|
176
|
+
userLabel: 'RF1.dgn',
|
|
177
|
+
federationGuid: undefined,
|
|
178
|
+
};
|
|
179
|
+
const elementId = imodel.elements.insertElement(elProps);
|
|
180
|
+
const element = imodel.elements.getElement(elementId);
|
|
181
|
+
assert.equal(element.code.value, elProps.code.value);
|
|
182
|
+
assert.equal(element.code.spec, elProps.code.spec);
|
|
183
|
+
assert.equal(element.code.scope, elProps.code.scope);
|
|
184
|
+
const elProps2 = {
|
|
185
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
186
|
+
code: { scope: "0x1", spec: "0x10", value: "newcode32" },
|
|
187
|
+
id: '0x1e',
|
|
188
|
+
model: '0x11',
|
|
189
|
+
userLabel: 'RF1.dgn',
|
|
190
|
+
federationGuid: undefined,
|
|
191
|
+
};
|
|
192
|
+
const elementId2 = imodel.elements.insertElement(elProps2);
|
|
193
|
+
const element2 = imodel.elements.getElement(elementId2);
|
|
194
|
+
assert.equal(element2.code.value, elProps2.code.value);
|
|
195
|
+
assert.equal(element2.code.spec, elProps2.code.spec);
|
|
196
|
+
assert.equal(element2.code.scope, elProps2.code.scope);
|
|
197
|
+
element.code = element2.code;
|
|
198
|
+
expect(() => element.update()).to.throw("Error updating element").to.have.property("metadata");
|
|
199
|
+
});
|
|
200
|
+
it("should fail to update an element code with an invalid code value", () => {
|
|
201
|
+
assert.exists(imodel.elements);
|
|
202
|
+
const elProps = {
|
|
203
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
204
|
+
code: { scope: "0x1", spec: "0x10", value: "newcode4" },
|
|
205
|
+
id: '0x1e',
|
|
206
|
+
model: '0x11',
|
|
207
|
+
userLabel: 'RF1.dgn',
|
|
208
|
+
federationGuid: undefined,
|
|
209
|
+
};
|
|
210
|
+
const elementId = imodel.elements.insertElement(elProps);
|
|
211
|
+
const element = imodel.elements.getElement(elementId);
|
|
212
|
+
assert.equal(element.code.value, elProps.code.value);
|
|
213
|
+
assert.equal(element.code.spec, elProps.code.spec);
|
|
214
|
+
assert.equal(element.code.scope, elProps.code.scope);
|
|
215
|
+
let newCode = new Code({ scope: "0x1", spec: "0x10", value: "" }); // empty value
|
|
216
|
+
element.code = newCode;
|
|
217
|
+
element.update();
|
|
218
|
+
const updatedElement = imodel.elements.getElement(elementId);
|
|
219
|
+
assert.equal(updatedElement.code.value, newCode.value);
|
|
220
|
+
assert.equal(updatedElement.code.spec, newCode.spec);
|
|
221
|
+
assert.equal(updatedElement.code.scope, newCode.scope);
|
|
222
|
+
newCode = new Code({ scope: "0x1", spec: "0x10", value: "validcodeagain" }); // reset the code
|
|
223
|
+
element.code = newCode;
|
|
224
|
+
element.update();
|
|
225
|
+
newCode = new Code({ scope: "0x1", spec: "0x11" }); // NULL value
|
|
226
|
+
newCode.value = undefined;
|
|
227
|
+
element.code = newCode;
|
|
228
|
+
element.update();
|
|
229
|
+
const updatedElement2 = imodel.elements.getElement(elementId);
|
|
230
|
+
assert.equal(updatedElement2.code.value, "");
|
|
231
|
+
assert.equal(updatedElement2.code.spec, newCode.spec);
|
|
232
|
+
assert.equal(updatedElement2.code.scope, newCode.scope);
|
|
233
|
+
newCode = Code.createEmpty(); // Empty Code
|
|
234
|
+
element.code = newCode;
|
|
235
|
+
element.update();
|
|
236
|
+
const updatedElement3 = imodel.elements.getElement(elementId);
|
|
237
|
+
assert.equal(updatedElement3.code.value, newCode.value);
|
|
238
|
+
assert.equal(updatedElement3.code.spec, newCode.spec);
|
|
239
|
+
assert.equal(updatedElement3.code.scope, newCode.scope);
|
|
240
|
+
});
|
|
241
|
+
it("should fail to update an element code with an invalid code scope", () => {
|
|
242
|
+
assert.exists(imodel.elements);
|
|
243
|
+
const elProps = {
|
|
244
|
+
classFullName: 'BisCore:RepositoryLink',
|
|
245
|
+
code: { scope: "0x1", spec: "0x10", value: "newcode5" },
|
|
246
|
+
id: '0x1e',
|
|
247
|
+
model: '0x11',
|
|
248
|
+
userLabel: 'RF1.dgn',
|
|
249
|
+
federationGuid: undefined,
|
|
250
|
+
};
|
|
251
|
+
const elementId = imodel.elements.insertElement(elProps);
|
|
252
|
+
const element = imodel.elements.getElement(elementId);
|
|
253
|
+
assert.equal(element.code.value, elProps.code.value);
|
|
254
|
+
assert.equal(element.code.spec, elProps.code.spec);
|
|
255
|
+
assert.equal(element.code.scope, elProps.code.scope);
|
|
256
|
+
let newCode = new Code({ scope: "", spec: "0x10", value: "newcode5" }); // empty scope
|
|
257
|
+
element.code = newCode;
|
|
258
|
+
expect(() => element.update()).to.throw("Error updating element").to.have.property("metadata");
|
|
259
|
+
const updatedElement = imodel.elements.getElement(elementId);
|
|
260
|
+
assert.equal(updatedElement.code.value, elProps.code.value);
|
|
261
|
+
assert.equal(updatedElement.code.spec, elProps.code.spec);
|
|
262
|
+
assert.equal(updatedElement.code.scope, elProps.code.scope);
|
|
263
|
+
newCode = new Code({ scope: "not a real id", spec: "0x10", value: "newcode5" }); // bad id
|
|
264
|
+
element.code = newCode;
|
|
265
|
+
expect(() => element.update()).to.throw("Error updating element").to.have.property("metadata");
|
|
266
|
+
const updatedElement2 = imodel.elements.getElement(elementId);
|
|
267
|
+
assert.equal(updatedElement2.code.value, elProps.code.value);
|
|
268
|
+
assert.equal(updatedElement2.code.spec, elProps.code.spec);
|
|
269
|
+
assert.equal(updatedElement2.code.scope, elProps.code.scope);
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
//# sourceMappingURL=Code.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Code.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/Code.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, expect } from \"chai\";\nimport * as path from \"node:path\";\nimport { SnapshotDb } from \"../../core-backend\";\nimport { Code, ElementProps } from \"@itwin/core-common\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { Id64 } from \"@itwin/core-bentley\";\n\ndescribe(\"Code insertion tests\", () => {\n let imodel: SnapshotDb;\n\n before(async () => {\n IModelTestUtils.registerTestBimSchema();\n const seedFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\n const snapshotFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"test.bim\");\n imodel = IModelTestUtils.createSnapshotFromSeed(snapshotFile, seedFile);\n const schemaPathname = path.join(KnownTestLocations.assetsDir, \"TestBim.ecschema.xml\");\n await imodel.importSchemas([schemaPathname]);\n imodel.saveChanges();\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"should query an element by code\", () => {\n assert.exists(imodel.elements);\n const code = new Code({ scope: \"0x11\", spec: \"0x10\", value: \"RF1.dgn\" });\n const elementId = imodel.elements.queryElementIdByCode(code);\n assert.exists(elementId);\n assert.equal(elementId, \"0x1e\");\n });\n\n it(\"should get undefined when querying an element with a bad code value\", () => {\n assert.exists(imodel.elements);\n const badCode = new Code({ scope: \"0x11\", spec: \"0x10\", value: \"RF1_does_not_exist.dgn\" });\n const elementId = imodel.elements.queryElementIdByCode(badCode);\n assert.isUndefined(elementId);\n });\n\n it(\"should get undefined when querying an element with an empty code\", () => {\n assert.exists(imodel.elements);\n const emptyCode = Code.createEmpty();\n const elementId = imodel.elements.queryElementIdByCode(emptyCode);\n assert.isUndefined(elementId);\n });\n\n it(\"should throw when querying an element with a NULL code value\", () => {\n assert.exists(imodel.elements);\n expect(() => imodel.elements.queryElementIdByCode({\n scope: \"0x11\", spec: \"0x10\",\n value: undefined as any\n })).to.throw(\"Invalid Code\");\n });\n\n it(\"should throw when querying an element with an empty code spec\", () => {\n assert.exists(imodel.elements);\n const noSpecCode = new Code({ scope: \"0x11\", spec: \"\", value: \"RF1.dgn\" });\n expect(() => imodel.elements.queryElementIdByCode(noSpecCode)).to.throw(\"Invalid CodeSpec\");\n });\n\n it(\"should throw when querying an element with a bad code spec\", () => {\n assert.exists(imodel.elements);\n const badSpecCode = new Code({ scope: \"0x11\", spec: \"not a real id\", value: \"RF1.dgn\" });\n expect(() => imodel.elements.queryElementIdByCode(badSpecCode)).to.throw(\"Invalid CodeSpec\");\n });\n\n it(\"should get undefined when querying for an element id with no scope\", () => {\n assert.exists(imodel.elements);\n const noScopeCode = new Code({ scope: \"\", spec: \"0x10\", value: \"RF1.dgn\" });\n const elementId = imodel.elements.queryElementIdByCode(noScopeCode);\n assert.isUndefined(elementId);\n });\n\n it(\"should get undefined when querying for an element id with a bad scope\", () => {\n assert.exists(imodel.elements);\n const badScopeCode = new Code({ scope: \"not a real id\", spec: \"0x10\", value: \"RF1.dgn\" });\n const elementId = imodel.elements.queryElementIdByCode(badScopeCode);\n assert.isUndefined(elementId);\n });\n\n it(\"should insert an element with valid Code\", () => {\n assert.exists(imodel.elements);\n const elProps: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x10\", value: \"new code\" },\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n\n const id = imodel.elements.insertElement(elProps);\n assert.exists(id);\n assert.isTrue(Id64.isValidId64(id));\n });\n\n it(\"should fail to insert an element with invalid Code scope\", () => {\n assert.exists(imodel.elements);\n const elProps: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"bad scope\", spec: \"0x10\", value: \"new code\" }, // invalid scope value\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n\n expect(() => imodel.elements.insertElement(elProps)).throws(\"invalid code scope\").to.have.property(\"metadata\");\n elProps.code.scope = \"0x34322\"; // valid id, but element doesn't exist\n expect(() => imodel.elements.insertElement(elProps)).throws(\"invalid code scope\").to.have.property(\"metadata\");\n elProps.code.scope = undefined as any; // nothing\n expect(() => imodel.elements.insertElement(elProps)).throws(\"invalid code scope\").to.have.property(\"metadata\");\n });\n\n it(\"should fail to insert an element with invalid Code spec\", () => {\n assert.exists(imodel.elements);\n const elProps: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x34322\", value: \"new code\" }, // valid id, but element doesn't exist\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n\n expect(() => imodel.elements.insertElement(elProps)).throws(\"Error inserting element\").to.have.property(\"metadata\");\n // TODO: Non-ID values currently do not throw an error. This should be caught in TS\n // elProps.code.spec = \"not a spec in the model\"; // not an id\n // expect(() => imodel.elements.insertElement(elProps)).throws(\"Error inserting element\").to.have.property(\"metadata\");\n // elProps.code.spec = undefined as any; // nothing\n // expect(() => imodel.elements.insertElement(elProps)).throws(\"Error inserting element\").to.have.property(\"metadata\");\n });\n\n it(\"should fail to insert an element with a duplicate valid code\", () => {\n assert.exists(imodel.elements);\n const elProps: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x10\", value: \"new code duplicate test\" },\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n\n const id = imodel.elements.insertElement(elProps);\n assert.exists(id);\n assert.isTrue(Id64.isValidId64(id));\n\n const elProps2: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x10\", value: \"new code duplicate test\" },\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n\n expect(() => imodel.elements.insertElement(elProps2)).throws(\"Error inserting element\").to.have.property(\"metadata\");\n });\n\n it(\"should update an element code to a valid code\", () => {\n assert.exists(imodel.elements);\n const elProps: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x10\", value: \"newcode update\" },\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n const elementId = imodel.elements.insertElement(elProps);\n const element = imodel.elements.getElement(elementId);\n assert.equal(element.code.value, elProps.code.value);\n assert.equal(element.code.spec, elProps.code.spec);\n assert.equal(element.code.scope, elProps.code.scope);\n\n let newCode = new Code({ scope: \"0x1\", spec: \"0x10\", value: \"UpdatedValue.dgn2\" });\n element.code = newCode;\n element.update();\n\n const updatedElement = imodel.elements.getElement(elementId);\n assert.equal(updatedElement.code.value, newCode.value);\n assert.equal(updatedElement.code.spec, newCode.spec);\n assert.equal(updatedElement.code.scope, newCode.scope);\n\n newCode = new Code({ scope: \"0x12\", spec: \"0x11\", value: \"UpdatedValue.dgn2\" });\n element.code = newCode;\n element.update();\n\n const updatedElement2 = imodel.elements.getElement(elementId);\n assert.equal(updatedElement2.code.value, newCode.value);\n assert.equal(updatedElement2.code.spec, newCode.spec);\n assert.equal(updatedElement2.code.scope, newCode.scope);\n });\n\n it(\"should fail to update an element code to a duplicate valid code\", () => {\n assert.exists(imodel.elements);\n const elProps: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x10\", value: \"newcode3\" },\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n const elementId = imodel.elements.insertElement(elProps);\n const element = imodel.elements.getElement(elementId);\n assert.equal(element.code.value, elProps.code.value);\n assert.equal(element.code.spec, elProps.code.spec);\n assert.equal(element.code.scope, elProps.code.scope);\n\n const elProps2: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x10\", value: \"newcode32\" },\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n const elementId2 = imodel.elements.insertElement(elProps2);\n const element2 = imodel.elements.getElement(elementId2);\n assert.equal(element2.code.value, elProps2.code.value);\n assert.equal(element2.code.spec, elProps2.code.spec);\n assert.equal(element2.code.scope, elProps2.code.scope);\n\n element.code = element2.code;\n expect(() => element.update()).to.throw(\"Error updating element\").to.have.property(\"metadata\");\n });\n\n it(\"should fail to update an element code with an invalid code value\", () => {\n assert.exists(imodel.elements);\n const elProps: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x10\", value: \"newcode4\" },\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n const elementId = imodel.elements.insertElement(elProps);\n const element = imodel.elements.getElement(elementId);\n assert.equal(element.code.value, elProps.code.value);\n assert.equal(element.code.spec, elProps.code.spec);\n assert.equal(element.code.scope, elProps.code.scope);\n\n let newCode = new Code({ scope: \"0x1\", spec: \"0x10\", value: \"\" }); // empty value\n element.code = newCode;\n element.update();\n\n const updatedElement = imodel.elements.getElement(elementId);\n assert.equal(updatedElement.code.value, newCode.value);\n assert.equal(updatedElement.code.spec, newCode.spec);\n assert.equal(updatedElement.code.scope, newCode.scope);\n\n newCode = new Code({ scope: \"0x1\", spec: \"0x10\", value: \"validcodeagain\" }); // reset the code\n element.code = newCode;\n element.update();\n\n newCode = new Code({ scope: \"0x1\", spec: \"0x11\" }); // NULL value\n newCode.value = undefined as any;\n element.code = newCode;\n element.update();\n\n const updatedElement2 = imodel.elements.getElement(elementId);\n assert.equal(updatedElement2.code.value, \"\");\n assert.equal(updatedElement2.code.spec, newCode.spec);\n assert.equal(updatedElement2.code.scope, newCode.scope);\n\n newCode = Code.createEmpty(); // Empty Code\n element.code = newCode;\n element.update();\n\n const updatedElement3 = imodel.elements.getElement(elementId);\n assert.equal(updatedElement3.code.value, newCode.value);\n assert.equal(updatedElement3.code.spec, newCode.spec);\n assert.equal(updatedElement3.code.scope, newCode.scope);\n });\n\n it(\"should fail to update an element code with an invalid code scope\", () => {\n assert.exists(imodel.elements);\n const elProps: ElementProps = {\n classFullName: 'BisCore:RepositoryLink',\n code: { scope: \"0x1\", spec: \"0x10\", value: \"newcode5\" },\n id: '0x1e',\n model: '0x11',\n userLabel: 'RF1.dgn',\n federationGuid: undefined,\n };\n const elementId = imodel.elements.insertElement(elProps);\n const element = imodel.elements.getElement(elementId);\n assert.equal(element.code.value, elProps.code.value);\n assert.equal(element.code.spec, elProps.code.spec);\n assert.equal(element.code.scope, elProps.code.scope);\n\n let newCode = new Code({ scope: \"\", spec: \"0x10\", value: \"newcode5\" }); // empty scope\n element.code = newCode;\n expect(() => element.update()).to.throw(\"Error updating element\").to.have.property(\"metadata\");\n\n const updatedElement = imodel.elements.getElement(elementId);\n assert.equal(updatedElement.code.value, elProps.code.value);\n assert.equal(updatedElement.code.spec, elProps.code.spec);\n assert.equal(updatedElement.code.scope, elProps.code.scope);\n\n newCode = new Code({ scope: \"not a real id\", spec: \"0x10\", value: \"newcode5\" }); // bad id\n element.code = newCode;\n expect(() => element.update()).to.throw(\"Error updating element\").to.have.property(\"metadata\");\n\n const updatedElement2 = imodel.elements.getElement(elementId);\n assert.equal(updatedElement2.code.value, elProps.code.value);\n assert.equal(updatedElement2.code.spec, elProps.code.spec);\n assert.equal(updatedElement2.code.scope, elProps.code.scope);\n });\n});"]}
|
|
@@ -59,7 +59,7 @@ import * as path from "path";
|
|
|
59
59
|
import * as semver from "semver";
|
|
60
60
|
import * as sinon from "sinon";
|
|
61
61
|
import { DbResult, Guid, Id64, IModelStatus, Logger, OpenMode, ProcessDetector } from "@itwin/core-bentley";
|
|
62
|
-
import { BisCodeSpec, BriefcaseIdValue, Code, CodeScopeSpec, CodeSpec, ColorByName, ColorDef, DisplayStyleSettings, EcefLocation, FontMap, FontType, GeoCoordStatus, GeographicCRS, GeometryParams, GeometryStreamBuilder, ImageSourceFormat, IModel, IModelError, RelatedElement, RenderMode, SchemaState, SubCategoryAppearance, TextureMapping, TextureMapUnits, ViewFlags, } from "@itwin/core-common";
|
|
62
|
+
import { BisCodeSpec, BriefcaseIdValue, Code, CodeScopeSpec, CodeSpec, ColorByName, ColorDef, DisplayStyleSettings, EcefLocation, FontMap, FontType, GeoCoordStatus, GeographicCRS, GeometryParams, GeometryStreamBuilder, ImageSourceFormat, IModel, IModelError, QueryBinder, RelatedElement, RenderMode, SchemaState, SubCategoryAppearance, TextureMapping, TextureMapUnits, ViewFlags, } from "@itwin/core-common";
|
|
63
63
|
import { Geometry, LineString3d, Loop, Matrix4d, Point3d, PolyfaceBuilder, Range3d, StrokeOptions, Transform, YawPitchRollAngles, } from "@itwin/core-geometry";
|
|
64
64
|
import { V2CheckpointManager } from "../../CheckpointManager";
|
|
65
65
|
import { _nativeDb, BisCoreSchema, Category, ClassRegistry, DefinitionContainer, DefinitionGroup, DefinitionGroupGroupsDefinitions, DefinitionModel, DefinitionPartition, DictionaryModel, DisplayStyle3d, DocumentPartition, DrawingGraphic, Element, ElementDrivesElement, ElementGroupsMembers, ElementOwnsChildElements, GenericGraphicalType2d, GeometricElement2d, GeometricElement3d, GeometricModel, GroupInformationPartition, IModelDb, IModelHost, IModelJsFs, InformationPartitionElement, InformationRecordElement, LinkPartition, Model, PhysicalElement, PhysicalModel, PhysicalObject, PhysicalPartition, RenderMaterialElement, SnapshotDb, SpatialCategory, SqliteValueType, StandaloneDb, SubCategory, Subject, Texture, } from "../../core-backend";
|
|
@@ -2930,5 +2930,148 @@ describe("iModel", () => {
|
|
|
2930
2930
|
}
|
|
2931
2931
|
testImodel.close();
|
|
2932
2932
|
});
|
|
2933
|
+
it("should update codeValues that are switched between elements", async () => {
|
|
2934
|
+
const dbFileName = IModelTestUtils.prepareOutputFile("IModel", "change-codeValues.bim");
|
|
2935
|
+
const imodelDb = SnapshotDb.createEmpty(dbFileName, {
|
|
2936
|
+
rootSubject: { name: "change-codeValues" },
|
|
2937
|
+
});
|
|
2938
|
+
let categoryA = SpatialCategory.create(imodelDb, IModel.dictionaryId, "A");
|
|
2939
|
+
let categoryB = SpatialCategory.create(imodelDb, IModel.dictionaryId, "B");
|
|
2940
|
+
categoryA.userLabel = "A";
|
|
2941
|
+
categoryB.userLabel = "B";
|
|
2942
|
+
categoryA.insert();
|
|
2943
|
+
categoryB.insert();
|
|
2944
|
+
imodelDb.saveChanges();
|
|
2945
|
+
categoryA = imodelDb.elements.getElement(SpatialCategory.createCode(imodelDb, IModel.dictionaryId, "A"));
|
|
2946
|
+
categoryB = imodelDb.elements.getElement(SpatialCategory.createCode(imodelDb, IModel.dictionaryId, "B"));
|
|
2947
|
+
categoryA.code.value = "temp";
|
|
2948
|
+
categoryA.update();
|
|
2949
|
+
categoryB.code.value = "A";
|
|
2950
|
+
categoryB.update();
|
|
2951
|
+
categoryA.code.value = "B";
|
|
2952
|
+
categoryA.update();
|
|
2953
|
+
imodelDb.saveChanges();
|
|
2954
|
+
categoryA = imodelDb.elements.getElement(SpatialCategory.createCode(imodelDb, IModel.dictionaryId, "A"));
|
|
2955
|
+
categoryB = imodelDb.elements.getElement(SpatialCategory.createCode(imodelDb, IModel.dictionaryId, "B"));
|
|
2956
|
+
expect(categoryA.userLabel).to.equal("B", `categoryA.userLabel mismatch in ${imodelDb.name}`);
|
|
2957
|
+
expect(categoryB.userLabel).to.equal("A", `categoryB.userLabel mismatch in ${imodelDb.name}`);
|
|
2958
|
+
imodelDb.close();
|
|
2959
|
+
});
|
|
2960
|
+
it("should provide meaningful error when querying a closed iModel", () => {
|
|
2961
|
+
const testImodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile("IModel", "QueryingClosedImodel.bim"), { rootSubject: { name: "QueryClosedTest" } });
|
|
2962
|
+
assert.isTrue(testImodel.isOpen);
|
|
2963
|
+
// Close the iModel for the tests
|
|
2964
|
+
testImodel.close();
|
|
2965
|
+
assert.isFalse(testImodel.isOpen);
|
|
2966
|
+
const closedDbError = "Cannot query a closed Db";
|
|
2967
|
+
expect(() => testImodel.withPreparedSqliteStatement("SELECT 1", () => { })).to.throw(closedDbError);
|
|
2968
|
+
expect(() => testImodel.withPreparedSqliteStatement("SELECT 1", () => { })).to.throw(closedDbError);
|
|
2969
|
+
expect(() => testImodel.prepareSqliteStatement("SELECT 1")).to.throw(closedDbError);
|
|
2970
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
2971
|
+
expect(() => testImodel.prepareStatement("SELECT 1")).to.throw(closedDbError);
|
|
2972
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
2973
|
+
expect(() => testImodel.withPreparedStatement("SELECT ECInstanceId FROM BisCore:Element LIMIT 1", () => { })).to.throw(closedDbError);
|
|
2974
|
+
expect(() => testImodel.elements.queryChildren(IModel.rootSubjectId)).to.throw(closedDbError);
|
|
2975
|
+
expect(() => testImodel.elements.getAspects("0x1", "WrongSchema:WrongClass")).to.throw("db is not open");
|
|
2976
|
+
expect(() => testImodel.createQueryReader("SELECT 1")).to.throw("db not open");
|
|
2977
|
+
});
|
|
2978
|
+
describe("Delete relationship instances", () => {
|
|
2979
|
+
let testImodel;
|
|
2980
|
+
const relationshipClasses = [
|
|
2981
|
+
"BisCore:ElementGroupsMembers",
|
|
2982
|
+
"BisCore:ElementDrivesElement",
|
|
2983
|
+
"BisCore:ElementRefersToDocuments"
|
|
2984
|
+
];
|
|
2985
|
+
afterEach(() => {
|
|
2986
|
+
if (testImodel !== undefined) {
|
|
2987
|
+
const iModelPath = testImodel.pathName;
|
|
2988
|
+
if (testImodel.isOpen)
|
|
2989
|
+
testImodel.close();
|
|
2990
|
+
IModelJsFs.unlinkSync(iModelPath);
|
|
2991
|
+
}
|
|
2992
|
+
});
|
|
2993
|
+
function setupRelationships(numOfRelationships, multipleClasses = false) {
|
|
2994
|
+
testImodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile("IModel", "DeleteRelationshipInstances.bim"), { rootSubject: { name: "DeleteRelationshipInstances" } });
|
|
2995
|
+
assert.isTrue(testImodel.isOpen);
|
|
2996
|
+
const [, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);
|
|
2997
|
+
let spatialCategoryId = SpatialCategory.queryCategoryIdByName(testImodel, IModel.dictionaryId, "MySpatialCategory");
|
|
2998
|
+
if (!spatialCategoryId) {
|
|
2999
|
+
spatialCategoryId = SpatialCategory.insert(testImodel, IModel.dictionaryId, "MySpatialCategory", new SubCategoryAppearance());
|
|
3000
|
+
}
|
|
3001
|
+
const relationships = [];
|
|
3002
|
+
for (let i = 0; i < numOfRelationships; ++i) {
|
|
3003
|
+
const sourceProps = createElemProps(testImodel, newModelId, spatialCategoryId, "Generic:PhysicalObject");
|
|
3004
|
+
const sourceId = testImodel.elements.insertElement(sourceProps);
|
|
3005
|
+
const targetProps = createElemProps(testImodel, newModelId, spatialCategoryId, "Generic:PhysicalObject");
|
|
3006
|
+
const targetId = testImodel.elements.insertElement(targetProps);
|
|
3007
|
+
let relationshipClass = "BisCore:ElementGroupsMembers";
|
|
3008
|
+
if (multipleClasses)
|
|
3009
|
+
relationshipClass = relationshipClasses[i % relationshipClasses.length];
|
|
3010
|
+
const relationshipProps = {
|
|
3011
|
+
classFullName: relationshipClass,
|
|
3012
|
+
sourceId,
|
|
3013
|
+
targetId,
|
|
3014
|
+
};
|
|
3015
|
+
relationshipProps.id = testImodel.relationships.insertInstance(relationshipProps);
|
|
3016
|
+
relationships.push(relationshipProps);
|
|
3017
|
+
}
|
|
3018
|
+
testImodel.saveChanges();
|
|
3019
|
+
return relationships;
|
|
3020
|
+
}
|
|
3021
|
+
async function getRelationshipCount(iModel, relationshipClass) {
|
|
3022
|
+
const reader = iModel.createQueryReader(`SELECT COUNT(*) AS [count] FROM ${relationshipClass}`);
|
|
3023
|
+
await reader.step();
|
|
3024
|
+
return reader.current.count;
|
|
3025
|
+
}
|
|
3026
|
+
it("deleteInstances with an empty array", async () => {
|
|
3027
|
+
const relationships = setupRelationships(10);
|
|
3028
|
+
assert.equal(relationships.length, await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers"));
|
|
3029
|
+
testImodel.relationships.deleteInstances([]);
|
|
3030
|
+
testImodel.saveChanges();
|
|
3031
|
+
assert.equal(relationships.length, await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers"));
|
|
3032
|
+
});
|
|
3033
|
+
it("deleteInstances with a single relationship instance", async () => {
|
|
3034
|
+
const relationships = setupRelationships(10);
|
|
3035
|
+
assert.equal(relationships.length, await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers"), "Should delete exactly one relationship");
|
|
3036
|
+
// Delete just one relationship using deleteInstances method
|
|
3037
|
+
testImodel.relationships.deleteInstances([relationships[0]]);
|
|
3038
|
+
testImodel.saveChanges();
|
|
3039
|
+
const remainingCount = await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers");
|
|
3040
|
+
assert.equal(remainingCount, relationships.length - 1, "Should delete exactly one relationship");
|
|
3041
|
+
});
|
|
3042
|
+
it("deleteInstances with different relationship classes", async () => {
|
|
3043
|
+
const relationships = setupRelationships(500, true);
|
|
3044
|
+
// Verify relationships were created across different classes
|
|
3045
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers") >= Math.floor(relationships.length / 3));
|
|
3046
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementDrivesElement") >= Math.floor(relationships.length / 3));
|
|
3047
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementRefersToDocuments") >= Math.floor(relationships.length / 3));
|
|
3048
|
+
// Test deleteInstances with mixed relationship classes
|
|
3049
|
+
testImodel.relationships.deleteInstances(relationships);
|
|
3050
|
+
testImodel.saveChanges();
|
|
3051
|
+
// Verify all relationships were deleted regardless of their class
|
|
3052
|
+
assert.equal(0, await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers"), "All ElementGroupsMembers relationships should be deleted");
|
|
3053
|
+
assert.equal(0, await getRelationshipCount(testImodel, "BisCore.ElementDrivesElement"), "All ElementDrivesElement relationships should be deleted");
|
|
3054
|
+
assert.equal(0, await getRelationshipCount(testImodel, "BisCore.ElementRefersToDocuments"), "All ElementRefersToDocuments relationships should be deleted");
|
|
3055
|
+
});
|
|
3056
|
+
it("deleteInstances for random relationship instances", async () => {
|
|
3057
|
+
const relationships = setupRelationships(1000, true);
|
|
3058
|
+
// Verify relationships exist before deletion
|
|
3059
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementGroupsMembers") >= Math.floor(relationships.length / 3));
|
|
3060
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementDrivesElement") >= Math.floor(relationships.length / 3));
|
|
3061
|
+
assert.isTrue(await getRelationshipCount(testImodel, "BisCore.ElementRefersToDocuments") >= Math.floor(relationships.length / 3));
|
|
3062
|
+
// Create a subset of random relationship entries to delete
|
|
3063
|
+
const relationshipsToDelete = [];
|
|
3064
|
+
for (let i = 0; i < 250; ++i) {
|
|
3065
|
+
relationshipsToDelete.push(relationships[Math.floor(Math.random() * (relationships.length + 1))]);
|
|
3066
|
+
}
|
|
3067
|
+
testImodel.relationships.deleteInstances(relationshipsToDelete);
|
|
3068
|
+
testImodel.saveChanges();
|
|
3069
|
+
// Verify all relationships were deleted
|
|
3070
|
+
for (const relClass of relationshipsToDelete) {
|
|
3071
|
+
const reader = testImodel.createQueryReader(`SELECT ECInstanceId FROM ${relClass.classFullName} WHERE SourceECInstanceId=? AND TargetECInstanceId=?`, new QueryBinder().bindId(1, relClass.sourceId).bindId(2, relClass.targetId));
|
|
3072
|
+
assert.isFalse(await reader.step(), `Relationship ${relClass.id} should be deleted`); // No row should be returned
|
|
3073
|
+
}
|
|
3074
|
+
});
|
|
3075
|
+
});
|
|
2933
3076
|
});
|
|
2934
3077
|
//# sourceMappingURL=IModel.test.js.map
|