@itwin/core-backend 5.13.0-dev.8 → 5.14.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/lib/cjs/Category.d.ts +4 -4
  3. package/lib/cjs/Category.js.map +1 -1
  4. package/lib/cjs/ChangesetECAdaptor.d.ts +5 -0
  5. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  6. package/lib/cjs/ChangesetECAdaptor.js +13 -3
  7. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  8. package/lib/cjs/CodeSpecs.d.ts +3 -3
  9. package/lib/cjs/CodeSpecs.js.map +1 -1
  10. package/lib/cjs/DisplayStyle.d.ts +2 -2
  11. package/lib/cjs/DisplayStyle.js.map +1 -1
  12. package/lib/cjs/EditTxn.d.ts.map +1 -1
  13. package/lib/cjs/EditTxn.js +1 -0
  14. package/lib/cjs/EditTxn.js.map +1 -1
  15. package/lib/cjs/Element.d.ts +48 -12
  16. package/lib/cjs/Element.d.ts.map +1 -1
  17. package/lib/cjs/Element.js +120 -24
  18. package/lib/cjs/Element.js.map +1 -1
  19. package/lib/cjs/IModelDb.d.ts +30 -15
  20. package/lib/cjs/IModelDb.d.ts.map +1 -1
  21. package/lib/cjs/IModelDb.js +51 -15
  22. package/lib/cjs/IModelDb.js.map +1 -1
  23. package/lib/cjs/Model.d.ts +5 -5
  24. package/lib/cjs/Model.d.ts.map +1 -1
  25. package/lib/cjs/Model.js.map +1 -1
  26. package/lib/cjs/PropertyStore.js +1 -1
  27. package/lib/cjs/PropertyStore.js.map +1 -1
  28. package/lib/cjs/SchemaSync.d.ts +37 -9
  29. package/lib/cjs/SchemaSync.d.ts.map +1 -1
  30. package/lib/cjs/SchemaSync.js +125 -6
  31. package/lib/cjs/SchemaSync.js.map +1 -1
  32. package/lib/cjs/SynchronousChannel.d.ts +62 -0
  33. package/lib/cjs/SynchronousChannel.d.ts.map +1 -0
  34. package/lib/cjs/SynchronousChannel.js +11 -0
  35. package/lib/cjs/SynchronousChannel.js.map +1 -0
  36. package/lib/cjs/Texture.d.ts +1 -1
  37. package/lib/cjs/Texture.js.map +1 -1
  38. package/lib/cjs/TxnManager.d.ts +44 -4
  39. package/lib/cjs/TxnManager.d.ts.map +1 -1
  40. package/lib/cjs/TxnManager.js +72 -14
  41. package/lib/cjs/TxnManager.js.map +1 -1
  42. package/lib/cjs/ViewDefinition.d.ts +6 -6
  43. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  44. package/lib/cjs/ViewDefinition.js.map +1 -1
  45. package/lib/cjs/annotations/LeaderGeometry.d.ts +22 -7
  46. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  47. package/lib/cjs/annotations/LeaderGeometry.js +104 -36
  48. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  49. package/lib/cjs/annotations/TextAnnotationElement.d.ts +1 -1
  50. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  51. package/lib/cjs/annotations/TextAnnotationElement.js +25 -10
  52. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  53. package/lib/cjs/core-backend.d.ts +1 -0
  54. package/lib/cjs/core-backend.d.ts.map +1 -1
  55. package/lib/cjs/core-backend.js +1 -0
  56. package/lib/cjs/core-backend.js.map +1 -1
  57. package/lib/cjs/internal/IntegrityCheck.d.ts +22 -0
  58. package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
  59. package/lib/cjs/internal/IntegrityCheck.js +13 -0
  60. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  61. package/lib/cjs/internal/NoReservations.d.ts +6 -0
  62. package/lib/cjs/internal/NoReservations.d.ts.map +1 -0
  63. package/lib/cjs/internal/NoReservations.js +21 -0
  64. package/lib/cjs/internal/NoReservations.js.map +1 -0
  65. package/lib/cjs/internal/SchemaSyncReservations.d.ts +4 -0
  66. package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -0
  67. package/lib/cjs/internal/SchemaSyncReservations.js +118 -0
  68. package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -0
  69. package/lib/cjs/internal/Symbols.d.ts +1 -0
  70. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  71. package/lib/cjs/internal/Symbols.js +2 -1
  72. package/lib/cjs/internal/Symbols.js.map +1 -1
  73. package/lib/esm/Category.d.ts +4 -4
  74. package/lib/esm/Category.js.map +1 -1
  75. package/lib/esm/ChangesetECAdaptor.d.ts +5 -0
  76. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  77. package/lib/esm/ChangesetECAdaptor.js +13 -3
  78. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  79. package/lib/esm/CodeSpecs.d.ts +3 -3
  80. package/lib/esm/CodeSpecs.js.map +1 -1
  81. package/lib/esm/DisplayStyle.d.ts +2 -2
  82. package/lib/esm/DisplayStyle.js.map +1 -1
  83. package/lib/esm/EditTxn.d.ts.map +1 -1
  84. package/lib/esm/EditTxn.js +1 -0
  85. package/lib/esm/EditTxn.js.map +1 -1
  86. package/lib/esm/Element.d.ts +48 -12
  87. package/lib/esm/Element.d.ts.map +1 -1
  88. package/lib/esm/Element.js +121 -25
  89. package/lib/esm/Element.js.map +1 -1
  90. package/lib/esm/IModelDb.d.ts +30 -15
  91. package/lib/esm/IModelDb.d.ts.map +1 -1
  92. package/lib/esm/IModelDb.js +52 -16
  93. package/lib/esm/IModelDb.js.map +1 -1
  94. package/lib/esm/Model.d.ts +5 -5
  95. package/lib/esm/Model.d.ts.map +1 -1
  96. package/lib/esm/Model.js.map +1 -1
  97. package/lib/esm/PropertyStore.js +1 -1
  98. package/lib/esm/PropertyStore.js.map +1 -1
  99. package/lib/esm/SchemaSync.d.ts +37 -9
  100. package/lib/esm/SchemaSync.d.ts.map +1 -1
  101. package/lib/esm/SchemaSync.js +127 -8
  102. package/lib/esm/SchemaSync.js.map +1 -1
  103. package/lib/esm/SynchronousChannel.d.ts +62 -0
  104. package/lib/esm/SynchronousChannel.d.ts.map +1 -0
  105. package/lib/esm/SynchronousChannel.js +9 -0
  106. package/lib/esm/SynchronousChannel.js.map +1 -0
  107. package/lib/esm/Texture.d.ts +1 -1
  108. package/lib/esm/Texture.js.map +1 -1
  109. package/lib/esm/TxnManager.d.ts +44 -4
  110. package/lib/esm/TxnManager.d.ts.map +1 -1
  111. package/lib/esm/TxnManager.js +72 -14
  112. package/lib/esm/TxnManager.js.map +1 -1
  113. package/lib/esm/ViewDefinition.d.ts +6 -6
  114. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  115. package/lib/esm/ViewDefinition.js.map +1 -1
  116. package/lib/esm/annotations/LeaderGeometry.d.ts +22 -7
  117. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  118. package/lib/esm/annotations/LeaderGeometry.js +104 -36
  119. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  120. package/lib/esm/annotations/TextAnnotationElement.d.ts +1 -1
  121. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  122. package/lib/esm/annotations/TextAnnotationElement.js +25 -10
  123. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  124. package/lib/esm/core-backend.d.ts +1 -0
  125. package/lib/esm/core-backend.d.ts.map +1 -1
  126. package/lib/esm/core-backend.js +1 -0
  127. package/lib/esm/core-backend.js.map +1 -1
  128. package/lib/esm/internal/IntegrityCheck.d.ts +22 -0
  129. package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
  130. package/lib/esm/internal/IntegrityCheck.js +13 -0
  131. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  132. package/lib/esm/internal/NoReservations.d.ts +6 -0
  133. package/lib/esm/internal/NoReservations.d.ts.map +1 -0
  134. package/lib/esm/internal/NoReservations.js +18 -0
  135. package/lib/esm/internal/NoReservations.js.map +1 -0
  136. package/lib/esm/internal/SchemaSyncReservations.d.ts +4 -0
  137. package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -0
  138. package/lib/esm/internal/SchemaSyncReservations.js +115 -0
  139. package/lib/esm/internal/SchemaSyncReservations.js.map +1 -0
  140. package/lib/esm/internal/Symbols.d.ts +1 -0
  141. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  142. package/lib/esm/internal/Symbols.js +1 -0
  143. package/lib/esm/internal/Symbols.js.map +1 -1
  144. package/lib/esm/test/IModelTestUtils.d.ts +1 -1
  145. package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
  146. package/lib/esm/test/IModelTestUtils.js +8 -3
  147. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  148. package/lib/esm/test/annotations/LeaderGeometry.test.js +178 -2
  149. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  150. package/lib/esm/test/annotations/TextAnnotation.test.js +48 -18
  151. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  152. package/lib/esm/test/ecdb/ECSqlStatement.test.js +177 -0
  153. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  154. package/lib/esm/test/ecdb/QueryReaders.test.js +2 -16
  155. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  156. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +2 -2
  157. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  158. package/lib/esm/test/element/ElementRoundTrip.test.js +80 -2
  159. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  160. package/lib/esm/test/imodel/IModelECSql.test.d.ts +2 -0
  161. package/lib/esm/test/imodel/IModelECSql.test.d.ts.map +1 -0
  162. package/lib/esm/test/imodel/IModelECSql.test.js +367 -0
  163. package/lib/esm/test/imodel/IModelECSql.test.js.map +1 -0
  164. package/lib/esm/test/imodel/IModelElements.test.d.ts +2 -0
  165. package/lib/esm/test/imodel/IModelElements.test.d.ts.map +1 -0
  166. package/lib/esm/test/imodel/IModelElements.test.js +969 -0
  167. package/lib/esm/test/imodel/IModelElements.test.js.map +1 -0
  168. package/lib/esm/test/imodel/IModelGeolocation.test.d.ts +2 -0
  169. package/lib/esm/test/imodel/IModelGeolocation.test.d.ts.map +1 -0
  170. package/lib/esm/test/imodel/IModelGeolocation.test.js +539 -0
  171. package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -0
  172. package/lib/esm/test/imodel/IModelLifecycle.test.d.ts +2 -0
  173. package/lib/esm/test/imodel/IModelLifecycle.test.d.ts.map +1 -0
  174. package/lib/esm/test/imodel/IModelLifecycle.test.js +499 -0
  175. package/lib/esm/test/imodel/IModelLifecycle.test.js.map +1 -0
  176. package/lib/esm/test/imodel/IModelMetadata.test.d.ts +2 -0
  177. package/lib/esm/test/imodel/IModelMetadata.test.d.ts.map +1 -0
  178. package/lib/esm/test/imodel/IModelMetadata.test.js +274 -0
  179. package/lib/esm/test/imodel/IModelMetadata.test.js.map +1 -0
  180. package/lib/esm/test/imodel/IModelModels.test.d.ts +2 -0
  181. package/lib/esm/test/imodel/IModelModels.test.d.ts.map +1 -0
  182. package/lib/esm/test/imodel/IModelModels.test.js +357 -0
  183. package/lib/esm/test/imodel/IModelModels.test.js.map +1 -0
  184. package/lib/esm/test/imodel/IModelRelationships.test.d.ts +2 -0
  185. package/lib/esm/test/imodel/IModelRelationships.test.d.ts.map +1 -0
  186. package/lib/esm/test/imodel/IModelRelationships.test.js +407 -0
  187. package/lib/esm/test/imodel/IModelRelationships.test.js.map +1 -0
  188. package/lib/esm/test/imodel/IModelTestFixtures.d.ts +53 -0
  189. package/lib/esm/test/imodel/IModelTestFixtures.d.ts.map +1 -0
  190. package/lib/esm/test/imodel/IModelTestFixtures.js +107 -0
  191. package/lib/esm/test/imodel/IModelTestFixtures.js.map +1 -0
  192. package/lib/esm/test/imodel/IModelViews.test.d.ts +2 -0
  193. package/lib/esm/test/imodel/IModelViews.test.d.ts.map +1 -0
  194. package/lib/esm/test/imodel/IModelViews.test.js +199 -0
  195. package/lib/esm/test/imodel/IModelViews.test.js.map +1 -0
  196. package/lib/esm/test/index.d.ts +0 -1
  197. package/lib/esm/test/index.d.ts.map +1 -1
  198. package/lib/esm/test/index.js +0 -1
  199. package/lib/esm/test/index.js.map +1 -1
  200. package/lib/esm/test/standalone/ChangesetReader.test.js +8 -26
  201. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  202. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts +2 -0
  203. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts.map +1 -0
  204. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js +263 -0
  205. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js.map +1 -0
  206. package/lib/esm/test/standalone/GeometryStream.test.js +1 -3
  207. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  208. package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
  209. package/lib/esm/test/standalone/IModelWrite.test.js +78 -1
  210. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  211. package/lib/esm/test/standalone/IntegrityCheck.test.js +29 -10
  212. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  213. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +23 -0
  214. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  215. package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts +2 -0
  216. package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts.map +1 -0
  217. package/lib/esm/test/standalone/SchemaSyncDb.test.js +221 -0
  218. package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -0
  219. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts +2 -0
  220. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts.map +1 -0
  221. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +459 -0
  222. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -0
  223. package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
  224. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  225. package/lib/esm/test/standalone/TxnManager.test.js +108 -8
  226. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  227. package/package.json +13 -16
  228. package/lib/esm/test/RevisionUtility.d.ts +0 -33
  229. package/lib/esm/test/RevisionUtility.d.ts.map +0 -1
  230. package/lib/esm/test/RevisionUtility.js +0 -52
  231. package/lib/esm/test/RevisionUtility.js.map +0 -1
  232. package/lib/esm/test/imodel/IModel.test.d.ts +0 -2
  233. package/lib/esm/test/imodel/IModel.test.d.ts.map +0 -1
  234. package/lib/esm/test/imodel/IModel.test.js +0 -3277
  235. package/lib/esm/test/imodel/IModel.test.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IModelMetadata.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IModelModels.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IModelModels.test.d.ts","sourceRoot":"","sources":["../../../../src/test/imodel/IModelModels.test.ts"],"names":[],"mappings":""}