@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 @@
|
|
|
1
|
+
{"version":3,"file":"IModelMetadata.test.d.ts","sourceRoot":"","sources":["../../../../src/test/imodel/IModelMetadata.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,274 @@
|
|
|
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 { Id64 } from "@itwin/core-bentley";
|
|
7
|
+
import { BisCodeSpec, Code, CodeScopeSpec, CodeSpec, FontMap, FontType, IModel } from "@itwin/core-common";
|
|
8
|
+
import { CustomAttributeClass, EntityClass, PropertyType, propertyTypeToString, SchemaItemType } from "@itwin/ecschema-metadata";
|
|
9
|
+
import { EditTxn, withEditTxn } from "../../EditTxn";
|
|
10
|
+
import { BisCoreSchema, Category, ClassRegistry, Element, SnapshotDb } from "../../core-backend";
|
|
11
|
+
import { IModelTestUtils } from "../IModelTestUtils";
|
|
12
|
+
import { TestUtils } from "../TestUtils";
|
|
13
|
+
import { closeIfOpen, createIModelFromSeed, createMutableIModelTracker, importTestBim, openReadonlySeedCopy } from "./IModelTestFixtures";
|
|
14
|
+
describe("iModel metadata and schemas", () => {
|
|
15
|
+
let testBimReadonly;
|
|
16
|
+
let compatibilityReadonly;
|
|
17
|
+
const { trackMutableIModel, closeTrackedIModels } = createMutableIModelTracker();
|
|
18
|
+
before(async () => {
|
|
19
|
+
await TestUtils.startBackend();
|
|
20
|
+
IModelTestUtils.registerTestBimSchema();
|
|
21
|
+
testBimReadonly = await openReadonlySeedCopy("metadata-test.bim", "test.bim", { importTestBim: true });
|
|
22
|
+
compatibilityReadonly = await openReadonlySeedCopy("metadata-CompatibilityTestSeed.bim", "CompatibilityTestSeed.bim");
|
|
23
|
+
});
|
|
24
|
+
after(() => {
|
|
25
|
+
closeIfOpen(testBimReadonly, compatibilityReadonly);
|
|
26
|
+
closeTrackedIModels();
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
closeTrackedIModels();
|
|
30
|
+
});
|
|
31
|
+
function checkElementMetaData(entityClass) {
|
|
32
|
+
assert.isNotNull(entityClass);
|
|
33
|
+
assert.equal(entityClass.fullName, Element.classFullName.replace(":", "."));
|
|
34
|
+
assert.isUndefined(entityClass.baseClass);
|
|
35
|
+
let foundClassHasHandler = false;
|
|
36
|
+
let foundClassHasCurrentTimeStampProperty = false;
|
|
37
|
+
if (entityClass.customAttributes !== undefined) {
|
|
38
|
+
if (entityClass.customAttributes.has("BisCore.ClassHasHandler"))
|
|
39
|
+
foundClassHasHandler = true;
|
|
40
|
+
if (entityClass.customAttributes.has("CoreCustomAttributes.ClassHasCurrentTimeStampProperty"))
|
|
41
|
+
foundClassHasCurrentTimeStampProperty = true;
|
|
42
|
+
}
|
|
43
|
+
assert.isTrue(foundClassHasHandler);
|
|
44
|
+
assert.isTrue(foundClassHasCurrentTimeStampProperty);
|
|
45
|
+
const federationGuid = entityClass.getPropertySync("federationGuid", false);
|
|
46
|
+
if (federationGuid !== undefined) {
|
|
47
|
+
assert.isTrue(federationGuid.isPrimitive());
|
|
48
|
+
assert.equal(federationGuid.propertyType, PropertyType.Binary);
|
|
49
|
+
assert.equal(federationGuid.extendedTypeName, "BeGuid");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function checkClassHasHandlerMetaData(classToCheck) {
|
|
53
|
+
assert.isDefined(classToCheck);
|
|
54
|
+
const propertiesArray = Array.from(classToCheck.getPropertiesSync(true));
|
|
55
|
+
assert.equal(propertiesArray.length, 1);
|
|
56
|
+
const restrictionProperty = propertiesArray[0];
|
|
57
|
+
assert.isDefined(restrictionProperty);
|
|
58
|
+
assert.equal(restrictionProperty.name, "Restrictions");
|
|
59
|
+
assert.equal(propertyTypeToString(restrictionProperty.propertyType), "PrimitiveArrayProperty");
|
|
60
|
+
assert.equal(restrictionProperty.minOccurs, 0);
|
|
61
|
+
}
|
|
62
|
+
it("should use schema to look up classes by name", () => {
|
|
63
|
+
const elementClass = ClassRegistry.findRegisteredClass(Element.classFullName);
|
|
64
|
+
const categoryClass = ClassRegistry.findRegisteredClass(Category.classFullName);
|
|
65
|
+
assert.isDefined(elementClass);
|
|
66
|
+
assert.isDefined(categoryClass);
|
|
67
|
+
assert.equal(elementClass.schema, BisCoreSchema);
|
|
68
|
+
assert.equal(categoryClass.schema, BisCoreSchema);
|
|
69
|
+
assert.equal(elementClass.className, "Element");
|
|
70
|
+
assert.equal(categoryClass.className, "Category");
|
|
71
|
+
});
|
|
72
|
+
it("Fonts", async () => {
|
|
73
|
+
const imodel1 = trackMutableIModel(await importTestBim(createIModelFromSeed("metadata-fonts.bim", "test.bim")));
|
|
74
|
+
const dbFonts = imodel1.fonts;
|
|
75
|
+
expect(Array.from(dbFonts.queryMappedFamilies({ includeNonEmbedded: true })).length).to.equal(4);
|
|
76
|
+
expect(dbFonts.findDescriptor(1)).to.deep.equal({ name: "Arial", type: FontType.TrueType });
|
|
77
|
+
expect(dbFonts.findId({ name: "Arial" })).to.equal(1);
|
|
78
|
+
expect(dbFonts.findId({ name: "arial" })).to.equal(1);
|
|
79
|
+
expect(dbFonts.findDescriptor(2)).to.deep.equal({ name: "Font0", type: FontType.Rsc });
|
|
80
|
+
expect(dbFonts.findId({ name: "Font0" })).to.equal(2);
|
|
81
|
+
expect(dbFonts.findId({ name: "fOnt0" })).to.equal(2);
|
|
82
|
+
expect(dbFonts.findDescriptor(3)).to.deep.equal({ name: "ShxFont0", type: FontType.Shx });
|
|
83
|
+
expect(dbFonts.findId({ name: "ShxFont0" })).to.equal(3);
|
|
84
|
+
expect(dbFonts.findId({ name: "shxfont0" })).to.equal(3);
|
|
85
|
+
expect(dbFonts.findDescriptor(4)).to.deep.equal({ name: "Calibri", type: FontType.TrueType });
|
|
86
|
+
expect(dbFonts.findId({ name: "Calibri" })).to.equal(4);
|
|
87
|
+
expect(dbFonts.findId({ name: "cAlIbRi" })).to.equal(4);
|
|
88
|
+
expect(dbFonts.findId({ name: "notfound" })).to.be.undefined;
|
|
89
|
+
const fonts1 = imodel1.fontMap; // eslint-disable-line @typescript-eslint/no-deprecated
|
|
90
|
+
assert.equal(fonts1.fonts.size, 4, "font map size should be 4");
|
|
91
|
+
assert.equal(FontType.TrueType, fonts1.getFont(1).type, "get font 1 type is TrueType");
|
|
92
|
+
assert.equal("Arial", fonts1.getFont(1).name, "get Font 1 name");
|
|
93
|
+
assert.equal(1, fonts1.getFont("Arial").id, "get Font 1, by name");
|
|
94
|
+
assert.equal(1, fonts1.getFont("arial").id, "get Font 1, by name case insensitive");
|
|
95
|
+
assert.equal(FontType.Rsc, fonts1.getFont(2).type, "get font 2 type is Rsc");
|
|
96
|
+
assert.equal("Font0", fonts1.getFont(2).name, "get Font 2 name");
|
|
97
|
+
assert.equal(2, fonts1.getFont("Font0").id, "get Font 2, by name");
|
|
98
|
+
assert.equal(2, fonts1.getFont("fOnt0").id, "get Font 2, by name case insensitive");
|
|
99
|
+
assert.equal(FontType.Shx, fonts1.getFont(3).type, "get font 1 type is Shx");
|
|
100
|
+
assert.equal("ShxFont0", fonts1.getFont(3).name, "get Font 3 name");
|
|
101
|
+
assert.equal(3, fonts1.getFont("ShxFont0").id, "get Font 3, by name");
|
|
102
|
+
assert.equal(3, fonts1.getFont("shxfont0").id, "get Font 3, by name case insensitive");
|
|
103
|
+
assert.equal(FontType.TrueType, fonts1.getFont(4).type, "get font 4 type is TrueType");
|
|
104
|
+
assert.equal("Calibri", fonts1.getFont(4).name, "get Font 4 name");
|
|
105
|
+
assert.equal(4, fonts1.getFont("Calibri").id, "get Font 4, by name");
|
|
106
|
+
assert.equal(4, fonts1.getFont("cAlIbRi").id, "get Font 4, by name case insensitive");
|
|
107
|
+
assert.isUndefined(fonts1.getFont("notfound"), "attempt lookup of a font that should not be found");
|
|
108
|
+
assert.deepEqual(new FontMap(fonts1.toJSON()), fonts1, "toJSON on FontMap"); // eslint-disable-line @typescript-eslint/no-deprecated
|
|
109
|
+
});
|
|
110
|
+
it("should get metadata for a relationship", async () => {
|
|
111
|
+
const imodelPath = IModelTestUtils.prepareOutputFile("IModel", "metadata-relationshipMetadata.bim");
|
|
112
|
+
const imodel = trackMutableIModel(SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: "relationshipMetadata" } }));
|
|
113
|
+
await withEditTxn(imodel, async (txn) => {
|
|
114
|
+
const partitionId = txn.insertElement({
|
|
115
|
+
classFullName: "BisCore:PhysicalPartition",
|
|
116
|
+
model: IModel.repositoryModelId,
|
|
117
|
+
parent: {
|
|
118
|
+
relClassName: "BisCore:SubjectOwnsPartitionElements",
|
|
119
|
+
id: IModel.rootSubjectId,
|
|
120
|
+
},
|
|
121
|
+
code: new Code({
|
|
122
|
+
spec: imodel.codeSpecs.getByName(BisCodeSpec.informationPartitionElement).id,
|
|
123
|
+
scope: IModel.rootSubjectId,
|
|
124
|
+
value: "physical model",
|
|
125
|
+
}),
|
|
126
|
+
});
|
|
127
|
+
for await (const row of imodel.createQueryReader(`SELECT * FROM bis.Element LIMIT ${1}`)) {
|
|
128
|
+
const relId = txn.insertRelationship({
|
|
129
|
+
classFullName: "BisCore:ElementHasLinks",
|
|
130
|
+
sourceId: partitionId,
|
|
131
|
+
targetId: row.ECInstanceId,
|
|
132
|
+
});
|
|
133
|
+
const relationship = imodel.relationships.getInstance("BisCore:ElementHasLinks", relId);
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
135
|
+
const metadata = await relationship.getMetaData();
|
|
136
|
+
assert.isDefined(metadata, "metadata should be defined");
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
it("should get metadata for class", () => {
|
|
141
|
+
const imodel1 = testBimReadonly;
|
|
142
|
+
const metaData = imodel1.schemaContext.getSchemaItemSync(Element.classFullName, EntityClass);
|
|
143
|
+
assert.exists(metaData);
|
|
144
|
+
if (metaData !== undefined)
|
|
145
|
+
checkElementMetaData(metaData);
|
|
146
|
+
});
|
|
147
|
+
it("should iterate through metadata for a relationship", async () => {
|
|
148
|
+
const imodelPath = IModelTestUtils.prepareOutputFile("IModel", "metadata-relationshipMetadata-iterate.bim");
|
|
149
|
+
const imodel = trackMutableIModel(SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: "relationshipMetadata" } }));
|
|
150
|
+
await withEditTxn(imodel, async (txn) => {
|
|
151
|
+
const partitionId = txn.insertElement({
|
|
152
|
+
classFullName: "BisCore:PhysicalPartition",
|
|
153
|
+
model: IModel.repositoryModelId,
|
|
154
|
+
parent: {
|
|
155
|
+
relClassName: "BisCore:SubjectOwnsPartitionElements",
|
|
156
|
+
id: IModel.rootSubjectId,
|
|
157
|
+
},
|
|
158
|
+
code: new Code({
|
|
159
|
+
spec: imodel.codeSpecs.getByName(BisCodeSpec.informationPartitionElement).id,
|
|
160
|
+
scope: IModel.rootSubjectId,
|
|
161
|
+
value: "physical model",
|
|
162
|
+
}),
|
|
163
|
+
});
|
|
164
|
+
for await (const row of imodel.createQueryReader(`SELECT * FROM bis.Element LIMIT ${1}`)) {
|
|
165
|
+
const relId = txn.insertRelationship({
|
|
166
|
+
classFullName: "BisCore:ElementHasLinks",
|
|
167
|
+
sourceId: partitionId,
|
|
168
|
+
targetId: row.ECInstanceId,
|
|
169
|
+
});
|
|
170
|
+
const relationship = imodel.relationships.getInstance("BisCore:ElementHasLinks", relId);
|
|
171
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
172
|
+
relationship.forEach((propName, propMeta) => {
|
|
173
|
+
assert.isDefined(propName, "Property name should be defined");
|
|
174
|
+
assert.isDefined(propMeta, "Property metadata should be defined");
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
it("should get metadata for CA class just as well (and we'll see a array-typed property)", () => {
|
|
180
|
+
const imodel1 = testBimReadonly;
|
|
181
|
+
const metaData = imodel1.schemaContext.getSchemaItemSync("BisCore.ClassHasHandler", CustomAttributeClass);
|
|
182
|
+
assert.exists(metaData);
|
|
183
|
+
if (metaData !== undefined) {
|
|
184
|
+
assert.equal(metaData.schemaItemType, SchemaItemType.CustomAttributeClass);
|
|
185
|
+
checkClassHasHandlerMetaData(metaData);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
it("validate BisCodeSpecs", async () => {
|
|
189
|
+
const imodel2 = compatibilityReadonly;
|
|
190
|
+
assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.nullCodeSpec).scopeType, CodeScopeSpec.Type.Repository);
|
|
191
|
+
assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subCategory).scopeType, CodeScopeSpec.Type.ParentElement);
|
|
192
|
+
assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.viewDefinition).scopeType, CodeScopeSpec.Type.Model);
|
|
193
|
+
assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subject).scopeReq, CodeScopeSpec.ScopeRequirement.ElementId);
|
|
194
|
+
});
|
|
195
|
+
it("should create and insert CodeSpecs", () => {
|
|
196
|
+
const testImodel = trackMutableIModel(createIModelFromSeed("metadata-create-CodeSpecs.bim", "CompatibilityTestSeed.bim"));
|
|
197
|
+
const txn = new EditTxn(testImodel, "create and insert CodeSpecs");
|
|
198
|
+
txn.start();
|
|
199
|
+
const codeSpec = CodeSpec.create(testImodel, "CodeSpec1", CodeScopeSpec.Type.Model);
|
|
200
|
+
const codeSpecId = testImodel.codeSpecs.insert(txn, codeSpec); // throws in case of error
|
|
201
|
+
assert.deepEqual(codeSpecId, codeSpec.id);
|
|
202
|
+
assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);
|
|
203
|
+
assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.ElementId);
|
|
204
|
+
// Should not be able to insert a duplicate.
|
|
205
|
+
const codeSpecDup = CodeSpec.create(testImodel, "CodeSpec1", CodeScopeSpec.Type.Model);
|
|
206
|
+
assert.throws(() => testImodel.codeSpecs.insert(txn, codeSpecDup), "CodeSpec already exists");
|
|
207
|
+
// We should be able to insert another CodeSpec with a different name.
|
|
208
|
+
const codeSpec2 = CodeSpec.create(testImodel, "CodeSpec2", CodeScopeSpec.Type.Model, CodeScopeSpec.ScopeRequirement.FederationGuid);
|
|
209
|
+
const codeSpec2Id = testImodel.codeSpecs.insert(txn, codeSpec2); // throws in case of error
|
|
210
|
+
assert.deepEqual(codeSpec2Id, codeSpec2.id);
|
|
211
|
+
assert.notDeepEqual(codeSpec2Id, codeSpecId);
|
|
212
|
+
// make sure CodeScopeSpec.Type.Repository works
|
|
213
|
+
const codeSpec3 = CodeSpec.create(testImodel, "CodeSpec3", CodeScopeSpec.Type.Repository, CodeScopeSpec.ScopeRequirement.FederationGuid);
|
|
214
|
+
const codeSpec3Id = testImodel.codeSpecs.insert(txn, codeSpec3); // throws in case of error
|
|
215
|
+
assert.notDeepEqual(codeSpec2Id, codeSpec3Id);
|
|
216
|
+
const codeSpec4 = testImodel.codeSpecs.getById(codeSpec3Id);
|
|
217
|
+
codeSpec4.name = "CodeSpec4";
|
|
218
|
+
const codeSpec4Id = testImodel.codeSpecs.insert(txn, codeSpec4); // throws in case of error
|
|
219
|
+
assert.notDeepEqual(codeSpec3Id, codeSpec4Id);
|
|
220
|
+
assert.equal(codeSpec4.scopeType, CodeScopeSpec.Type.Repository);
|
|
221
|
+
assert.equal(codeSpec4.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);
|
|
222
|
+
const copyOfCodeSpec4 = testImodel.codeSpecs.getById(codeSpec4Id);
|
|
223
|
+
assert.deepEqual(codeSpec4, copyOfCodeSpec4);
|
|
224
|
+
assert.isTrue(testImodel.codeSpecs.hasName("CodeSpec1"));
|
|
225
|
+
assert.isTrue(testImodel.codeSpecs.hasName("CodeSpec2"));
|
|
226
|
+
assert.isTrue(testImodel.codeSpecs.hasName("CodeSpec3"));
|
|
227
|
+
assert.isTrue(testImodel.codeSpecs.hasName("CodeSpec4"));
|
|
228
|
+
assert.isFalse(testImodel.codeSpecs.hasName("CodeSpec5"));
|
|
229
|
+
assert.isTrue(testImodel.codeSpecs.hasId(codeSpec.id));
|
|
230
|
+
assert.isTrue(testImodel.codeSpecs.hasId(codeSpec2.id));
|
|
231
|
+
assert.isTrue(testImodel.codeSpecs.hasId(codeSpec3.id));
|
|
232
|
+
assert.isTrue(testImodel.codeSpecs.hasId(codeSpec4.id));
|
|
233
|
+
assert.isFalse(testImodel.codeSpecs.hasId(Id64.invalid));
|
|
234
|
+
txn.end();
|
|
235
|
+
});
|
|
236
|
+
it("validate CodeSpec properties", async () => {
|
|
237
|
+
const iModelFileName = IModelTestUtils.prepareOutputFile("IModel", "metadata-ReadWriteCodeSpec.bim");
|
|
238
|
+
const codeSpecName = "CodeSpec1";
|
|
239
|
+
// Write new CodeSpec to iModel
|
|
240
|
+
if (true) {
|
|
241
|
+
const iModelDb = trackMutableIModel(IModelTestUtils.createSnapshotFromSeed(iModelFileName, IModelTestUtils.resolveAssetFile("CompatibilityTestSeed.bim")));
|
|
242
|
+
const codeSpec = CodeSpec.create(iModelDb, codeSpecName, CodeScopeSpec.Type.Model, CodeScopeSpec.ScopeRequirement.FederationGuid);
|
|
243
|
+
const codeSpecId = withEditTxn(iModelDb, (txn) => iModelDb.codeSpecs.insert(txn, codeSpec));
|
|
244
|
+
assert.isTrue(Id64.isValidId64(codeSpec.id));
|
|
245
|
+
assert.equal(codeSpec.id, codeSpecId);
|
|
246
|
+
assert.equal(codeSpec.name, codeSpecName);
|
|
247
|
+
assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);
|
|
248
|
+
assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);
|
|
249
|
+
iModelDb.close();
|
|
250
|
+
}
|
|
251
|
+
// Reopen iModel (ensure CodeSpec cache is cleared) and reconfirm CodeSpec properties
|
|
252
|
+
if (true) {
|
|
253
|
+
const iModelDb = trackMutableIModel(SnapshotDb.openFile(iModelFileName));
|
|
254
|
+
const codeSpec = iModelDb.codeSpecs.getByName(codeSpecName);
|
|
255
|
+
assert.isTrue(Id64.isValidId64(codeSpec.id));
|
|
256
|
+
assert.equal(codeSpec.name, codeSpecName);
|
|
257
|
+
assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);
|
|
258
|
+
assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);
|
|
259
|
+
iModelDb.close();
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
it("should import schemas", async () => {
|
|
263
|
+
const imodel1 = trackMutableIModel(await importTestBim(createIModelFromSeed("metadata-import-schemas.bim", "test.bim")));
|
|
264
|
+
const metaData = await imodel1.schemaContext.getSchemaItem("TestBim:TestDocument", EntityClass);
|
|
265
|
+
assert.isDefined(metaData);
|
|
266
|
+
if (metaData !== undefined) {
|
|
267
|
+
const property = await metaData.getProperty("testDocumentProperty");
|
|
268
|
+
assert.isDefined(property);
|
|
269
|
+
if (property !== undefined)
|
|
270
|
+
assert.isDefined(property.propertyType, propertyTypeToString(PropertyType.Integer));
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
//# sourceMappingURL=IModelMetadata.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelMetadata.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModelMetadata.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 { Id64 } from \"@itwin/core-bentley\";\r\nimport { BisCodeSpec, Code, CodeScopeSpec, CodeSpec, FontMap, FontType, IModel } from \"@itwin/core-common\";\r\nimport { CustomAttributeClass, EntityClass, PrimitiveArrayProperty, PrimitiveOrEnumPropertyBase, PropertyType, propertyTypeToString, SchemaItemType } from \"@itwin/ecschema-metadata\";\r\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\r\nimport { BisCoreSchema, Category, ClassRegistry, Element, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { closeIfOpen, createIModelFromSeed, createMutableIModelTracker, importTestBim, openReadonlySeedCopy } from \"./IModelTestFixtures\";\r\n\r\n\r\ndescribe(\"iModel metadata and schemas\", () => {\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(\"metadata-test.bim\", \"test.bim\", { importTestBim: true });\r\n compatibilityReadonly = await openReadonlySeedCopy(\"metadata-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 function checkElementMetaData(entityClass: EntityClass) {\r\n assert.isNotNull(entityClass);\r\n assert.equal(entityClass.fullName, Element.classFullName.replace(\":\", \".\"));\r\n assert.isUndefined(entityClass.baseClass);\r\n\r\n let foundClassHasHandler = false;\r\n let foundClassHasCurrentTimeStampProperty = false;\r\n if (entityClass.customAttributes !== undefined) {\r\n if (entityClass.customAttributes.has(\"BisCore.ClassHasHandler\"))\r\n foundClassHasHandler = true;\r\n if (entityClass.customAttributes.has(\"CoreCustomAttributes.ClassHasCurrentTimeStampProperty\"))\r\n foundClassHasCurrentTimeStampProperty = true;\r\n }\r\n assert.isTrue(foundClassHasHandler);\r\n assert.isTrue(foundClassHasCurrentTimeStampProperty);\r\n const federationGuid = entityClass.getPropertySync(\"federationGuid\", false);\r\n if (federationGuid !== undefined) {\r\n assert.isTrue(federationGuid.isPrimitive());\r\n assert.equal(federationGuid.propertyType, PropertyType.Binary);\r\n assert.equal((federationGuid as PrimitiveOrEnumPropertyBase).extendedTypeName, \"BeGuid\");\r\n }\r\n }\r\n\r\n function checkClassHasHandlerMetaData(classToCheck: CustomAttributeClass) {\r\n assert.isDefined(classToCheck);\r\n\r\n const propertiesArray = Array.from(classToCheck.getPropertiesSync(true));\r\n assert.equal(propertiesArray.length, 1);\r\n\r\n const restrictionProperty = propertiesArray[0];\r\n assert.isDefined(restrictionProperty);\r\n assert.equal(restrictionProperty.name, \"Restrictions\");\r\n assert.equal(propertyTypeToString(restrictionProperty.propertyType), \"PrimitiveArrayProperty\");\r\n assert.equal((restrictionProperty as PrimitiveArrayProperty).minOccurs, 0);\r\n }\r\n\r\n it(\"should use schema to look up classes by name\", () => {\r\n const elementClass = ClassRegistry.findRegisteredClass(Element.classFullName);\r\n const categoryClass = ClassRegistry.findRegisteredClass(Category.classFullName);\r\n assert.isDefined(elementClass);\r\n assert.isDefined(categoryClass);\r\n assert.equal(elementClass!.schema, BisCoreSchema);\r\n assert.equal(categoryClass!.schema, BisCoreSchema);\r\n assert.equal(elementClass!.className, \"Element\");\r\n assert.equal(categoryClass!.className, \"Category\");\r\n });\r\n\r\n it(\"Fonts\", async () => {\r\n const imodel1 = trackMutableIModel(await importTestBim(createIModelFromSeed(\"metadata-fonts.bim\", \"test.bim\")));\r\n const dbFonts = imodel1.fonts;\r\n expect(Array.from(dbFonts.queryMappedFamilies({ includeNonEmbedded: true })).length).to.equal(4);\r\n expect(dbFonts.findDescriptor(1)).to.deep.equal({ name: \"Arial\", type: FontType.TrueType });\r\n expect(dbFonts.findId({ name: \"Arial\" })).to.equal(1);\r\n expect(dbFonts.findId({ name: \"arial\" })).to.equal(1);\r\n\r\n expect(dbFonts.findDescriptor(2)).to.deep.equal({ name: \"Font0\", type: FontType.Rsc });\r\n expect(dbFonts.findId({ name: \"Font0\" })).to.equal(2);\r\n expect(dbFonts.findId({ name: \"fOnt0\" })).to.equal(2);\r\n\r\n expect(dbFonts.findDescriptor(3)).to.deep.equal({ name: \"ShxFont0\", type: FontType.Shx });\r\n expect(dbFonts.findId({ name: \"ShxFont0\" })).to.equal(3);\r\n expect(dbFonts.findId({ name: \"shxfont0\" })).to.equal(3);\r\n\r\n expect(dbFonts.findDescriptor(4)).to.deep.equal({ name: \"Calibri\", type: FontType.TrueType });\r\n expect(dbFonts.findId({ name: \"Calibri\" })).to.equal(4);\r\n expect(dbFonts.findId({ name: \"cAlIbRi\" })).to.equal(4);\r\n\r\n expect(dbFonts.findId({ name: \"notfound\" })).to.be.undefined;\r\n\r\n const fonts1 = imodel1.fontMap; // eslint-disable-line @typescript-eslint/no-deprecated\r\n assert.equal(fonts1.fonts.size, 4, \"font map size should be 4\");\r\n assert.equal(FontType.TrueType, fonts1.getFont(1)!.type, \"get font 1 type is TrueType\");\r\n assert.equal(\"Arial\", fonts1.getFont(1)!.name, \"get Font 1 name\");\r\n assert.equal(1, fonts1.getFont(\"Arial\")!.id, \"get Font 1, by name\");\r\n assert.equal(1, fonts1.getFont(\"arial\")!.id, \"get Font 1, by name case insensitive\");\r\n\r\n assert.equal(FontType.Rsc, fonts1.getFont(2)!.type, \"get font 2 type is Rsc\");\r\n assert.equal(\"Font0\", fonts1.getFont(2)!.name, \"get Font 2 name\");\r\n assert.equal(2, fonts1.getFont(\"Font0\")!.id, \"get Font 2, by name\");\r\n assert.equal(2, fonts1.getFont(\"fOnt0\")!.id, \"get Font 2, by name case insensitive\");\r\n\r\n assert.equal(FontType.Shx, fonts1.getFont(3)!.type, \"get font 1 type is Shx\");\r\n assert.equal(\"ShxFont0\", fonts1.getFont(3)!.name, \"get Font 3 name\");\r\n assert.equal(3, fonts1.getFont(\"ShxFont0\")!.id, \"get Font 3, by name\");\r\n assert.equal(3, fonts1.getFont(\"shxfont0\")!.id, \"get Font 3, by name case insensitive\");\r\n\r\n assert.equal(FontType.TrueType, fonts1.getFont(4)!.type, \"get font 4 type is TrueType\");\r\n assert.equal(\"Calibri\", fonts1.getFont(4)!.name, \"get Font 4 name\");\r\n assert.equal(4, fonts1.getFont(\"Calibri\")!.id, \"get Font 4, by name\");\r\n assert.equal(4, fonts1.getFont(\"cAlIbRi\")!.id, \"get Font 4, by name case insensitive\");\r\n\r\n assert.isUndefined(fonts1.getFont(\"notfound\"), \"attempt lookup of a font that should not be found\");\r\n\r\n assert.deepEqual(new FontMap(fonts1.toJSON()), fonts1, \"toJSON on FontMap\"); // eslint-disable-line @typescript-eslint/no-deprecated\r\n });\r\n\r\n it(\"should get metadata for a relationship\", async () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"metadata-relationshipMetadata.bim\");\r\n const imodel = trackMutableIModel(SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"relationshipMetadata\" } }));\r\n\r\n await withEditTxn(imodel, async (txn) => {\r\n const partitionId = txn.insertElement({\r\n classFullName: \"BisCore:PhysicalPartition\",\r\n model: IModel.repositoryModelId,\r\n parent: {\r\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\r\n id: IModel.rootSubjectId,\r\n },\r\n code: new Code({\r\n spec: imodel.codeSpecs.getByName(BisCodeSpec.informationPartitionElement).id,\r\n scope: IModel.rootSubjectId,\r\n value: \"physical model\",\r\n }),\r\n });\r\n\r\n for await (const row of imodel.createQueryReader(`SELECT * FROM bis.Element LIMIT ${1}`)) {\r\n const relId = txn.insertRelationship({\r\n classFullName: \"BisCore:ElementHasLinks\",\r\n sourceId: partitionId,\r\n targetId: row.ECInstanceId,\r\n });\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementHasLinks\", relId);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const metadata = await relationship.getMetaData();\r\n assert.isDefined(metadata, \"metadata should be defined\");\r\n }\r\n });\r\n });\r\n\r\n it(\"should get metadata for class\", () => {\r\n const imodel1 = testBimReadonly;\r\n const metaData = imodel1.schemaContext.getSchemaItemSync(Element.classFullName, EntityClass);\r\n assert.exists(metaData);\r\n if (metaData !== undefined)\r\n checkElementMetaData(metaData);\r\n });\r\n\r\n it(\"should iterate through metadata for a relationship\", async () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"metadata-relationshipMetadata-iterate.bim\");\r\n const imodel = trackMutableIModel(SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"relationshipMetadata\" } }));\r\n\r\n await withEditTxn(imodel, async (txn) => {\r\n const partitionId = txn.insertElement({\r\n classFullName: \"BisCore:PhysicalPartition\",\r\n model: IModel.repositoryModelId,\r\n parent: {\r\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\r\n id: IModel.rootSubjectId,\r\n },\r\n code: new Code({\r\n spec: imodel.codeSpecs.getByName(BisCodeSpec.informationPartitionElement).id,\r\n scope: IModel.rootSubjectId,\r\n value: \"physical model\",\r\n }),\r\n });\r\n\r\n for await (const row of imodel.createQueryReader(`SELECT * FROM bis.Element LIMIT ${1}`)) {\r\n const relId = txn.insertRelationship({\r\n classFullName: \"BisCore:ElementHasLinks\",\r\n sourceId: partitionId,\r\n targetId: row.ECInstanceId,\r\n });\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementHasLinks\", relId);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n relationship.forEach((propName, propMeta) => {\r\n assert.isDefined(propName, \"Property name should be defined\");\r\n assert.isDefined(propMeta, \"Property metadata should be defined\");\r\n });\r\n }\r\n });\r\n });\r\n\r\n it(\"should get metadata for CA class just as well (and we'll see a array-typed property)\", () => {\r\n const imodel1 = testBimReadonly;\r\n const metaData = imodel1.schemaContext.getSchemaItemSync(\"BisCore.ClassHasHandler\", CustomAttributeClass);\r\n assert.exists(metaData);\r\n if (metaData !== undefined) {\r\n assert.equal(metaData.schemaItemType, SchemaItemType.CustomAttributeClass);\r\n checkClassHasHandlerMetaData(metaData);\r\n }\r\n });\r\n\r\n it(\"validate BisCodeSpecs\", async () => {\r\n const imodel2 = compatibilityReadonly;\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.nullCodeSpec).scopeType, CodeScopeSpec.Type.Repository);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subCategory).scopeType, CodeScopeSpec.Type.ParentElement);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.viewDefinition).scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subject).scopeReq, CodeScopeSpec.ScopeRequirement.ElementId);\r\n });\r\n\r\n it(\"should create and insert CodeSpecs\", () => {\r\n const testImodel = trackMutableIModel(createIModelFromSeed(\"metadata-create-CodeSpecs.bim\", \"CompatibilityTestSeed.bim\"));\r\n const txn = new EditTxn(testImodel, \"create and insert CodeSpecs\");\r\n txn.start();\r\n const codeSpec = CodeSpec.create(testImodel, \"CodeSpec1\", CodeScopeSpec.Type.Model);\r\n const codeSpecId = testImodel.codeSpecs.insert(txn, codeSpec); // throws in case of error\r\n assert.deepEqual(codeSpecId, codeSpec.id);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.ElementId);\r\n\r\n // Should not be able to insert a duplicate.\r\n const codeSpecDup = CodeSpec.create(testImodel, \"CodeSpec1\", CodeScopeSpec.Type.Model);\r\n assert.throws(() => testImodel.codeSpecs.insert(txn, codeSpecDup), \"CodeSpec already exists\");\r\n\r\n // We should be able to insert another CodeSpec with a different name.\r\n const codeSpec2 = CodeSpec.create(testImodel, \"CodeSpec2\", CodeScopeSpec.Type.Model, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpec2Id = testImodel.codeSpecs.insert(txn, codeSpec2); // throws in case of error\r\n assert.deepEqual(codeSpec2Id, codeSpec2.id);\r\n assert.notDeepEqual(codeSpec2Id, codeSpecId);\r\n\r\n // make sure CodeScopeSpec.Type.Repository works\r\n const codeSpec3 = CodeSpec.create(testImodel, \"CodeSpec3\", CodeScopeSpec.Type.Repository, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpec3Id = testImodel.codeSpecs.insert(txn, codeSpec3); // throws in case of error\r\n assert.notDeepEqual(codeSpec2Id, codeSpec3Id);\r\n\r\n const codeSpec4 = testImodel.codeSpecs.getById(codeSpec3Id);\r\n codeSpec4.name = \"CodeSpec4\";\r\n const codeSpec4Id = testImodel.codeSpecs.insert(txn, codeSpec4); // throws in case of error\r\n assert.notDeepEqual(codeSpec3Id, codeSpec4Id);\r\n assert.equal(codeSpec4.scopeType, CodeScopeSpec.Type.Repository);\r\n assert.equal(codeSpec4.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const copyOfCodeSpec4 = testImodel.codeSpecs.getById(codeSpec4Id);\r\n assert.deepEqual(codeSpec4, copyOfCodeSpec4);\r\n\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec1\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec2\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec3\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec4\"));\r\n assert.isFalse(testImodel.codeSpecs.hasName(\"CodeSpec5\"));\r\n\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec2.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec3.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec4.id));\r\n assert.isFalse(testImodel.codeSpecs.hasId(Id64.invalid));\r\n txn.end();\r\n });\r\n\r\n it(\"validate CodeSpec properties\", async () => {\r\n const iModelFileName: string = IModelTestUtils.prepareOutputFile(\"IModel\", \"metadata-ReadWriteCodeSpec.bim\");\r\n const codeSpecName = \"CodeSpec1\";\r\n\r\n // Write new CodeSpec to iModel\r\n if (true) {\r\n const iModelDb = trackMutableIModel(IModelTestUtils.createSnapshotFromSeed(iModelFileName, IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\")));\r\n const codeSpec = CodeSpec.create(iModelDb, codeSpecName, CodeScopeSpec.Type.Model, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpecId = withEditTxn(iModelDb, (txn) => iModelDb.codeSpecs.insert(txn, codeSpec));\r\n assert.isTrue(Id64.isValidId64(codeSpec.id));\r\n assert.equal(codeSpec.id, codeSpecId);\r\n assert.equal(codeSpec.name, codeSpecName);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n iModelDb.close();\r\n }\r\n\r\n // Reopen iModel (ensure CodeSpec cache is cleared) and reconfirm CodeSpec properties\r\n if (true) {\r\n const iModelDb = trackMutableIModel(SnapshotDb.openFile(iModelFileName));\r\n const codeSpec = iModelDb.codeSpecs.getByName(codeSpecName);\r\n assert.isTrue(Id64.isValidId64(codeSpec.id));\r\n assert.equal(codeSpec.name, codeSpecName);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n iModelDb.close();\r\n }\r\n });\r\n\r\n it(\"should import schemas\", async () => {\r\n const imodel1 = trackMutableIModel(await importTestBim(createIModelFromSeed(\"metadata-import-schemas.bim\", \"test.bim\")));\r\n const metaData = await imodel1.schemaContext.getSchemaItem(\"TestBim:TestDocument\", EntityClass);\r\n assert.isDefined(metaData);\r\n if (metaData !== undefined) {\r\n const property = await metaData.getProperty(\"testDocumentProperty\");\r\n assert.isDefined(property);\r\n if (property !== undefined)\r\n assert.isDefined(property.propertyType, propertyTypeToString(PropertyType.Integer));\r\n }\r\n });\r\n});\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelModels.test.d.ts","sourceRoot":"","sources":["../../../../src/test/imodel/IModelModels.test.ts"],"names":[],"mappings":""}
|