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