@itwin/core-backend 5.0.0-dev.96 → 5.0.0-dev.97

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 (335) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/BackendHubAccess.js.map +1 -1
  3. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  4. package/lib/cjs/BisCoreSchema.js.map +1 -1
  5. package/lib/cjs/BlobContainerService.js.map +1 -1
  6. package/lib/cjs/BriefcaseManager.js.map +1 -1
  7. package/lib/cjs/Category.js.map +1 -1
  8. package/lib/cjs/ChangeSummaryManager.js +2 -2
  9. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  10. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  11. package/lib/cjs/ChangesetECAdaptor.js +242 -242
  12. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  13. package/lib/cjs/ChannelControl.js.map +1 -1
  14. package/lib/cjs/CheckpointManager.js.map +1 -1
  15. package/lib/cjs/ClassRegistry.js +5 -5
  16. package/lib/cjs/ClassRegistry.js.map +1 -1
  17. package/lib/cjs/CloudSqlite.js.map +1 -1
  18. package/lib/cjs/CodeService.js.map +1 -1
  19. package/lib/cjs/CodeSpecs.js.map +1 -1
  20. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  21. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  22. package/lib/cjs/DevTools.js.map +1 -1
  23. package/lib/cjs/DisplayStyle.js.map +1 -1
  24. package/lib/cjs/ECDb.js.map +1 -1
  25. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  26. package/lib/cjs/ECSqlStatement.js.map +1 -1
  27. package/lib/cjs/Element.js.map +1 -1
  28. package/lib/cjs/ElementAspect.js.map +1 -1
  29. package/lib/cjs/ElementGraphics.js.map +1 -1
  30. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  31. package/lib/cjs/Entity.js.map +1 -1
  32. package/lib/cjs/EntityReferences.js.map +1 -1
  33. package/lib/cjs/ExportGraphics.js.map +1 -1
  34. package/lib/cjs/ExternalSource.js.map +1 -1
  35. package/lib/cjs/FontFile.js.map +1 -1
  36. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  37. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  38. package/lib/cjs/GeometrySummary.js +47 -47
  39. package/lib/cjs/GeometrySummary.js.map +1 -1
  40. package/lib/cjs/HubMock.js.map +1 -1
  41. package/lib/cjs/IModelDb.js +8 -8
  42. package/lib/cjs/IModelDb.js.map +1 -1
  43. package/lib/cjs/IModelDbFonts.js.map +1 -1
  44. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  45. package/lib/cjs/IModelHost.js.map +1 -1
  46. package/lib/cjs/IModelJsFs.js.map +1 -1
  47. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  48. package/lib/cjs/IpcHost.js.map +1 -1
  49. package/lib/cjs/LineStyle.js.map +1 -1
  50. package/lib/cjs/LocalHub.js +1 -1
  51. package/lib/cjs/LocalHub.js.map +1 -1
  52. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  53. package/lib/cjs/LockControl.js.map +1 -1
  54. package/lib/cjs/Material.js.map +1 -1
  55. package/lib/cjs/Model.js.map +1 -1
  56. package/lib/cjs/NativeAppStorage.js.map +1 -1
  57. package/lib/cjs/NativeHost.js.map +1 -1
  58. package/lib/cjs/NavigationRelationship.js.map +1 -1
  59. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  60. package/lib/cjs/PropertyStore.js.map +1 -1
  61. package/lib/cjs/Relationship.js.map +1 -1
  62. package/lib/cjs/RpcBackend.js.map +1 -1
  63. package/lib/cjs/SQLiteDb.js.map +1 -1
  64. package/lib/cjs/Schema.js.map +1 -1
  65. package/lib/cjs/SchemaSync.js.map +1 -1
  66. package/lib/cjs/SchemaUtils.js.map +1 -1
  67. package/lib/cjs/SheetIndex.js.map +1 -1
  68. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  69. package/lib/cjs/SqliteStatement.js.map +1 -1
  70. package/lib/cjs/TextAnnotationElement.js.map +1 -1
  71. package/lib/cjs/TextAnnotationGeometry.js.map +1 -1
  72. package/lib/cjs/TextAnnotationLayout.js.map +1 -1
  73. package/lib/cjs/Texture.js.map +1 -1
  74. package/lib/cjs/TileStorage.js.map +1 -1
  75. package/lib/cjs/TxnManager.js.map +1 -1
  76. package/lib/cjs/ViewDefinition.js.map +1 -1
  77. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  78. package/lib/cjs/ViewStore.js.map +1 -1
  79. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  80. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  81. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  82. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  83. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  84. package/lib/cjs/core-backend.js.map +1 -1
  85. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  86. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  87. package/lib/cjs/domains/GenericElements.js.map +1 -1
  88. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  89. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  90. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  91. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  92. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  93. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  94. package/lib/cjs/internal/NoLocks.js.map +1 -1
  95. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  96. package/lib/cjs/internal/Symbols.js.map +1 -1
  97. package/lib/cjs/internal/cross-package.js.map +1 -1
  98. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  99. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  100. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  101. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  102. package/lib/cjs/rpc/multipart.js.map +1 -1
  103. package/lib/cjs/rpc/tracing.js.map +1 -1
  104. package/lib/cjs/rpc/web/logging.js.map +1 -1
  105. package/lib/cjs/rpc/web/request.js.map +1 -1
  106. package/lib/cjs/rpc/web/response.js.map +1 -1
  107. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  108. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  109. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  110. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  111. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  112. package/lib/cjs/workspace/Settings.js.map +1 -1
  113. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  114. package/lib/cjs/workspace/Workspace.js.map +1 -1
  115. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  116. package/lib/esm/BackendHubAccess.js.map +1 -1
  117. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  118. package/lib/esm/BisCoreSchema.js.map +1 -1
  119. package/lib/esm/BlobContainerService.js.map +1 -1
  120. package/lib/esm/BriefcaseManager.js.map +1 -1
  121. package/lib/esm/Category.js.map +1 -1
  122. package/lib/esm/ChangeSummaryManager.js +2 -2
  123. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  124. package/lib/esm/ChangedElementsDb.js.map +1 -1
  125. package/lib/esm/ChangesetECAdaptor.js +242 -242
  126. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  127. package/lib/esm/ChannelControl.js.map +1 -1
  128. package/lib/esm/CheckpointManager.js.map +1 -1
  129. package/lib/esm/ClassRegistry.js +5 -5
  130. package/lib/esm/ClassRegistry.js.map +1 -1
  131. package/lib/esm/CloudSqlite.js.map +1 -1
  132. package/lib/esm/CodeService.js.map +1 -1
  133. package/lib/esm/CodeSpecs.js.map +1 -1
  134. package/lib/esm/ConcurrentQuery.js.map +1 -1
  135. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  136. package/lib/esm/DevTools.js.map +1 -1
  137. package/lib/esm/DisplayStyle.js.map +1 -1
  138. package/lib/esm/ECDb.js.map +1 -1
  139. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  140. package/lib/esm/ECSqlStatement.js.map +1 -1
  141. package/lib/esm/Element.js.map +1 -1
  142. package/lib/esm/ElementAspect.js.map +1 -1
  143. package/lib/esm/ElementGraphics.js.map +1 -1
  144. package/lib/esm/ElementTreeWalker.js.map +1 -1
  145. package/lib/esm/Entity.js.map +1 -1
  146. package/lib/esm/EntityReferences.js.map +1 -1
  147. package/lib/esm/ExportGraphics.js.map +1 -1
  148. package/lib/esm/ExternalSource.js.map +1 -1
  149. package/lib/esm/FontFile.js.map +1 -1
  150. package/lib/esm/GeoCoordConfig.js.map +1 -1
  151. package/lib/esm/GeographicCRSServices.js.map +1 -1
  152. package/lib/esm/GeometrySummary.js +47 -47
  153. package/lib/esm/GeometrySummary.js.map +1 -1
  154. package/lib/esm/HubMock.js.map +1 -1
  155. package/lib/esm/IModelDb.js +8 -8
  156. package/lib/esm/IModelDb.js.map +1 -1
  157. package/lib/esm/IModelDbFonts.js.map +1 -1
  158. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  159. package/lib/esm/IModelHost.js.map +1 -1
  160. package/lib/esm/IModelJsFs.js.map +1 -1
  161. package/lib/esm/ImageSourceConversion.js.map +1 -1
  162. package/lib/esm/IpcHost.js.map +1 -1
  163. package/lib/esm/LineStyle.js.map +1 -1
  164. package/lib/esm/LocalHub.js +1 -1
  165. package/lib/esm/LocalHub.js.map +1 -1
  166. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  167. package/lib/esm/LockControl.js.map +1 -1
  168. package/lib/esm/Material.js.map +1 -1
  169. package/lib/esm/Model.js.map +1 -1
  170. package/lib/esm/NativeAppStorage.js.map +1 -1
  171. package/lib/esm/NativeHost.js.map +1 -1
  172. package/lib/esm/NavigationRelationship.js.map +1 -1
  173. package/lib/esm/PromiseMemoizer.js.map +1 -1
  174. package/lib/esm/PropertyStore.js.map +1 -1
  175. package/lib/esm/Relationship.js.map +1 -1
  176. package/lib/esm/RpcBackend.js.map +1 -1
  177. package/lib/esm/SQLiteDb.js.map +1 -1
  178. package/lib/esm/Schema.js.map +1 -1
  179. package/lib/esm/SchemaSync.js.map +1 -1
  180. package/lib/esm/SchemaUtils.js.map +1 -1
  181. package/lib/esm/SheetIndex.js.map +1 -1
  182. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  183. package/lib/esm/SqliteStatement.js.map +1 -1
  184. package/lib/esm/TextAnnotationElement.js.map +1 -1
  185. package/lib/esm/TextAnnotationGeometry.js.map +1 -1
  186. package/lib/esm/TextAnnotationLayout.js.map +1 -1
  187. package/lib/esm/Texture.js.map +1 -1
  188. package/lib/esm/TileStorage.js.map +1 -1
  189. package/lib/esm/TxnManager.js.map +1 -1
  190. package/lib/esm/ViewDefinition.js.map +1 -1
  191. package/lib/esm/ViewStateHydrator.js.map +1 -1
  192. package/lib/esm/ViewStore.js.map +1 -1
  193. package/lib/esm/core-backend.js.map +1 -1
  194. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  195. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  196. package/lib/esm/domains/GenericElements.js.map +1 -1
  197. package/lib/esm/domains/GenericSchema.js.map +1 -1
  198. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  199. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  200. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  201. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  202. package/lib/esm/internal/NativePlatform.js.map +1 -1
  203. package/lib/esm/internal/NoLocks.js.map +1 -1
  204. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  205. package/lib/esm/internal/Symbols.js.map +1 -1
  206. package/lib/esm/internal/cross-package.js.map +1 -1
  207. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  208. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  209. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  210. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  211. package/lib/esm/rpc/multipart.js.map +1 -1
  212. package/lib/esm/rpc/tracing.js.map +1 -1
  213. package/lib/esm/rpc/web/logging.js.map +1 -1
  214. package/lib/esm/rpc/web/request.js.map +1 -1
  215. package/lib/esm/rpc/web/response.js.map +1 -1
  216. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  217. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  218. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  219. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  220. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  221. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  222. package/lib/esm/test/AttachDb.test.js +11 -11
  223. package/lib/esm/test/AttachDb.test.js.map +1 -1
  224. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  225. package/lib/esm/test/IModelHost.test.js.map +1 -1
  226. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  227. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  228. package/lib/esm/test/IpcHost.test.js.map +1 -1
  229. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  230. package/lib/esm/test/PrintElementTree.js.map +1 -1
  231. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  232. package/lib/esm/test/RevisionUtility.js.map +1 -1
  233. package/lib/esm/test/SchemaUtils.test.js +25 -25
  234. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  235. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  236. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  237. package/lib/esm/test/TestUtils.js.map +1 -1
  238. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  239. package/lib/esm/test/categories/Category.test.js.map +1 -1
  240. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  241. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  242. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  243. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  244. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  245. package/lib/esm/test/ecdb/ECDb.test.js +57 -57
  246. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  247. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  248. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  249. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  250. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  251. package/lib/esm/test/ecdb/ECSqlQuery.test.js +7 -7
  252. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  253. package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
  254. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  255. package/lib/esm/test/ecdb/ECSqlStatement.test.js +292 -292
  256. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  257. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  258. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  259. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  260. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  261. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  262. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  263. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  264. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  265. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  266. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  267. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  268. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  269. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  270. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  271. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  272. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  273. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  274. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  275. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  276. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  277. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  278. package/lib/esm/test/imageData.js.map +1 -1
  279. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  280. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  281. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  282. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  283. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  284. package/lib/esm/test/index.js.map +1 -1
  285. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  286. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  287. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  288. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  289. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  290. package/lib/esm/test/rpc/response.test.js.map +1 -1
  291. package/lib/esm/test/schema/ClassRegistry.test.js +71 -71
  292. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  293. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  294. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  295. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  296. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  297. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  298. package/lib/esm/test/standalone/ChangesetReader.test.js +28 -28
  299. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  300. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  301. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  302. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  303. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  304. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  305. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  306. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  307. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  308. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  309. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  310. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  311. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  312. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  313. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  314. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  315. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  316. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  317. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  318. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  319. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  320. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  321. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  322. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  323. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  324. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  325. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  326. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  327. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  328. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  329. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  330. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  331. package/lib/esm/workspace/Settings.js.map +1 -1
  332. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  333. package/lib/esm/workspace/Workspace.js.map +1 -1
  334. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  335. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"TextAnnotation.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/TextAnnotation.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 { computeGraphemeOffsets, ComputeGraphemeOffsetsArgs, ComputeRangesForTextLayout, ComputeRangesForTextLayoutArgs, FindFontId, FindTextStyle, layoutTextBlock, LineLayout, RunLayout, TextBlockLayout, TextLayoutRanges } from \"../../TextAnnotationLayout\";\r\nimport { Geometry, Range2d } from \"@itwin/core-geometry\";\r\nimport { ColorDef, FontType, FractionRun, LineBreakRun, LineLayoutResult, Run, RunLayoutResult, TextAnnotation, TextAnnotation2dProps, TextAnnotation3dProps, TextAnnotationAnchor, TextBlock, TextBlockGeometryPropsEntry, TextBlockMargins, TextRun, TextStringProps, TextStyleSettings } from \"@itwin/core-common\";\r\nimport { IModelDb, SnapshotDb } from \"../../IModelDb\";\r\nimport { TextAnnotation2d, TextAnnotation3d } from \"../../TextAnnotationElement\";\r\nimport { produceTextAnnotationGeometry } from \"../../TextAnnotationGeometry\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { GeometricElement3d } from \"../../Element\";\r\nimport { Id64, ProcessDetector } from \"@itwin/core-bentley\";\r\n\r\nfunction computeTextRangeAsStringLength(args: ComputeRangesForTextLayoutArgs): TextLayoutRanges {\r\n const range = new Range2d(0, 0, args.chars.length, args.lineHeight);\r\n return { layout: range, justification: range };\r\n}\r\n\r\nfunction doLayout(textBlock: TextBlock, args?: {\r\n findTextStyle?: FindTextStyle;\r\n findFontId?: FindFontId;\r\n computeTextRange?: ComputeRangesForTextLayout;\r\n}): TextBlockLayout {\r\n const layout = layoutTextBlock({\r\n textBlock,\r\n iModel: {} as any,\r\n findTextStyle: args?.findTextStyle ?? (() => TextStyleSettings.defaults),\r\n findFontId: args?.findFontId ?? (() => 0),\r\n computeTextRange: args?.computeTextRange ?? computeTextRangeAsStringLength,\r\n });\r\n\r\n return layout;\r\n}\r\n\r\nfunction makeTextRun(content: string, styleName = \"\"): TextRun {\r\n return TextRun.create({ content, styleName });\r\n}\r\n\r\nfunction isIntlSupported(): boolean {\r\n // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile\r\n // users are not expected to do any editing, but long term we will attempt to find a better\r\n // solution.\r\n return !ProcessDetector.isMobileAppBackend;\r\n}\r\n\r\ndescribe(\"layoutTextBlock\", () => {\r\n it(\"resolves TextStyleSettings from combination of TextBlock and Run\", () => {\r\n const textBlock = TextBlock.create({ styleName: \"block\", styleOverrides: { widthFactor: 34, color: 0x00ff00 } });\r\n const run0 = TextRun.create({ content: \"run0\", styleName: \"run\", styleOverrides: { lineHeight: 56, color: 0xff0000 } });\r\n const run1 = TextRun.create({ content: \"run1\", styleName: \"run\", styleOverrides: { widthFactor: 78, fontName: \"run1\" } });\r\n textBlock.appendRun(run0);\r\n textBlock.appendRun(run1);\r\n\r\n const tb = doLayout(textBlock, {\r\n findTextStyle: (name: string) => TextStyleSettings.fromJSON(name === \"block\" ? { lineSpacingFactor: 12, fontName: \"block\" } : { lineSpacingFactor: 99, fontName: \"run\" }),\r\n });\r\n\r\n expect(tb.lines.length).to.equal(1);\r\n expect(tb.lines[0].runs.length).to.equal(2);\r\n\r\n const s0 = tb.lines[0].runs[0].style;\r\n expect(s0.lineHeight).to.equal(1);\r\n expect(s0.lineSpacingFactor).to.equal(12);\r\n expect(s0.widthFactor).to.equal(34);\r\n expect(s0.fontName).to.equal(\"run\");\r\n expect(s0.color).to.equal(0xff0000);\r\n\r\n const s1 = tb.lines[0].runs[1].style;\r\n expect(s1.widthFactor).to.equal(34);\r\n expect(s1.lineSpacingFactor).to.equal(12);\r\n expect(s1.lineHeight).to.equal(1);\r\n expect(s1.fontName).to.equal(\"run1\");\r\n expect(s1.color).to.equal(\"subcategory\");\r\n });\r\n\r\n it(\"aligns text to center based on height of stacked fraction\", () => {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n const fractionRun = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleName: \"fraction\" });\r\n const textRun = TextRun.create({ content: \"text\", styleName: \"text\" });\r\n textBlock.appendRun(fractionRun);\r\n textBlock.appendRun(textRun);\r\n\r\n const layout = doLayout(textBlock);\r\n\r\n const fractionLayout = layout.lines[0].runs[0];\r\n const textLayout = layout.lines[0].runs[1];\r\n\r\n const round = (num: number, numDecimalPlaces: number) => {\r\n const mult = Math.pow(100, numDecimalPlaces);\r\n return Math.round(num * mult) / mult;\r\n };\r\n\r\n expect(textLayout.range.yLength()).to.equal(1);\r\n expect(round(fractionLayout.range.yLength(), 2)).to.equal(1.75);\r\n expect(fractionLayout.offsetFromLine.y).to.equal(0);\r\n expect(round(textLayout.offsetFromLine.y, 3)).to.equal(.375);\r\n });\r\n\r\n it(\"produces one line per paragraph if document width <= 0\", () => {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n for (let i = 0; i < 4; i++) {\r\n const layout = doLayout(textBlock);\r\n if (i === 0) {\r\n expect(layout.range.isNull).to.be.true;\r\n } else {\r\n expect(layout.lines.length).to.equal(i);\r\n expect(layout.range.low.x).to.equal(0);\r\n expect(layout.range.low.y).to.equal(-i - (0.5 * (i - 1))); // lineSpacingFactor=0.5\r\n expect(layout.range.high.x).to.equal(i * 3);\r\n expect(layout.range.high.y).to.equal(0);\r\n }\r\n\r\n for (let l = 0; l < layout.lines.length; l++) {\r\n const line = layout.lines[l];\r\n expect(line.runs.length).to.equal(l + 1);\r\n expect(line.range.low.x).to.equal(0);\r\n expect(line.range.low.y).to.equal(0);\r\n expect(line.range.high.y).to.equal(1);\r\n expect(line.range.high.x).to.equal(3 * (l + 1));\r\n for (const run of line.runs) {\r\n expect(run.charOffset).to.equal(0);\r\n expect(run.numChars).to.equal(3);\r\n expect(run.range.low.x).to.equal(0);\r\n expect(run.range.low.y).to.equal(0);\r\n expect(run.range.high.x).to.equal(3);\r\n expect(run.range.high.y).to.equal(1);\r\n }\r\n }\r\n\r\n const p = textBlock.appendParagraph();\r\n for (let j = 0; j <= i; j++) {\r\n p.runs.push(TextRun.create({ styleName: \"\", content: \"Run\" }));\r\n }\r\n }\r\n });\r\n\r\n it(\"produces a new line for each LineBreakRun\", () => {\r\n const lineSpacingFactor = 0.5;\r\n const lineHeight = 1;\r\n const textBlock = TextBlock.create({ styleName: \"\", styleOverrides: { lineSpacingFactor, lineHeight } });\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"abc\" }));\r\n textBlock.appendRun(LineBreakRun.create({ styleName: \"\" }));\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"def\" }));\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"ghi\" }));\r\n textBlock.appendRun(LineBreakRun.create({ styleName: \"\" }));\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"jkl\" }));\r\n\r\n const tb = doLayout(textBlock);\r\n expect(tb.lines.length).to.equal(3);\r\n expect(tb.lines[0].runs.length).to.equal(2);\r\n expect(tb.lines[1].runs.length).to.equal(3);\r\n expect(tb.lines[2].runs.length).to.equal(1);\r\n\r\n expect(tb.range.low.x).to.equal(0);\r\n expect(tb.range.high.x).to.equal(6);\r\n expect(tb.range.high.y).to.equal(0);\r\n expect(tb.range.low.y).to.equal(-(lineSpacingFactor * 2 + lineHeight * 3));\r\n });\r\n\r\n it(\"computes ranges based on custom line spacing and line height\", () => {\r\n const lineSpacingFactor = 2;\r\n const lineHeight = 3;\r\n const textBlock = TextBlock.create({ styleName: \"\", styleOverrides: { lineSpacingFactor, lineHeight } });\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"abc\" }));\r\n textBlock.appendRun(LineBreakRun.create({ styleName: \"\" }));\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"def\" }));\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"ghi\" }));\r\n textBlock.appendRun(LineBreakRun.create({ styleName: \"\" }));\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"jkl\" }));\r\n\r\n const tb = doLayout(textBlock);\r\n expect(tb.lines.length).to.equal(3);\r\n expect(tb.lines[0].runs.length).to.equal(2);\r\n expect(tb.lines[1].runs.length).to.equal(3);\r\n expect(tb.lines[2].runs.length).to.equal(1);\r\n\r\n // We have 3 lines each `lineHeight` high, plus 2 line breaks in between each `lineHeight*lineSpacingFactor` high.\r\n expect(tb.range.low.x).to.equal(0);\r\n expect(tb.range.high.x).to.equal(6);\r\n expect(tb.range.high.y).to.equal(0);\r\n expect(tb.range.low.y).to.equal(-(lineHeight * 3 + (lineHeight * lineSpacingFactor) * 2));\r\n\r\n expect(tb.lines[0].offsetFromDocument.y).to.equal(-lineHeight);\r\n expect(tb.lines[1].offsetFromDocument.y).to.equal(tb.lines[0].offsetFromDocument.y - (lineHeight + lineHeight * lineSpacingFactor));\r\n expect(tb.lines[2].offsetFromDocument.y).to.equal(tb.lines[1].offsetFromDocument.y - (lineHeight + lineHeight * lineSpacingFactor));\r\n expect(tb.lines.every((line) => line.offsetFromDocument.x === 0)).to.be.true;\r\n });\r\n\r\n it(\"splits paragraphs into multiple lines if runs exceed the document width\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n textBlock.width = 6;\r\n textBlock.appendRun(makeTextRun(\"ab\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(1);\r\n textBlock.appendRun(makeTextRun(\"cd\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(1);\r\n\r\n textBlock.appendRun(makeTextRun(\"ef\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(1);\r\n textBlock.appendRun(makeTextRun(\"ghi\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(2);\r\n\r\n textBlock.appendRun(makeTextRun(\"jklmnop\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(3);\r\n\r\n textBlock.appendRun(makeTextRun(\"q\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(4);\r\n textBlock.appendRun(makeTextRun(\"r\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(4);\r\n textBlock.appendRun(makeTextRun(\"stu\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(4);\r\n\r\n textBlock.appendRun(makeTextRun(\"vwxyz\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(5);\r\n });\r\n\r\n function expectRange(width: number, height: number, range: Range2d): void {\r\n expect(range.xLength()).to.equal(width);\r\n expect(range.yLength()).to.equal(height);\r\n }\r\n\r\n it(\"computes range for wrapped lines\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ styleName: \"\", width: 3, styleOverrides: { lineHeight: 1, lineSpacingFactor: 0 } });\r\n\r\n function expectBlockRange(width: number, height: number): void {\r\n const layout = doLayout(block);\r\n expectRange(width, height, layout.range);\r\n }\r\n\r\n block.appendRun(makeTextRun(\"abc\"));\r\n expectBlockRange(3, 1);\r\n\r\n block.appendRun(makeTextRun(\"defg\"));\r\n expectBlockRange(4, 2);\r\n\r\n block.width = 1;\r\n expectBlockRange(4, 2);\r\n\r\n block.width = 8;\r\n expectBlockRange(8, 1);\r\n\r\n block.width = 6;\r\n expectBlockRange(6, 2);\r\n\r\n block.width = 10;\r\n expectBlockRange(10, 1);\r\n block.appendRun(makeTextRun(\"hijk\"));\r\n expectBlockRange(10, 2);\r\n });\r\n\r\n it(\"computes range for split runs\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ styleName: \"\", styleOverrides: { lineHeight: 1, lineSpacingFactor: 0 } });\r\n\r\n function expectBlockRange(width: number, height: number): void {\r\n const layout = doLayout(block);\r\n expectRange(width, height, layout.range);\r\n }\r\n\r\n const sentence = \"a bc def ghij klmno\";\r\n expect(sentence.length).to.equal(19);\r\n block.appendRun(makeTextRun(sentence));\r\n\r\n block.width = 19;\r\n expectBlockRange(19, 1);\r\n\r\n block.width = 10;\r\n expectBlockRange(10, 2);\r\n });\r\n\r\n it(\"justifies lines\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ styleName: \"\", styleOverrides: { lineSpacingFactor: 0 } });\r\n\r\n function expectBlockRange(width: number, height: number): void {\r\n const layout = doLayout(block);\r\n expectRange(width, height, layout.range);\r\n }\r\n\r\n function expectLineOffset(offset: number, lineIndex: number): void {\r\n const layout = doLayout(block);\r\n expect(layout.lines.length).least(lineIndex + 1);\r\n\r\n const line = layout.lines[lineIndex];\r\n expect(line.offsetFromDocument.y).to.equal(-(lineIndex + 1));\r\n expect(line.offsetFromDocument.x).to.equal(offset);\r\n }\r\n\r\n // Two text runs with 7 characters total.\r\n block.appendRun(makeTextRun(\"abc\"));\r\n block.appendRun(makeTextRun(\"defg\"));\r\n\r\n // 1 line of text with width 0: left, right, center justification.\r\n block.justification = \"left\";\r\n expectBlockRange(7, 1);\r\n expectLineOffset(0, 0);\r\n\r\n block.justification = \"right\";\r\n expectBlockRange(7, 1);\r\n expectLineOffset(0, 0);\r\n\r\n block.justification = \"center\";\r\n expectBlockRange(7, 1);\r\n expectLineOffset(0, 0);\r\n\r\n // 1 line of text from a width greater than number of characters: left, right, center justification.\r\n block.width = 10;\r\n\r\n block.justification = \"left\";\r\n expectBlockRange(10, 1);\r\n expectLineOffset(0, 0);\r\n\r\n block.justification = \"right\";\r\n expectBlockRange(10, 1);\r\n expectLineOffset(3, 0); // 3 = 10 - 7\r\n\r\n block.justification = \"center\";\r\n expectBlockRange(10, 1);\r\n expectLineOffset(1.5, 0); // 1.5 = (10 - 7) / 2\r\n\r\n // 2 line of text from a width less than number of characters: left, right, center justification.\r\n block.justification = \"left\";\r\n block.width = 4;\r\n expectBlockRange(4, 2);\r\n expectLineOffset(0, 0);\r\n expectLineOffset(0, 1);\r\n\r\n block.justification = \"right\";\r\n expectBlockRange(4, 2);\r\n expectLineOffset(1, 0);\r\n expectLineOffset(0, 1);\r\n\r\n block.justification = \"center\";\r\n expectBlockRange(4, 2);\r\n expectLineOffset(0.5, 0);\r\n expectLineOffset(0, 1);\r\n\r\n // Testing text longer the the width of the text block.\r\n block.width = 2;\r\n block.justification = \"left\";\r\n expectBlockRange(4, 2);\r\n expectLineOffset(0, 0);\r\n expectLineOffset(0, 1);\r\n\r\n block.justification = \"right\";\r\n expectBlockRange(4, 2);\r\n expectLineOffset(-1, 0);\r\n expectLineOffset(-2, 1);\r\n\r\n block.appendRun(makeTextRun(\"123456789\"));\r\n expectBlockRange(9, 3);\r\n expectLineOffset(-1, 0);\r\n expectLineOffset(-2, 1);\r\n expectLineOffset(-7, 2);\r\n\r\n block.justification = \"center\";\r\n expectBlockRange(9, 3);\r\n expectLineOffset(-0.5, 0);\r\n expectLineOffset(-1, 1);\r\n expectLineOffset(-3.5, 2);\r\n });\r\n\r\n function expectLines(input: string, width: number, expectedLines: string[]): TextBlockLayout {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n textBlock.width = width;\r\n const run = makeTextRun(input);\r\n textBlock.appendRun(run);\r\n\r\n const layout = doLayout(textBlock);\r\n expect(layout.lines.every((line) => line.runs.every((r) => r.source === run))).to.be.true;\r\n\r\n const actual = layout.lines.map((line) => line.runs.map((runLayout) => (runLayout.source as TextRun).content.substring(runLayout.charOffset, runLayout.charOffset + runLayout.numChars)).join(\"\"));\r\n expect(actual).to.deep.equal(expectedLines);\r\n\r\n return layout;\r\n }\r\n\r\n it(\"splits a single TextRun at word boundaries if it exceeds the document width\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n expectLines(\"a bc def ghij klmno pqrstu vwxyz\", 5, [\r\n \"a bc \",\r\n \"def \",\r\n \"ghij \",\r\n \"klmno \",\r\n \"pqrstu \",\r\n \"vwxyz\",\r\n ]);\r\n\r\n const fox = \"The quick brown fox jumped over the lazy dog\";\r\n expectLines(fox, 50, [fox]);\r\n expectLines(fox, 40, [\r\n // 1 2 3 4\r\n // 34567890123456789012345678901234567890\r\n \"The quick brown fox jumped over the \",\r\n \"lazy dog\",\r\n ]);\r\n expectLines(fox, 30, [\r\n // 1 2 3\r\n // 3456789012345678901234567890\r\n \"The quick brown fox jumped \",\r\n \"over the lazy dog\",\r\n ]);\r\n expectLines(fox, 20, [\r\n // 1 2\r\n // 345678901234567890\r\n \"The quick brown fox \",\r\n \"jumped over the \",\r\n \"lazy dog\",\r\n ]);\r\n expectLines(fox, 10, [\r\n // 1\r\n // 234567890\r\n \"The quick \",\r\n \"brown fox \",\r\n \"jumped \",\r\n \"over the \",\r\n \"lazy dog\",\r\n ]);\r\n });\r\n\r\n it(\"considers consecutive whitespace part of a single 'word'\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n expectLines(\"a b c d e f \", 3, [\r\n \"a \",\r\n \"b \",\r\n \"c \",\r\n \"d \",\r\n \"e \",\r\n \"f \",\r\n ]);\r\n });\r\n\r\n it(\"wraps Japanese text\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n // \"I am a cat. The name is Tanuki.\"\r\n expectLines(\"吾輩は猫である。名前はたぬき。\", 1, [\"吾\", \"輩\", \"は\", \"猫\", \"で\", \"あ\", \"る。\", \"名\", \"前\", \"は\", \"た\", \"ぬ\", \"き。\"]);\r\n });\r\n\r\n it(\"performs word-wrapping with punctuation\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n expectLines(\"1.24 56.7 8,910\", 1, [\"1.24 \", \"56.7 \", \"8,910\"]);\r\n\r\n expectLines(\"a.bc de.f g,hij\", 1, [\"a.bc \", \"de.f \", \"g,hij\"]);\r\n\r\n expectLines(\"Let's see... can you (or anyone) predict?!\", 1, [\r\n \"Let's \",\r\n \"see... \",\r\n \"can \",\r\n \"you \",\r\n \"(or \",\r\n \"anyone) \",\r\n \"predict?!\",\r\n ]);\r\n });\r\n\r\n it(\"performs word-wrapping and line-splitting with multiple runs\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n for (const str of [\"The \", \"quick brown\", \" fox jumped over \", \"the lazy \", \"dog\"]) {\r\n textBlock.appendRun(makeTextRun(str));\r\n }\r\n\r\n function test(width: number, expected: string[]): void {\r\n textBlock.width = width;\r\n const layout = doLayout(textBlock);\r\n const actual = layout.lines.map((line) => line.runs.map((runLayout) => (runLayout.source as TextRun).content.substring(runLayout.charOffset, runLayout.charOffset + runLayout.numChars)).join(\"\"));\r\n expect(actual).to.deep.equal(expected);\r\n }\r\n\r\n test(50, [\"The quick brown fox jumped over the lazy dog\"]);\r\n test(40, [\r\n // 1 2 3 4\r\n // 34567890123456789012345678901234567890\r\n \"The quick brown fox jumped over the \",\r\n \"lazy dog\",\r\n ]);\r\n test(30, [\r\n // 1 2 3\r\n // 3456789012345678901234567890\r\n \"The quick brown fox jumped \",\r\n \"over the lazy dog\",\r\n ]);\r\n test(20, [\r\n // 1 2\r\n // 345678901234567890\r\n \"The quick brown fox \",\r\n \"jumped over the \",\r\n \"lazy dog\",\r\n ]);\r\n test(10, [\r\n // 1\r\n // 34567890\r\n \"The quick \",\r\n \"brown fox \",\r\n \"jumped \",\r\n \"over the \",\r\n \"lazy dog\",\r\n ]);\r\n });\r\n\r\n it(\"wraps multiple runs\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ styleName: \"\" });\r\n block.appendRun(makeTextRun(\"aa\")); // 2 chars wide\r\n block.appendRun(makeTextRun(\"bb ccc d ee\")); // 11 chars wide\r\n block.appendRun(makeTextRun(\"ff ggg h\")); // 8 chars wide\r\n\r\n function expectLayout(width: number, expected: string): void {\r\n block.width = width;\r\n const layout = doLayout(block);\r\n expect(layout.stringify()).to.equal(expected);\r\n }\r\n\r\n expectLayout(23, \"aabb ccc d eeff ggg h\");\r\n expectLayout(22, \"aabb ccc d eeff ggg h\");\r\n expectLayout(21, \"aabb ccc d eeff ggg h\");\r\n expectLayout(20, \"aabb ccc d eeff ggg \\nh\");\r\n expectLayout(19, \"aabb ccc d eeff \\nggg h\");\r\n expectLayout(18, \"aabb ccc d eeff \\nggg h\");\r\n expectLayout(17, \"aabb ccc d eeff \\nggg h\");\r\n expectLayout(16, \"aabb ccc d eeff \\nggg h\");\r\n expectLayout(15, \"aabb ccc d ee\\nff ggg h\");\r\n expectLayout(14, \"aabb ccc d ee\\nff ggg h\");\r\n expectLayout(13, \"aabb ccc d ee\\nff ggg h\");\r\n expectLayout(12, \"aabb ccc d \\neeff ggg h\");\r\n expectLayout(11, \"aabb ccc d \\neeff ggg h\");\r\n expectLayout(10, \"aabb ccc \\nd eeff \\nggg h\");\r\n expectLayout(9, \"aabb ccc \\nd eeff \\nggg h\");\r\n expectLayout(8, \"aabb \\nccc d ee\\nff ggg h\");\r\n expectLayout(7, \"aabb \\nccc d \\neeff \\nggg h\");\r\n expectLayout(6, \"aabb \\nccc d \\neeff \\nggg h\");\r\n expectLayout(5, \"aabb \\nccc \\nd ee\\nff \\nggg h\");\r\n expectLayout(4, \"aa\\nbb \\nccc \\nd ee\\nff \\nggg \\nh\");\r\n expectLayout(3, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\r\n expectLayout(2, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\r\n expectLayout(1, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\r\n expectLayout(0, \"aabb ccc d eeff ggg h\");\r\n expectLayout(-1, \"aabb ccc d eeff ggg h\");\r\n expectLayout(-2, \"aabb ccc d eeff ggg h\");\r\n });\r\n\r\n it(\"does not word wrap due to floating point rounding error\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ styleName: \"\", styleOverrides: { lineHeight: 1, lineSpacingFactor: 0 } });\r\n block.appendRun(makeTextRun(\"abc defg\"));\r\n const layout1 = doLayout(block);\r\n let width = layout1.range.xLength();\r\n // Simulate a floating point rounding error by slightly reducing the width\r\n width -= Geometry.smallFloatingPoint;\r\n block.width = width;\r\n const layout2 = doLayout(block);\r\n expect(layout2.range.yLength()).to.equal(1);\r\n })\r\n\r\n it(\"has consistent data when converted to a layout result\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n // Initialize a new TextBlockLayout object\r\n const textBlock = TextBlock.create({ width: 50, styleName: \"\", styleOverrides: { widthFactor: 34, color: 0x00ff00, fontName: \"arial\" } });\r\n const run0 = TextRun.create({\r\n content: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium mi sit amet magna malesuada, at venenatis ante eleifend.\",\r\n styleName: \"\",\r\n styleOverrides: { lineHeight: 56, color: 0xff0000 },\r\n });\r\n const run1 = TextRun.create({\r\n content: \"Donec sit amet semper sapien. Nullam commodo, libero a accumsan lacinia, metus enim pharetra lacus, eu facilisis sem nisi eu dui.\",\r\n styleName: \"\",\r\n styleOverrides: { widthFactor: 78, fontName: \"run1\" },\r\n });\r\n const run2 = TextRun.create({\r\n content: \"Duis dui quam, suscipit quis feugiat id, fermentum ut augue. Mauris iaculis odio rhoncus lorem eleifend, posuere viverra turpis elementum.\",\r\n styleName: \"\",\r\n styleOverrides: {},\r\n });\r\n const fractionRun = FractionRun.create({ numerator: \"num\", denominator: \"denom\", styleName: \"\", styleOverrides: {} });\r\n textBlock.appendRun(run0);\r\n textBlock.appendRun(fractionRun);\r\n textBlock.appendParagraph();\r\n textBlock.appendRun(run1);\r\n textBlock.appendRun(run2);\r\n\r\n // Call the toResult() method\r\n const textBlockLayout = doLayout(\r\n textBlock,\r\n {\r\n findFontId: (fontName: string) => {\r\n if (fontName === \"arial\") {\r\n return 1;\r\n } else if (fontName === \"run1\") {\r\n return 2;\r\n }\r\n return 0;\r\n },\r\n });\r\n const result = textBlockLayout.toResult();\r\n\r\n // Assert that the result object has the same data as the original TextBlockLayout object\r\n expect(result.range).to.deep.equal(textBlockLayout.range.toJSON());\r\n expect(result.lines.length).to.equal(textBlockLayout.lines.length);\r\n\r\n // Loop through each line in the result and the original object\r\n for (let i = 0; i < result.lines.length; i++) {\r\n const resultLine: LineLayoutResult = result.lines[i];\r\n const originalLine: LineLayout = textBlockLayout.lines[i];\r\n\r\n // Source paragraph index matches\r\n expect(resultLine.sourceParagraphIndex).to.equal(textBlock.paragraphs.indexOf(originalLine.source));\r\n // Ranges match\r\n expect(resultLine.range).to.deep.equal(originalLine.range.toJSON());\r\n expect(resultLine.justificationRange).to.deep.equal(originalLine.justificationRange.toJSON());\r\n // Offset matches\r\n expect(resultLine.offsetFromDocument).to.deep.equal(originalLine.offsetFromDocument);\r\n\r\n for (let j = 0; j < resultLine.runs.length; j++) {\r\n const resultRun: RunLayoutResult = resultLine.runs[j];\r\n const originalRun: RunLayout = originalLine.runs[j];\r\n\r\n // Source run index matches\r\n expect(resultRun.sourceRunIndex).to.equal(textBlock.paragraphs[resultLine.sourceParagraphIndex].runs.indexOf(originalRun.source));\r\n // FontId matches\r\n expect(resultRun.fontId).to.equal(originalRun.fontId);\r\n // Offsets match\r\n expect(resultRun.characterOffset).to.equal(originalRun.charOffset);\r\n expect(resultRun.characterCount).to.equal(originalRun.numChars);\r\n expect(resultRun.offsetFromLine).to.deep.equal(originalRun.offsetFromLine);\r\n // Range matches\r\n expect(resultRun.range).to.deep.equal(originalRun.range.toJSON());\r\n // Text style matches\r\n expect(resultRun.textStyle).to.deep.equal(originalRun.style.toJSON());\r\n // Optional values match existence and values\r\n if (resultRun.justificationRange) {\r\n expect(originalRun.justificationRange);\r\n }\r\n if (originalRun.justificationRange) {\r\n expect(resultRun.justificationRange);\r\n }\r\n if (resultRun.justificationRange && originalRun.justificationRange) {\r\n expect(resultRun.justificationRange).to.deep.equal(originalRun.justificationRange.toJSON());\r\n }\r\n if (resultRun.numeratorRange) {\r\n expect(originalRun.numeratorRange);\r\n }\r\n if (originalRun.numeratorRange) {\r\n expect(resultRun.numeratorRange);\r\n }\r\n if (resultRun.numeratorRange && originalRun.numeratorRange) {\r\n expect(resultRun.numeratorRange).to.deep.equal(originalRun.numeratorRange.toJSON());\r\n }\r\n if (resultRun.denominatorRange) {\r\n expect(originalRun.denominatorRange);\r\n }\r\n if (originalRun.denominatorRange) {\r\n expect(resultRun.denominatorRange);\r\n }\r\n if (resultRun.denominatorRange && originalRun.denominatorRange) {\r\n expect(resultRun.denominatorRange).to.deep.equal(originalRun.denominatorRange.toJSON());\r\n }\r\n // Check that the result string matches what we expect\r\n const inputRun = textBlock.paragraphs[resultLine.sourceParagraphIndex].runs[resultRun.sourceRunIndex].clone();\r\n if (inputRun.type === \"text\") {\r\n const resultText = inputRun.content.substring(resultRun.characterOffset, resultRun.characterOffset + resultRun.characterCount);\r\n const originalText = inputRun.content.substring(originalRun.charOffset, originalRun.charOffset + originalRun.numChars);\r\n expect(resultText).to.equal(originalText);\r\n }\r\n }\r\n }\r\n });\r\n\r\n it(\"adds margins\", function () {\r\n const expectMargins = (layoutRange: Range2d, marginRange: Range2d, margins: Partial<TextBlockMargins>) => {\r\n expect(marginRange.low.x).to.equal(layoutRange.low.x - (margins.left ?? 0));\r\n expect(marginRange.high.x).to.equal(layoutRange.high.x + (margins.right ?? 0));\r\n expect(marginRange.low.y).to.equal(layoutRange.low.y - (margins.bottom ?? 0));\r\n expect(marginRange.high.y).to.equal(layoutRange.high.y + (margins.top ?? 0));\r\n }\r\n\r\n const makeTextBlock = (margins: Partial<TextBlockMargins>) => {\r\n const textblock = TextBlock.create({ styleName: \"\", styleOverrides: { lineSpacingFactor: 0 }, margins });\r\n textblock.appendRun(makeTextRun(\"abc\"));\r\n textblock.appendRun(makeTextRun(\"defg\"));\r\n return textblock;\r\n }\r\n\r\n let block = makeTextBlock({});\r\n let layout = doLayout(block);\r\n\r\n // Margins should be 0 by default\r\n expect(layout.range.isAlmostEqual(layout.textRange)).to.be.true;\r\n expectMargins(layout.textRange, layout.range, {});\r\n\r\n // All margins should be applied to the range\r\n block = makeTextBlock({ left: 1, right: 2, top: 3, bottom: 4 })\r\n layout = doLayout(block);\r\n\r\n expectMargins(layout.textRange, layout.range, { left: 1, right: 2, top: 3, bottom: 4 });\r\n\r\n // Just horisontal margins should be applied\r\n block = makeTextBlock({ left: 1, right: 2 });\r\n layout = doLayout(block);\r\n\r\n expectMargins(layout.textRange, layout.range, { left: 1, right: 2 });\r\n\r\n // Just vertical margins should be applied\r\n block = makeTextBlock({ top: 1, bottom: 2 });\r\n layout = doLayout(block);\r\n\r\n expectMargins(layout.textRange, layout.range, { top: 1, bottom: 2 });\r\n\r\n });\r\n\r\n describe(\"grapheme offsets\", () => {\r\n it(\"should return an empty array if source type is not text\", function () {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n const fractionRun = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleName: \"fraction\" });\r\n textBlock.appendRun(fractionRun);\r\n\r\n const layout = doLayout(textBlock);\r\n const result = layout.toResult();\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n textBlock,\r\n iModel: {} as any,\r\n findTextStyle: () => TextStyleSettings.defaults,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n paragraphIndex: result.lines[0].sourceParagraphIndex,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0],\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.is.empty;\r\n });\r\n\r\n it(\"should handle empty text content\", function () {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n const textRun = TextRun.create({ content: \"\", styleName: \"text\" });\r\n textBlock.appendRun(textRun);\r\n\r\n const layout = doLayout(textBlock);\r\n const result = layout.toResult();\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n textBlock,\r\n iModel: {} as any,\r\n findTextStyle: () => TextStyleSettings.defaults,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n paragraphIndex: result.lines[0].sourceParagraphIndex,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0], // Supply a grapheme index even though there is no text\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.is.empty;\r\n });\r\n\r\n it(\"should compute grapheme offsets correctly for a given text\", function () {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n const textRun = TextRun.create({ content: \"hello\", styleName: \"text\" });\r\n textBlock.appendRun(textRun);\r\n\r\n const layout = doLayout(textBlock);\r\n const result = layout.toResult();\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n textBlock,\r\n iModel: {} as any,\r\n findTextStyle: () => TextStyleSettings.defaults,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n paragraphIndex: result.lines[0].sourceParagraphIndex,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0, 1, 2, 3, 4],\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(5);\r\n expect(graphemeRanges[0].high.x).to.equal(1);\r\n expect(graphemeRanges[4].high.x).to.equal(5);\r\n });\r\n\r\n it(\"should compute grapheme offsets correctly for non-English text\", function () {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n // Hindi - \"Paragraph\"\r\n const textRun = TextRun.create({ content: \"अनुच्छेद\", styleName: \"text\" });\r\n textBlock.appendRun(textRun);\r\n\r\n const layout = doLayout(textBlock);\r\n const result = layout.toResult();\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n textBlock,\r\n iModel: {} as any,\r\n findTextStyle: () => TextStyleSettings.defaults,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n paragraphIndex: result.lines[0].sourceParagraphIndex,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0, 1, 3, 7],\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(4); // Length based on actual grapheme segmentation\r\n expect(graphemeRanges[0].high.x).to.equal(1);\r\n expect(graphemeRanges[1].high.x).to.equal(3);\r\n expect(graphemeRanges[2].high.x).to.equal(7);\r\n expect(graphemeRanges[3].high.x).to.equal(8);\r\n });\r\n\r\n it(\"should compute grapheme offsets correctly for emoji content\", function () {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n const textRun = TextRun.create({ content: \"👨‍👦\", styleName: \"text\" });\r\n textBlock.appendRun(textRun);\r\n\r\n const layout = doLayout(textBlock);\r\n const result = layout.toResult();\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n textBlock,\r\n iModel: {} as any,\r\n findTextStyle: () => TextStyleSettings.defaults,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n paragraphIndex: result.lines[0].sourceParagraphIndex,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0],\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(1); // Length based on actual grapheme segmentation\r\n expect(graphemeRanges[0].high.x).to.equal(5);\r\n });\r\n });\r\n\r\n describe(\"using native font library\", () => {\r\n let iModel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"NativeFonts\", \"NativeFonts.bim\");\r\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => iModel.close());\r\n\r\n it(\"maps font names to Id\", async () => {\r\n const vera = iModel.fonts.findId({ name: \"Vera\" });\r\n expect(vera).to.equal(1);\r\n\r\n const arial = await iModel.fonts.acquireId({ name: \"Arial\", type: FontType.TrueType });\r\n const comic = await iModel.fonts.acquireId({ name: \"Comic Sans\", type: FontType.TrueType });\r\n iModel.saveChanges();\r\n\r\n expect(arial).to.equal(2);\r\n expect(comic).to.equal(3);\r\n expect(iModel.fonts.findId({ name: \"Consolas\" })).to.be.undefined;\r\n\r\n function test(fontName: string, expectedFontId: number): void {\r\n const textBlock = TextBlock.create({ styleName: \"\" });\r\n textBlock.appendRun(TextRun.create({ styleName: \"\", styleOverrides: { fontName } }));\r\n const layout = layoutTextBlock({ textBlock, iModel });\r\n const run = layout.lines[0].runs[0];\r\n expect(run).not.to.be.undefined;\r\n expect(run.fontId).to.equal(expectedFontId);\r\n }\r\n\r\n test(\"Arial\", arial);\r\n test(\"Comic Sans\", comic);\r\n test(\"Consolas\", 0);\r\n\r\n test(\"arial\", arial);\r\n test(\"aRIaL\", arial);\r\n });\r\n\r\n function computeDimensions(args: { content?: string, bold?: boolean, italic?: boolean, font?: string, height?: number, width?: number }): { x: number, y: number } {\r\n const textBlock = TextBlock.create({\r\n styleName: \"\",\r\n styleOverrides: {\r\n lineHeight: args.height,\r\n widthFactor: args.width,\r\n },\r\n });\r\n\r\n textBlock.appendRun(TextRun.create({\r\n styleName: \"\",\r\n content: args.content ?? \"This is a string of text.\",\r\n styleOverrides: {\r\n isBold: args.bold,\r\n isItalic: args.italic,\r\n fontName: args.font ?? \"Vera\",\r\n },\r\n }));\r\n\r\n const range = layoutTextBlock({ textBlock, iModel }).range;\r\n return { x: range.high.x - range.low.x, y: range.high.y - range.low.y };\r\n }\r\n\r\n it(\"computes different ranges for different strings\", () => {\r\n expect(computeDimensions({ content: \"text\" })).to.deep.equal(computeDimensions({ content: \"text\" }));\r\n expect(computeDimensions({ content: \"text\" })).not.to.deep.equal(computeDimensions({ content: \"texttexttext\" }));\r\n expect(computeDimensions({ content: \"text\" })).not.to.deep.equal(computeDimensions({ content: \"TEXT\" }));\r\n });\r\n\r\n it(\"computes different ranges for different fonts\", () => {\r\n // These two are embedded in the iModel.\r\n expect(computeDimensions({ font: \"Vera\" })).not.to.deep.equal(computeDimensions({ font: \"Karla\" }));\r\n\r\n // These two are not embedded in the iModel, but do exist in its font table - they should both fall back to the default font.\r\n expect(computeDimensions({ font: \"Arial\" })).to.deep.equal(computeDimensions({ font: \"Comic Sans\" }));\r\n });\r\n\r\n it(\"computes different ranges for different height and width\", () => {\r\n expect(computeDimensions({ height: 2 })).to.deep.equal(computeDimensions({ height: 2 }));\r\n expect(computeDimensions({ height: 2 })).not.to.deep.equal(computeDimensions({ height: 3 }));\r\n expect(computeDimensions({ width: 2 })).to.deep.equal(computeDimensions({ width: 2 }));\r\n expect(computeDimensions({ width: 2 })).not.to.deep.equal(computeDimensions({ width: 3 }));\r\n });\r\n\r\n it(\"excludes trailing blank glyphs from justification ranges\", () => {\r\n function computeRanges(chars: string): TextLayoutRanges {\r\n return iModel.computeRangesForText({\r\n chars,\r\n bold: false,\r\n italic: false,\r\n fontId: 1,\r\n widthFactor: 1,\r\n lineHeight: 1,\r\n baselineShift: \"none\",\r\n });\r\n }\r\n\r\n function test(chars: string, expectEqualRanges: boolean): void {\r\n const { justification, layout } = computeRanges(chars);\r\n expect(layout.low.x).to.equal(justification.low.x);\r\n expect(layout.high.y).to.equal(justification.high.y);\r\n expect(layout.low.y).to.equal(justification.low.y);\r\n\r\n if (expectEqualRanges) {\r\n expect(layout.high.x).to.equal(justification.high.x);\r\n } else {\r\n expect(layout.high.x).greaterThan(justification.high.x);\r\n }\r\n }\r\n\r\n test(\"abcdef\", true);\r\n test(\"abcdef \", false);\r\n test(\"abcdef \", false);\r\n test(\"abc def\", true);\r\n\r\n // new line has no width ever.\r\n test(\"abcdef\\n\", true);\r\n\r\n // apparently native code doesn't consider tab characters to be \"blank\".\r\n test(\"abcdef\\t\", true);\r\n\r\n // apparently native code doesn't consider \"thin space\" to be \"blank\".\r\n test(\"abcdef\\u2009\", true);\r\n\r\n const r1 = computeRanges(\"abcdef \");\r\n const r2 = computeRanges(\"abcdef \");\r\n expect(r1.layout.xLength()).lessThan(r2.layout.xLength());\r\n expect(r1.justification.xLength()).to.equal(r2.justification.xLength());\r\n });\r\n });\r\n});\r\n\r\nfunction mockIModel(): IModelDb {\r\n const iModel: Pick<IModelDb, \"fonts\" | \"computeRangesForText\" | \"forEachMetaData\"> = {\r\n fonts: {\r\n findId: () => 0,\r\n } as any,\r\n computeRangesForText: () => { return { layout: new Range2d(0, 0, 1, 1), justification: new Range2d(0, 0, 1, 1) }; },\r\n forEachMetaData: () => undefined,\r\n };\r\n\r\n return iModel as IModelDb;\r\n}\r\n\r\ndescribe(\"produceTextAnnotationGeometry\", () => {\r\n type Color = ColorDef | \"subcategory\";\r\n\r\n function makeText(color?: Color): TextRun {\r\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\r\n return TextRun.create({ styleName: \"\", styleOverrides, content: \"text\" });\r\n }\r\n\r\n function makeFraction(color?: Color): FractionRun {\r\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\r\n return FractionRun.create({ numerator: \"num\", denominator: \"denom\", styleName: \"\", styleOverrides });\r\n }\r\n\r\n function makeBreak(color?: Color): LineBreakRun {\r\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\r\n return LineBreakRun.create({ styleName: \"\", styleOverrides });\r\n }\r\n\r\n function makeTextBlock(runs: Run[]): TextBlock {\r\n const block = TextBlock.create({ styleName: \"\" });\r\n for (const run of runs) {\r\n block.appendRun(run);\r\n }\r\n\r\n return block;\r\n }\r\n\r\n function makeGeometry(runs: Run[]): TextBlockGeometryPropsEntry[] {\r\n const block = makeTextBlock(runs);\r\n const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\r\n return produceTextAnnotationGeometry({ iModel: mockIModel(), annotation }).entries;\r\n }\r\n\r\n it(\"produces an empty array for an empty text block\", () => {\r\n expect(makeGeometry([])).to.deep.equal([]);\r\n });\r\n\r\n it(\"produces an empty array for a block consisting only of line breaks\", () => {\r\n expect(makeGeometry([makeBreak(), makeBreak(), makeBreak()])).to.deep.equal([]);\r\n });\r\n\r\n it(\"produces one appearance entry if all runs use subcategory color\", () => {\r\n const geom = makeGeometry([makeText(), makeFraction(), makeText(\"subcategory\"), makeFraction(\"subcategory\")]);\r\n expect(geom.length).to.equal(9);\r\n expect(geom[0].color).to.equal(\"subcategory\");\r\n expect(geom.slice(1).some((entry) => entry.color !== undefined)).to.be.false;\r\n });\r\n\r\n it(\"produces strings and fraction separators\", () => {\r\n const geom = makeGeometry([makeText(), makeFraction(), makeFraction(), makeText()]);\r\n expect(geom.length).to.equal(9);\r\n expect(geom[0].color).to.equal(\"subcategory\");\r\n\r\n expect(geom[1].text).not.to.be.undefined;\r\n\r\n expect(geom[2].text).not.to.be.undefined;\r\n expect(geom[3].separator).not.to.be.undefined;\r\n expect(geom[4].text).not.to.be.undefined;\r\n\r\n expect(geom[5].text).not.to.be.undefined;\r\n expect(geom[6].separator).not.to.be.undefined;\r\n expect(geom[7].text).not.to.be.undefined;\r\n\r\n expect(geom[8].text).not.to.be.undefined;\r\n });\r\n\r\n it(\"produces an appearance change for each non-break run that is a different color from the previous run\", () => {\r\n const geom = makeGeometry([\r\n makeText(ColorDef.blue),\r\n makeText(), // subcategory by default\r\n makeText(),\r\n makeText(ColorDef.red),\r\n makeText(ColorDef.white),\r\n makeText(ColorDef.white),\r\n makeBreak(\"subcategory\"),\r\n makeFraction(ColorDef.green),\r\n makeText(ColorDef.green),\r\n makeBreak(ColorDef.black),\r\n makeText(ColorDef.green),\r\n ]).map((entry) => entry.text ? \"text\" : (entry.separator ? \"sep\" : (typeof entry.color === \"number\" ? ColorDef.fromJSON(entry.color) : entry.color)));\r\n\r\n expect(geom).to.deep.equal([\r\n ColorDef.blue,\r\n \"text\",\r\n \"subcategory\",\r\n \"text\",\r\n \"text\",\r\n ColorDef.red,\r\n \"text\",\r\n ColorDef.white,\r\n \"text\",\r\n \"text\",\r\n ColorDef.green,\r\n \"text\", \"sep\", \"text\",\r\n \"text\",\r\n \"text\",\r\n ]);\r\n });\r\n\r\n it(\"offsets geometry entries by margins\", () => {\r\n function makeGeometryWithMargins(anchor: TextAnnotationAnchor, margins: TextBlockMargins): TextStringProps | undefined {\r\n const runs = [makeText()];\r\n const block = makeTextBlock(runs);\r\n block.margins = margins;\r\n\r\n const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\r\n annotation.anchor = anchor;\r\n\r\n const geom = produceTextAnnotationGeometry({ iModel: mockIModel(), annotation }).entries;\r\n return geom[1].text;\r\n }\r\n\r\n function testMargins(margins: TextBlockMargins, height: number, width: number) {\r\n // We want to disregard negative margins. Note, I'm not changing the margins object itself. It gets passed into makeGeometryWithMargins as it is.\r\n const left = margins.left >= 0 ? margins.left : 0;\r\n const right = margins.right >= 0 ? margins.right : 0;\r\n const top = margins.top >= 0 ? margins.top : 0;\r\n const bottom = margins.bottom >= 0 ? margins.bottom : 0;\r\n\r\n // Test case: bottom, left\r\n let props = makeGeometryWithMargins({ horizontal: \"left\", vertical: \"bottom\" }, margins);\r\n expect(props).not.to.be.undefined;\r\n expect(props?.origin, \"Expected geometry to be offset by left and bottom margins\").to.deep.equal({ x: left, y: bottom, z: 0 });\r\n\r\n // Test case: top, right\r\n props = makeGeometryWithMargins({ vertical: \"top\", horizontal: \"right\" }, margins);\r\n\r\n let x = (right + width) * -1;\r\n let y = (top + height) * -1;\r\n expect(props).not.to.be.undefined;\r\n expect(props?.origin, \"Expected geometry to be offset by top and right margins\").to.deep.equal({ x, y, z: 0 });\r\n\r\n // Test case: middle, center\r\n props = makeGeometryWithMargins({ vertical: \"middle\", horizontal: \"center\" }, margins);\r\n\r\n x = (left - right - width) / 2;\r\n y = (bottom - top - height) / 2;\r\n expect(props).not.to.be.undefined;\r\n expect(props?.origin, \"Expected geometry to be centered in the margins\").to.deep.equal({ x, y, z: 0 });\r\n }\r\n\r\n // Getting the range from the same mock the native code uses to compute the range of a text block.\r\n const textRange = mockIModel().computeRangesForText({\r\n chars: \"text\",\r\n bold: false,\r\n italic: false,\r\n fontId: 1,\r\n widthFactor: 1,\r\n lineHeight: 1,\r\n baselineShift: \"none\",\r\n });\r\n\r\n const xLength = textRange.layout.xLength(); // Will be 1 because of the mock implementation.\r\n const yLength = textRange.layout.yLength(); // Will be 1 because of the mock implementation.\r\n\r\n testMargins({ top: 0, right: 0, bottom: 0, left: 0 }, yLength, xLength);\r\n testMargins({ top: 1, right: 2, bottom: 3, left: 4 }, yLength, xLength);\r\n testMargins({ top: -1, right: -2, bottom: -3, left: -4 }, yLength, xLength);\r\n });\r\n\r\n});\r\n\r\ndescribe(\"TextAnnotation element\", () => {\r\n function makeElement(props?: Partial<TextAnnotation2dProps>): TextAnnotation2d {\r\n return TextAnnotation2d.fromJSON({\r\n category: \"0x12\",\r\n model: \"0x34\",\r\n code: {\r\n spec: \"0x56\",\r\n scope: \"0x78\",\r\n },\r\n classFullName: TextAnnotation2d.classFullName,\r\n ...props,\r\n }, mockIModel());\r\n }\r\n\r\n describe(\"getAnnotation\", () => {\r\n it(\"returns undefined if not present in JSON properties\", () => {\r\n expect(makeElement().getAnnotation()).to.be.undefined;\r\n });\r\n\r\n it(\"extracts from JSON properties\", () => {\r\n const elem = makeElement({\r\n jsonProperties: {\r\n annotation: {\r\n textBlock: TextBlock.create({ styleName: \"block\" }).toJSON(),\r\n },\r\n },\r\n });\r\n\r\n const anno = elem.getAnnotation()!;\r\n expect(anno).not.to.be.undefined;\r\n expect(anno.textBlock.isEmpty).to.be.true;\r\n expect(anno.textBlock.styleName).to.equal(\"block\");\r\n });\r\n\r\n it(\"produces a new object each time it is called\", () => {\r\n const elem = makeElement({\r\n jsonProperties: {\r\n annotation: {\r\n textBlock: TextBlock.create({ styleName: \"block\" }).toJSON(),\r\n },\r\n },\r\n });\r\n\r\n const anno1 = elem.getAnnotation()!;\r\n const anno2 = elem.getAnnotation()!;\r\n expect(anno1).not.to.equal(anno2);\r\n expect(anno1.textBlock.equals(anno2.textBlock)).to.be.true;\r\n });\r\n });\r\n\r\n describe(\"setAnnotation\", () => {\r\n it(\"updates JSON properties and recomputes geometry stream\", () => {\r\n const elem = makeElement();\r\n expect(elem.geom).to.be.undefined;\r\n\r\n const annotation = { textBlock: TextBlock.create({ styleName: \"block\" }).toJSON() };\r\n elem.setAnnotation(TextAnnotation.fromJSON(annotation));\r\n\r\n expect(elem.geom).not.to.be.undefined;\r\n expect(elem.jsonProperties.annotation).to.deep.equal(annotation);\r\n expect(elem.jsonProperties.annotation).not.to.equal(annotation);\r\n });\r\n\r\n it(\"uses default subcategory by default\", () => {\r\n const elem = makeElement();\r\n elem.setAnnotation(TextAnnotation.fromJSON({ textBlock: { styleName: \"block\" } }));\r\n expect(elem.geom!.length).to.equal(1);\r\n expect(elem.geom![0].appearance!.subCategory).to.equal(\"0x13\");\r\n });\r\n\r\n it(\"uses specific subcategory if provided\", () => {\r\n const elem = makeElement();\r\n elem.setAnnotation(TextAnnotation.fromJSON({ textBlock: { styleName: \"block\" } }), \"0x1234\");\r\n expect(elem.geom!.length).to.equal(1);\r\n expect(elem.geom![0].appearance!.subCategory).to.equal(\"0x1234\");\r\n });\r\n });\r\n\r\n describe(\"persistence\", () => {\r\n let imodel: SnapshotDb;\r\n let seed: GeometricElement3d;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n\r\n seed = imodel.elements.getElement<GeometricElement3d>(\"0x1d\");\r\n assert.exists(seed);\r\n assert.isTrue(seed.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n });\r\n\r\n after(() => imodel.close());\r\n\r\n function createElement(props?: Partial<TextAnnotation3dProps>): TextAnnotation3d {\r\n return TextAnnotation3d.fromJSON({\r\n category: seed.category,\r\n model: seed.model,\r\n code: {\r\n spec: seed.code.spec,\r\n scope: seed.code.scope,\r\n },\r\n ...props,\r\n classFullName: TextAnnotation3d.classFullName,\r\n }, imodel);\r\n }\r\n\r\n function createAnnotation(): TextAnnotation {\r\n const block = TextBlock.createEmpty();\r\n block.styleName = \"block\";\r\n block.appendRun(makeTextRun(\"run\", \"run1\"));\r\n block.appendRun(makeTextRun(\"RUN!!!!!\", \"run2\"));\r\n\r\n return TextAnnotation.fromJSON({\r\n textBlock: block.toJSON(),\r\n anchor: {\r\n vertical: \"middle\",\r\n horizontal: \"right\",\r\n },\r\n orientation: { yaw: 1, pitch: 0, roll: -1 },\r\n offset: [0, -5, 100],\r\n });\r\n }\r\n\r\n it(\"create method does not automatically compute the geometry\", () => {\r\n const annotation = createAnnotation();\r\n const el = createElement({ jsonProperties: { annotation: annotation.toJSON() } });\r\n expect(el.getAnnotation()!.equals(annotation)).to.be.true;\r\n expect(el.geom).to.be.undefined;\r\n });\r\n\r\n function expectPlacement(el: GeometricElement3d, expectValidBBox: boolean, expectedOrigin = [0, 0, 0], expectedYPR = [0, 0, 0]): void {\r\n expect(el.placement.origin.x).to.equal(expectedOrigin[0]);\r\n expect(el.placement.origin.y).to.equal(expectedOrigin[1]);\r\n expect(el.placement.origin.z).to.equal(expectedOrigin[2]);\r\n expect(el.placement.angles.yaw.radians).to.equal(expectedYPR[0]);\r\n expect(el.placement.angles.pitch.radians).to.equal(expectedYPR[1]);\r\n expect(el.placement.angles.roll.radians).to.equal(expectedYPR[2]);\r\n expect(el.placement.bbox.isNull).to.equal(!expectValidBBox);\r\n }\r\n\r\n it(\"inserts and round-trips through JSON\", () => {\r\n function test(annotation?: TextAnnotation): void {\r\n const el0 = createElement();\r\n if (annotation) {\r\n el0.setAnnotation(annotation);\r\n }\r\n\r\n expectPlacement(el0, false);\r\n\r\n const elId = el0.insert();\r\n expect(Id64.isValidId64(elId)).to.be.true;\r\n\r\n const el1 = imodel.elements.getElement<TextAnnotation3d>(elId);\r\n expect(el1).not.to.be.undefined;\r\n expect(el1 instanceof TextAnnotation3d).to.be.true;\r\n\r\n expectPlacement(el1, undefined !== annotation && !annotation.textBlock.isEmpty);\r\n\r\n const anno = el1.getAnnotation();\r\n\r\n if (!annotation) {\r\n expect(anno).to.be.undefined;\r\n } else {\r\n expect(anno).not.to.be.undefined;\r\n expect(anno!.equals(annotation)).to.be.true;\r\n }\r\n }\r\n\r\n test();\r\n test(TextAnnotation.fromJSON({ textBlock: { styleName: \"block\" } }));\r\n test(createAnnotation());\r\n });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"TextAnnotation.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/TextAnnotation.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { assert, expect } from \"chai\";\nimport { computeGraphemeOffsets, ComputeGraphemeOffsetsArgs, ComputeRangesForTextLayout, ComputeRangesForTextLayoutArgs, FindFontId, FindTextStyle, layoutTextBlock, LineLayout, RunLayout, TextBlockLayout, TextLayoutRanges } from \"../../TextAnnotationLayout\";\nimport { Geometry, Range2d } from \"@itwin/core-geometry\";\nimport { ColorDef, FontType, FractionRun, LineBreakRun, LineLayoutResult, Run, RunLayoutResult, TextAnnotation, TextAnnotation2dProps, TextAnnotation3dProps, TextAnnotationAnchor, TextBlock, TextBlockGeometryPropsEntry, TextBlockMargins, TextRun, TextStringProps, TextStyleSettings } from \"@itwin/core-common\";\nimport { IModelDb, SnapshotDb } from \"../../IModelDb\";\nimport { TextAnnotation2d, TextAnnotation3d } from \"../../TextAnnotationElement\";\nimport { produceTextAnnotationGeometry } from \"../../TextAnnotationGeometry\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { GeometricElement3d } from \"../../Element\";\nimport { Id64, ProcessDetector } from \"@itwin/core-bentley\";\n\nfunction computeTextRangeAsStringLength(args: ComputeRangesForTextLayoutArgs): TextLayoutRanges {\n const range = new Range2d(0, 0, args.chars.length, args.lineHeight);\n return { layout: range, justification: range };\n}\n\nfunction doLayout(textBlock: TextBlock, args?: {\n findTextStyle?: FindTextStyle;\n findFontId?: FindFontId;\n computeTextRange?: ComputeRangesForTextLayout;\n}): TextBlockLayout {\n const layout = layoutTextBlock({\n textBlock,\n iModel: {} as any,\n findTextStyle: args?.findTextStyle ?? (() => TextStyleSettings.defaults),\n findFontId: args?.findFontId ?? (() => 0),\n computeTextRange: args?.computeTextRange ?? computeTextRangeAsStringLength,\n });\n\n return layout;\n}\n\nfunction makeTextRun(content: string, styleName = \"\"): TextRun {\n return TextRun.create({ content, styleName });\n}\n\nfunction isIntlSupported(): boolean {\n // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile\n // users are not expected to do any editing, but long term we will attempt to find a better\n // solution.\n return !ProcessDetector.isMobileAppBackend;\n}\n\ndescribe(\"layoutTextBlock\", () => {\n it(\"resolves TextStyleSettings from combination of TextBlock and Run\", () => {\n const textBlock = TextBlock.create({ styleName: \"block\", styleOverrides: { widthFactor: 34, color: 0x00ff00 } });\n const run0 = TextRun.create({ content: \"run0\", styleName: \"run\", styleOverrides: { lineHeight: 56, color: 0xff0000 } });\n const run1 = TextRun.create({ content: \"run1\", styleName: \"run\", styleOverrides: { widthFactor: 78, fontName: \"run1\" } });\n textBlock.appendRun(run0);\n textBlock.appendRun(run1);\n\n const tb = doLayout(textBlock, {\n findTextStyle: (name: string) => TextStyleSettings.fromJSON(name === \"block\" ? { lineSpacingFactor: 12, fontName: \"block\" } : { lineSpacingFactor: 99, fontName: \"run\" }),\n });\n\n expect(tb.lines.length).to.equal(1);\n expect(tb.lines[0].runs.length).to.equal(2);\n\n const s0 = tb.lines[0].runs[0].style;\n expect(s0.lineHeight).to.equal(1);\n expect(s0.lineSpacingFactor).to.equal(12);\n expect(s0.widthFactor).to.equal(34);\n expect(s0.fontName).to.equal(\"run\");\n expect(s0.color).to.equal(0xff0000);\n\n const s1 = tb.lines[0].runs[1].style;\n expect(s1.widthFactor).to.equal(34);\n expect(s1.lineSpacingFactor).to.equal(12);\n expect(s1.lineHeight).to.equal(1);\n expect(s1.fontName).to.equal(\"run1\");\n expect(s1.color).to.equal(\"subcategory\");\n });\n\n it(\"aligns text to center based on height of stacked fraction\", () => {\n const textBlock = TextBlock.create({ styleName: \"\" });\n const fractionRun = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleName: \"fraction\" });\n const textRun = TextRun.create({ content: \"text\", styleName: \"text\" });\n textBlock.appendRun(fractionRun);\n textBlock.appendRun(textRun);\n\n const layout = doLayout(textBlock);\n\n const fractionLayout = layout.lines[0].runs[0];\n const textLayout = layout.lines[0].runs[1];\n\n const round = (num: number, numDecimalPlaces: number) => {\n const mult = Math.pow(100, numDecimalPlaces);\n return Math.round(num * mult) / mult;\n };\n\n expect(textLayout.range.yLength()).to.equal(1);\n expect(round(fractionLayout.range.yLength(), 2)).to.equal(1.75);\n expect(fractionLayout.offsetFromLine.y).to.equal(0);\n expect(round(textLayout.offsetFromLine.y, 3)).to.equal(.375);\n });\n\n it(\"produces one line per paragraph if document width <= 0\", () => {\n const textBlock = TextBlock.create({ styleName: \"\" });\n for (let i = 0; i < 4; i++) {\n const layout = doLayout(textBlock);\n if (i === 0) {\n expect(layout.range.isNull).to.be.true;\n } else {\n expect(layout.lines.length).to.equal(i);\n expect(layout.range.low.x).to.equal(0);\n expect(layout.range.low.y).to.equal(-i - (0.5 * (i - 1))); // lineSpacingFactor=0.5\n expect(layout.range.high.x).to.equal(i * 3);\n expect(layout.range.high.y).to.equal(0);\n }\n\n for (let l = 0; l < layout.lines.length; l++) {\n const line = layout.lines[l];\n expect(line.runs.length).to.equal(l + 1);\n expect(line.range.low.x).to.equal(0);\n expect(line.range.low.y).to.equal(0);\n expect(line.range.high.y).to.equal(1);\n expect(line.range.high.x).to.equal(3 * (l + 1));\n for (const run of line.runs) {\n expect(run.charOffset).to.equal(0);\n expect(run.numChars).to.equal(3);\n expect(run.range.low.x).to.equal(0);\n expect(run.range.low.y).to.equal(0);\n expect(run.range.high.x).to.equal(3);\n expect(run.range.high.y).to.equal(1);\n }\n }\n\n const p = textBlock.appendParagraph();\n for (let j = 0; j <= i; j++) {\n p.runs.push(TextRun.create({ styleName: \"\", content: \"Run\" }));\n }\n }\n });\n\n it(\"produces a new line for each LineBreakRun\", () => {\n const lineSpacingFactor = 0.5;\n const lineHeight = 1;\n const textBlock = TextBlock.create({ styleName: \"\", styleOverrides: { lineSpacingFactor, lineHeight } });\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"abc\" }));\n textBlock.appendRun(LineBreakRun.create({ styleName: \"\" }));\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"def\" }));\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"ghi\" }));\n textBlock.appendRun(LineBreakRun.create({ styleName: \"\" }));\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"jkl\" }));\n\n const tb = doLayout(textBlock);\n expect(tb.lines.length).to.equal(3);\n expect(tb.lines[0].runs.length).to.equal(2);\n expect(tb.lines[1].runs.length).to.equal(3);\n expect(tb.lines[2].runs.length).to.equal(1);\n\n expect(tb.range.low.x).to.equal(0);\n expect(tb.range.high.x).to.equal(6);\n expect(tb.range.high.y).to.equal(0);\n expect(tb.range.low.y).to.equal(-(lineSpacingFactor * 2 + lineHeight * 3));\n });\n\n it(\"computes ranges based on custom line spacing and line height\", () => {\n const lineSpacingFactor = 2;\n const lineHeight = 3;\n const textBlock = TextBlock.create({ styleName: \"\", styleOverrides: { lineSpacingFactor, lineHeight } });\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"abc\" }));\n textBlock.appendRun(LineBreakRun.create({ styleName: \"\" }));\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"def\" }));\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"ghi\" }));\n textBlock.appendRun(LineBreakRun.create({ styleName: \"\" }));\n textBlock.appendRun(TextRun.create({ styleName: \"\", content: \"jkl\" }));\n\n const tb = doLayout(textBlock);\n expect(tb.lines.length).to.equal(3);\n expect(tb.lines[0].runs.length).to.equal(2);\n expect(tb.lines[1].runs.length).to.equal(3);\n expect(tb.lines[2].runs.length).to.equal(1);\n\n // We have 3 lines each `lineHeight` high, plus 2 line breaks in between each `lineHeight*lineSpacingFactor` high.\n expect(tb.range.low.x).to.equal(0);\n expect(tb.range.high.x).to.equal(6);\n expect(tb.range.high.y).to.equal(0);\n expect(tb.range.low.y).to.equal(-(lineHeight * 3 + (lineHeight * lineSpacingFactor) * 2));\n\n expect(tb.lines[0].offsetFromDocument.y).to.equal(-lineHeight);\n expect(tb.lines[1].offsetFromDocument.y).to.equal(tb.lines[0].offsetFromDocument.y - (lineHeight + lineHeight * lineSpacingFactor));\n expect(tb.lines[2].offsetFromDocument.y).to.equal(tb.lines[1].offsetFromDocument.y - (lineHeight + lineHeight * lineSpacingFactor));\n expect(tb.lines.every((line) => line.offsetFromDocument.x === 0)).to.be.true;\n });\n\n it(\"splits paragraphs into multiple lines if runs exceed the document width\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const textBlock = TextBlock.create({ styleName: \"\" });\n textBlock.width = 6;\n textBlock.appendRun(makeTextRun(\"ab\"));\n expect(doLayout(textBlock).lines.length).to.equal(1);\n textBlock.appendRun(makeTextRun(\"cd\"));\n expect(doLayout(textBlock).lines.length).to.equal(1);\n\n textBlock.appendRun(makeTextRun(\"ef\"));\n expect(doLayout(textBlock).lines.length).to.equal(1);\n textBlock.appendRun(makeTextRun(\"ghi\"));\n expect(doLayout(textBlock).lines.length).to.equal(2);\n\n textBlock.appendRun(makeTextRun(\"jklmnop\"));\n expect(doLayout(textBlock).lines.length).to.equal(3);\n\n textBlock.appendRun(makeTextRun(\"q\"));\n expect(doLayout(textBlock).lines.length).to.equal(4);\n textBlock.appendRun(makeTextRun(\"r\"));\n expect(doLayout(textBlock).lines.length).to.equal(4);\n textBlock.appendRun(makeTextRun(\"stu\"));\n expect(doLayout(textBlock).lines.length).to.equal(4);\n\n textBlock.appendRun(makeTextRun(\"vwxyz\"));\n expect(doLayout(textBlock).lines.length).to.equal(5);\n });\n\n function expectRange(width: number, height: number, range: Range2d): void {\n expect(range.xLength()).to.equal(width);\n expect(range.yLength()).to.equal(height);\n }\n\n it(\"computes range for wrapped lines\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ styleName: \"\", width: 3, styleOverrides: { lineHeight: 1, lineSpacingFactor: 0 } });\n\n function expectBlockRange(width: number, height: number): void {\n const layout = doLayout(block);\n expectRange(width, height, layout.range);\n }\n\n block.appendRun(makeTextRun(\"abc\"));\n expectBlockRange(3, 1);\n\n block.appendRun(makeTextRun(\"defg\"));\n expectBlockRange(4, 2);\n\n block.width = 1;\n expectBlockRange(4, 2);\n\n block.width = 8;\n expectBlockRange(8, 1);\n\n block.width = 6;\n expectBlockRange(6, 2);\n\n block.width = 10;\n expectBlockRange(10, 1);\n block.appendRun(makeTextRun(\"hijk\"));\n expectBlockRange(10, 2);\n });\n\n it(\"computes range for split runs\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ styleName: \"\", styleOverrides: { lineHeight: 1, lineSpacingFactor: 0 } });\n\n function expectBlockRange(width: number, height: number): void {\n const layout = doLayout(block);\n expectRange(width, height, layout.range);\n }\n\n const sentence = \"a bc def ghij klmno\";\n expect(sentence.length).to.equal(19);\n block.appendRun(makeTextRun(sentence));\n\n block.width = 19;\n expectBlockRange(19, 1);\n\n block.width = 10;\n expectBlockRange(10, 2);\n });\n\n it(\"justifies lines\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ styleName: \"\", styleOverrides: { lineSpacingFactor: 0 } });\n\n function expectBlockRange(width: number, height: number): void {\n const layout = doLayout(block);\n expectRange(width, height, layout.range);\n }\n\n function expectLineOffset(offset: number, lineIndex: number): void {\n const layout = doLayout(block);\n expect(layout.lines.length).least(lineIndex + 1);\n\n const line = layout.lines[lineIndex];\n expect(line.offsetFromDocument.y).to.equal(-(lineIndex + 1));\n expect(line.offsetFromDocument.x).to.equal(offset);\n }\n\n // Two text runs with 7 characters total.\n block.appendRun(makeTextRun(\"abc\"));\n block.appendRun(makeTextRun(\"defg\"));\n\n // 1 line of text with width 0: left, right, center justification.\n block.justification = \"left\";\n expectBlockRange(7, 1);\n expectLineOffset(0, 0);\n\n block.justification = \"right\";\n expectBlockRange(7, 1);\n expectLineOffset(0, 0);\n\n block.justification = \"center\";\n expectBlockRange(7, 1);\n expectLineOffset(0, 0);\n\n // 1 line of text from a width greater than number of characters: left, right, center justification.\n block.width = 10;\n\n block.justification = \"left\";\n expectBlockRange(10, 1);\n expectLineOffset(0, 0);\n\n block.justification = \"right\";\n expectBlockRange(10, 1);\n expectLineOffset(3, 0); // 3 = 10 - 7\n\n block.justification = \"center\";\n expectBlockRange(10, 1);\n expectLineOffset(1.5, 0); // 1.5 = (10 - 7) / 2\n\n // 2 line of text from a width less than number of characters: left, right, center justification.\n block.justification = \"left\";\n block.width = 4;\n expectBlockRange(4, 2);\n expectLineOffset(0, 0);\n expectLineOffset(0, 1);\n\n block.justification = \"right\";\n expectBlockRange(4, 2);\n expectLineOffset(1, 0);\n expectLineOffset(0, 1);\n\n block.justification = \"center\";\n expectBlockRange(4, 2);\n expectLineOffset(0.5, 0);\n expectLineOffset(0, 1);\n\n // Testing text longer the the width of the text block.\n block.width = 2;\n block.justification = \"left\";\n expectBlockRange(4, 2);\n expectLineOffset(0, 0);\n expectLineOffset(0, 1);\n\n block.justification = \"right\";\n expectBlockRange(4, 2);\n expectLineOffset(-1, 0);\n expectLineOffset(-2, 1);\n\n block.appendRun(makeTextRun(\"123456789\"));\n expectBlockRange(9, 3);\n expectLineOffset(-1, 0);\n expectLineOffset(-2, 1);\n expectLineOffset(-7, 2);\n\n block.justification = \"center\";\n expectBlockRange(9, 3);\n expectLineOffset(-0.5, 0);\n expectLineOffset(-1, 1);\n expectLineOffset(-3.5, 2);\n });\n\n function expectLines(input: string, width: number, expectedLines: string[]): TextBlockLayout {\n const textBlock = TextBlock.create({ styleName: \"\" });\n textBlock.width = width;\n const run = makeTextRun(input);\n textBlock.appendRun(run);\n\n const layout = doLayout(textBlock);\n expect(layout.lines.every((line) => line.runs.every((r) => r.source === run))).to.be.true;\n\n const actual = layout.lines.map((line) => line.runs.map((runLayout) => (runLayout.source as TextRun).content.substring(runLayout.charOffset, runLayout.charOffset + runLayout.numChars)).join(\"\"));\n expect(actual).to.deep.equal(expectedLines);\n\n return layout;\n }\n\n it(\"splits a single TextRun at word boundaries if it exceeds the document width\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n expectLines(\"a bc def ghij klmno pqrstu vwxyz\", 5, [\n \"a bc \",\n \"def \",\n \"ghij \",\n \"klmno \",\n \"pqrstu \",\n \"vwxyz\",\n ]);\n\n const fox = \"The quick brown fox jumped over the lazy dog\";\n expectLines(fox, 50, [fox]);\n expectLines(fox, 40, [\n // 1 2 3 4\n // 34567890123456789012345678901234567890\n \"The quick brown fox jumped over the \",\n \"lazy dog\",\n ]);\n expectLines(fox, 30, [\n // 1 2 3\n // 3456789012345678901234567890\n \"The quick brown fox jumped \",\n \"over the lazy dog\",\n ]);\n expectLines(fox, 20, [\n // 1 2\n // 345678901234567890\n \"The quick brown fox \",\n \"jumped over the \",\n \"lazy dog\",\n ]);\n expectLines(fox, 10, [\n // 1\n // 234567890\n \"The quick \",\n \"brown fox \",\n \"jumped \",\n \"over the \",\n \"lazy dog\",\n ]);\n });\n\n it(\"considers consecutive whitespace part of a single 'word'\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n expectLines(\"a b c d e f \", 3, [\n \"a \",\n \"b \",\n \"c \",\n \"d \",\n \"e \",\n \"f \",\n ]);\n });\n\n it(\"wraps Japanese text\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n // \"I am a cat. The name is Tanuki.\"\n expectLines(\"吾輩は猫である。名前はたぬき。\", 1, [\"吾\", \"輩\", \"は\", \"猫\", \"で\", \"あ\", \"る。\", \"名\", \"前\", \"は\", \"た\", \"ぬ\", \"き。\"]);\n });\n\n it(\"performs word-wrapping with punctuation\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n expectLines(\"1.24 56.7 8,910\", 1, [\"1.24 \", \"56.7 \", \"8,910\"]);\n\n expectLines(\"a.bc de.f g,hij\", 1, [\"a.bc \", \"de.f \", \"g,hij\"]);\n\n expectLines(\"Let's see... can you (or anyone) predict?!\", 1, [\n \"Let's \",\n \"see... \",\n \"can \",\n \"you \",\n \"(or \",\n \"anyone) \",\n \"predict?!\",\n ]);\n });\n\n it(\"performs word-wrapping and line-splitting with multiple runs\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const textBlock = TextBlock.create({ styleName: \"\" });\n for (const str of [\"The \", \"quick brown\", \" fox jumped over \", \"the lazy \", \"dog\"]) {\n textBlock.appendRun(makeTextRun(str));\n }\n\n function test(width: number, expected: string[]): void {\n textBlock.width = width;\n const layout = doLayout(textBlock);\n const actual = layout.lines.map((line) => line.runs.map((runLayout) => (runLayout.source as TextRun).content.substring(runLayout.charOffset, runLayout.charOffset + runLayout.numChars)).join(\"\"));\n expect(actual).to.deep.equal(expected);\n }\n\n test(50, [\"The quick brown fox jumped over the lazy dog\"]);\n test(40, [\n // 1 2 3 4\n // 34567890123456789012345678901234567890\n \"The quick brown fox jumped over the \",\n \"lazy dog\",\n ]);\n test(30, [\n // 1 2 3\n // 3456789012345678901234567890\n \"The quick brown fox jumped \",\n \"over the lazy dog\",\n ]);\n test(20, [\n // 1 2\n // 345678901234567890\n \"The quick brown fox \",\n \"jumped over the \",\n \"lazy dog\",\n ]);\n test(10, [\n // 1\n // 34567890\n \"The quick \",\n \"brown fox \",\n \"jumped \",\n \"over the \",\n \"lazy dog\",\n ]);\n });\n\n it(\"wraps multiple runs\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ styleName: \"\" });\n block.appendRun(makeTextRun(\"aa\")); // 2 chars wide\n block.appendRun(makeTextRun(\"bb ccc d ee\")); // 11 chars wide\n block.appendRun(makeTextRun(\"ff ggg h\")); // 8 chars wide\n\n function expectLayout(width: number, expected: string): void {\n block.width = width;\n const layout = doLayout(block);\n expect(layout.stringify()).to.equal(expected);\n }\n\n expectLayout(23, \"aabb ccc d eeff ggg h\");\n expectLayout(22, \"aabb ccc d eeff ggg h\");\n expectLayout(21, \"aabb ccc d eeff ggg h\");\n expectLayout(20, \"aabb ccc d eeff ggg \\nh\");\n expectLayout(19, \"aabb ccc d eeff \\nggg h\");\n expectLayout(18, \"aabb ccc d eeff \\nggg h\");\n expectLayout(17, \"aabb ccc d eeff \\nggg h\");\n expectLayout(16, \"aabb ccc d eeff \\nggg h\");\n expectLayout(15, \"aabb ccc d ee\\nff ggg h\");\n expectLayout(14, \"aabb ccc d ee\\nff ggg h\");\n expectLayout(13, \"aabb ccc d ee\\nff ggg h\");\n expectLayout(12, \"aabb ccc d \\neeff ggg h\");\n expectLayout(11, \"aabb ccc d \\neeff ggg h\");\n expectLayout(10, \"aabb ccc \\nd eeff \\nggg h\");\n expectLayout(9, \"aabb ccc \\nd eeff \\nggg h\");\n expectLayout(8, \"aabb \\nccc d ee\\nff ggg h\");\n expectLayout(7, \"aabb \\nccc d \\neeff \\nggg h\");\n expectLayout(6, \"aabb \\nccc d \\neeff \\nggg h\");\n expectLayout(5, \"aabb \\nccc \\nd ee\\nff \\nggg h\");\n expectLayout(4, \"aa\\nbb \\nccc \\nd ee\\nff \\nggg \\nh\");\n expectLayout(3, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\n expectLayout(2, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\n expectLayout(1, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\n expectLayout(0, \"aabb ccc d eeff ggg h\");\n expectLayout(-1, \"aabb ccc d eeff ggg h\");\n expectLayout(-2, \"aabb ccc d eeff ggg h\");\n });\n\n it(\"does not word wrap due to floating point rounding error\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ styleName: \"\", styleOverrides: { lineHeight: 1, lineSpacingFactor: 0 } });\n block.appendRun(makeTextRun(\"abc defg\"));\n const layout1 = doLayout(block);\n let width = layout1.range.xLength();\n // Simulate a floating point rounding error by slightly reducing the width\n width -= Geometry.smallFloatingPoint;\n block.width = width;\n const layout2 = doLayout(block);\n expect(layout2.range.yLength()).to.equal(1);\n })\n\n it(\"has consistent data when converted to a layout result\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n // Initialize a new TextBlockLayout object\n const textBlock = TextBlock.create({ width: 50, styleName: \"\", styleOverrides: { widthFactor: 34, color: 0x00ff00, fontName: \"arial\" } });\n const run0 = TextRun.create({\n content: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium mi sit amet magna malesuada, at venenatis ante eleifend.\",\n styleName: \"\",\n styleOverrides: { lineHeight: 56, color: 0xff0000 },\n });\n const run1 = TextRun.create({\n content: \"Donec sit amet semper sapien. Nullam commodo, libero a accumsan lacinia, metus enim pharetra lacus, eu facilisis sem nisi eu dui.\",\n styleName: \"\",\n styleOverrides: { widthFactor: 78, fontName: \"run1\" },\n });\n const run2 = TextRun.create({\n content: \"Duis dui quam, suscipit quis feugiat id, fermentum ut augue. Mauris iaculis odio rhoncus lorem eleifend, posuere viverra turpis elementum.\",\n styleName: \"\",\n styleOverrides: {},\n });\n const fractionRun = FractionRun.create({ numerator: \"num\", denominator: \"denom\", styleName: \"\", styleOverrides: {} });\n textBlock.appendRun(run0);\n textBlock.appendRun(fractionRun);\n textBlock.appendParagraph();\n textBlock.appendRun(run1);\n textBlock.appendRun(run2);\n\n // Call the toResult() method\n const textBlockLayout = doLayout(\n textBlock,\n {\n findFontId: (fontName: string) => {\n if (fontName === \"arial\") {\n return 1;\n } else if (fontName === \"run1\") {\n return 2;\n }\n return 0;\n },\n });\n const result = textBlockLayout.toResult();\n\n // Assert that the result object has the same data as the original TextBlockLayout object\n expect(result.range).to.deep.equal(textBlockLayout.range.toJSON());\n expect(result.lines.length).to.equal(textBlockLayout.lines.length);\n\n // Loop through each line in the result and the original object\n for (let i = 0; i < result.lines.length; i++) {\n const resultLine: LineLayoutResult = result.lines[i];\n const originalLine: LineLayout = textBlockLayout.lines[i];\n\n // Source paragraph index matches\n expect(resultLine.sourceParagraphIndex).to.equal(textBlock.paragraphs.indexOf(originalLine.source));\n // Ranges match\n expect(resultLine.range).to.deep.equal(originalLine.range.toJSON());\n expect(resultLine.justificationRange).to.deep.equal(originalLine.justificationRange.toJSON());\n // Offset matches\n expect(resultLine.offsetFromDocument).to.deep.equal(originalLine.offsetFromDocument);\n\n for (let j = 0; j < resultLine.runs.length; j++) {\n const resultRun: RunLayoutResult = resultLine.runs[j];\n const originalRun: RunLayout = originalLine.runs[j];\n\n // Source run index matches\n expect(resultRun.sourceRunIndex).to.equal(textBlock.paragraphs[resultLine.sourceParagraphIndex].runs.indexOf(originalRun.source));\n // FontId matches\n expect(resultRun.fontId).to.equal(originalRun.fontId);\n // Offsets match\n expect(resultRun.characterOffset).to.equal(originalRun.charOffset);\n expect(resultRun.characterCount).to.equal(originalRun.numChars);\n expect(resultRun.offsetFromLine).to.deep.equal(originalRun.offsetFromLine);\n // Range matches\n expect(resultRun.range).to.deep.equal(originalRun.range.toJSON());\n // Text style matches\n expect(resultRun.textStyle).to.deep.equal(originalRun.style.toJSON());\n // Optional values match existence and values\n if (resultRun.justificationRange) {\n expect(originalRun.justificationRange);\n }\n if (originalRun.justificationRange) {\n expect(resultRun.justificationRange);\n }\n if (resultRun.justificationRange && originalRun.justificationRange) {\n expect(resultRun.justificationRange).to.deep.equal(originalRun.justificationRange.toJSON());\n }\n if (resultRun.numeratorRange) {\n expect(originalRun.numeratorRange);\n }\n if (originalRun.numeratorRange) {\n expect(resultRun.numeratorRange);\n }\n if (resultRun.numeratorRange && originalRun.numeratorRange) {\n expect(resultRun.numeratorRange).to.deep.equal(originalRun.numeratorRange.toJSON());\n }\n if (resultRun.denominatorRange) {\n expect(originalRun.denominatorRange);\n }\n if (originalRun.denominatorRange) {\n expect(resultRun.denominatorRange);\n }\n if (resultRun.denominatorRange && originalRun.denominatorRange) {\n expect(resultRun.denominatorRange).to.deep.equal(originalRun.denominatorRange.toJSON());\n }\n // Check that the result string matches what we expect\n const inputRun = textBlock.paragraphs[resultLine.sourceParagraphIndex].runs[resultRun.sourceRunIndex].clone();\n if (inputRun.type === \"text\") {\n const resultText = inputRun.content.substring(resultRun.characterOffset, resultRun.characterOffset + resultRun.characterCount);\n const originalText = inputRun.content.substring(originalRun.charOffset, originalRun.charOffset + originalRun.numChars);\n expect(resultText).to.equal(originalText);\n }\n }\n }\n });\n\n it(\"adds margins\", function () {\n const expectMargins = (layoutRange: Range2d, marginRange: Range2d, margins: Partial<TextBlockMargins>) => {\n expect(marginRange.low.x).to.equal(layoutRange.low.x - (margins.left ?? 0));\n expect(marginRange.high.x).to.equal(layoutRange.high.x + (margins.right ?? 0));\n expect(marginRange.low.y).to.equal(layoutRange.low.y - (margins.bottom ?? 0));\n expect(marginRange.high.y).to.equal(layoutRange.high.y + (margins.top ?? 0));\n }\n\n const makeTextBlock = (margins: Partial<TextBlockMargins>) => {\n const textblock = TextBlock.create({ styleName: \"\", styleOverrides: { lineSpacingFactor: 0 }, margins });\n textblock.appendRun(makeTextRun(\"abc\"));\n textblock.appendRun(makeTextRun(\"defg\"));\n return textblock;\n }\n\n let block = makeTextBlock({});\n let layout = doLayout(block);\n\n // Margins should be 0 by default\n expect(layout.range.isAlmostEqual(layout.textRange)).to.be.true;\n expectMargins(layout.textRange, layout.range, {});\n\n // All margins should be applied to the range\n block = makeTextBlock({ left: 1, right: 2, top: 3, bottom: 4 })\n layout = doLayout(block);\n\n expectMargins(layout.textRange, layout.range, { left: 1, right: 2, top: 3, bottom: 4 });\n\n // Just horisontal margins should be applied\n block = makeTextBlock({ left: 1, right: 2 });\n layout = doLayout(block);\n\n expectMargins(layout.textRange, layout.range, { left: 1, right: 2 });\n\n // Just vertical margins should be applied\n block = makeTextBlock({ top: 1, bottom: 2 });\n layout = doLayout(block);\n\n expectMargins(layout.textRange, layout.range, { top: 1, bottom: 2 });\n\n });\n\n describe(\"grapheme offsets\", () => {\n it(\"should return an empty array if source type is not text\", function () {\n const textBlock = TextBlock.create({ styleName: \"\" });\n const fractionRun = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleName: \"fraction\" });\n textBlock.appendRun(fractionRun);\n\n const layout = doLayout(textBlock);\n const result = layout.toResult();\n const args: ComputeGraphemeOffsetsArgs = {\n textBlock,\n iModel: {} as any,\n findTextStyle: () => TextStyleSettings.defaults,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n paragraphIndex: result.lines[0].sourceParagraphIndex,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0],\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.is.empty;\n });\n\n it(\"should handle empty text content\", function () {\n const textBlock = TextBlock.create({ styleName: \"\" });\n const textRun = TextRun.create({ content: \"\", styleName: \"text\" });\n textBlock.appendRun(textRun);\n\n const layout = doLayout(textBlock);\n const result = layout.toResult();\n const args: ComputeGraphemeOffsetsArgs = {\n textBlock,\n iModel: {} as any,\n findTextStyle: () => TextStyleSettings.defaults,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n paragraphIndex: result.lines[0].sourceParagraphIndex,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0], // Supply a grapheme index even though there is no text\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.is.empty;\n });\n\n it(\"should compute grapheme offsets correctly for a given text\", function () {\n const textBlock = TextBlock.create({ styleName: \"\" });\n const textRun = TextRun.create({ content: \"hello\", styleName: \"text\" });\n textBlock.appendRun(textRun);\n\n const layout = doLayout(textBlock);\n const result = layout.toResult();\n const args: ComputeGraphemeOffsetsArgs = {\n textBlock,\n iModel: {} as any,\n findTextStyle: () => TextStyleSettings.defaults,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n paragraphIndex: result.lines[0].sourceParagraphIndex,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0, 1, 2, 3, 4],\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(5);\n expect(graphemeRanges[0].high.x).to.equal(1);\n expect(graphemeRanges[4].high.x).to.equal(5);\n });\n\n it(\"should compute grapheme offsets correctly for non-English text\", function () {\n const textBlock = TextBlock.create({ styleName: \"\" });\n // Hindi - \"Paragraph\"\n const textRun = TextRun.create({ content: \"अनुच्छेद\", styleName: \"text\" });\n textBlock.appendRun(textRun);\n\n const layout = doLayout(textBlock);\n const result = layout.toResult();\n const args: ComputeGraphemeOffsetsArgs = {\n textBlock,\n iModel: {} as any,\n findTextStyle: () => TextStyleSettings.defaults,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n paragraphIndex: result.lines[0].sourceParagraphIndex,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0, 1, 3, 7],\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(4); // Length based on actual grapheme segmentation\n expect(graphemeRanges[0].high.x).to.equal(1);\n expect(graphemeRanges[1].high.x).to.equal(3);\n expect(graphemeRanges[2].high.x).to.equal(7);\n expect(graphemeRanges[3].high.x).to.equal(8);\n });\n\n it(\"should compute grapheme offsets correctly for emoji content\", function () {\n const textBlock = TextBlock.create({ styleName: \"\" });\n const textRun = TextRun.create({ content: \"👨‍👦\", styleName: \"text\" });\n textBlock.appendRun(textRun);\n\n const layout = doLayout(textBlock);\n const result = layout.toResult();\n const args: ComputeGraphemeOffsetsArgs = {\n textBlock,\n iModel: {} as any,\n findTextStyle: () => TextStyleSettings.defaults,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n paragraphIndex: result.lines[0].sourceParagraphIndex,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0],\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(1); // Length based on actual grapheme segmentation\n expect(graphemeRanges[0].high.x).to.equal(5);\n });\n });\n\n describe(\"using native font library\", () => {\n let iModel: SnapshotDb;\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"NativeFonts\", \"NativeFonts.bim\");\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n });\n\n after(() => iModel.close());\n\n it(\"maps font names to Id\", async () => {\n const vera = iModel.fonts.findId({ name: \"Vera\" });\n expect(vera).to.equal(1);\n\n const arial = await iModel.fonts.acquireId({ name: \"Arial\", type: FontType.TrueType });\n const comic = await iModel.fonts.acquireId({ name: \"Comic Sans\", type: FontType.TrueType });\n iModel.saveChanges();\n\n expect(arial).to.equal(2);\n expect(comic).to.equal(3);\n expect(iModel.fonts.findId({ name: \"Consolas\" })).to.be.undefined;\n\n function test(fontName: string, expectedFontId: number): void {\n const textBlock = TextBlock.create({ styleName: \"\" });\n textBlock.appendRun(TextRun.create({ styleName: \"\", styleOverrides: { fontName } }));\n const layout = layoutTextBlock({ textBlock, iModel });\n const run = layout.lines[0].runs[0];\n expect(run).not.to.be.undefined;\n expect(run.fontId).to.equal(expectedFontId);\n }\n\n test(\"Arial\", arial);\n test(\"Comic Sans\", comic);\n test(\"Consolas\", 0);\n\n test(\"arial\", arial);\n test(\"aRIaL\", arial);\n });\n\n function computeDimensions(args: { content?: string, bold?: boolean, italic?: boolean, font?: string, height?: number, width?: number }): { x: number, y: number } {\n const textBlock = TextBlock.create({\n styleName: \"\",\n styleOverrides: {\n lineHeight: args.height,\n widthFactor: args.width,\n },\n });\n\n textBlock.appendRun(TextRun.create({\n styleName: \"\",\n content: args.content ?? \"This is a string of text.\",\n styleOverrides: {\n isBold: args.bold,\n isItalic: args.italic,\n fontName: args.font ?? \"Vera\",\n },\n }));\n\n const range = layoutTextBlock({ textBlock, iModel }).range;\n return { x: range.high.x - range.low.x, y: range.high.y - range.low.y };\n }\n\n it(\"computes different ranges for different strings\", () => {\n expect(computeDimensions({ content: \"text\" })).to.deep.equal(computeDimensions({ content: \"text\" }));\n expect(computeDimensions({ content: \"text\" })).not.to.deep.equal(computeDimensions({ content: \"texttexttext\" }));\n expect(computeDimensions({ content: \"text\" })).not.to.deep.equal(computeDimensions({ content: \"TEXT\" }));\n });\n\n it(\"computes different ranges for different fonts\", () => {\n // These two are embedded in the iModel.\n expect(computeDimensions({ font: \"Vera\" })).not.to.deep.equal(computeDimensions({ font: \"Karla\" }));\n\n // These two are not embedded in the iModel, but do exist in its font table - they should both fall back to the default font.\n expect(computeDimensions({ font: \"Arial\" })).to.deep.equal(computeDimensions({ font: \"Comic Sans\" }));\n });\n\n it(\"computes different ranges for different height and width\", () => {\n expect(computeDimensions({ height: 2 })).to.deep.equal(computeDimensions({ height: 2 }));\n expect(computeDimensions({ height: 2 })).not.to.deep.equal(computeDimensions({ height: 3 }));\n expect(computeDimensions({ width: 2 })).to.deep.equal(computeDimensions({ width: 2 }));\n expect(computeDimensions({ width: 2 })).not.to.deep.equal(computeDimensions({ width: 3 }));\n });\n\n it(\"excludes trailing blank glyphs from justification ranges\", () => {\n function computeRanges(chars: string): TextLayoutRanges {\n return iModel.computeRangesForText({\n chars,\n bold: false,\n italic: false,\n fontId: 1,\n widthFactor: 1,\n lineHeight: 1,\n baselineShift: \"none\",\n });\n }\n\n function test(chars: string, expectEqualRanges: boolean): void {\n const { justification, layout } = computeRanges(chars);\n expect(layout.low.x).to.equal(justification.low.x);\n expect(layout.high.y).to.equal(justification.high.y);\n expect(layout.low.y).to.equal(justification.low.y);\n\n if (expectEqualRanges) {\n expect(layout.high.x).to.equal(justification.high.x);\n } else {\n expect(layout.high.x).greaterThan(justification.high.x);\n }\n }\n\n test(\"abcdef\", true);\n test(\"abcdef \", false);\n test(\"abcdef \", false);\n test(\"abc def\", true);\n\n // new line has no width ever.\n test(\"abcdef\\n\", true);\n\n // apparently native code doesn't consider tab characters to be \"blank\".\n test(\"abcdef\\t\", true);\n\n // apparently native code doesn't consider \"thin space\" to be \"blank\".\n test(\"abcdef\\u2009\", true);\n\n const r1 = computeRanges(\"abcdef \");\n const r2 = computeRanges(\"abcdef \");\n expect(r1.layout.xLength()).lessThan(r2.layout.xLength());\n expect(r1.justification.xLength()).to.equal(r2.justification.xLength());\n });\n });\n});\n\nfunction mockIModel(): IModelDb {\n const iModel: Pick<IModelDb, \"fonts\" | \"computeRangesForText\" | \"forEachMetaData\"> = {\n fonts: {\n findId: () => 0,\n } as any,\n computeRangesForText: () => { return { layout: new Range2d(0, 0, 1, 1), justification: new Range2d(0, 0, 1, 1) }; },\n forEachMetaData: () => undefined,\n };\n\n return iModel as IModelDb;\n}\n\ndescribe(\"produceTextAnnotationGeometry\", () => {\n type Color = ColorDef | \"subcategory\";\n\n function makeText(color?: Color): TextRun {\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\n return TextRun.create({ styleName: \"\", styleOverrides, content: \"text\" });\n }\n\n function makeFraction(color?: Color): FractionRun {\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\n return FractionRun.create({ numerator: \"num\", denominator: \"denom\", styleName: \"\", styleOverrides });\n }\n\n function makeBreak(color?: Color): LineBreakRun {\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\n return LineBreakRun.create({ styleName: \"\", styleOverrides });\n }\n\n function makeTextBlock(runs: Run[]): TextBlock {\n const block = TextBlock.create({ styleName: \"\" });\n for (const run of runs) {\n block.appendRun(run);\n }\n\n return block;\n }\n\n function makeGeometry(runs: Run[]): TextBlockGeometryPropsEntry[] {\n const block = makeTextBlock(runs);\n const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\n return produceTextAnnotationGeometry({ iModel: mockIModel(), annotation }).entries;\n }\n\n it(\"produces an empty array for an empty text block\", () => {\n expect(makeGeometry([])).to.deep.equal([]);\n });\n\n it(\"produces an empty array for a block consisting only of line breaks\", () => {\n expect(makeGeometry([makeBreak(), makeBreak(), makeBreak()])).to.deep.equal([]);\n });\n\n it(\"produces one appearance entry if all runs use subcategory color\", () => {\n const geom = makeGeometry([makeText(), makeFraction(), makeText(\"subcategory\"), makeFraction(\"subcategory\")]);\n expect(geom.length).to.equal(9);\n expect(geom[0].color).to.equal(\"subcategory\");\n expect(geom.slice(1).some((entry) => entry.color !== undefined)).to.be.false;\n });\n\n it(\"produces strings and fraction separators\", () => {\n const geom = makeGeometry([makeText(), makeFraction(), makeFraction(), makeText()]);\n expect(geom.length).to.equal(9);\n expect(geom[0].color).to.equal(\"subcategory\");\n\n expect(geom[1].text).not.to.be.undefined;\n\n expect(geom[2].text).not.to.be.undefined;\n expect(geom[3].separator).not.to.be.undefined;\n expect(geom[4].text).not.to.be.undefined;\n\n expect(geom[5].text).not.to.be.undefined;\n expect(geom[6].separator).not.to.be.undefined;\n expect(geom[7].text).not.to.be.undefined;\n\n expect(geom[8].text).not.to.be.undefined;\n });\n\n it(\"produces an appearance change for each non-break run that is a different color from the previous run\", () => {\n const geom = makeGeometry([\n makeText(ColorDef.blue),\n makeText(), // subcategory by default\n makeText(),\n makeText(ColorDef.red),\n makeText(ColorDef.white),\n makeText(ColorDef.white),\n makeBreak(\"subcategory\"),\n makeFraction(ColorDef.green),\n makeText(ColorDef.green),\n makeBreak(ColorDef.black),\n makeText(ColorDef.green),\n ]).map((entry) => entry.text ? \"text\" : (entry.separator ? \"sep\" : (typeof entry.color === \"number\" ? ColorDef.fromJSON(entry.color) : entry.color)));\n\n expect(geom).to.deep.equal([\n ColorDef.blue,\n \"text\",\n \"subcategory\",\n \"text\",\n \"text\",\n ColorDef.red,\n \"text\",\n ColorDef.white,\n \"text\",\n \"text\",\n ColorDef.green,\n \"text\", \"sep\", \"text\",\n \"text\",\n \"text\",\n ]);\n });\n\n it(\"offsets geometry entries by margins\", () => {\n function makeGeometryWithMargins(anchor: TextAnnotationAnchor, margins: TextBlockMargins): TextStringProps | undefined {\n const runs = [makeText()];\n const block = makeTextBlock(runs);\n block.margins = margins;\n\n const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\n annotation.anchor = anchor;\n\n const geom = produceTextAnnotationGeometry({ iModel: mockIModel(), annotation }).entries;\n return geom[1].text;\n }\n\n function testMargins(margins: TextBlockMargins, height: number, width: number) {\n // We want to disregard negative margins. Note, I'm not changing the margins object itself. It gets passed into makeGeometryWithMargins as it is.\n const left = margins.left >= 0 ? margins.left : 0;\n const right = margins.right >= 0 ? margins.right : 0;\n const top = margins.top >= 0 ? margins.top : 0;\n const bottom = margins.bottom >= 0 ? margins.bottom : 0;\n\n // Test case: bottom, left\n let props = makeGeometryWithMargins({ horizontal: \"left\", vertical: \"bottom\" }, margins);\n expect(props).not.to.be.undefined;\n expect(props?.origin, \"Expected geometry to be offset by left and bottom margins\").to.deep.equal({ x: left, y: bottom, z: 0 });\n\n // Test case: top, right\n props = makeGeometryWithMargins({ vertical: \"top\", horizontal: \"right\" }, margins);\n\n let x = (right + width) * -1;\n let y = (top + height) * -1;\n expect(props).not.to.be.undefined;\n expect(props?.origin, \"Expected geometry to be offset by top and right margins\").to.deep.equal({ x, y, z: 0 });\n\n // Test case: middle, center\n props = makeGeometryWithMargins({ vertical: \"middle\", horizontal: \"center\" }, margins);\n\n x = (left - right - width) / 2;\n y = (bottom - top - height) / 2;\n expect(props).not.to.be.undefined;\n expect(props?.origin, \"Expected geometry to be centered in the margins\").to.deep.equal({ x, y, z: 0 });\n }\n\n // Getting the range from the same mock the native code uses to compute the range of a text block.\n const textRange = mockIModel().computeRangesForText({\n chars: \"text\",\n bold: false,\n italic: false,\n fontId: 1,\n widthFactor: 1,\n lineHeight: 1,\n baselineShift: \"none\",\n });\n\n const xLength = textRange.layout.xLength(); // Will be 1 because of the mock implementation.\n const yLength = textRange.layout.yLength(); // Will be 1 because of the mock implementation.\n\n testMargins({ top: 0, right: 0, bottom: 0, left: 0 }, yLength, xLength);\n testMargins({ top: 1, right: 2, bottom: 3, left: 4 }, yLength, xLength);\n testMargins({ top: -1, right: -2, bottom: -3, left: -4 }, yLength, xLength);\n });\n\n});\n\ndescribe(\"TextAnnotation element\", () => {\n function makeElement(props?: Partial<TextAnnotation2dProps>): TextAnnotation2d {\n return TextAnnotation2d.fromJSON({\n category: \"0x12\",\n model: \"0x34\",\n code: {\n spec: \"0x56\",\n scope: \"0x78\",\n },\n classFullName: TextAnnotation2d.classFullName,\n ...props,\n }, mockIModel());\n }\n\n describe(\"getAnnotation\", () => {\n it(\"returns undefined if not present in JSON properties\", () => {\n expect(makeElement().getAnnotation()).to.be.undefined;\n });\n\n it(\"extracts from JSON properties\", () => {\n const elem = makeElement({\n jsonProperties: {\n annotation: {\n textBlock: TextBlock.create({ styleName: \"block\" }).toJSON(),\n },\n },\n });\n\n const anno = elem.getAnnotation()!;\n expect(anno).not.to.be.undefined;\n expect(anno.textBlock.isEmpty).to.be.true;\n expect(anno.textBlock.styleName).to.equal(\"block\");\n });\n\n it(\"produces a new object each time it is called\", () => {\n const elem = makeElement({\n jsonProperties: {\n annotation: {\n textBlock: TextBlock.create({ styleName: \"block\" }).toJSON(),\n },\n },\n });\n\n const anno1 = elem.getAnnotation()!;\n const anno2 = elem.getAnnotation()!;\n expect(anno1).not.to.equal(anno2);\n expect(anno1.textBlock.equals(anno2.textBlock)).to.be.true;\n });\n });\n\n describe(\"setAnnotation\", () => {\n it(\"updates JSON properties and recomputes geometry stream\", () => {\n const elem = makeElement();\n expect(elem.geom).to.be.undefined;\n\n const annotation = { textBlock: TextBlock.create({ styleName: \"block\" }).toJSON() };\n elem.setAnnotation(TextAnnotation.fromJSON(annotation));\n\n expect(elem.geom).not.to.be.undefined;\n expect(elem.jsonProperties.annotation).to.deep.equal(annotation);\n expect(elem.jsonProperties.annotation).not.to.equal(annotation);\n });\n\n it(\"uses default subcategory by default\", () => {\n const elem = makeElement();\n elem.setAnnotation(TextAnnotation.fromJSON({ textBlock: { styleName: \"block\" } }));\n expect(elem.geom!.length).to.equal(1);\n expect(elem.geom![0].appearance!.subCategory).to.equal(\"0x13\");\n });\n\n it(\"uses specific subcategory if provided\", () => {\n const elem = makeElement();\n elem.setAnnotation(TextAnnotation.fromJSON({ textBlock: { styleName: \"block\" } }), \"0x1234\");\n expect(elem.geom!.length).to.equal(1);\n expect(elem.geom![0].appearance!.subCategory).to.equal(\"0x1234\");\n });\n });\n\n describe(\"persistence\", () => {\n let imodel: SnapshotDb;\n let seed: GeometricElement3d;\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"GeometryStream\", \"GeometryStreamTest.bim\");\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n\n seed = imodel.elements.getElement<GeometricElement3d>(\"0x1d\");\n assert.exists(seed);\n assert.isTrue(seed.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\n });\n\n after(() => imodel.close());\n\n function createElement(props?: Partial<TextAnnotation3dProps>): TextAnnotation3d {\n return TextAnnotation3d.fromJSON({\n category: seed.category,\n model: seed.model,\n code: {\n spec: seed.code.spec,\n scope: seed.code.scope,\n },\n ...props,\n classFullName: TextAnnotation3d.classFullName,\n }, imodel);\n }\n\n function createAnnotation(): TextAnnotation {\n const block = TextBlock.createEmpty();\n block.styleName = \"block\";\n block.appendRun(makeTextRun(\"run\", \"run1\"));\n block.appendRun(makeTextRun(\"RUN!!!!!\", \"run2\"));\n\n return TextAnnotation.fromJSON({\n textBlock: block.toJSON(),\n anchor: {\n vertical: \"middle\",\n horizontal: \"right\",\n },\n orientation: { yaw: 1, pitch: 0, roll: -1 },\n offset: [0, -5, 100],\n });\n }\n\n it(\"create method does not automatically compute the geometry\", () => {\n const annotation = createAnnotation();\n const el = createElement({ jsonProperties: { annotation: annotation.toJSON() } });\n expect(el.getAnnotation()!.equals(annotation)).to.be.true;\n expect(el.geom).to.be.undefined;\n });\n\n function expectPlacement(el: GeometricElement3d, expectValidBBox: boolean, expectedOrigin = [0, 0, 0], expectedYPR = [0, 0, 0]): void {\n expect(el.placement.origin.x).to.equal(expectedOrigin[0]);\n expect(el.placement.origin.y).to.equal(expectedOrigin[1]);\n expect(el.placement.origin.z).to.equal(expectedOrigin[2]);\n expect(el.placement.angles.yaw.radians).to.equal(expectedYPR[0]);\n expect(el.placement.angles.pitch.radians).to.equal(expectedYPR[1]);\n expect(el.placement.angles.roll.radians).to.equal(expectedYPR[2]);\n expect(el.placement.bbox.isNull).to.equal(!expectValidBBox);\n }\n\n it(\"inserts and round-trips through JSON\", () => {\n function test(annotation?: TextAnnotation): void {\n const el0 = createElement();\n if (annotation) {\n el0.setAnnotation(annotation);\n }\n\n expectPlacement(el0, false);\n\n const elId = el0.insert();\n expect(Id64.isValidId64(elId)).to.be.true;\n\n const el1 = imodel.elements.getElement<TextAnnotation3d>(elId);\n expect(el1).not.to.be.undefined;\n expect(el1 instanceof TextAnnotation3d).to.be.true;\n\n expectPlacement(el1, undefined !== annotation && !annotation.textBlock.isEmpty);\n\n const anno = el1.getAnnotation();\n\n if (!annotation) {\n expect(anno).to.be.undefined;\n } else {\n expect(anno).not.to.be.undefined;\n expect(anno!.equals(annotation)).to.be.true;\n }\n }\n\n test();\n test(TextAnnotation.fromJSON({ textBlock: { styleName: \"block\" } }));\n test(createAnnotation());\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Category.test.js","sourceRoot":"","sources":["../../../../src/test/categories/Category.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 { expect } from \"chai\";\r\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\r\nimport { SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport {\r\n IModelDb, RenderMaterialElement, RenderMaterialElementParams, SpatialCategory, StandaloneDb, SubCategory,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\n\r\ndescribe(\"Category\", () => {\r\n let imodel: StandaloneDb;\r\n before(() => {\r\n imodel = StandaloneDb.createEmpty(IModelTestUtils.prepareOutputFile(\"Category\", \"Category.bim\"), {\r\n rootSubject: { name: \"Category tests\", description: \"Category tests\" },\r\n client: \"Category\",\r\n globalOrigin: { x: 0, y: 0 },\r\n projectExtents: { low: { x: -500, y: -500, z: -50 }, high: { x: 500, y: 500, z: 50 } },\r\n guid: Guid.createValue(),\r\n });\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n it(\"should insert with default subcategory appearance\", () => {\r\n const params: RenderMaterialElementParams = {\r\n description: \"Field Weld\",\r\n color: [0.9058, 0.298, 0.2352],\r\n diffuse: 0.5,\r\n finish: 0.15,\r\n paletteName: \"MyPalette\",\r\n reflectColor: [0.9, 0.3, 0.25],\r\n specularColor: [0.2, 0.2, 0.2],\r\n };\r\n\r\n const materialId = RenderMaterialElement.insert(imodel, IModelDb.dictionaryId, \"FieldWeldMaterial\", params);\r\n expect(Id64.isValidId64(materialId)).to.be.true;\r\n\r\n const appearance = new SubCategoryAppearance({ material: materialId, priority: 100, transp: 0.75 });\r\n const priCategoryId = SpatialCategory.insert(imodel, IModelDb.dictionaryId, \"FieldWeld\", appearance);\r\n expect(Id64.isValidId64(priCategoryId)).to.be.true;\r\n\r\n const subCatId = imodel.elements.queryElementIdByCode(SubCategory.createCode(imodel, priCategoryId, \"FieldWeld\"))!;\r\n expect(subCatId).not.to.be.undefined;\r\n expect(Id64.isValidId64(subCatId)).to.be.true;\r\n const subCat = imodel.elements.getElement<SubCategory>(subCatId);\r\n expect(subCat).not.to.be.undefined;\r\n expect(subCat).instanceof(SubCategory);\r\n expect(subCat.isDefaultSubCategory).to.be.true;\r\n expect(subCat.appearance.priority).to.equal(100);\r\n expect(subCat.appearance.transparency).to.equal(0.75);\r\n expect(subCat.appearance.materialId).to.equal(materialId);\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"Category.test.js","sourceRoot":"","sources":["../../../../src/test/categories/Category.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { expect } from \"chai\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { SubCategoryAppearance } from \"@itwin/core-common\";\nimport {\n IModelDb, RenderMaterialElement, RenderMaterialElementParams, SpatialCategory, StandaloneDb, SubCategory,\n} from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\ndescribe(\"Category\", () => {\n let imodel: StandaloneDb;\n before(() => {\n imodel = StandaloneDb.createEmpty(IModelTestUtils.prepareOutputFile(\"Category\", \"Category.bim\"), {\n rootSubject: { name: \"Category tests\", description: \"Category tests\" },\n client: \"Category\",\n globalOrigin: { x: 0, y: 0 },\n projectExtents: { low: { x: -500, y: -500, z: -50 }, high: { x: 500, y: 500, z: 50 } },\n guid: Guid.createValue(),\n });\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"should insert with default subcategory appearance\", () => {\n const params: RenderMaterialElementParams = {\n description: \"Field Weld\",\n color: [0.9058, 0.298, 0.2352],\n diffuse: 0.5,\n finish: 0.15,\n paletteName: \"MyPalette\",\n reflectColor: [0.9, 0.3, 0.25],\n specularColor: [0.2, 0.2, 0.2],\n };\n\n const materialId = RenderMaterialElement.insert(imodel, IModelDb.dictionaryId, \"FieldWeldMaterial\", params);\n expect(Id64.isValidId64(materialId)).to.be.true;\n\n const appearance = new SubCategoryAppearance({ material: materialId, priority: 100, transp: 0.75 });\n const priCategoryId = SpatialCategory.insert(imodel, IModelDb.dictionaryId, \"FieldWeld\", appearance);\n expect(Id64.isValidId64(priCategoryId)).to.be.true;\n\n const subCatId = imodel.elements.queryElementIdByCode(SubCategory.createCode(imodel, priCategoryId, \"FieldWeld\"))!;\n expect(subCatId).not.to.be.undefined;\n expect(Id64.isValidId64(subCatId)).to.be.true;\n const subCat = imodel.elements.getElement<SubCategory>(subCatId);\n expect(subCat).not.to.be.undefined;\n expect(subCat).instanceof(SubCategory);\n expect(subCat.isDefaultSubCategory).to.be.true;\n expect(subCat.appearance.priority).to.equal(100);\n expect(subCat.appearance.transparency).to.equal(0.75);\n expect(subCat.appearance.materialId).to.equal(materialId);\n });\n});\n"]}