@itwin/core-backend 5.13.0-dev.9 → 5.14.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 +33 -1
- package/lib/cjs/Category.d.ts +4 -4
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts +5 -0
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +13 -3
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +3 -3
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +1 -0
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +48 -12
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +120 -24
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +30 -15
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +51 -15
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/Model.d.ts +5 -5
- package/lib/cjs/Model.d.ts.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/PropertyStore.js +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts +37 -9
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js +125 -6
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SynchronousChannel.d.ts +62 -0
- package/lib/cjs/SynchronousChannel.d.ts.map +1 -0
- package/lib/cjs/SynchronousChannel.js +11 -0
- package/lib/cjs/SynchronousChannel.js.map +1 -0
- package/lib/cjs/Texture.d.ts +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +44 -4
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +72 -14
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +6 -6
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts +22 -7
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +104 -36
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +25 -10
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.d.ts +22 -0
- package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js +13 -0
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NoReservations.d.ts +6 -0
- package/lib/cjs/internal/NoReservations.d.ts.map +1 -0
- package/lib/cjs/internal/NoReservations.js +21 -0
- package/lib/cjs/internal/NoReservations.js.map +1 -0
- package/lib/cjs/internal/SchemaSyncReservations.d.ts +4 -0
- package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -0
- package/lib/cjs/internal/SchemaSyncReservations.js +118 -0
- package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -0
- package/lib/cjs/internal/Symbols.d.ts +1 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +2 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/esm/Category.d.ts +4 -4
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts +5 -0
- package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +13 -3
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/CodeSpecs.d.ts +3 -3
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +1 -0
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +48 -12
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +121 -25
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +30 -15
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +52 -16
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/Model.d.ts +5 -5
- package/lib/esm/Model.d.ts.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/PropertyStore.js +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/SchemaSync.d.ts +37 -9
- package/lib/esm/SchemaSync.d.ts.map +1 -1
- package/lib/esm/SchemaSync.js +127 -8
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SynchronousChannel.d.ts +62 -0
- package/lib/esm/SynchronousChannel.d.ts.map +1 -0
- package/lib/esm/SynchronousChannel.js +9 -0
- package/lib/esm/SynchronousChannel.js.map +1 -0
- package/lib/esm/Texture.d.ts +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +44 -4
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +72 -14
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +6 -6
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts +22 -7
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +104 -36
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +25 -10
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.d.ts +22 -0
- package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js +13 -0
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NoReservations.d.ts +6 -0
- package/lib/esm/internal/NoReservations.d.ts.map +1 -0
- package/lib/esm/internal/NoReservations.js +18 -0
- package/lib/esm/internal/NoReservations.js.map +1 -0
- package/lib/esm/internal/SchemaSyncReservations.d.ts +4 -0
- package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -0
- package/lib/esm/internal/SchemaSyncReservations.js +115 -0
- package/lib/esm/internal/SchemaSyncReservations.js.map +1 -0
- package/lib/esm/internal/Symbols.d.ts +1 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +1 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
- package/lib/esm/test/IModelTestUtils.js +8 -3
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +178 -2
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +48 -18
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +177 -0
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +2 -16
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +2 -2
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +80 -2
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/imodel/IModelECSql.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelECSql.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelECSql.test.js +367 -0
- package/lib/esm/test/imodel/IModelECSql.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelElements.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelElements.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelElements.test.js +969 -0
- package/lib/esm/test/imodel/IModelElements.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js +539 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.js +499 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelMetadata.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelMetadata.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelMetadata.test.js +274 -0
- package/lib/esm/test/imodel/IModelMetadata.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelModels.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelModels.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelModels.test.js +357 -0
- package/lib/esm/test/imodel/IModelModels.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelRelationships.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelRelationships.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelRelationships.test.js +407 -0
- package/lib/esm/test/imodel/IModelRelationships.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelTestFixtures.d.ts +53 -0
- package/lib/esm/test/imodel/IModelTestFixtures.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelTestFixtures.js +107 -0
- package/lib/esm/test/imodel/IModelTestFixtures.js.map +1 -0
- package/lib/esm/test/imodel/IModelViews.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelViews.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelViews.test.js +199 -0
- package/lib/esm/test/imodel/IModelViews.test.js.map +1 -0
- package/lib/esm/test/index.d.ts +0 -1
- package/lib/esm/test/index.d.ts.map +1 -1
- package/lib/esm/test/index.js +0 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +8 -26
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts +2 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js +263 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js.map +1 -0
- package/lib/esm/test/standalone/GeometryStream.test.js +1 -3
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +78 -1
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js +29 -10
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +23 -0
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.js +221 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts +2 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +459 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +108 -8
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +14 -17
- package/lib/esm/test/RevisionUtility.d.ts +0 -33
- package/lib/esm/test/RevisionUtility.d.ts.map +0 -1
- package/lib/esm/test/RevisionUtility.js +0 -52
- package/lib/esm/test/RevisionUtility.js.map +0 -1
- package/lib/esm/test/imodel/IModel.test.d.ts +0 -2
- package/lib/esm/test/imodel/IModel.test.d.ts.map +0 -1
- package/lib/esm/test/imodel/IModel.test.js +0 -3277
- package/lib/esm/test/imodel/IModel.test.js.map +0 -1
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
53
|
+
/*---------------------------------------------------------------------------------------------
|
|
54
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
55
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
56
|
+
*--------------------------------------------------------------------------------------------*/
|
|
57
|
+
import { assert, expect } from "chai";
|
|
58
|
+
import { DbResult, Id64, IModelStatus } from "@itwin/core-bentley";
|
|
59
|
+
import { Code, IModel, IModelError, SubCategoryAppearance } from "@itwin/core-common";
|
|
60
|
+
import { Range3d, Transform } from "@itwin/core-geometry";
|
|
61
|
+
import { EditTxn, withEditTxn } from "../../EditTxn";
|
|
62
|
+
import { _nativeDb, Category, ClassRegistry, DefinitionContainer, DefinitionGroup, DefinitionGroupGroupsDefinitions, DefinitionModel, DefinitionPartition, DocumentPartition, DrawingGraphic, GeometricElement2d, GroupInformationPartition, LinkPartition, Model, PhysicalModel, PhysicalPartition, SnapshotDb, SpatialCategory, SubCategory, } from "../../core-backend";
|
|
63
|
+
import { IModelTestUtils } from "../IModelTestUtils";
|
|
64
|
+
import { DisableNativeAssertions, TestUtils } from "../TestUtils";
|
|
65
|
+
import { closeIfOpen, createIModelFromSeed, createMutableIModelTracker, expectIModelError, getIModelError, importTestBim, openReadonlySeedCopy, roundtripThroughJson } from "./IModelTestFixtures";
|
|
66
|
+
describe("iModel models", () => {
|
|
67
|
+
let testBimReadonly;
|
|
68
|
+
let compatibilityReadonly;
|
|
69
|
+
const { trackMutableIModel, closeTrackedIModels } = createMutableIModelTracker();
|
|
70
|
+
before(async () => {
|
|
71
|
+
await TestUtils.startBackend();
|
|
72
|
+
IModelTestUtils.registerTestBimSchema();
|
|
73
|
+
testBimReadonly = await openReadonlySeedCopy("models-test.bim", "test.bim", { importTestBim: true });
|
|
74
|
+
compatibilityReadonly = await openReadonlySeedCopy("models-CompatibilityTestSeed.bim", "CompatibilityTestSeed.bim");
|
|
75
|
+
});
|
|
76
|
+
after(() => {
|
|
77
|
+
closeIfOpen(testBimReadonly, compatibilityReadonly);
|
|
78
|
+
closeTrackedIModels();
|
|
79
|
+
});
|
|
80
|
+
afterEach(() => {
|
|
81
|
+
closeTrackedIModels();
|
|
82
|
+
});
|
|
83
|
+
it("should load a known model by Id from an existing iModel", () => {
|
|
84
|
+
const imodel1 = testBimReadonly;
|
|
85
|
+
assert.exists(imodel1.models);
|
|
86
|
+
const model2 = imodel1.models.getModel("0x1c");
|
|
87
|
+
assert.exists(model2);
|
|
88
|
+
const formatter = model2.getJsonProperty("formatter");
|
|
89
|
+
assert.exists(formatter, "formatter should exist as json property");
|
|
90
|
+
assert.equal(formatter.fmtFlags.angMode, 1, "fmtFlags");
|
|
91
|
+
assert.equal(formatter.mastUnit.label, "m", "mastUnit is meters");
|
|
92
|
+
roundtripThroughJson(model2);
|
|
93
|
+
let model = imodel1.models.getModel(IModel.repositoryModelId);
|
|
94
|
+
assert.exists(model);
|
|
95
|
+
roundtripThroughJson(model);
|
|
96
|
+
const code1 = new Code({ spec: "0x1d", scope: "0x1d", value: "A" });
|
|
97
|
+
model = imodel1.models.getSubModel(code1);
|
|
98
|
+
// By this point, we expect the submodel's class to be in the class registry *cache*
|
|
99
|
+
const geomModel = ClassRegistry.getClass(PhysicalModel.classFullName, imodel1);
|
|
100
|
+
assert.exists(model);
|
|
101
|
+
assert.isTrue(model instanceof geomModel);
|
|
102
|
+
roundtripThroughJson(model);
|
|
103
|
+
const modelExtents = model.queryExtents();
|
|
104
|
+
assert.isBelow(modelExtents.low.x, modelExtents.high.x);
|
|
105
|
+
assert.isBelow(modelExtents.low.y, modelExtents.high.y);
|
|
106
|
+
assert.isBelow(modelExtents.low.z, modelExtents.high.z);
|
|
107
|
+
});
|
|
108
|
+
it("should find a tile tree for a geometric model", async () => {
|
|
109
|
+
const imodel1 = testBimReadonly;
|
|
110
|
+
// Note: this is an empty model.
|
|
111
|
+
const tree = await imodel1.tiles.requestTileTreeProps("0x1c");
|
|
112
|
+
expect(tree).not.to.be.undefined;
|
|
113
|
+
expect(tree.id).to.equal("0x1c");
|
|
114
|
+
expect(tree.maxTilesToSkip).to.equal(1);
|
|
115
|
+
expect(tree.rootTile).not.to.be.undefined;
|
|
116
|
+
// Empty model => identity transform
|
|
117
|
+
const tf = Transform.fromJSON(tree.location);
|
|
118
|
+
expect(tf.matrix.isIdentity).to.be.true;
|
|
119
|
+
expect(tf.origin.x).to.equal(0);
|
|
120
|
+
expect(tf.origin.y).to.equal(0);
|
|
121
|
+
expect(tf.origin.z).to.equal(0);
|
|
122
|
+
expect(tree.rootTile.contentId).to.equal("0/0/0/0/1");
|
|
123
|
+
// Empty model => null range
|
|
124
|
+
const range = Range3d.fromJSON(tree.rootTile.range);
|
|
125
|
+
expect(range.isNull).to.be.true;
|
|
126
|
+
expect(tree.rootTile.maximumSize).to.equal(0.0); // empty model => undisplayable root tile => size = 0.0
|
|
127
|
+
expect(tree.rootTile.isLeaf).to.be.true; // empty model => empty tile
|
|
128
|
+
expect(tree.rootTile.contentRange).to.be.undefined;
|
|
129
|
+
});
|
|
130
|
+
it("should throw on invalid tile requests", async () => {
|
|
131
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
132
|
+
try {
|
|
133
|
+
const imodel1 = testBimReadonly;
|
|
134
|
+
const _r = __addDisposableResource(env_1, new DisableNativeAssertions(), false);
|
|
135
|
+
let error = await getIModelError(imodel1.tiles.requestTileTreeProps("0x12345"));
|
|
136
|
+
expectIModelError(IModelStatus.InvalidId, error);
|
|
137
|
+
error = await getIModelError(imodel1.tiles.requestTileTreeProps("NotAValidId"));
|
|
138
|
+
expectIModelError(IModelStatus.InvalidId, error);
|
|
139
|
+
error = await getIModelError(imodel1.tiles.requestTileContent("0x1c", "0/0/0/0"));
|
|
140
|
+
expectIModelError(IModelStatus.InvalidId, error);
|
|
141
|
+
error = await getIModelError(imodel1.tiles.requestTileContent("0x12345", "0/0/0/0/1"));
|
|
142
|
+
expectIModelError(IModelStatus.InvalidId, error);
|
|
143
|
+
error = await getIModelError(imodel1.tiles.requestTileContent("0x1c", "V/W/X/Y/Z"));
|
|
144
|
+
expectIModelError(IModelStatus.InvalidId, error);
|
|
145
|
+
error = await getIModelError(imodel1.tiles.requestTileContent("0x1c", "NotAValidId"));
|
|
146
|
+
expectIModelError(IModelStatus.InvalidId, error);
|
|
147
|
+
}
|
|
148
|
+
catch (e_1) {
|
|
149
|
+
env_1.error = e_1;
|
|
150
|
+
env_1.hasError = true;
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
__disposeResources(env_1);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
it("should be some categories", () => {
|
|
157
|
+
const imodel1 = testBimReadonly;
|
|
158
|
+
const categorySql = `SELECT ECInstanceId FROM ${Category.classFullName}`;
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
160
|
+
imodel1.withPreparedStatement(categorySql, (categoryStatement) => {
|
|
161
|
+
let numCategories = 0;
|
|
162
|
+
while (DbResult.BE_SQLITE_ROW === categoryStatement.step()) {
|
|
163
|
+
numCategories++;
|
|
164
|
+
const categoryId = categoryStatement.getValue(0).getId();
|
|
165
|
+
const category = imodel1.elements.getElement(categoryId);
|
|
166
|
+
assert.isTrue(category instanceof Category, "Should be instance of Category");
|
|
167
|
+
// verify the default subcategory.
|
|
168
|
+
const defaultSubCategoryId = category.myDefaultSubCategoryId();
|
|
169
|
+
const defaultSubCategory = imodel1.elements.getElement(defaultSubCategoryId);
|
|
170
|
+
assert.isTrue(defaultSubCategory instanceof SubCategory, "defaultSubCategory should be instance of SubCategory");
|
|
171
|
+
if (defaultSubCategory instanceof SubCategory) {
|
|
172
|
+
assert.isTrue(defaultSubCategory.parent.id === categoryId, "defaultSubCategory id should be prescribed value");
|
|
173
|
+
assert.isTrue(defaultSubCategory.getSubCategoryName() === category.code.value, "DefaultSubcategory name should match that of Category");
|
|
174
|
+
assert.isTrue(defaultSubCategory.isDefaultSubCategory, "isDefaultSubCategory should return true");
|
|
175
|
+
}
|
|
176
|
+
// get the subcategories
|
|
177
|
+
const subCategorySql = `SELECT ECInstanceId FROM ${SubCategory.classFullName} WHERE Parent.Id=:parentId`;
|
|
178
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
179
|
+
imodel1.withPreparedStatement(subCategorySql, (subCategoryStatement) => {
|
|
180
|
+
let numSubCategories = 0;
|
|
181
|
+
subCategoryStatement.bindId("parentId", categoryId);
|
|
182
|
+
while (DbResult.BE_SQLITE_ROW === subCategoryStatement.step()) {
|
|
183
|
+
numSubCategories++;
|
|
184
|
+
const subCategoryId = subCategoryStatement.getValue(0).getId();
|
|
185
|
+
const subCategory = imodel1.elements.getElement(subCategoryId);
|
|
186
|
+
assert.isTrue(subCategory instanceof SubCategory);
|
|
187
|
+
assert.isTrue(subCategory.parent.id === categoryId);
|
|
188
|
+
}
|
|
189
|
+
assert.isAtLeast(numSubCategories, 1, "Expected query to find at least one SubCategory");
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
assert.isAtLeast(numCategories, 1, "Expected query to find some categories");
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
it("should be some 2d elements", () => {
|
|
196
|
+
const imodel2 = compatibilityReadonly;
|
|
197
|
+
const sql = `SELECT ECInstanceId FROM ${DrawingGraphic.classFullName}`;
|
|
198
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
199
|
+
imodel2.withPreparedStatement(sql, (statement) => {
|
|
200
|
+
let numDrawingGraphics = 0;
|
|
201
|
+
let found25 = false;
|
|
202
|
+
let found26 = false;
|
|
203
|
+
while (DbResult.BE_SQLITE_ROW === statement.step()) {
|
|
204
|
+
numDrawingGraphics++;
|
|
205
|
+
const drawingGraphicId = statement.getValue(0).getId();
|
|
206
|
+
const drawingGraphic = imodel2.elements.getElement({ id: drawingGraphicId, wantGeometry: true });
|
|
207
|
+
assert.exists(drawingGraphic);
|
|
208
|
+
assert.isTrue(drawingGraphic.className === "DrawingGraphic", "Should be instance of DrawingGraphic");
|
|
209
|
+
assert.isTrue(drawingGraphic instanceof DrawingGraphic, "Is instance of DrawingGraphic");
|
|
210
|
+
assert.isTrue(drawingGraphic instanceof GeometricElement2d, "Is instance of GeometricElement2d");
|
|
211
|
+
if (Id64.getLocalId(drawingGraphic.id) === 0x25) {
|
|
212
|
+
found25 = true;
|
|
213
|
+
assert.isTrue(drawingGraphic.placement.origin.x === 0.0);
|
|
214
|
+
assert.isTrue(drawingGraphic.placement.origin.y === 0.0);
|
|
215
|
+
assert.isTrue(drawingGraphic.placement.angle.radians === 0.0);
|
|
216
|
+
assert.isTrue(drawingGraphic.placement.bbox.low.x === 0.0);
|
|
217
|
+
assert.isTrue(drawingGraphic.placement.bbox.low.y === 0.0);
|
|
218
|
+
assert.isTrue(drawingGraphic.placement.bbox.high.x === 1.0);
|
|
219
|
+
assert.isTrue(drawingGraphic.placement.bbox.high.y === 1.0);
|
|
220
|
+
assert.isDefined(drawingGraphic.geom);
|
|
221
|
+
}
|
|
222
|
+
else if (Id64.getLocalId(drawingGraphic.id) === 0x26) {
|
|
223
|
+
found26 = true;
|
|
224
|
+
assert.isTrue(drawingGraphic.placement.origin.x === 1.0);
|
|
225
|
+
assert.isTrue(drawingGraphic.placement.origin.y === 1.0);
|
|
226
|
+
assert.isTrue(drawingGraphic.placement.angle.radians === 0.0);
|
|
227
|
+
assert.isTrue(drawingGraphic.placement.bbox.low.x === 0.0);
|
|
228
|
+
assert.isTrue(drawingGraphic.placement.bbox.low.y === 0.0);
|
|
229
|
+
assert.isTrue(drawingGraphic.placement.bbox.high.x === 2.0);
|
|
230
|
+
assert.isTrue(drawingGraphic.placement.bbox.high.y === 2.0);
|
|
231
|
+
assert.isDefined(drawingGraphic.geom);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
assert.isAtLeast(numDrawingGraphics, 1, "Expected query to find some DrawingGraphics");
|
|
235
|
+
assert.isTrue(found25, "Expected to find a specific element");
|
|
236
|
+
assert.isTrue(found26, "Expected to find a specific element");
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
it("should be children of RootSubject", () => {
|
|
240
|
+
const imodel2 = compatibilityReadonly;
|
|
241
|
+
const sql = `SELECT ECInstanceId FROM ${Model.classFullName} WHERE ParentModel.Id=:parentModelId`;
|
|
242
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
243
|
+
imodel2.withPreparedStatement(sql, (statement) => {
|
|
244
|
+
statement.bindId("parentModelId", IModel.repositoryModelId);
|
|
245
|
+
let numModels = 0;
|
|
246
|
+
while (DbResult.BE_SQLITE_ROW === statement.step()) {
|
|
247
|
+
numModels++;
|
|
248
|
+
const modelId = statement.getValue(0).getId();
|
|
249
|
+
const model = imodel2.models.getModel(modelId);
|
|
250
|
+
assert.exists(model, "Model should exist");
|
|
251
|
+
assert.isTrue(model instanceof Model);
|
|
252
|
+
// should be an element with the same Id.
|
|
253
|
+
const modeledElement = imodel2.elements.getElement(modelId);
|
|
254
|
+
assert.exists(modeledElement, "Modeled Element should exist");
|
|
255
|
+
if (model.className === "LinkModel") {
|
|
256
|
+
// expect LinkModel to be accompanied by LinkPartition
|
|
257
|
+
assert.isTrue(modeledElement instanceof LinkPartition);
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
else if (model.className === "DictionaryModel") {
|
|
261
|
+
assert.isTrue(modeledElement instanceof DefinitionPartition);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
else if (model.className === "PhysicalModel") {
|
|
265
|
+
assert.isTrue(modeledElement instanceof PhysicalPartition);
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
else if (model.className === "GroupModel") {
|
|
269
|
+
assert.isTrue(modeledElement instanceof GroupInformationPartition);
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
else if (model.className === "DocumentListModel") {
|
|
273
|
+
assert.isTrue(modeledElement instanceof DocumentPartition);
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
else if (model.className === "DefinitionModel") {
|
|
277
|
+
assert.isTrue(modeledElement instanceof DefinitionPartition);
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
assert.isTrue(false, "Expected a known model type");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
assert.isAtLeast(numModels, 1, "Expected query to find some Models");
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
it("update the project extents", async () => {
|
|
288
|
+
const imodel1 = trackMutableIModel(await importTestBim(createIModelFromSeed("models-project-extents.bim", "test.bim")));
|
|
289
|
+
const originalExtents = imodel1.projectExtents;
|
|
290
|
+
const newExtents = Range3d.create(originalExtents.low, originalExtents.high);
|
|
291
|
+
newExtents.low.x -= 50;
|
|
292
|
+
newExtents.low.y -= 25;
|
|
293
|
+
newExtents.low.z -= 189;
|
|
294
|
+
newExtents.high.x += 1087;
|
|
295
|
+
newExtents.high.y += 19;
|
|
296
|
+
newExtents.high.z += .001;
|
|
297
|
+
await withEditTxn(imodel1, async (txn) => txn.updateProjectExtents(newExtents));
|
|
298
|
+
const updatedProps = imodel1[_nativeDb].getIModelProps();
|
|
299
|
+
assert.isTrue(updatedProps.hasOwnProperty("projectExtents"), "Returned property JSON object has project extents");
|
|
300
|
+
const updatedExtents = Range3d.fromJSON(updatedProps.projectExtents);
|
|
301
|
+
assert.isTrue(newExtents.isAlmostEqual(updatedExtents), "Project extents successfully updated in database");
|
|
302
|
+
});
|
|
303
|
+
it("should do CRUD on models", () => {
|
|
304
|
+
const testImodel = trackMutableIModel(createIModelFromSeed("models-CRUD-CompatibilityTestSeed.bim", "CompatibilityTestSeed.bim"));
|
|
305
|
+
const txn = new EditTxn(testImodel, "CRUD on models");
|
|
306
|
+
txn.start();
|
|
307
|
+
const [modeledElementId, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(txn, Code.createEmpty(), true);
|
|
308
|
+
const newModelPersist = testImodel.models.getModel(newModelId);
|
|
309
|
+
// Check that it has the properties that we set.
|
|
310
|
+
assert.equal(newModelPersist.classFullName, PhysicalModel.classFullName);
|
|
311
|
+
assert.isTrue(newModelPersist.isPrivate);
|
|
312
|
+
assert.deepEqual(newModelPersist.modeledElement.id, modeledElementId);
|
|
313
|
+
// Update the model
|
|
314
|
+
newModelPersist.isPrivate = false;
|
|
315
|
+
txn.updateModel(newModelPersist.toJSON());
|
|
316
|
+
// ... and check that it updated the model in the db
|
|
317
|
+
const newModelPersist2 = testImodel.models.getModel(newModelId);
|
|
318
|
+
assert.isFalse(newModelPersist2.isPrivate);
|
|
319
|
+
// Delete the model
|
|
320
|
+
txn.deleteModel(newModelId);
|
|
321
|
+
// Test insertModel error handling
|
|
322
|
+
try {
|
|
323
|
+
txn.insertModel({
|
|
324
|
+
classFullName: DefinitionModel.classFullName,
|
|
325
|
+
modeledElement: { id: "0x10000000bad" },
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
assert.isTrue(error instanceof IModelError || error.iTwinErrorId !== undefined);
|
|
330
|
+
}
|
|
331
|
+
txn.end();
|
|
332
|
+
});
|
|
333
|
+
it("should insert DefinitionSets", () => {
|
|
334
|
+
const iModelFileName = IModelTestUtils.prepareOutputFile("IModel", "DefinitionSets.bim");
|
|
335
|
+
const iModelDb = SnapshotDb.createEmpty(iModelFileName, { rootSubject: { name: "DefinitionSets" }, createClassViews: true });
|
|
336
|
+
const txn = new EditTxn(iModelDb, "definition sets");
|
|
337
|
+
txn.start();
|
|
338
|
+
const definitionContainerId = DefinitionContainer.insert(txn, IModel.dictionaryId, Code.createEmpty());
|
|
339
|
+
assert.exists(iModelDb.elements.getElement(definitionContainerId));
|
|
340
|
+
assert.exists(iModelDb.models.getModel(definitionContainerId));
|
|
341
|
+
const categoryId1 = SpatialCategory.insert(txn, definitionContainerId, "Category1", new SubCategoryAppearance());
|
|
342
|
+
const categoryId2 = SpatialCategory.insert(txn, definitionContainerId, "Category2", new SubCategoryAppearance());
|
|
343
|
+
const categoryId3 = SpatialCategory.insert(txn, definitionContainerId, "Category3", new SubCategoryAppearance());
|
|
344
|
+
const definitionGroupId = DefinitionGroup.create(iModelDb, definitionContainerId, Code.createEmpty()).insert(txn);
|
|
345
|
+
DefinitionGroupGroupsDefinitions.insert(txn, definitionGroupId, categoryId1);
|
|
346
|
+
DefinitionGroupGroupsDefinitions.insert(txn, definitionGroupId, categoryId2);
|
|
347
|
+
DefinitionGroupGroupsDefinitions.insert(txn, definitionGroupId, categoryId3);
|
|
348
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
349
|
+
const numMembers = iModelDb.withPreparedStatement(`SELECT COUNT(*) FROM ${DefinitionGroupGroupsDefinitions.classFullName}`, (statement) => {
|
|
350
|
+
return statement.step() === DbResult.BE_SQLITE_ROW ? statement.getValue(0).getInteger() : 0;
|
|
351
|
+
});
|
|
352
|
+
assert.equal(numMembers, 3);
|
|
353
|
+
txn.end();
|
|
354
|
+
iModelDb.close();
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
//# sourceMappingURL=IModelModels.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelModels.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModelModels.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert, expect } from \"chai\";\r\nimport { DbResult, Id64, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { AxisAlignedBox3d, Code, IModel, IModelError, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\r\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\r\nimport {\r\n _nativeDb, Category, ClassRegistry, DefinitionContainer, DefinitionGroup, DefinitionGroupGroupsDefinitions,\r\n DefinitionModel, DefinitionPartition, DocumentPartition, DrawingGraphic, ECSqlStatement, Element, GeometricElement2d,\r\n GroupInformationPartition, LinkPartition, Model, PhysicalModel, PhysicalPartition, SnapshotDb, SpatialCategory, SubCategory,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { DisableNativeAssertions, TestUtils } from \"../TestUtils\";\r\nimport { closeIfOpen, createIModelFromSeed, createMutableIModelTracker, expectIModelError, getIModelError, importTestBim, openReadonlySeedCopy, roundtripThroughJson } from \"./IModelTestFixtures\";\r\n\r\n\r\ndescribe(\"iModel models\", () => {\r\n let testBimReadonly: SnapshotDb;\r\n let compatibilityReadonly: SnapshotDb;\r\n const { trackMutableIModel, closeTrackedIModels } = createMutableIModelTracker();\r\n\r\n before(async () => {\r\n await TestUtils.startBackend();\r\n IModelTestUtils.registerTestBimSchema();\r\n\r\n testBimReadonly = await openReadonlySeedCopy(\"models-test.bim\", \"test.bim\", { importTestBim: true });\r\n compatibilityReadonly = await openReadonlySeedCopy(\"models-CompatibilityTestSeed.bim\", \"CompatibilityTestSeed.bim\");\r\n });\r\n\r\n after(() => {\r\n closeIfOpen(testBimReadonly, compatibilityReadonly);\r\n closeTrackedIModels();\r\n });\r\n\r\n afterEach(() => {\r\n closeTrackedIModels();\r\n });\r\n\r\n it(\"should load a known model by Id from an existing iModel\", () => {\r\n const imodel1 = testBimReadonly;\r\n assert.exists(imodel1.models);\r\n const model2 = imodel1.models.getModel(\"0x1c\");\r\n assert.exists(model2);\r\n const formatter = model2.getJsonProperty(\"formatter\");\r\n assert.exists(formatter, \"formatter should exist as json property\");\r\n assert.equal(formatter.fmtFlags.angMode, 1, \"fmtFlags\");\r\n assert.equal(formatter.mastUnit.label, \"m\", \"mastUnit is meters\");\r\n roundtripThroughJson(model2);\r\n let model = imodel1.models.getModel(IModel.repositoryModelId);\r\n assert.exists(model);\r\n roundtripThroughJson(model);\r\n const code1 = new Code({ spec: \"0x1d\", scope: \"0x1d\", value: \"A\" });\r\n model = imodel1.models.getSubModel(code1);\r\n // By this point, we expect the submodel's class to be in the class registry *cache*\r\n const geomModel = ClassRegistry.getClass(PhysicalModel.classFullName, imodel1);\r\n assert.exists(model);\r\n assert.isTrue(model instanceof geomModel);\r\n roundtripThroughJson(model);\r\n const modelExtents: AxisAlignedBox3d = (model as PhysicalModel).queryExtents();\r\n\r\n assert.isBelow(modelExtents.low.x, modelExtents.high.x);\r\n assert.isBelow(modelExtents.low.y, modelExtents.high.y);\r\n assert.isBelow(modelExtents.low.z, modelExtents.high.z);\r\n });\r\n\r\n it(\"should find a tile tree for a geometric model\", async () => {\r\n const imodel1 = testBimReadonly;\r\n // Note: this is an empty model.\r\n const tree = await imodel1.tiles.requestTileTreeProps(\"0x1c\");\r\n expect(tree).not.to.be.undefined;\r\n\r\n expect(tree.id).to.equal(\"0x1c\");\r\n expect(tree.maxTilesToSkip).to.equal(1);\r\n expect(tree.rootTile).not.to.be.undefined;\r\n\r\n // Empty model => identity transform\r\n const tf = Transform.fromJSON(tree.location);\r\n expect(tf.matrix.isIdentity).to.be.true;\r\n expect(tf.origin.x).to.equal(0);\r\n expect(tf.origin.y).to.equal(0);\r\n expect(tf.origin.z).to.equal(0);\r\n\r\n expect(tree.rootTile.contentId).to.equal(\"0/0/0/0/1\");\r\n\r\n // Empty model => null range\r\n const range = Range3d.fromJSON(tree.rootTile.range);\r\n expect(range.isNull).to.be.true;\r\n\r\n expect(tree.rootTile.maximumSize).to.equal(0.0); // empty model => undisplayable root tile => size = 0.0\r\n expect(tree.rootTile.isLeaf).to.be.true; // empty model => empty tile\r\n expect(tree.rootTile.contentRange).to.be.undefined;\r\n });\r\n\r\n it(\"should throw on invalid tile requests\", async () => {\r\n const imodel1 = testBimReadonly;\r\n using _r = new DisableNativeAssertions();\r\n let error = await getIModelError(imodel1.tiles.requestTileTreeProps(\"0x12345\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileTreeProps(\"NotAValidId\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"0/0/0/0\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x12345\", \"0/0/0/0/1\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"V/W/X/Y/Z\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"NotAValidId\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n });\r\n\r\n it(\"should be some categories\", () => {\r\n const imodel1 = testBimReadonly;\r\n const categorySql = `SELECT ECInstanceId FROM ${Category.classFullName}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(categorySql, (categoryStatement: ECSqlStatement): void => {\r\n let numCategories = 0;\r\n while (DbResult.BE_SQLITE_ROW === categoryStatement.step()) {\r\n numCategories++;\r\n const categoryId = categoryStatement.getValue(0).getId();\r\n const category: Element = imodel1.elements.getElement(categoryId);\r\n assert.isTrue(category instanceof Category, \"Should be instance of Category\");\r\n\r\n // verify the default subcategory.\r\n const defaultSubCategoryId = (category as Category).myDefaultSubCategoryId();\r\n const defaultSubCategory: Element = imodel1.elements.getElement(defaultSubCategoryId);\r\n assert.isTrue(defaultSubCategory instanceof SubCategory, \"defaultSubCategory should be instance of SubCategory\");\r\n if (defaultSubCategory instanceof SubCategory) {\r\n assert.isTrue(defaultSubCategory.parent!.id === categoryId, \"defaultSubCategory id should be prescribed value\");\r\n assert.isTrue(defaultSubCategory.getSubCategoryName() === category.code.value, \"DefaultSubcategory name should match that of Category\");\r\n assert.isTrue(defaultSubCategory.isDefaultSubCategory, \"isDefaultSubCategory should return true\");\r\n }\r\n\r\n // get the subcategories\r\n const subCategorySql = `SELECT ECInstanceId FROM ${SubCategory.classFullName} WHERE Parent.Id=:parentId`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(subCategorySql, (subCategoryStatement: ECSqlStatement): void => {\r\n let numSubCategories = 0;\r\n subCategoryStatement.bindId(\"parentId\", categoryId);\r\n while (DbResult.BE_SQLITE_ROW === subCategoryStatement.step()) {\r\n numSubCategories++;\r\n const subCategoryId = subCategoryStatement.getValue(0).getId();\r\n const subCategory: Element = imodel1.elements.getElement(subCategoryId);\r\n assert.isTrue(subCategory instanceof SubCategory);\r\n assert.isTrue(subCategory.parent!.id === categoryId);\r\n }\r\n assert.isAtLeast(numSubCategories, 1, \"Expected query to find at least one SubCategory\");\r\n });\r\n }\r\n assert.isAtLeast(numCategories, 1, \"Expected query to find some categories\");\r\n });\r\n });\r\n\r\n it(\"should be some 2d elements\", () => {\r\n const imodel2 = compatibilityReadonly;\r\n const sql = `SELECT ECInstanceId FROM ${DrawingGraphic.classFullName}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(sql, (statement: ECSqlStatement): void => {\r\n let numDrawingGraphics = 0;\r\n let found25: boolean = false;\r\n let found26: boolean = false;\r\n while (DbResult.BE_SQLITE_ROW === statement.step()) {\r\n numDrawingGraphics++;\r\n const drawingGraphicId = statement.getValue(0).getId();\r\n const drawingGraphic = imodel2.elements.getElement<GeometricElement2d>({ id: drawingGraphicId, wantGeometry: true });\r\n assert.exists(drawingGraphic);\r\n assert.isTrue(drawingGraphic.className === \"DrawingGraphic\", \"Should be instance of DrawingGraphic\");\r\n assert.isTrue(drawingGraphic instanceof DrawingGraphic, \"Is instance of DrawingGraphic\");\r\n assert.isTrue(drawingGraphic instanceof GeometricElement2d, \"Is instance of GeometricElement2d\");\r\n if (Id64.getLocalId(drawingGraphic.id) === 0x25) {\r\n found25 = true;\r\n assert.isTrue(drawingGraphic.placement.origin.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.origin.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.angle.radians === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.x === 1.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.y === 1.0);\r\n assert.isDefined(drawingGraphic.geom);\r\n } else if (Id64.getLocalId(drawingGraphic.id) === 0x26) {\r\n found26 = true;\r\n assert.isTrue(drawingGraphic.placement.origin.x === 1.0);\r\n assert.isTrue(drawingGraphic.placement.origin.y === 1.0);\r\n assert.isTrue(drawingGraphic.placement.angle.radians === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.x === 2.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.y === 2.0);\r\n assert.isDefined(drawingGraphic.geom);\r\n }\r\n }\r\n assert.isAtLeast(numDrawingGraphics, 1, \"Expected query to find some DrawingGraphics\");\r\n assert.isTrue(found25, \"Expected to find a specific element\");\r\n assert.isTrue(found26, \"Expected to find a specific element\");\r\n });\r\n });\r\n\r\n it(\"should be children of RootSubject\", () => {\r\n const imodel2 = compatibilityReadonly;\r\n const sql = `SELECT ECInstanceId FROM ${Model.classFullName} WHERE ParentModel.Id=:parentModelId`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(sql, (statement: ECSqlStatement): void => {\r\n statement.bindId(\"parentModelId\", IModel.repositoryModelId);\r\n let numModels = 0;\r\n while (DbResult.BE_SQLITE_ROW === statement.step()) {\r\n numModels++;\r\n const modelId = statement.getValue(0).getId();\r\n const model = imodel2.models.getModel(modelId);\r\n assert.exists(model, \"Model should exist\");\r\n assert.isTrue(model instanceof Model);\r\n\r\n // should be an element with the same Id.\r\n const modeledElement = imodel2.elements.getElement(modelId);\r\n assert.exists(modeledElement, \"Modeled Element should exist\");\r\n\r\n if (model.className === \"LinkModel\") {\r\n // expect LinkModel to be accompanied by LinkPartition\r\n assert.isTrue(modeledElement instanceof LinkPartition);\r\n continue;\r\n } else if (model.className === \"DictionaryModel\") {\r\n assert.isTrue(modeledElement instanceof DefinitionPartition);\r\n continue;\r\n } else if (model.className === \"PhysicalModel\") {\r\n assert.isTrue(modeledElement instanceof PhysicalPartition);\r\n continue;\r\n } else if (model.className === \"GroupModel\") {\r\n assert.isTrue(modeledElement instanceof GroupInformationPartition);\r\n continue;\r\n } else if (model.className === \"DocumentListModel\") {\r\n assert.isTrue(modeledElement instanceof DocumentPartition);\r\n continue;\r\n } else if (model.className === \"DefinitionModel\") {\r\n assert.isTrue(modeledElement instanceof DefinitionPartition);\r\n continue;\r\n } else {\r\n assert.isTrue(false, \"Expected a known model type\");\r\n }\r\n }\r\n assert.isAtLeast(numModels, 1, \"Expected query to find some Models\");\r\n });\r\n });\r\n\r\n it(\"update the project extents\", async () => {\r\n const imodel1 = trackMutableIModel(await importTestBim(createIModelFromSeed(\"models-project-extents.bim\", \"test.bim\")));\r\n const originalExtents = imodel1.projectExtents;\r\n const newExtents = Range3d.create(originalExtents.low, originalExtents.high);\r\n newExtents.low.x -= 50;\r\n newExtents.low.y -= 25;\r\n newExtents.low.z -= 189;\r\n newExtents.high.x += 1087;\r\n newExtents.high.y += 19;\r\n newExtents.high.z += .001;\r\n await withEditTxn(imodel1, async (txn) => txn.updateProjectExtents(newExtents));\r\n\r\n const updatedProps = imodel1[_nativeDb].getIModelProps();\r\n assert.isTrue(updatedProps.hasOwnProperty(\"projectExtents\"), \"Returned property JSON object has project extents\");\r\n const updatedExtents = Range3d.fromJSON(updatedProps.projectExtents);\r\n assert.isTrue(newExtents.isAlmostEqual(updatedExtents), \"Project extents successfully updated in database\");\r\n });\r\n\r\n it(\"should do CRUD on models\", () => {\r\n\r\n const testImodel = trackMutableIModel(createIModelFromSeed(\"models-CRUD-CompatibilityTestSeed.bim\", \"CompatibilityTestSeed.bim\"));\r\n const txn = new EditTxn(testImodel, \"CRUD on models\");\r\n txn.start();\r\n\r\n const [modeledElementId, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(txn, Code.createEmpty(), true);\r\n\r\n const newModelPersist = testImodel.models.getModel(newModelId);\r\n\r\n // Check that it has the properties that we set.\r\n assert.equal(newModelPersist.classFullName, PhysicalModel.classFullName);\r\n assert.isTrue(newModelPersist.isPrivate);\r\n assert.deepEqual(newModelPersist.modeledElement.id, modeledElementId);\r\n\r\n // Update the model\r\n newModelPersist.isPrivate = false;\r\n txn.updateModel(newModelPersist.toJSON());\r\n // ... and check that it updated the model in the db\r\n const newModelPersist2 = testImodel.models.getModel(newModelId);\r\n assert.isFalse(newModelPersist2.isPrivate);\r\n\r\n // Delete the model\r\n txn.deleteModel(newModelId);\r\n\r\n // Test insertModel error handling\r\n try {\r\n txn.insertModel({\r\n classFullName: DefinitionModel.classFullName,\r\n modeledElement: { id: \"0x10000000bad\" },\r\n });\r\n } catch (error: any) {\r\n assert.isTrue(error instanceof IModelError || error.iTwinErrorId !== undefined);\r\n }\r\n\r\n txn.end();\r\n\r\n });\r\n\r\n it(\"should insert DefinitionSets\", () => {\r\n const iModelFileName: string = IModelTestUtils.prepareOutputFile(\"IModel\", \"DefinitionSets.bim\");\r\n const iModelDb = SnapshotDb.createEmpty(iModelFileName, { rootSubject: { name: \"DefinitionSets\" }, createClassViews: true });\r\n const txn = new EditTxn(iModelDb, \"definition sets\");\r\n txn.start();\r\n const definitionContainerId = DefinitionContainer.insert(txn, IModel.dictionaryId, Code.createEmpty());\r\n assert.exists(iModelDb.elements.getElement<DefinitionContainer>(definitionContainerId));\r\n assert.exists(iModelDb.models.getModel<DefinitionModel>(definitionContainerId));\r\n const categoryId1 = SpatialCategory.insert(txn, definitionContainerId, \"Category1\", new SubCategoryAppearance());\r\n const categoryId2 = SpatialCategory.insert(txn, definitionContainerId, \"Category2\", new SubCategoryAppearance());\r\n const categoryId3 = SpatialCategory.insert(txn, definitionContainerId, \"Category3\", new SubCategoryAppearance());\r\n const definitionGroupId = DefinitionGroup.create(iModelDb, definitionContainerId, Code.createEmpty()).insert(txn);\r\n DefinitionGroupGroupsDefinitions.insert(txn, definitionGroupId, categoryId1);\r\n DefinitionGroupGroupsDefinitions.insert(txn, definitionGroupId, categoryId2);\r\n DefinitionGroupGroupsDefinitions.insert(txn, definitionGroupId, categoryId3);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const numMembers = iModelDb.withPreparedStatement(`SELECT COUNT(*) FROM ${DefinitionGroupGroupsDefinitions.classFullName}`, (statement: ECSqlStatement): number => {\r\n return statement.step() === DbResult.BE_SQLITE_ROW ? statement.getValue(0).getInteger() : 0;\r\n });\r\n assert.equal(numMembers, 3);\r\n txn.end();\r\n iModelDb.close();\r\n });\r\n});\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelRelationships.test.d.ts","sourceRoot":"","sources":["../../../../src/test/imodel/IModelRelationships.test.ts"],"names":[],"mappings":""}
|