@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,107 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { assert, expect } from "chai";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import { IModelError } from "@itwin/core-common";
|
|
8
|
+
import { SnapshotDb } from "../../core-backend";
|
|
9
|
+
import { KnownTestLocations } from "../KnownTestLocations";
|
|
10
|
+
import { IModelTestUtils } from "../IModelTestUtils";
|
|
11
|
+
/**
|
|
12
|
+
* Awaits `promise` and returns the {@link IModelError} it rejected with, or `undefined` if it resolved.
|
|
13
|
+
*
|
|
14
|
+
* A rejection that is not an {@link IModelError} is rethrown rather than swallowed, so an unexpected
|
|
15
|
+
* failure surfaces with its original message and stack trace instead of being misreported as
|
|
16
|
+
* "no error was thrown". This means `undefined` unambiguously means the promise resolved.
|
|
17
|
+
*/
|
|
18
|
+
export async function getIModelError(promise) {
|
|
19
|
+
try {
|
|
20
|
+
await promise;
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
if (err instanceof IModelError)
|
|
25
|
+
return err;
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Asserts that `error` is an {@link IModelError} carrying the expected error number. */
|
|
30
|
+
export function expectIModelError(expectedErrorNumber, error) {
|
|
31
|
+
if (error === undefined)
|
|
32
|
+
expect.fail(`Expected an IModelError with errorNumber ${expectedErrorNumber}, but the call resolved without throwing.`);
|
|
33
|
+
expect(error.errorNumber).to.equal(expectedErrorNumber);
|
|
34
|
+
}
|
|
35
|
+
/** Roundtrip an entity through a JSON string and back to a new entity, asserting the serialization is stable. */
|
|
36
|
+
export function roundtripThroughJson(entity1) {
|
|
37
|
+
const string1 = JSON.stringify(entity1);
|
|
38
|
+
const props1 = JSON.parse(string1);
|
|
39
|
+
const entity2 = new entity1.constructor(props1, entity1.iModel); // create a new entity from the EntityProps
|
|
40
|
+
const string2 = JSON.stringify(entity2);
|
|
41
|
+
assert.equal(string1, string2);
|
|
42
|
+
return entity2;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a fresh writable snapshot copied from a seed asset. This is the single creation path for
|
|
46
|
+
* mutating tests (hybrid isolation) so state never leaks between tests. Compose with
|
|
47
|
+
* {@link importTestBim} when the test also needs the `TestBim` schema.
|
|
48
|
+
*/
|
|
49
|
+
export function createIModelFromSeed(targetFileName, seedAssetName) {
|
|
50
|
+
const seedFile = IModelTestUtils.resolveAssetFile(seedAssetName);
|
|
51
|
+
const snapshotFile = IModelTestUtils.prepareOutputFile("IModel", targetFileName);
|
|
52
|
+
return IModelTestUtils.createSnapshotFromSeed(snapshotFile, seedFile);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Import the `TestBim` schema into `imodel` and return it, so this can wrap a creation call:
|
|
56
|
+
* `await importTestBim(createIModelFromSeed(target, seed))`.
|
|
57
|
+
*/
|
|
58
|
+
export async function importTestBim(imodel) {
|
|
59
|
+
const schemaPathname = path.join(KnownTestLocations.assetsDir, "TestBim.ecschema.xml");
|
|
60
|
+
await imodel.importSchemas([schemaPathname]);
|
|
61
|
+
return imodel;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a fresh writable copy from a seed asset, close it, and reopen it read-only.
|
|
65
|
+
*
|
|
66
|
+
* This is the canonical way to build a shared, per-file read-only fixture under the hybrid
|
|
67
|
+
* isolation policy: the read-only handle can be shared safely across tests in a file because
|
|
68
|
+
* nothing can mutate it, while each mutating test still gets its own writable copy elsewhere.
|
|
69
|
+
* When `importTestBim` is set, the `TestBim` schema is imported into the writable copy before
|
|
70
|
+
* it is reopened read-only.
|
|
71
|
+
*/
|
|
72
|
+
export async function openReadonlySeedCopy(targetFileName, seedAssetName, opts) {
|
|
73
|
+
const writable = createIModelFromSeed(targetFileName, seedAssetName);
|
|
74
|
+
if (opts?.importTestBim)
|
|
75
|
+
await importTestBim(writable);
|
|
76
|
+
const pathName = writable.pathName;
|
|
77
|
+
writable.close();
|
|
78
|
+
return SnapshotDb.openFile(pathName);
|
|
79
|
+
}
|
|
80
|
+
/** Close each provided database that is still open. Guards against `undefined` and already-closed handles. */
|
|
81
|
+
export function closeIfOpen(...dbs) {
|
|
82
|
+
for (const db of dbs) {
|
|
83
|
+
if (db !== undefined && db.isOpen)
|
|
84
|
+
db.close();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Create a tracker for the writable iModels a test file opens, so they are all closed during teardown.
|
|
89
|
+
*
|
|
90
|
+
* This is the mechanism that enforces the hybrid isolation policy for mutating tests: each test wraps
|
|
91
|
+
* its freshly-created writable copy in `trackMutableIModel(...)`, and the file's `afterEach`/`after`
|
|
92
|
+
* calls `closeTrackedIModels()` to close and forget them. `closeTrackedIModels` is idempotent, so it is
|
|
93
|
+
* safe to call from both hooks.
|
|
94
|
+
*/
|
|
95
|
+
export function createMutableIModelTracker() {
|
|
96
|
+
const tracked = [];
|
|
97
|
+
return {
|
|
98
|
+
trackMutableIModel: (imodel) => {
|
|
99
|
+
tracked.push(imodel);
|
|
100
|
+
return imodel;
|
|
101
|
+
},
|
|
102
|
+
closeTrackedIModels: () => {
|
|
103
|
+
closeIfOpen(...tracked.splice(0));
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=IModelTestFixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelTestFixtures.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModelTestFixtures.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 * as path from \"node:path\";\r\nimport { DbResult, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { EntityProps, IModelError } from \"@itwin/core-common\";\r\nimport { Entity, IModelDb, SnapshotDb } from \"../../core-backend\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\n\r\n/**\r\n * Awaits `promise` and returns the {@link IModelError} it rejected with, or `undefined` if it resolved.\r\n *\r\n * A rejection that is not an {@link IModelError} is rethrown rather than swallowed, so an unexpected\r\n * failure surfaces with its original message and stack trace instead of being misreported as\r\n * \"no error was thrown\". This means `undefined` unambiguously means the promise resolved.\r\n */\r\nexport async function getIModelError<T>(promise: Promise<T>): Promise<IModelError | undefined> {\r\n try {\r\n await promise;\r\n return undefined;\r\n } catch (err) {\r\n if (err instanceof IModelError)\r\n return err;\r\n throw err;\r\n }\r\n}\r\n\r\n/** Asserts that `error` is an {@link IModelError} carrying the expected error number. */\r\nexport function expectIModelError(expectedErrorNumber: IModelStatus | DbResult, error: IModelError | undefined): void {\r\n if (error === undefined)\r\n expect.fail(`Expected an IModelError with errorNumber ${expectedErrorNumber}, but the call resolved without throwing.`);\r\n expect(error.errorNumber).to.equal(expectedErrorNumber);\r\n}\r\n\r\n/** Roundtrip an entity through a JSON string and back to a new entity, asserting the serialization is stable. */\r\nexport function roundtripThroughJson(entity1: Entity): Entity {\r\n const string1 = JSON.stringify(entity1);\r\n const props1 = JSON.parse(string1) as EntityProps;\r\n const entity2 = new (entity1.constructor as any)(props1, entity1.iModel); // create a new entity from the EntityProps\r\n const string2 = JSON.stringify(entity2);\r\n assert.equal(string1, string2);\r\n return entity2;\r\n}\r\n\r\n/**\r\n * Create a fresh writable snapshot copied from a seed asset. This is the single creation path for\r\n * mutating tests (hybrid isolation) so state never leaks between tests. Compose with\r\n * {@link importTestBim} when the test also needs the `TestBim` schema.\r\n */\r\nexport function createIModelFromSeed(targetFileName: string, seedAssetName: string): SnapshotDb {\r\n const seedFile = IModelTestUtils.resolveAssetFile(seedAssetName);\r\n const snapshotFile = IModelTestUtils.prepareOutputFile(\"IModel\", targetFileName);\r\n return IModelTestUtils.createSnapshotFromSeed(snapshotFile, seedFile);\r\n}\r\n\r\n/**\r\n * Import the `TestBim` schema into `imodel` and return it, so this can wrap a creation call:\r\n * `await importTestBim(createIModelFromSeed(target, seed))`.\r\n */\r\nexport async function importTestBim<T extends SnapshotDb>(imodel: T): Promise<T> {\r\n const schemaPathname = path.join(KnownTestLocations.assetsDir, \"TestBim.ecschema.xml\");\r\n await imodel.importSchemas([schemaPathname]);\r\n return imodel;\r\n}\r\n\r\n/**\r\n * Create a fresh writable copy from a seed asset, close it, and reopen it read-only.\r\n *\r\n * This is the canonical way to build a shared, per-file read-only fixture under the hybrid\r\n * isolation policy: the read-only handle can be shared safely across tests in a file because\r\n * nothing can mutate it, while each mutating test still gets its own writable copy elsewhere.\r\n * When `importTestBim` is set, the `TestBim` schema is imported into the writable copy before\r\n * it is reopened read-only.\r\n */\r\nexport async function openReadonlySeedCopy(targetFileName: string, seedAssetName: string, opts?: { importTestBim?: boolean }): Promise<SnapshotDb> {\r\n const writable = createIModelFromSeed(targetFileName, seedAssetName);\r\n if (opts?.importTestBim)\r\n await importTestBim(writable);\r\n const pathName = writable.pathName;\r\n writable.close();\r\n return SnapshotDb.openFile(pathName);\r\n}\r\n\r\n/** Close each provided database that is still open. Guards against `undefined` and already-closed handles. */\r\nexport function closeIfOpen(...dbs: Array<IModelDb | undefined>): void {\r\n for (const db of dbs) {\r\n if (db !== undefined && db.isOpen)\r\n db.close();\r\n }\r\n}\r\n\r\n/**\r\n * Create a tracker for the writable iModels a test file opens, so they are all closed during teardown.\r\n *\r\n * This is the mechanism that enforces the hybrid isolation policy for mutating tests: each test wraps\r\n * its freshly-created writable copy in `trackMutableIModel(...)`, and the file's `afterEach`/`after`\r\n * calls `closeTrackedIModels()` to close and forget them. `closeTrackedIModels` is idempotent, so it is\r\n * safe to call from both hooks.\r\n */\r\nexport function createMutableIModelTracker(): {\r\n trackMutableIModel: <T extends IModelDb>(imodel: T) => T;\r\n closeTrackedIModels: () => void;\r\n} {\r\n const tracked: IModelDb[] = [];\r\n return {\r\n trackMutableIModel: (imodel) => {\r\n tracked.push(imodel);\r\n return imodel;\r\n },\r\n closeTrackedIModels: () => {\r\n closeIfOpen(...tracked.splice(0));\r\n },\r\n };\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelViews.test.d.ts","sourceRoot":"","sources":["../../../../src/test/imodel/IModelViews.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { assert, expect } from "chai";
|
|
6
|
+
import { BisCodeSpec, ColorDef, DisplayStyleSettings, IModel, RenderMode, ViewFlags, } from "@itwin/core-common";
|
|
7
|
+
import { EditTxn, withEditTxn } from "../../EditTxn";
|
|
8
|
+
import { DisplayStyle3d, IModelDb } from "../../core-backend";
|
|
9
|
+
import { IModelTestUtils } from "../IModelTestUtils";
|
|
10
|
+
import { TestUtils } from "../TestUtils";
|
|
11
|
+
import { closeIfOpen, createIModelFromSeed, createMutableIModelTracker, openReadonlySeedCopy } from "./IModelTestFixtures";
|
|
12
|
+
describe("iModel views", () => {
|
|
13
|
+
let compatibilityReadonly;
|
|
14
|
+
const { trackMutableIModel, closeTrackedIModels } = createMutableIModelTracker();
|
|
15
|
+
before(async () => {
|
|
16
|
+
await TestUtils.startBackend();
|
|
17
|
+
IModelTestUtils.registerTestBimSchema();
|
|
18
|
+
compatibilityReadonly = await openReadonlySeedCopy("views-CompatibilityTestSeed.bim", "CompatibilityTestSeed.bim");
|
|
19
|
+
});
|
|
20
|
+
after(() => {
|
|
21
|
+
closeIfOpen(compatibilityReadonly);
|
|
22
|
+
closeTrackedIModels();
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
closeTrackedIModels();
|
|
26
|
+
});
|
|
27
|
+
it("should insert a DisplayStyle", () => {
|
|
28
|
+
const imodel2 = trackMutableIModel(createIModelFromSeed("views-insert-display-style.bim", "CompatibilityTestSeed.bim"));
|
|
29
|
+
const model = imodel2.models.getModel(IModel.dictionaryId);
|
|
30
|
+
expect(model).not.to.be.undefined;
|
|
31
|
+
const settings = {
|
|
32
|
+
backgroundColor: ColorDef.blue.toJSON(),
|
|
33
|
+
viewflags: ViewFlags.fromJSON({
|
|
34
|
+
renderMode: RenderMode.SolidFill,
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
const props = {
|
|
38
|
+
classFullName: DisplayStyle3d.classFullName,
|
|
39
|
+
model: IModel.dictionaryId,
|
|
40
|
+
code: { spec: BisCodeSpec.displayStyle, scope: IModel.dictionaryId, value: "test style" },
|
|
41
|
+
isPrivate: false,
|
|
42
|
+
jsonProperties: {
|
|
43
|
+
styles: settings,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
const txn = new EditTxn(imodel2, "insert and update DisplayStyle");
|
|
47
|
+
txn.start();
|
|
48
|
+
const styleId = txn.insertElement(props);
|
|
49
|
+
let style = imodel2.elements.getElement(styleId);
|
|
50
|
+
expect(style instanceof DisplayStyle3d).to.be.true;
|
|
51
|
+
expect(style.code.spec).equal(imodel2.codeSpecs.getByName(BisCodeSpec.displayStyle).id);
|
|
52
|
+
expect(style.settings.viewFlags.renderMode).to.equal(RenderMode.SolidFill);
|
|
53
|
+
expect(style.settings.backgroundColor.equals(ColorDef.blue)).to.be.true;
|
|
54
|
+
const newFlags = style.settings.viewFlags.copy({ renderMode: RenderMode.SmoothShade });
|
|
55
|
+
style.settings.viewFlags = newFlags;
|
|
56
|
+
style.settings.backgroundColor = ColorDef.red;
|
|
57
|
+
style.settings.monochromeColor = ColorDef.green;
|
|
58
|
+
expect(style.jsonProperties.styles.viewflags.renderMode).to.equal(RenderMode.SmoothShade);
|
|
59
|
+
txn.updateElement(style.toJSON());
|
|
60
|
+
txn.end();
|
|
61
|
+
style = imodel2.elements.getElement(styleId);
|
|
62
|
+
expect(style instanceof DisplayStyle3d).to.be.true;
|
|
63
|
+
expect(style.settings.viewFlags.renderMode).to.equal(RenderMode.SmoothShade);
|
|
64
|
+
expect(style.settings.backgroundColor.equals(ColorDef.red)).to.be.true;
|
|
65
|
+
expect(style.settings.monochromeColor.equals(ColorDef.green)).to.be.true;
|
|
66
|
+
});
|
|
67
|
+
it("should create display styles", () => {
|
|
68
|
+
const imodel2 = trackMutableIModel(createIModelFromSeed("views-create-display-styles.bim", "CompatibilityTestSeed.bim"));
|
|
69
|
+
const defaultViewFlags = new ViewFlags().toJSON();
|
|
70
|
+
const defaultMapImagery = new DisplayStyleSettings({}).toJSON().mapImagery;
|
|
71
|
+
const viewFlags = new ViewFlags({ patterns: false, visibleEdges: true });
|
|
72
|
+
const viewflags = { noWhiteOnWhiteReversal: true, shadows: true, noTransp: true };
|
|
73
|
+
const mapImagery = {
|
|
74
|
+
backgroundBase: ColorDef.red.tbgr,
|
|
75
|
+
backgroundLayers: [{
|
|
76
|
+
name: "x",
|
|
77
|
+
url: "y",
|
|
78
|
+
transparency: 0.5,
|
|
79
|
+
formatId: "WMS",
|
|
80
|
+
visible: true,
|
|
81
|
+
}],
|
|
82
|
+
};
|
|
83
|
+
const props = {
|
|
84
|
+
mapImagery,
|
|
85
|
+
excludedElements: ["0x123", "0xfed"],
|
|
86
|
+
timePoint: 42,
|
|
87
|
+
backgroundColor: ColorDef.green.tbgr,
|
|
88
|
+
};
|
|
89
|
+
const testCases = [
|
|
90
|
+
[undefined, defaultViewFlags, false],
|
|
91
|
+
[{ viewFlags }, viewFlags.toJSON(), false],
|
|
92
|
+
[{ viewflags }, viewflags, false],
|
|
93
|
+
[{ viewflags, viewFlags }, viewFlags.toJSON(), false],
|
|
94
|
+
[props, defaultViewFlags, false],
|
|
95
|
+
[{ ...props, viewflags }, viewflags, false],
|
|
96
|
+
[{ backgroundColor: ColorDef.blue }, defaultViewFlags, false],
|
|
97
|
+
[{ backgroundColor: ColorDef.from(1, 2, 3, 4) }, defaultViewFlags, false],
|
|
98
|
+
[{ backgroundColor: ColorDef.blue.tbgr }, defaultViewFlags, false],
|
|
99
|
+
[{ backgroundColor: ColorDef.from(1, 2, 3, 4).tbgr }, defaultViewFlags, false],
|
|
100
|
+
];
|
|
101
|
+
let suffix = 123;
|
|
102
|
+
withEditTxn(imodel2, (txn) => {
|
|
103
|
+
for (const test of testCases) {
|
|
104
|
+
const expected = test[0] ?? {};
|
|
105
|
+
const styleId = DisplayStyle3d.insert(txn, IModel.dictionaryId, `TestStyle${suffix++}`, expected);
|
|
106
|
+
const style = imodel2.elements.getElement(styleId).toJSON();
|
|
107
|
+
expect(style.jsonProperties.styles).not.to.be.undefined;
|
|
108
|
+
expect(style.jsonProperties).not.to.be.undefined;
|
|
109
|
+
expect(style.jsonProperties.styles).not.to.be.undefined;
|
|
110
|
+
const actual = style.jsonProperties.styles;
|
|
111
|
+
expect(actual.viewflags).not.to.be.undefined;
|
|
112
|
+
const expectedVf = ViewFlags.fromJSON(test[1]);
|
|
113
|
+
const actualVf = ViewFlags.fromJSON(actual.viewflags);
|
|
114
|
+
expect(actualVf.toJSON()).to.deep.equal(expectedVf.toJSON());
|
|
115
|
+
const expectedBGColor = expected.backgroundColor instanceof ColorDef ? expected.backgroundColor.toJSON() : expected.backgroundColor;
|
|
116
|
+
expect(actual.backgroundColor).to.equal(expectedBGColor);
|
|
117
|
+
// DisplayStyleSettings constructor always initializes json.mapImagery.
|
|
118
|
+
expect(actual.mapImagery).to.deep.equal(expected.mapImagery ?? defaultMapImagery);
|
|
119
|
+
expect(actual.excludedElements).to.deep.equal(expected.excludedElements);
|
|
120
|
+
expect(actual.timePoint).to.deep.equal(expected.timePoint);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
it("should be able to query for ViewDefinitionProps", () => {
|
|
125
|
+
const imodel2 = compatibilityReadonly;
|
|
126
|
+
const viewDefinitionProps = imodel2.views.queryViewDefinitionProps(); // query for all ViewDefinitions
|
|
127
|
+
assert.isAtLeast(viewDefinitionProps.length, 3);
|
|
128
|
+
assert.isTrue(viewDefinitionProps[0].classFullName.includes("ViewDefinition"));
|
|
129
|
+
assert.isFalse(viewDefinitionProps[1].isPrivate);
|
|
130
|
+
const spatialViewDefinitionProps = imodel2.views.queryViewDefinitionProps("BisCore.SpatialViewDefinition"); // limit query to SpatialViewDefinitions
|
|
131
|
+
assert.isAtLeast(spatialViewDefinitionProps.length, 3);
|
|
132
|
+
assert.exists(spatialViewDefinitionProps[2].modelSelector?.id);
|
|
133
|
+
});
|
|
134
|
+
it("should iterate ViewDefinitions", () => {
|
|
135
|
+
const imodel2 = compatibilityReadonly;
|
|
136
|
+
// imodel2 contains 3 SpatialViewDefinitions and no other views.
|
|
137
|
+
let numViews = 0;
|
|
138
|
+
let result = imodel2.views.iterateViews(IModelDb.Views.defaultQueryParams, (_view) => {
|
|
139
|
+
++numViews;
|
|
140
|
+
return true;
|
|
141
|
+
});
|
|
142
|
+
expect(result).to.be.true;
|
|
143
|
+
expect(numViews).to.equal(3);
|
|
144
|
+
// Query specifically for spatial views
|
|
145
|
+
numViews = 0;
|
|
146
|
+
result = imodel2.views.iterateViews({ from: "BisCore.SpatialViewDefinition" }, (view) => {
|
|
147
|
+
if (view.isSpatialView())
|
|
148
|
+
++numViews;
|
|
149
|
+
return view.isSpatialView();
|
|
150
|
+
});
|
|
151
|
+
expect(result).to.be.true;
|
|
152
|
+
expect(numViews).to.equal(3);
|
|
153
|
+
// Query specifically for 2d views
|
|
154
|
+
numViews = 0;
|
|
155
|
+
result = imodel2.views.iterateViews({ from: "BisCore.ViewDefinition2d" }, (_view) => {
|
|
156
|
+
++numViews;
|
|
157
|
+
return true;
|
|
158
|
+
});
|
|
159
|
+
expect(result).to.be.true;
|
|
160
|
+
expect(numViews).to.equal(0);
|
|
161
|
+
// Terminate iteration on first view
|
|
162
|
+
numViews = 0;
|
|
163
|
+
result = imodel2.views.iterateViews(IModelDb.Views.defaultQueryParams, (_view) => {
|
|
164
|
+
++numViews;
|
|
165
|
+
return false;
|
|
166
|
+
});
|
|
167
|
+
expect(result).to.be.false;
|
|
168
|
+
expect(numViews).to.equal(1);
|
|
169
|
+
});
|
|
170
|
+
it("read view thumbnail", () => {
|
|
171
|
+
const imodel5 = trackMutableIModel(createIModelFromSeed("views-mirukuru-thumbnail.bim", "mirukuru.ibim"));
|
|
172
|
+
const viewId = "0x24";
|
|
173
|
+
const thumbnail = imodel5.views.getThumbnail(viewId);
|
|
174
|
+
assert.exists(thumbnail);
|
|
175
|
+
if (!thumbnail)
|
|
176
|
+
return;
|
|
177
|
+
assert.equal(thumbnail.format, "jpeg");
|
|
178
|
+
assert.equal(thumbnail.height, 768);
|
|
179
|
+
assert.equal(thumbnail.width, 768);
|
|
180
|
+
assert.equal(thumbnail.image.length, 18062);
|
|
181
|
+
thumbnail.width = 100;
|
|
182
|
+
thumbnail.height = 200;
|
|
183
|
+
thumbnail.format = "png";
|
|
184
|
+
thumbnail.image = new Uint8Array(200);
|
|
185
|
+
thumbnail.image.fill(12);
|
|
186
|
+
const stat = imodel5.views.saveThumbnail(viewId, thumbnail);
|
|
187
|
+
assert.equal(stat, 0, "save thumbnail");
|
|
188
|
+
const thumbnail2 = imodel5.views.getThumbnail(viewId);
|
|
189
|
+
assert.exists(thumbnail2);
|
|
190
|
+
if (!thumbnail2)
|
|
191
|
+
return;
|
|
192
|
+
assert.equal(thumbnail2.format, "png");
|
|
193
|
+
assert.equal(thumbnail2.height, 200);
|
|
194
|
+
assert.equal(thumbnail2.width, 100);
|
|
195
|
+
assert.equal(thumbnail2.image.length, 200);
|
|
196
|
+
assert.equal(thumbnail2.image[0], 12);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
//# sourceMappingURL=IModelViews.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelViews.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModelViews.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 {\r\n BisCodeSpec, ColorDef, DisplayStyleProps, DisplayStyleSettings, DisplayStyleSettingsProps, IModel, MapImageryProps,\r\n RenderMode, SpatialViewDefinitionProps, ViewDefinitionProps, ViewFlagProps, ViewFlags,\r\n} from \"@itwin/core-common\";\r\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\r\nimport { DictionaryModel, DisplayStyle3d, DisplayStyleCreationOptions, IModelDb, SnapshotDb, ViewDefinition } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { closeIfOpen, createIModelFromSeed, createMutableIModelTracker, openReadonlySeedCopy } from \"./IModelTestFixtures\";\r\n\r\n\r\ndescribe(\"iModel views\", () => {\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 compatibilityReadonly = await openReadonlySeedCopy(\"views-CompatibilityTestSeed.bim\", \"CompatibilityTestSeed.bim\");\r\n });\r\n\r\n after(() => {\r\n closeIfOpen(compatibilityReadonly);\r\n closeTrackedIModels();\r\n });\r\n\r\n afterEach(() => {\r\n closeTrackedIModels();\r\n });\r\n\r\n it(\"should insert a DisplayStyle\", () => {\r\n const imodel2 = trackMutableIModel(createIModelFromSeed(\"views-insert-display-style.bim\", \"CompatibilityTestSeed.bim\"));\r\n const model = imodel2.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n expect(model).not.to.be.undefined;\r\n\r\n const settings: DisplayStyleSettingsProps = {\r\n backgroundColor: ColorDef.blue.toJSON(),\r\n viewflags: ViewFlags.fromJSON({\r\n renderMode: RenderMode.SolidFill,\r\n }),\r\n };\r\n\r\n const props: DisplayStyleProps = {\r\n classFullName: DisplayStyle3d.classFullName,\r\n model: IModel.dictionaryId,\r\n code: { spec: BisCodeSpec.displayStyle, scope: IModel.dictionaryId, value: \"test style\" },\r\n isPrivate: false,\r\n jsonProperties: {\r\n styles: settings,\r\n },\r\n };\r\n\r\n const txn = new EditTxn(imodel2, \"insert and update DisplayStyle\");\r\n txn.start();\r\n const styleId = txn.insertElement(props);\r\n let style = imodel2.elements.getElement<DisplayStyle3d>(styleId);\r\n expect(style instanceof DisplayStyle3d).to.be.true;\r\n expect(style.code.spec).equal(imodel2.codeSpecs.getByName(BisCodeSpec.displayStyle).id);\r\n\r\n expect(style.settings.viewFlags.renderMode).to.equal(RenderMode.SolidFill);\r\n expect(style.settings.backgroundColor.equals(ColorDef.blue)).to.be.true;\r\n\r\n const newFlags = style.settings.viewFlags.copy({ renderMode: RenderMode.SmoothShade });\r\n style.settings.viewFlags = newFlags;\r\n style.settings.backgroundColor = ColorDef.red;\r\n style.settings.monochromeColor = ColorDef.green;\r\n expect(style.jsonProperties.styles.viewflags.renderMode).to.equal(RenderMode.SmoothShade);\r\n\r\n txn.updateElement(style.toJSON());\r\n txn.end();\r\n style = imodel2.elements.getElement<DisplayStyle3d>(styleId);\r\n expect(style instanceof DisplayStyle3d).to.be.true;\r\n\r\n expect(style.settings.viewFlags.renderMode).to.equal(RenderMode.SmoothShade);\r\n expect(style.settings.backgroundColor.equals(ColorDef.red)).to.be.true;\r\n expect(style.settings.monochromeColor.equals(ColorDef.green)).to.be.true;\r\n });\r\n\r\n it(\"should create display styles\", () => {\r\n const imodel2 = trackMutableIModel(createIModelFromSeed(\"views-create-display-styles.bim\", \"CompatibilityTestSeed.bim\"));\r\n const defaultViewFlags = new ViewFlags().toJSON();\r\n const defaultMapImagery = new DisplayStyleSettings({}).toJSON().mapImagery;\r\n\r\n const viewFlags = new ViewFlags({ patterns: false, visibleEdges: true });\r\n const viewflags: ViewFlagProps = { noWhiteOnWhiteReversal: true, shadows: true, noTransp: true };\r\n\r\n const mapImagery: MapImageryProps = {\r\n backgroundBase: ColorDef.red.tbgr,\r\n backgroundLayers: [{\r\n name: \"x\",\r\n url: \"y\",\r\n transparency: 0.5,\r\n formatId: \"WMS\",\r\n visible: true,\r\n }],\r\n };\r\n\r\n const props: DisplayStyleSettingsProps = {\r\n mapImagery,\r\n excludedElements: [\"0x123\", \"0xfed\"],\r\n timePoint: 42,\r\n backgroundColor: ColorDef.green.tbgr,\r\n };\r\n\r\n type TestCase = [DisplayStyleCreationOptions | undefined, ViewFlagProps, boolean];\r\n const testCases: TestCase[] = [\r\n [undefined, defaultViewFlags, false],\r\n [{ viewFlags }, viewFlags.toJSON(), false],\r\n [{ viewflags }, viewflags, false],\r\n [{ viewflags, viewFlags }, viewFlags.toJSON(), false],\r\n [props, defaultViewFlags, false],\r\n [{ ...props, viewflags }, viewflags, false],\r\n [{ backgroundColor: ColorDef.blue }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.from(1, 2, 3, 4) }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.blue.tbgr }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.from(1, 2, 3, 4).tbgr }, defaultViewFlags, false],\r\n ];\r\n\r\n let suffix = 123;\r\n withEditTxn(imodel2, (txn) => {\r\n for (const test of testCases) {\r\n const expected = test[0] ?? {};\r\n const styleId = DisplayStyle3d.insert(txn, IModel.dictionaryId, `TestStyle${suffix++}`, expected);\r\n const style = imodel2.elements.getElement<DisplayStyle3d>(styleId).toJSON();\r\n expect(style.jsonProperties.styles).not.to.be.undefined;\r\n\r\n expect(style.jsonProperties).not.to.be.undefined;\r\n expect(style.jsonProperties.styles).not.to.be.undefined;\r\n const actual = style.jsonProperties.styles!;\r\n\r\n expect(actual.viewflags).not.to.be.undefined;\r\n const expectedVf = ViewFlags.fromJSON(test[1]);\r\n const actualVf = ViewFlags.fromJSON(actual.viewflags);\r\n expect(actualVf.toJSON()).to.deep.equal(expectedVf.toJSON());\r\n\r\n const expectedBGColor = expected.backgroundColor instanceof ColorDef ? expected.backgroundColor.toJSON() : expected.backgroundColor;\r\n expect(actual.backgroundColor).to.equal(expectedBGColor);\r\n\r\n // DisplayStyleSettings constructor always initializes json.mapImagery.\r\n expect(actual.mapImagery).to.deep.equal(expected.mapImagery ?? defaultMapImagery);\r\n expect(actual.excludedElements).to.deep.equal(expected.excludedElements);\r\n expect(actual.timePoint).to.deep.equal(expected.timePoint);\r\n }\r\n });\r\n });\r\n\r\n it(\"should be able to query for ViewDefinitionProps\", () => {\r\n const imodel2 = compatibilityReadonly;\r\n const viewDefinitionProps: ViewDefinitionProps[] = imodel2.views.queryViewDefinitionProps(); // query for all ViewDefinitions\r\n assert.isAtLeast(viewDefinitionProps.length, 3);\r\n assert.isTrue(viewDefinitionProps[0].classFullName.includes(\"ViewDefinition\"));\r\n assert.isFalse(viewDefinitionProps[1].isPrivate);\r\n\r\n const spatialViewDefinitionProps = imodel2.views.queryViewDefinitionProps(\"BisCore.SpatialViewDefinition\") as SpatialViewDefinitionProps[]; // limit query to SpatialViewDefinitions\r\n assert.isAtLeast(spatialViewDefinitionProps.length, 3);\r\n assert.exists(spatialViewDefinitionProps[2].modelSelector?.id);\r\n });\r\n\r\n it(\"should iterate ViewDefinitions\", () => {\r\n const imodel2 = compatibilityReadonly;\r\n // imodel2 contains 3 SpatialViewDefinitions and no other views.\r\n let numViews = 0;\r\n let result = imodel2.views.iterateViews(IModelDb.Views.defaultQueryParams, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return true;\r\n });\r\n\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(3);\r\n\r\n // Query specifically for spatial views\r\n numViews = 0;\r\n result = imodel2.views.iterateViews({ from: \"BisCore.SpatialViewDefinition\" }, (view: ViewDefinition) => {\r\n if (view.isSpatialView())\r\n ++numViews;\r\n\r\n return view.isSpatialView();\r\n });\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(3);\r\n\r\n // Query specifically for 2d views\r\n numViews = 0;\r\n result = imodel2.views.iterateViews({ from: \"BisCore.ViewDefinition2d\" }, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return true;\r\n });\r\n\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(0);\r\n\r\n // Terminate iteration on first view\r\n numViews = 0;\r\n result = imodel2.views.iterateViews(IModelDb.Views.defaultQueryParams, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return false;\r\n });\r\n\r\n expect(result).to.be.false;\r\n expect(numViews).to.equal(1);\r\n });\r\n\r\n it(\"read view thumbnail\", () => {\r\n const imodel5 = trackMutableIModel(createIModelFromSeed(\"views-mirukuru-thumbnail.bim\", \"mirukuru.ibim\"));\r\n const viewId = \"0x24\";\r\n const thumbnail = imodel5.views.getThumbnail(viewId);\r\n assert.exists(thumbnail);\r\n if (!thumbnail)\r\n return;\r\n assert.equal(thumbnail.format, \"jpeg\");\r\n assert.equal(thumbnail.height, 768);\r\n assert.equal(thumbnail.width, 768);\r\n assert.equal(thumbnail.image.length, 18062);\r\n\r\n thumbnail.width = 100;\r\n thumbnail.height = 200;\r\n thumbnail.format = \"png\";\r\n thumbnail.image = new Uint8Array(200);\r\n thumbnail.image.fill(12);\r\n const stat = imodel5.views.saveThumbnail(viewId, thumbnail);\r\n assert.equal(stat, 0, \"save thumbnail\");\r\n\r\n const thumbnail2 = imodel5.views.getThumbnail(viewId);\r\n assert.exists(thumbnail2);\r\n if (!thumbnail2)\r\n return;\r\n assert.equal(thumbnail2.format, \"png\");\r\n assert.equal(thumbnail2.height, 200);\r\n assert.equal(thumbnail2.width, 100);\r\n assert.equal(thumbnail2.image.length, 200);\r\n assert.equal(thumbnail2.image[0], 12);\r\n });\r\n});\r\n"]}
|
package/lib/esm/test/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test/index.ts"],"names":[],"mappings":"AAIA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test/index.ts"],"names":[],"mappings":"AAIA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
|
package/lib/esm/test/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test/index.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test/index.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC","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\nexport * from \"./AdvancedEqual\";\r\nexport * from \"./IModelTestUtils\";\r\nexport * from \"./KnownTestLocations\";\r\nexport * from \"./TestChangeSetUtility\";\r\nexport * from \"./TestEditTxn\";\r\nexport * from \"./imageData\";\r\n"]}
|
|
@@ -3192,17 +3192,12 @@ describe("ChangesetReader — openFile + openGroup", () => {
|
|
|
3192
3192
|
assert.equal(elemNew.$meta.propFilter, PropertyFilter.All);
|
|
3193
3193
|
assert.deepEqual(Object.keys(elemNew.$meta).sort(), ["op", "tables", "changeIndexes", "stage", "propFilter", "rowOptions", "changeFetchedPropNames", "instanceKey", "isIndirectChange"].sort());
|
|
3194
3194
|
assert.equal(elemNew.$meta.isIndirectChange, false);
|
|
3195
|
-
assert.deepEqual(Object.keys(elemNew).sort(), ["ECInstanceId", "ECClassId", "
|
|
3196
|
-
"Rotation", "BBoxLow", "BBoxHigh", "Pt3dProp", "BinProp", "GuidArrProp", "$meta", "LastMod"].sort());
|
|
3195
|
+
assert.deepEqual(Object.keys(elemNew).sort(), ["ECInstanceId", "ECClassId", "Pt3dProp", "BinProp", "GuidArrProp", "$meta", "LastMod"].sort());
|
|
3197
3196
|
assert.deepEqual(elemNew.Pt3dProp, { X: 1, Y: 9.9, Z: 7.7 });
|
|
3198
3197
|
assert.deepEqual(elemNew.BinProp, new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]));
|
|
3199
3198
|
assert.deepEqual(elemNew.GuidArrProp, ["ffffffff-0000-1111-2222-333344445555"]);
|
|
3200
|
-
assert.deepEqual(elemNew.Origin, { X: 0, Y: 0 });
|
|
3201
|
-
assert.deepEqual(elemNew.BBoxLow, { X: 0, Y: 0 });
|
|
3202
|
-
assert.deepEqual(elemNew.BBoxHigh, { X: 0, Y: 0 });
|
|
3203
|
-
assert.deepEqual(elemNew.Rotation, 0);
|
|
3204
3199
|
expect(elemNew.LastMod).to.exist;
|
|
3205
|
-
assert.deepEqual(elemNew.$meta.changeFetchedPropNames.sort(), ['
|
|
3200
|
+
assert.deepEqual(elemNew.$meta.changeFetchedPropNames.sort(), ['BinProp', 'ECInstanceId', 'GuidArrProp', 'LastMod', 'Pt3dProp'].sort());
|
|
3206
3201
|
assert.equal(elemOld.$meta.op, "Updated");
|
|
3207
3202
|
assert.equal(elemOld.$meta.stage, "Old");
|
|
3208
3203
|
assert.deepEqual(Object.keys(elemOld.$meta).sort(), ["op", "tables", "changeIndexes", "stage", "propFilter", "rowOptions", "changeFetchedPropNames", "instanceKey", "isIndirectChange"].sort());
|
|
@@ -3215,7 +3210,7 @@ describe("ChangesetReader — openFile + openGroup", () => {
|
|
|
3215
3210
|
]);
|
|
3216
3211
|
assert.equal(elemOld.$meta.isIndirectChange, false);
|
|
3217
3212
|
expect(elemOld.LastMod).to.exist;
|
|
3218
|
-
assert.deepEqual(elemOld.$meta.changeFetchedPropNames.sort(), ['
|
|
3213
|
+
assert.deepEqual(elemOld.$meta.changeFetchedPropNames.sort(), ['BinProp', 'ECInstanceId', 'GuidArrProp', 'LastMod', 'Pt3dProp'].sort());
|
|
3219
3214
|
}
|
|
3220
3215
|
catch (e_16) {
|
|
3221
3216
|
env_16.error = e_16;
|
|
@@ -3242,10 +3237,6 @@ describe("ChangesetReader — openFile + openGroup", () => {
|
|
|
3242
3237
|
assert.deepEqual(elemNew.Pt3dProp, { X: 1, Y: 9.9, Z: 7.7 });
|
|
3243
3238
|
assert.deepEqual(elemNew.BinProp, new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]));
|
|
3244
3239
|
assert.deepEqual(elemNew.GuidArrProp, ["ffffffff-0000-1111-2222-333344445555"]);
|
|
3245
|
-
assert.deepEqual(elemNew.Origin, { X: 0, Y: 0 });
|
|
3246
|
-
assert.deepEqual(elemNew.BBoxLow, { X: 0, Y: 0 });
|
|
3247
|
-
assert.deepEqual(elemNew.BBoxHigh, { X: 0, Y: 0 });
|
|
3248
|
-
assert.deepEqual(elemNew.Rotation, 0);
|
|
3249
3240
|
expect(elemNew.LastMod).to.exist;
|
|
3250
3241
|
expect(elemNew.Category).to.exist;
|
|
3251
3242
|
expect(elemNew.CodeScope).to.exist;
|
|
@@ -3262,7 +3253,7 @@ describe("ChangesetReader — openFile + openGroup", () => {
|
|
|
3262
3253
|
assert.deepEqual(elemNew.$meta.rowOptions, { abbreviateBlobs: false });
|
|
3263
3254
|
assert.deepEqual(Object.keys(elemNew).sort(), ["ECInstanceId", "ECClassId", "Model", "CodeSpec",
|
|
3264
3255
|
"CodeScope", "FederationGuid", "$meta", "Category", "LastMod",
|
|
3265
|
-
"BinProp", "GuidArrProp", "
|
|
3256
|
+
"BinProp", "GuidArrProp", "Pt3dProp"].sort());
|
|
3266
3257
|
assert.deepEqual(elemNew.$meta.changeFetchedPropNames.sort(), ['BBoxHigh', 'BBoxLow',
|
|
3267
3258
|
'BinProp', 'Category.Id', 'CodeScope.Id', 'CodeSpec.Id',
|
|
3268
3259
|
'CodeValue', 'ECClassId', 'ECInstanceId', 'FederationGuid', 'GeometryStream',
|
|
@@ -3470,17 +3461,12 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
|
|
|
3470
3461
|
assert.equal(elemNew.$meta.stage, "New");
|
|
3471
3462
|
assert.equal(elemNew.$meta.propFilter, PropertyFilter.All);
|
|
3472
3463
|
assert.deepEqual(Object.keys(elemNew.$meta).sort(), ["op", "tables", "changeIndexes", "stage", "propFilter", "rowOptions", "changeFetchedPropNames", "instanceKey", "isIndirectChange"].sort());
|
|
3473
|
-
assert.deepEqual(Object.keys(elemNew).sort(), ["ECInstanceId", "ECClassId", "
|
|
3474
|
-
"Rotation", "BBoxLow", "BBoxHigh", "Pt3dProp", "BinProp", "GuidArrProp", "$meta", "LastMod"].sort());
|
|
3464
|
+
assert.deepEqual(Object.keys(elemNew).sort(), ["ECInstanceId", "ECClassId", "Pt3dProp", "BinProp", "GuidArrProp", "$meta", "LastMod"].sort());
|
|
3475
3465
|
assert.deepEqual(elemNew.Pt3dProp, { X: 1, Y: 9.9, Z: 7.7 });
|
|
3476
3466
|
assert.deepEqual(elemNew.BinProp, new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]));
|
|
3477
3467
|
assert.deepEqual(elemNew.GuidArrProp, ["ffffffff-0000-1111-2222-333344445555"]);
|
|
3478
|
-
assert.deepEqual(elemNew.Origin, { X: 0, Y: 0 });
|
|
3479
|
-
assert.deepEqual(elemNew.BBoxLow, { X: 0, Y: 0 });
|
|
3480
|
-
assert.deepEqual(elemNew.BBoxHigh, { X: 0, Y: 0 });
|
|
3481
|
-
assert.deepEqual(elemNew.Rotation, 0);
|
|
3482
3468
|
expect(elemNew.LastMod).to.exist;
|
|
3483
|
-
assert.deepEqual(elemNew.$meta.changeFetchedPropNames.sort(), ['
|
|
3469
|
+
assert.deepEqual(elemNew.$meta.changeFetchedPropNames.sort(), ['BinProp', 'ECInstanceId', 'GuidArrProp', 'LastMod', 'Pt3dProp'].sort());
|
|
3484
3470
|
assert.equal(elemNew.$meta.isIndirectChange, false);
|
|
3485
3471
|
assert.equal(elemOld.$meta.op, "Updated");
|
|
3486
3472
|
assert.equal(elemOld.$meta.stage, "Old");
|
|
@@ -3494,7 +3480,7 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
|
|
|
3494
3480
|
]);
|
|
3495
3481
|
expect(elemOld.LastMod).to.exist;
|
|
3496
3482
|
assert.equal(elemOld.$meta.isIndirectChange, false);
|
|
3497
|
-
assert.deepEqual(elemOld.$meta.changeFetchedPropNames.sort(), ['
|
|
3483
|
+
assert.deepEqual(elemOld.$meta.changeFetchedPropNames.sort(), ['BinProp', 'ECInstanceId', 'GuidArrProp', 'LastMod', 'Pt3dProp'].sort());
|
|
3498
3484
|
}
|
|
3499
3485
|
catch (e_20) {
|
|
3500
3486
|
env_20.error = e_20;
|
|
@@ -3521,10 +3507,6 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
|
|
|
3521
3507
|
assert.deepEqual(elemNew.Pt3dProp, { X: 1, Y: 9.9, Z: 7.7 });
|
|
3522
3508
|
assert.deepEqual(elemNew.BinProp, new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]));
|
|
3523
3509
|
assert.deepEqual(elemNew.GuidArrProp, ["ffffffff-0000-1111-2222-333344445555"]);
|
|
3524
|
-
assert.deepEqual(elemNew.Origin, { X: 0, Y: 0 });
|
|
3525
|
-
assert.deepEqual(elemNew.BBoxLow, { X: 0, Y: 0 });
|
|
3526
|
-
assert.deepEqual(elemNew.BBoxHigh, { X: 0, Y: 0 });
|
|
3527
|
-
assert.deepEqual(elemNew.Rotation, 0);
|
|
3528
3510
|
expect(elemNew.LastMod).to.exist;
|
|
3529
3511
|
expect(elemNew.Category).to.exist;
|
|
3530
3512
|
expect(elemNew.CodeScope).to.exist;
|
|
@@ -3541,7 +3523,7 @@ describe("ChangesetReader — openLocalChanges + openInmemoryChanges", () => {
|
|
|
3541
3523
|
assert.deepEqual(elemNew.$meta.rowOptions, { abbreviateBlobs: false });
|
|
3542
3524
|
assert.deepEqual(Object.keys(elemNew).sort(), ["ECInstanceId", "ECClassId", "Model", "CodeSpec",
|
|
3543
3525
|
"CodeScope", "FederationGuid", "$meta", "Category", "LastMod",
|
|
3544
|
-
"BinProp", "GuidArrProp", "
|
|
3526
|
+
"BinProp", "GuidArrProp", "Pt3dProp"].sort());
|
|
3545
3527
|
assert.deepEqual(elemNew.$meta.changeFetchedPropNames.sort(), ['BBoxHigh', 'BBoxLow',
|
|
3546
3528
|
'BinProp', 'Category.Id', 'CodeScope.Id', 'CodeSpec.Id',
|
|
3547
3529
|
'CodeValue', 'ECClassId', 'ECInstanceId', 'FederationGuid', 'GeometryStream',
|