@itwin/core-backend 5.1.0-dev.3 → 5.1.0-dev.32

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 (521) hide show
  1. package/CHANGELOG.md +38 -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 +1 -1
  5. package/lib/cjs/BisCoreSchema.js.map +1 -1
  6. package/lib/cjs/BlobContainerService.js.map +1 -1
  7. package/lib/cjs/BriefcaseManager.d.ts +10 -2
  8. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  9. package/lib/cjs/BriefcaseManager.js +12 -0
  10. package/lib/cjs/BriefcaseManager.js.map +1 -1
  11. package/lib/cjs/CatalogDb.js.map +1 -1
  12. package/lib/cjs/Category.d.ts +41 -4
  13. package/lib/cjs/Category.d.ts.map +1 -1
  14. package/lib/cjs/Category.js +77 -4
  15. package/lib/cjs/Category.js.map +1 -1
  16. package/lib/cjs/ChangeSummaryManager.js +2 -2
  17. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  18. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  19. package/lib/cjs/ChangesetECAdaptor.js +242 -242
  20. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  21. package/lib/cjs/ChannelControl.js.map +1 -1
  22. package/lib/cjs/CheckpointManager.js.map +1 -1
  23. package/lib/cjs/ClassRegistry.js +5 -5
  24. package/lib/cjs/ClassRegistry.js.map +1 -1
  25. package/lib/cjs/CloudSqlite.js +1 -1
  26. package/lib/cjs/CloudSqlite.js.map +1 -1
  27. package/lib/cjs/CodeService.js.map +1 -1
  28. package/lib/cjs/CodeSpecs.d.ts +1 -1
  29. package/lib/cjs/CodeSpecs.js +1 -1
  30. package/lib/cjs/CodeSpecs.js.map +1 -1
  31. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  32. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  33. package/lib/cjs/DevTools.js.map +1 -1
  34. package/lib/cjs/DisplayStyle.d.ts +9 -4
  35. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  36. package/lib/cjs/DisplayStyle.js +30 -3
  37. package/lib/cjs/DisplayStyle.js.map +1 -1
  38. package/lib/cjs/ECDb.js.map +1 -1
  39. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  40. package/lib/cjs/ECSqlStatement.js.map +1 -1
  41. package/lib/cjs/Element.d.ts +216 -60
  42. package/lib/cjs/Element.d.ts.map +1 -1
  43. package/lib/cjs/Element.js +560 -59
  44. package/lib/cjs/Element.js.map +1 -1
  45. package/lib/cjs/ElementAspect.d.ts +7 -7
  46. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  47. package/lib/cjs/ElementAspect.js +7 -7
  48. package/lib/cjs/ElementAspect.js.map +1 -1
  49. package/lib/cjs/ElementGraphics.js.map +1 -1
  50. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  51. package/lib/cjs/Entity.d.ts +43 -3
  52. package/lib/cjs/Entity.d.ts.map +1 -1
  53. package/lib/cjs/Entity.js +59 -1
  54. package/lib/cjs/Entity.js.map +1 -1
  55. package/lib/cjs/EntityReferences.js.map +1 -1
  56. package/lib/cjs/ExportGraphics.d.ts +54 -8
  57. package/lib/cjs/ExportGraphics.d.ts.map +1 -1
  58. package/lib/cjs/ExportGraphics.js +158 -59
  59. package/lib/cjs/ExportGraphics.js.map +1 -1
  60. package/lib/cjs/ExternalSource.js.map +1 -1
  61. package/lib/cjs/FontFile.js.map +1 -1
  62. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  63. package/lib/cjs/GeographicCRSServices.d.ts +6 -2
  64. package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
  65. package/lib/cjs/GeographicCRSServices.js +1 -1
  66. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  67. package/lib/cjs/GeometrySummary.js +47 -47
  68. package/lib/cjs/GeometrySummary.js.map +1 -1
  69. package/lib/cjs/IModelDb.d.ts +28 -43
  70. package/lib/cjs/IModelDb.d.ts.map +1 -1
  71. package/lib/cjs/IModelDb.js +177 -92
  72. package/lib/cjs/IModelDb.js.map +1 -1
  73. package/lib/cjs/IModelDbFonts.js.map +1 -1
  74. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  75. package/lib/cjs/IModelHost.d.ts +13 -0
  76. package/lib/cjs/IModelHost.d.ts.map +1 -1
  77. package/lib/cjs/IModelHost.js +6 -0
  78. package/lib/cjs/IModelHost.js.map +1 -1
  79. package/lib/cjs/IModelJsFs.js.map +1 -1
  80. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  81. package/lib/cjs/IpcHost.js.map +1 -1
  82. package/lib/cjs/LineStyle.js.map +1 -1
  83. package/lib/cjs/LocalHub.js +1 -1
  84. package/lib/cjs/LocalHub.js.map +1 -1
  85. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  86. package/lib/cjs/LockControl.js.map +1 -1
  87. package/lib/cjs/Material.d.ts +19 -0
  88. package/lib/cjs/Material.d.ts.map +1 -1
  89. package/lib/cjs/Material.js +29 -0
  90. package/lib/cjs/Material.js.map +1 -1
  91. package/lib/cjs/Model.d.ts +64 -28
  92. package/lib/cjs/Model.d.ts.map +1 -1
  93. package/lib/cjs/Model.js +115 -27
  94. package/lib/cjs/Model.js.map +1 -1
  95. package/lib/cjs/NativeAppStorage.js.map +1 -1
  96. package/lib/cjs/NativeHost.js.map +1 -1
  97. package/lib/cjs/NavigationRelationship.js.map +1 -1
  98. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  99. package/lib/cjs/PropertyStore.js.map +1 -1
  100. package/lib/cjs/Relationship.js.map +1 -1
  101. package/lib/cjs/RpcBackend.js.map +1 -1
  102. package/lib/cjs/SQLiteDb.js.map +1 -1
  103. package/lib/cjs/Schema.js.map +1 -1
  104. package/lib/cjs/SchemaSync.js.map +1 -1
  105. package/lib/cjs/SchemaUtils.js.map +1 -1
  106. package/lib/cjs/SheetIndex.js.map +1 -1
  107. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  108. package/lib/cjs/SqliteStatement.js.map +1 -1
  109. package/lib/cjs/Texture.d.ts +1 -1
  110. package/lib/cjs/Texture.js +1 -1
  111. package/lib/cjs/Texture.js.map +1 -1
  112. package/lib/cjs/TileStorage.js.map +1 -1
  113. package/lib/cjs/TxnManager.d.ts +4 -4
  114. package/lib/cjs/TxnManager.d.ts.map +1 -1
  115. package/lib/cjs/TxnManager.js +2 -1
  116. package/lib/cjs/TxnManager.js.map +1 -1
  117. package/lib/cjs/ViewDefinition.d.ts +140 -14
  118. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  119. package/lib/cjs/ViewDefinition.js +250 -14
  120. package/lib/cjs/ViewDefinition.js.map +1 -1
  121. package/lib/cjs/ViewStateHydrator.js +3 -3
  122. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  123. package/lib/cjs/ViewStore.js.map +1 -1
  124. package/lib/cjs/annotations/FrameGeometry.d.ts +52 -0
  125. package/lib/cjs/annotations/FrameGeometry.d.ts.map +1 -0
  126. package/lib/cjs/annotations/FrameGeometry.js +250 -0
  127. package/lib/cjs/annotations/FrameGeometry.js.map +1 -0
  128. package/lib/cjs/{TextAnnotationElement.d.ts → annotations/TextAnnotationElement.d.ts} +6 -11
  129. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -0
  130. package/lib/cjs/{TextAnnotationElement.js → annotations/TextAnnotationElement.js} +20 -26
  131. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -0
  132. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts +31 -0
  133. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts.map +1 -0
  134. package/lib/cjs/annotations/TextAnnotationGeometry.js +83 -0
  135. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -0
  136. package/lib/cjs/annotations/TextBlockGeometry.d.ts +16 -0
  137. package/lib/cjs/annotations/TextBlockGeometry.d.ts.map +1 -0
  138. package/lib/cjs/{TextAnnotationGeometry.js → annotations/TextBlockGeometry.js} +11 -68
  139. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -0
  140. package/lib/cjs/{TextAnnotationLayout.d.ts → annotations/TextBlockLayout.d.ts} +19 -7
  141. package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -0
  142. package/lib/cjs/{TextAnnotationLayout.js → annotations/TextBlockLayout.js} +19 -7
  143. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -0
  144. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  145. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  146. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  147. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  148. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  149. package/lib/cjs/core-backend.d.ts +5 -3
  150. package/lib/cjs/core-backend.d.ts.map +1 -1
  151. package/lib/cjs/core-backend.js +5 -6
  152. package/lib/cjs/core-backend.js.map +1 -1
  153. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  154. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  155. package/lib/cjs/domains/GenericElements.js.map +1 -1
  156. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  157. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  158. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  159. package/lib/cjs/internal/ElementLRUCache.d.ts +28 -0
  160. package/lib/cjs/internal/ElementLRUCache.d.ts.map +1 -0
  161. package/lib/cjs/internal/ElementLRUCache.js +120 -0
  162. package/lib/cjs/internal/ElementLRUCache.js.map +1 -0
  163. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  164. package/lib/cjs/internal/HubMock.js.map +1 -1
  165. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  166. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  167. package/lib/cjs/internal/NoLocks.js.map +1 -1
  168. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  169. package/lib/cjs/internal/Symbols.d.ts +1 -0
  170. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  171. package/lib/cjs/internal/Symbols.js +2 -1
  172. package/lib/cjs/internal/Symbols.js.map +1 -1
  173. package/lib/cjs/internal/cross-package.js.map +1 -1
  174. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  175. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  176. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  177. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  178. package/lib/cjs/rpc/multipart.js.map +1 -1
  179. package/lib/cjs/rpc/tracing.js.map +1 -1
  180. package/lib/cjs/rpc/web/logging.js.map +1 -1
  181. package/lib/cjs/rpc/web/request.js.map +1 -1
  182. package/lib/cjs/rpc/web/response.js.map +1 -1
  183. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  184. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +2 -2
  185. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  186. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  187. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  188. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  189. package/lib/cjs/workspace/Settings.js.map +1 -1
  190. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  191. package/lib/cjs/workspace/Workspace.js.map +1 -1
  192. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  193. package/lib/esm/BackendHubAccess.js.map +1 -1
  194. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  195. package/lib/esm/BisCoreSchema.js +1 -1
  196. package/lib/esm/BisCoreSchema.js.map +1 -1
  197. package/lib/esm/BlobContainerService.js.map +1 -1
  198. package/lib/esm/BriefcaseManager.d.ts +10 -2
  199. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  200. package/lib/esm/BriefcaseManager.js +12 -0
  201. package/lib/esm/BriefcaseManager.js.map +1 -1
  202. package/lib/esm/CatalogDb.js.map +1 -1
  203. package/lib/esm/Category.d.ts +41 -4
  204. package/lib/esm/Category.d.ts.map +1 -1
  205. package/lib/esm/Category.js +77 -4
  206. package/lib/esm/Category.js.map +1 -1
  207. package/lib/esm/ChangeSummaryManager.js +2 -2
  208. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  209. package/lib/esm/ChangedElementsDb.js.map +1 -1
  210. package/lib/esm/ChangesetECAdaptor.js +242 -242
  211. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  212. package/lib/esm/ChannelControl.js.map +1 -1
  213. package/lib/esm/CheckpointManager.js.map +1 -1
  214. package/lib/esm/ClassRegistry.js +5 -5
  215. package/lib/esm/ClassRegistry.js.map +1 -1
  216. package/lib/esm/CloudSqlite.js +1 -1
  217. package/lib/esm/CloudSqlite.js.map +1 -1
  218. package/lib/esm/CodeService.js.map +1 -1
  219. package/lib/esm/CodeSpecs.d.ts +1 -1
  220. package/lib/esm/CodeSpecs.js +1 -1
  221. package/lib/esm/CodeSpecs.js.map +1 -1
  222. package/lib/esm/ConcurrentQuery.js.map +1 -1
  223. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  224. package/lib/esm/DevTools.js.map +1 -1
  225. package/lib/esm/DisplayStyle.d.ts +9 -4
  226. package/lib/esm/DisplayStyle.d.ts.map +1 -1
  227. package/lib/esm/DisplayStyle.js +30 -3
  228. package/lib/esm/DisplayStyle.js.map +1 -1
  229. package/lib/esm/ECDb.js.map +1 -1
  230. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  231. package/lib/esm/ECSqlStatement.js.map +1 -1
  232. package/lib/esm/Element.d.ts +216 -60
  233. package/lib/esm/Element.d.ts.map +1 -1
  234. package/lib/esm/Element.js +563 -62
  235. package/lib/esm/Element.js.map +1 -1
  236. package/lib/esm/ElementAspect.d.ts +7 -7
  237. package/lib/esm/ElementAspect.d.ts.map +1 -1
  238. package/lib/esm/ElementAspect.js +7 -7
  239. package/lib/esm/ElementAspect.js.map +1 -1
  240. package/lib/esm/ElementGraphics.js.map +1 -1
  241. package/lib/esm/ElementTreeWalker.js.map +1 -1
  242. package/lib/esm/Entity.d.ts +43 -3
  243. package/lib/esm/Entity.d.ts.map +1 -1
  244. package/lib/esm/Entity.js +59 -1
  245. package/lib/esm/Entity.js.map +1 -1
  246. package/lib/esm/EntityReferences.js.map +1 -1
  247. package/lib/esm/ExportGraphics.d.ts +54 -8
  248. package/lib/esm/ExportGraphics.d.ts.map +1 -1
  249. package/lib/esm/ExportGraphics.js +156 -58
  250. package/lib/esm/ExportGraphics.js.map +1 -1
  251. package/lib/esm/ExternalSource.js.map +1 -1
  252. package/lib/esm/FontFile.js.map +1 -1
  253. package/lib/esm/GeoCoordConfig.js.map +1 -1
  254. package/lib/esm/GeographicCRSServices.d.ts +6 -2
  255. package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
  256. package/lib/esm/GeographicCRSServices.js +1 -1
  257. package/lib/esm/GeographicCRSServices.js.map +1 -1
  258. package/lib/esm/GeometrySummary.js +47 -47
  259. package/lib/esm/GeometrySummary.js.map +1 -1
  260. package/lib/esm/IModelDb.d.ts +28 -43
  261. package/lib/esm/IModelDb.d.ts.map +1 -1
  262. package/lib/esm/IModelDb.js +180 -95
  263. package/lib/esm/IModelDb.js.map +1 -1
  264. package/lib/esm/IModelDbFonts.js.map +1 -1
  265. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  266. package/lib/esm/IModelHost.d.ts +13 -0
  267. package/lib/esm/IModelHost.d.ts.map +1 -1
  268. package/lib/esm/IModelHost.js +6 -0
  269. package/lib/esm/IModelHost.js.map +1 -1
  270. package/lib/esm/IModelJsFs.js.map +1 -1
  271. package/lib/esm/ImageSourceConversion.js.map +1 -1
  272. package/lib/esm/IpcHost.js.map +1 -1
  273. package/lib/esm/LineStyle.js.map +1 -1
  274. package/lib/esm/LocalHub.js +1 -1
  275. package/lib/esm/LocalHub.js.map +1 -1
  276. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  277. package/lib/esm/LockControl.js.map +1 -1
  278. package/lib/esm/Material.d.ts +19 -0
  279. package/lib/esm/Material.d.ts.map +1 -1
  280. package/lib/esm/Material.js +30 -1
  281. package/lib/esm/Material.js.map +1 -1
  282. package/lib/esm/Model.d.ts +64 -28
  283. package/lib/esm/Model.d.ts.map +1 -1
  284. package/lib/esm/Model.js +116 -28
  285. package/lib/esm/Model.js.map +1 -1
  286. package/lib/esm/NativeAppStorage.js.map +1 -1
  287. package/lib/esm/NativeHost.js.map +1 -1
  288. package/lib/esm/NavigationRelationship.js.map +1 -1
  289. package/lib/esm/PromiseMemoizer.js.map +1 -1
  290. package/lib/esm/PropertyStore.js.map +1 -1
  291. package/lib/esm/Relationship.js.map +1 -1
  292. package/lib/esm/RpcBackend.js.map +1 -1
  293. package/lib/esm/SQLiteDb.js.map +1 -1
  294. package/lib/esm/Schema.js.map +1 -1
  295. package/lib/esm/SchemaSync.js.map +1 -1
  296. package/lib/esm/SchemaUtils.js.map +1 -1
  297. package/lib/esm/SheetIndex.js.map +1 -1
  298. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  299. package/lib/esm/SqliteStatement.js.map +1 -1
  300. package/lib/esm/Texture.d.ts +1 -1
  301. package/lib/esm/Texture.js +1 -1
  302. package/lib/esm/Texture.js.map +1 -1
  303. package/lib/esm/TileStorage.js.map +1 -1
  304. package/lib/esm/TxnManager.d.ts +4 -4
  305. package/lib/esm/TxnManager.d.ts.map +1 -1
  306. package/lib/esm/TxnManager.js +2 -1
  307. package/lib/esm/TxnManager.js.map +1 -1
  308. package/lib/esm/ViewDefinition.d.ts +140 -14
  309. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  310. package/lib/esm/ViewDefinition.js +251 -15
  311. package/lib/esm/ViewDefinition.js.map +1 -1
  312. package/lib/esm/ViewStateHydrator.js +3 -3
  313. package/lib/esm/ViewStateHydrator.js.map +1 -1
  314. package/lib/esm/ViewStore.js.map +1 -1
  315. package/lib/esm/annotations/FrameGeometry.d.ts +52 -0
  316. package/lib/esm/annotations/FrameGeometry.d.ts.map +1 -0
  317. package/lib/esm/annotations/FrameGeometry.js +245 -0
  318. package/lib/esm/annotations/FrameGeometry.js.map +1 -0
  319. package/lib/esm/{TextAnnotationElement.d.ts → annotations/TextAnnotationElement.d.ts} +6 -11
  320. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -0
  321. package/lib/esm/{TextAnnotationElement.js → annotations/TextAnnotationElement.js} +22 -28
  322. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -0
  323. package/lib/esm/annotations/TextAnnotationGeometry.d.ts +31 -0
  324. package/lib/esm/annotations/TextAnnotationGeometry.d.ts.map +1 -0
  325. package/lib/esm/annotations/TextAnnotationGeometry.js +80 -0
  326. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -0
  327. package/lib/esm/annotations/TextBlockGeometry.d.ts +16 -0
  328. package/lib/esm/annotations/TextBlockGeometry.d.ts.map +1 -0
  329. package/lib/esm/{TextAnnotationGeometry.js → annotations/TextBlockGeometry.js} +11 -68
  330. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -0
  331. package/lib/esm/{TextAnnotationLayout.d.ts → annotations/TextBlockLayout.d.ts} +19 -7
  332. package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -0
  333. package/lib/esm/{TextAnnotationLayout.js → annotations/TextBlockLayout.js} +19 -7
  334. package/lib/esm/annotations/TextBlockLayout.js.map +1 -0
  335. package/lib/esm/core-backend.d.ts +5 -3
  336. package/lib/esm/core-backend.d.ts.map +1 -1
  337. package/lib/esm/core-backend.js +5 -3
  338. package/lib/esm/core-backend.js.map +1 -1
  339. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  340. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  341. package/lib/esm/domains/GenericElements.js.map +1 -1
  342. package/lib/esm/domains/GenericSchema.js.map +1 -1
  343. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  344. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  345. package/lib/esm/internal/ElementLRUCache.d.ts +28 -0
  346. package/lib/esm/internal/ElementLRUCache.d.ts.map +1 -0
  347. package/lib/esm/internal/ElementLRUCache.js +116 -0
  348. package/lib/esm/internal/ElementLRUCache.js.map +1 -0
  349. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  350. package/lib/esm/internal/HubMock.js.map +1 -1
  351. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  352. package/lib/esm/internal/NativePlatform.js.map +1 -1
  353. package/lib/esm/internal/NoLocks.js.map +1 -1
  354. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  355. package/lib/esm/internal/Symbols.d.ts +1 -0
  356. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  357. package/lib/esm/internal/Symbols.js +1 -0
  358. package/lib/esm/internal/Symbols.js.map +1 -1
  359. package/lib/esm/internal/cross-package.js.map +1 -1
  360. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  361. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  362. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  363. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  364. package/lib/esm/rpc/multipart.js.map +1 -1
  365. package/lib/esm/rpc/tracing.js.map +1 -1
  366. package/lib/esm/rpc/web/logging.js.map +1 -1
  367. package/lib/esm/rpc/web/request.js.map +1 -1
  368. package/lib/esm/rpc/web/response.js.map +1 -1
  369. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  370. package/lib/esm/rpc-impl/IModelReadRpcImpl.js +2 -2
  371. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  372. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  373. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  374. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  375. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  376. package/lib/esm/test/AttachDb.test.js +11 -11
  377. package/lib/esm/test/AttachDb.test.js.map +1 -1
  378. package/lib/esm/test/ElementLRUCache.test.d.ts +2 -0
  379. package/lib/esm/test/ElementLRUCache.test.d.ts.map +1 -0
  380. package/lib/esm/test/ElementLRUCache.test.js +212 -0
  381. package/lib/esm/test/ElementLRUCache.test.js.map +1 -0
  382. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  383. package/lib/esm/test/IModelHost.test.js.map +1 -1
  384. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  385. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  386. package/lib/esm/test/IpcHost.test.js.map +1 -1
  387. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  388. package/lib/esm/test/PrintElementTree.js.map +1 -1
  389. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  390. package/lib/esm/test/RevisionUtility.js.map +1 -1
  391. package/lib/esm/test/SchemaUtils.test.js +25 -25
  392. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  393. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  394. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  395. package/lib/esm/test/TestUtils.js.map +1 -1
  396. package/lib/esm/test/annotations/TextAnnotation.test.js +190 -1025
  397. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  398. package/lib/esm/test/annotations/TextBlock.test.d.ts +2 -0
  399. package/lib/esm/test/annotations/TextBlock.test.d.ts.map +1 -0
  400. package/lib/esm/test/annotations/TextBlock.test.js +969 -0
  401. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -0
  402. package/lib/esm/test/categories/Category.test.js.map +1 -1
  403. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  404. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  405. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  406. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  407. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  408. package/lib/esm/test/ecdb/ECDb.test.js +86 -65
  409. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  410. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  411. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  412. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  413. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  414. package/lib/esm/test/ecdb/ECSqlQuery.test.js +7 -30
  415. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  416. package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
  417. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  418. package/lib/esm/test/ecdb/ECSqlStatement.test.js +292 -292
  419. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  420. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  421. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  422. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  423. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  424. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  425. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  426. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  427. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  428. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  429. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  430. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  431. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  432. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  433. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  434. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  435. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  436. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  437. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  438. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  439. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  440. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  441. package/lib/esm/test/imageData.js.map +1 -1
  442. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  443. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  444. package/lib/esm/test/imodel/IModel.test.js +68 -16
  445. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  446. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  447. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  448. package/lib/esm/test/index.js.map +1 -1
  449. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  450. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  451. package/lib/esm/test/misc/GeoServices.test.js +23 -9
  452. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  453. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  454. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  455. package/lib/esm/test/rpc/response.test.js.map +1 -1
  456. package/lib/esm/test/schema/ClassRegistry.test.js +71 -71
  457. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  458. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  459. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  460. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  461. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  462. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  463. package/lib/esm/test/standalone/ChangesetReader.test.js +28 -28
  464. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  465. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  466. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  467. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  468. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  469. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  470. package/lib/esm/test/standalone/ExportGraphics.test.js +67 -15
  471. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  472. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  473. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  474. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  475. package/lib/esm/test/standalone/IModelLimits.test.d.ts +2 -0
  476. package/lib/esm/test/standalone/IModelLimits.test.d.ts.map +1 -0
  477. package/lib/esm/test/standalone/IModelLimits.test.js +103 -0
  478. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -0
  479. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  480. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  481. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  482. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  483. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  484. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  485. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  486. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  487. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  488. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  489. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  490. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  491. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  492. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  493. package/lib/esm/test/standalone/SnapshotDb.test.js +20 -1
  494. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  495. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  496. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  497. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  498. package/lib/esm/test/standalone/TxnManager.test.js +1 -1
  499. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  500. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  501. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  502. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  503. package/lib/esm/workspace/Settings.js.map +1 -1
  504. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  505. package/lib/esm/workspace/Workspace.js.map +1 -1
  506. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  507. package/package.json +12 -12
  508. package/lib/cjs/TextAnnotationElement.d.ts.map +0 -1
  509. package/lib/cjs/TextAnnotationElement.js.map +0 -1
  510. package/lib/cjs/TextAnnotationGeometry.d.ts +0 -32
  511. package/lib/cjs/TextAnnotationGeometry.d.ts.map +0 -1
  512. package/lib/cjs/TextAnnotationGeometry.js.map +0 -1
  513. package/lib/cjs/TextAnnotationLayout.d.ts.map +0 -1
  514. package/lib/cjs/TextAnnotationLayout.js.map +0 -1
  515. package/lib/esm/TextAnnotationElement.d.ts.map +0 -1
  516. package/lib/esm/TextAnnotationElement.js.map +0 -1
  517. package/lib/esm/TextAnnotationGeometry.d.ts +0 -32
  518. package/lib/esm/TextAnnotationGeometry.d.ts.map +0 -1
  519. package/lib/esm/TextAnnotationGeometry.js.map +0 -1
  520. package/lib/esm/TextAnnotationLayout.d.ts.map +0 -1
  521. package/lib/esm/TextAnnotationLayout.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextBlock.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/TextBlock.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 { computeGraphemeOffsets, ComputeGraphemeOffsetsArgs, ComputeRangesForTextLayoutArgs, FindFontId, FindTextStyle, layoutTextBlock, LineLayout, RunLayout, TextBlockLayout, TextLayoutRanges } from \"../../annotations/TextBlockLayout\";\r\nimport { Geometry, Range2d } from \"@itwin/core-geometry\";\r\nimport { ColorDef, FontType, FractionRun, LineBreakRun, LineLayoutResult, Run, RunLayoutResult, TextAnnotation, TextAnnotationAnchor, TextBlock, TextBlockGeometryPropsEntry, TextBlockMargins, TextRun, TextStringProps, TextStyleSettings } from \"@itwin/core-common\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { produceTextBlockGeometry } from \"../../core-backend\";\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}): 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: 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 multiplier = Math.pow(100, numDecimalPlaces);\r\n return Math.round(num * multiplier) / multiplier;\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 horizontal 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\ndescribe(\"produceTextBlockGeometry\", () => {\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 const layout = doLayout(block);\r\n return produceTextBlockGeometry(layout, annotation.computeTransform(layout.range)).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 const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\r\n annotation.anchor = anchor;\r\n const layout = doLayout(block);\r\n const geom = produceTextBlockGeometry(layout, annotation.computeTransform(layout.range)).entries;\r\n\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 // xLength will be 4 because of the mock implementation on line 16.\r\n // yLength will be 1 because of the mock implementation on line 16.\r\n testMargins({ top: 0, right: 0, bottom: 0, left: 0 }, 1, 4);\r\n testMargins({ top: 1, right: 2, bottom: 3, left: 4 }, 1, 4);\r\n testMargins({ top: -1, right: -2, bottom: -3, left: -4 }, 1, 4);\r\n });\r\n});\r\n\r\n\r\n// Ignoring the text strings from the spell checker\r\n// cspell:ignore jklmnop vwxyz defg hijk ghij klmno pqrstu Tanuki aabb eeff nggg amet adipiscing elit Phasellus pretium malesuada venenatis eleifend Donec sapien Nullam commodo accumsan lacinia metus enim pharetra lacus facilisis Duis suscipit quis feugiat fermentum ut augue Mauris iaculis odio rhoncus lorem viverra turpis elementum posuere Consolas अनुच्छेद"]}
@@ -1 +1 @@
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"]}
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 +1 @@
1
- {"version":3,"file":"CodeSpec.test.js","sourceRoot":"","sources":["../../../../src/test/codespec/CodeSpec.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 { CodeScopeSpec, CodeSpec } from \"@itwin/core-common\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { StandaloneDb } from \"../../IModelDb\";\n\ndescribe(\"CodeSpec\", () => {\n let imodel: StandaloneDb;\n before(() => {\n imodel = StandaloneDb.createEmpty(IModelTestUtils.prepareOutputFile(\"CodeSpec\", \"CodeSpec.bim\"), {\n rootSubject: { name: \"CodeSpec tests\", description: \"CodeSpec tests\" },\n client: \"CodeSpec\",\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 properties and update them later\", () => {\n let codeSpec = CodeSpec.create(imodel, \"PumpTag\", CodeScopeSpec.Type.Model);\n const codeSpecId = imodel.codeSpecs.insert(codeSpec);\n\n imodel.saveChanges();\n expect(Id64.isValidId64(codeSpecId)).to.be.true;\n expect(codeSpecId).to.be.equal(codeSpec.id);\n\n codeSpec = imodel.codeSpecs.getById(codeSpecId);\n\n expect(codeSpec.scopeReq).to.be.equal(CodeScopeSpec.ScopeRequirement.ElementId);\n expect(codeSpec.scopeType).to.be.equal(CodeScopeSpec.Type.Model);\n expect(codeSpec.isExternal).false;\n\n codeSpec.scopeReq = CodeScopeSpec.ScopeRequirement.FederationGuid;\n codeSpec.scopeType = CodeScopeSpec.Type.Repository;\n imodel.codeSpecs.updateProperties(codeSpec);\n imodel.saveChanges();\n const fname = imodel.pathName;\n imodel.close();\n imodel = StandaloneDb.openFile(fname);\n\n codeSpec = imodel.codeSpecs.getByName(\"PumpTag\");\n expect(codeSpecId).to.be.equal(codeSpec.id);\n expect(codeSpec.name).equal(\"PumpTag\");\n expect(codeSpec.isExternal).true;\n\n expect(codeSpec.scopeReq).to.be.equal(CodeScopeSpec.ScopeRequirement.FederationGuid);\n expect(codeSpec.scopeType).to.be.equal(CodeScopeSpec.Type.Repository);\n\n codeSpec = imodel.codeSpecs.getById(codeSpecId);\n expect(codeSpec.name).to.be.equal(\"PumpTag\");\n });\n});\n"]}
1
+ {"version":3,"file":"CodeSpec.test.js","sourceRoot":"","sources":["../../../../src/test/codespec/CodeSpec.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 { CodeScopeSpec, CodeSpec } from \"@itwin/core-common\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { StandaloneDb } from \"../../IModelDb\";\r\n\r\ndescribe(\"CodeSpec\", () => {\r\n let imodel: StandaloneDb;\r\n before(() => {\r\n imodel = StandaloneDb.createEmpty(IModelTestUtils.prepareOutputFile(\"CodeSpec\", \"CodeSpec.bim\"), {\r\n rootSubject: { name: \"CodeSpec tests\", description: \"CodeSpec tests\" },\r\n client: \"CodeSpec\",\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 properties and update them later\", () => {\r\n let codeSpec = CodeSpec.create(imodel, \"PumpTag\", CodeScopeSpec.Type.Model);\r\n const codeSpecId = imodel.codeSpecs.insert(codeSpec);\r\n\r\n imodel.saveChanges();\r\n expect(Id64.isValidId64(codeSpecId)).to.be.true;\r\n expect(codeSpecId).to.be.equal(codeSpec.id);\r\n\r\n codeSpec = imodel.codeSpecs.getById(codeSpecId);\r\n\r\n expect(codeSpec.scopeReq).to.be.equal(CodeScopeSpec.ScopeRequirement.ElementId);\r\n expect(codeSpec.scopeType).to.be.equal(CodeScopeSpec.Type.Model);\r\n expect(codeSpec.isExternal).false;\r\n\r\n codeSpec.scopeReq = CodeScopeSpec.ScopeRequirement.FederationGuid;\r\n codeSpec.scopeType = CodeScopeSpec.Type.Repository;\r\n imodel.codeSpecs.updateProperties(codeSpec);\r\n imodel.saveChanges();\r\n const fname = imodel.pathName;\r\n imodel.close();\r\n imodel = StandaloneDb.openFile(fname);\r\n\r\n codeSpec = imodel.codeSpecs.getByName(\"PumpTag\");\r\n expect(codeSpecId).to.be.equal(codeSpec.id);\r\n expect(codeSpec.name).equal(\"PumpTag\");\r\n expect(codeSpec.isExternal).true;\r\n\r\n expect(codeSpec.scopeReq).to.be.equal(CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n expect(codeSpec.scopeType).to.be.equal(CodeScopeSpec.Type.Repository);\r\n\r\n codeSpec = imodel.codeSpecs.getById(codeSpecId);\r\n expect(codeSpec.name).to.be.equal(\"PumpTag\");\r\n });\r\n});\r\n"]}
@@ -24,17 +24,17 @@ describe("Common table expression support in ECSQL", () => {
24
24
  imodel1.close();
25
25
  });
26
26
  it("collect base properties recursively", async () => {
27
- const query = `
28
- WITH RECURSIVE
29
- base_classes (aId, aParentId, aPath, aDepth) AS (
30
- SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?
31
- UNION ALL
32
- SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1
33
- FROM meta.ECClassDef c
34
- JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId
35
- JOIN base_classes ON aId = cbc.TargetECInstanceId
36
- ORDER BY 1
37
- )
27
+ const query = `
28
+ WITH RECURSIVE
29
+ base_classes (aId, aParentId, aPath, aDepth) AS (
30
+ SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?
31
+ UNION ALL
32
+ SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1
33
+ FROM meta.ECClassDef c
34
+ JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId
35
+ JOIN base_classes ON aId = cbc.TargetECInstanceId
36
+ ORDER BY 1
37
+ )
38
38
  SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name`;
39
39
  const rows = await executeQuery(imodel1, query, ["Element"]);
40
40
  const expected = ["Angle", "BaseModel", "BBoxHigh", "BBoxLow", "Border", "BorderTemplate", "Category", "CategorySelector", "CodeScope", "CodeSpec", "CodeValue", "Data", "Description", "DisplayStyle", "DrawingModel", "Enabled", "Extents", "EyePoint", "FederationGuid", "Flags", "FocusDistance", "Format", "GeometryStream", "Height", "InSpatialIndex", "IsCameraOn", "IsPrivate", "JsonProperties", "LastMod", "LensAngle", "Model", "ModelSelector", "Name", "Origin", "PaletteName", "Parent", "Pitch", "Properties", "Rank", "Recipe", "RepositoryGuid", "Roll", "Rotation", "RotationAngle", "Scale", "SheetTemplate", "Type", "TypeDefinition", "Url", "UserLabel", "View", "ViewAttachment", "Width", "Yaw"];
@@ -42,58 +42,58 @@ describe("Common table expression support in ECSQL", () => {
42
42
  assert.sameOrderedMembers(actual, expected);
43
43
  });
44
44
  it("generate mandelbrot set", async () => {
45
- const rows = await executeQuery(imodel1, `
46
- WITH RECURSIVE
47
- [xaxis]([x]) AS(
48
- VALUES (- 2.0)
49
- UNION ALL
50
- SELECT [x] + 0.05
51
- FROM [xaxis]
52
- WHERE [x] < 1.2
53
- ),
54
- [yaxis]([y]) AS(
55
- VALUES (- 1.0)
56
- UNION ALL
57
- SELECT [y] + 0.1
58
- FROM [yaxis]
59
- WHERE [y] < 1.0
60
- ),
61
- [m]([iter], [cx], [cy], [x], [y]) AS(
62
- SELECT
63
- 0,
64
- [x],
65
- [y],
66
- 0.0,
67
- 0.0
68
- FROM [xaxis],
69
- [yaxis]
70
- UNION ALL
71
- SELECT
72
- [iter] + 1,
73
- [cx],
74
- [cy],
75
- [x] * [x] - [y] * [y] + [cx],
76
- 2.0 * [x] * [y] + [cy]
77
- FROM [m]
78
- WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28
79
- ),
80
- [m2]([iter], [cx], [cy]) AS(
81
- SELECT
82
- MAX ([iter]),
83
- [cx],
84
- [cy]
85
- FROM [m]
86
- GROUP BY
87
- [cx],
88
- [cy]
89
- ),
90
- [a]([t]) AS(
91
- SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')
92
- FROM [m2]
93
- GROUP BY [cy]
94
- )
95
- SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set
96
- FROM [a];
45
+ const rows = await executeQuery(imodel1, `
46
+ WITH RECURSIVE
47
+ [xaxis]([x]) AS(
48
+ VALUES (- 2.0)
49
+ UNION ALL
50
+ SELECT [x] + 0.05
51
+ FROM [xaxis]
52
+ WHERE [x] < 1.2
53
+ ),
54
+ [yaxis]([y]) AS(
55
+ VALUES (- 1.0)
56
+ UNION ALL
57
+ SELECT [y] + 0.1
58
+ FROM [yaxis]
59
+ WHERE [y] < 1.0
60
+ ),
61
+ [m]([iter], [cx], [cy], [x], [y]) AS(
62
+ SELECT
63
+ 0,
64
+ [x],
65
+ [y],
66
+ 0.0,
67
+ 0.0
68
+ FROM [xaxis],
69
+ [yaxis]
70
+ UNION ALL
71
+ SELECT
72
+ [iter] + 1,
73
+ [cx],
74
+ [cy],
75
+ [x] * [x] - [y] * [y] + [cx],
76
+ 2.0 * [x] * [y] + [cy]
77
+ FROM [m]
78
+ WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28
79
+ ),
80
+ [m2]([iter], [cx], [cy]) AS(
81
+ SELECT
82
+ MAX ([iter]),
83
+ [cx],
84
+ [cy]
85
+ FROM [m]
86
+ GROUP BY
87
+ [cx],
88
+ [cy]
89
+ ),
90
+ [a]([t]) AS(
91
+ SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')
92
+ FROM [m2]
93
+ GROUP BY [cy]
94
+ )
95
+ SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set
96
+ FROM [a];
97
97
  `);
98
98
  const expected = " ....#\n" +
99
99
  " ..#*..\n" +
@@ -121,34 +121,34 @@ describe("Common table expression support in ECSQL", () => {
121
121
  });
122
122
  it("basic cte test", async () => {
123
123
  let rows = [];
124
- rows = await executeQuery(imodel1, `
125
- WITH RECURSIVE
126
- cnt (x,y) AS (
127
- SELECT 100, 200
128
- UNION ALL
129
- SELECT x+1, 200 FROM cnt WHERE x<210
130
- )
124
+ rows = await executeQuery(imodel1, `
125
+ WITH RECURSIVE
126
+ cnt (x,y) AS (
127
+ SELECT 100, 200
128
+ UNION ALL
129
+ SELECT x+1, 200 FROM cnt WHERE x<210
130
+ )
131
131
  SELECT * from cnt`);
132
132
  assert(rows.length === 111);
133
- rows = await executeQuery(imodel1, `
134
- WITH RECURSIVE
135
- cnt (x,y) AS (
136
- SELECT 100, 200
137
- )
133
+ rows = await executeQuery(imodel1, `
134
+ WITH RECURSIVE
135
+ cnt (x,y) AS (
136
+ SELECT 100, 200
137
+ )
138
138
  SELECT * from cnt`);
139
139
  let slm = new SequentialLogMatcher();
140
140
  // these two are generated by sqlite
141
141
  slm.append().error().category("ECDb").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);
142
142
  assert(rows.length === 1);
143
143
  try {
144
- rows = await executeQuery(imodel1, `
145
- WITH
146
- cte_1 (a,b,c) AS (
147
- SELECT 100, 400, 300
148
- ),
149
- cte_1 (a,b,c) AS (
150
- SELECT 100, 400, 300
151
- )
144
+ rows = await executeQuery(imodel1, `
145
+ WITH
146
+ cte_1 (a,b,c) AS (
147
+ SELECT 100, 400, 300
148
+ ),
149
+ cte_1 (a,b,c) AS (
150
+ SELECT 100, 400, 300
151
+ )
152
152
  SELECT * from cte_1`);
153
153
  assert(false);
154
154
  }
@@ -160,11 +160,11 @@ describe("Common table expression support in ECSQL", () => {
160
160
  // these two are generated by ECSQL. Its not clear why this message is logged twice.
161
161
  slm.append().error().category("ECDb").message(/Common table 'cte_1' has 3 values for columns 2/gm);
162
162
  try {
163
- rows = await executeQuery(imodel1, `
164
- WITH
165
- cte_1 (a,b,c) AS (
166
- SELECT 100, 400
167
- )
163
+ rows = await executeQuery(imodel1, `
164
+ WITH
165
+ cte_1 (a,b,c) AS (
166
+ SELECT 100, 400
167
+ )
168
168
  SELECT * from cte_1`);
169
169
  assert(false);
170
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CTE.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/CTE.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 } from \"chai\";\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\nimport { IModelDb, SnapshotDb } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\n\n// cspell:ignore mirukuru ibim\n\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\n const rows: any[] = [];\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\n rows.push(queryRow.toRow());\n }\n return rows;\n}\n\ndescribe(\"Common table expression support in ECSQL\", () => {\n let imodel1: SnapshotDb;\n\n before(async () => {\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\n });\n\n after(async () => {\n imodel1.close();\n });\n it(\"collect base properties recursively\", async () => {\n const query = `\n WITH RECURSIVE\n base_classes (aId, aParentId, aPath, aDepth) AS (\n SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?\n UNION ALL\n SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1\n FROM meta.ECClassDef c\n JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId\n JOIN base_classes ON aId = cbc.TargetECInstanceId\n ORDER BY 1\n )\n SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name` ;\n const rows = await executeQuery(imodel1, query, [\"Element\"]);\n const expected = [\"Angle\", \"BaseModel\", \"BBoxHigh\", \"BBoxLow\", \"Border\", \"BorderTemplate\", \"Category\", \"CategorySelector\", \"CodeScope\", \"CodeSpec\", \"CodeValue\", \"Data\", \"Description\", \"DisplayStyle\", \"DrawingModel\", \"Enabled\", \"Extents\", \"EyePoint\", \"FederationGuid\", \"Flags\", \"FocusDistance\", \"Format\", \"GeometryStream\", \"Height\", \"InSpatialIndex\", \"IsCameraOn\", \"IsPrivate\", \"JsonProperties\", \"LastMod\", \"LensAngle\", \"Model\", \"ModelSelector\", \"Name\", \"Origin\", \"PaletteName\", \"Parent\", \"Pitch\", \"Properties\", \"Rank\", \"Recipe\", \"RepositoryGuid\", \"Roll\", \"Rotation\", \"RotationAngle\", \"Scale\", \"SheetTemplate\", \"Type\", \"TypeDefinition\", \"Url\", \"UserLabel\", \"View\", \"ViewAttachment\", \"Width\", \"Yaw\"];\n const actual = rows.map((r) => r.prop);\n assert.sameOrderedMembers(actual, expected);\n });\n\n it(\"generate mandelbrot set\", async () => {\n const rows = await executeQuery(imodel1, `\n WITH RECURSIVE\n [xaxis]([x]) AS(\n VALUES (- 2.0)\n UNION ALL\n SELECT [x] + 0.05\n FROM [xaxis]\n WHERE [x] < 1.2\n ),\n [yaxis]([y]) AS(\n VALUES (- 1.0)\n UNION ALL\n SELECT [y] + 0.1\n FROM [yaxis]\n WHERE [y] < 1.0\n ),\n [m]([iter], [cx], [cy], [x], [y]) AS(\n SELECT\n 0,\n [x],\n [y],\n 0.0,\n 0.0\n FROM [xaxis],\n [yaxis]\n UNION ALL\n SELECT\n [iter] + 1,\n [cx],\n [cy],\n [x] * [x] - [y] * [y] + [cx],\n 2.0 * [x] * [y] + [cy]\n FROM [m]\n WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28\n ),\n [m2]([iter], [cx], [cy]) AS(\n SELECT\n MAX ([iter]),\n [cx],\n [cy]\n FROM [m]\n GROUP BY\n [cx],\n [cy]\n ),\n [a]([t]) AS(\n SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')\n FROM [m2]\n GROUP BY [cy]\n )\n SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set\n FROM [a];\n `);\n\n const expected =\n \" ....#\\n\" +\n \" ..#*..\\n\" +\n \" ..+####+.\\n\" +\n \" .......+####.... +\\n\" +\n \" ..##+*##########+.++++\\n\" +\n \" .+.##################+.\\n\" +\n \" .............+###################+.+\\n\" +\n \" ..++..#.....*#####################+.\\n\" +\n \" ...+#######++#######################.\\n\" +\n \" ....+*################################.\\n\" +\n \" #############################################...\\n\" +\n \" ....+*################################.\\n\" +\n \" ...+#######++#######################.\\n\" +\n \" ..++..#.....*#####################+.\\n\" +\n \" .............+###################+.+\\n\" +\n \" .+.##################+.\\n\" +\n \" ..##+*##########+.++++\\n\" +\n \" .......+####.... +\\n\" +\n \" ..+####+.\\n\" +\n \" ..#*..\\n\" +\n \" ....#\\n\" +\n \" +.\";\n assert(rows[0].mandelbrot_set === expected);\n });\n\n it(\"basic cte test\", async () => {\n let rows = [];\n rows = await executeQuery(imodel1, `\n WITH RECURSIVE\n cnt (x,y) AS (\n SELECT 100, 200\n UNION ALL\n SELECT x+1, 200 FROM cnt WHERE x<210\n )\n SELECT * from cnt`);\n assert(rows.length === 111);\n\n rows = await executeQuery(imodel1, `\n WITH RECURSIVE\n cnt (x,y) AS (\n SELECT 100, 200\n )\n SELECT * from cnt`);\n\n let slm = new SequentialLogMatcher();\n // these two are generated by sqlite\n slm.append().error().category(\"ECDb\").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);\n assert(rows.length === 1);\n try {\n rows = await executeQuery(imodel1, `\n WITH\n cte_1 (a,b,c) AS (\n SELECT 100, 400, 300\n ),\n cte_1 (a,b,c) AS (\n SELECT 100, 400, 300\n )\n SELECT * from cte_1`);\n assert(false);\n } catch {\n assert(true); // should fail as cte_1 is used for two ct expression.\n }\n assert.isTrue(slm.finishAndDispose());\n slm = new SequentialLogMatcher();\n // these two are generated by ECSQL. Its not clear why this message is logged twice.\n slm.append().error().category(\"ECDb\").message(/Common table 'cte_1' has 3 values for columns 2/gm);\n try {\n rows = await executeQuery(imodel1, `\n WITH\n cte_1 (a,b,c) AS (\n SELECT 100, 400\n )\n SELECT * from cte_1`);\n assert(false);\n } catch {\n assert(true); // number are to ct expression does not match select\n }\n assert.isTrue(slm.finishAndDispose());\n });\n});\n"]}
1
+ {"version":3,"file":"CTE.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/CTE.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 } from \"chai\";\r\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { IModelDb, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\n\r\n// cspell:ignore mirukuru ibim\r\n\r\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\r\n const rows: any[] = [];\r\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\r\n rows.push(queryRow.toRow());\r\n }\r\n return rows;\r\n}\r\n\r\ndescribe(\"Common table expression support in ECSQL\", () => {\r\n let imodel1: SnapshotDb;\r\n\r\n before(async () => {\r\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n });\r\n\r\n after(async () => {\r\n imodel1.close();\r\n });\r\n it(\"collect base properties recursively\", async () => {\r\n const query = `\r\n WITH RECURSIVE\r\n base_classes (aId, aParentId, aPath, aDepth) AS (\r\n SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?\r\n UNION ALL\r\n SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1\r\n FROM meta.ECClassDef c\r\n JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId\r\n JOIN base_classes ON aId = cbc.TargetECInstanceId\r\n ORDER BY 1\r\n )\r\n SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name` ;\r\n const rows = await executeQuery(imodel1, query, [\"Element\"]);\r\n const expected = [\"Angle\", \"BaseModel\", \"BBoxHigh\", \"BBoxLow\", \"Border\", \"BorderTemplate\", \"Category\", \"CategorySelector\", \"CodeScope\", \"CodeSpec\", \"CodeValue\", \"Data\", \"Description\", \"DisplayStyle\", \"DrawingModel\", \"Enabled\", \"Extents\", \"EyePoint\", \"FederationGuid\", \"Flags\", \"FocusDistance\", \"Format\", \"GeometryStream\", \"Height\", \"InSpatialIndex\", \"IsCameraOn\", \"IsPrivate\", \"JsonProperties\", \"LastMod\", \"LensAngle\", \"Model\", \"ModelSelector\", \"Name\", \"Origin\", \"PaletteName\", \"Parent\", \"Pitch\", \"Properties\", \"Rank\", \"Recipe\", \"RepositoryGuid\", \"Roll\", \"Rotation\", \"RotationAngle\", \"Scale\", \"SheetTemplate\", \"Type\", \"TypeDefinition\", \"Url\", \"UserLabel\", \"View\", \"ViewAttachment\", \"Width\", \"Yaw\"];\r\n const actual = rows.map((r) => r.prop);\r\n assert.sameOrderedMembers(actual, expected);\r\n });\r\n\r\n it(\"generate mandelbrot set\", async () => {\r\n const rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n [xaxis]([x]) AS(\r\n VALUES (- 2.0)\r\n UNION ALL\r\n SELECT [x] + 0.05\r\n FROM [xaxis]\r\n WHERE [x] < 1.2\r\n ),\r\n [yaxis]([y]) AS(\r\n VALUES (- 1.0)\r\n UNION ALL\r\n SELECT [y] + 0.1\r\n FROM [yaxis]\r\n WHERE [y] < 1.0\r\n ),\r\n [m]([iter], [cx], [cy], [x], [y]) AS(\r\n SELECT\r\n 0,\r\n [x],\r\n [y],\r\n 0.0,\r\n 0.0\r\n FROM [xaxis],\r\n [yaxis]\r\n UNION ALL\r\n SELECT\r\n [iter] + 1,\r\n [cx],\r\n [cy],\r\n [x] * [x] - [y] * [y] + [cx],\r\n 2.0 * [x] * [y] + [cy]\r\n FROM [m]\r\n WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28\r\n ),\r\n [m2]([iter], [cx], [cy]) AS(\r\n SELECT\r\n MAX ([iter]),\r\n [cx],\r\n [cy]\r\n FROM [m]\r\n GROUP BY\r\n [cx],\r\n [cy]\r\n ),\r\n [a]([t]) AS(\r\n SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')\r\n FROM [m2]\r\n GROUP BY [cy]\r\n )\r\n SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set\r\n FROM [a];\r\n `);\r\n\r\n const expected =\r\n \" ....#\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" #############################################...\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ....#\\n\" +\r\n \" +.\";\r\n assert(rows[0].mandelbrot_set === expected);\r\n });\r\n\r\n it(\"basic cte test\", async () => {\r\n let rows = [];\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n UNION ALL\r\n SELECT x+1, 200 FROM cnt WHERE x<210\r\n )\r\n SELECT * from cnt`);\r\n assert(rows.length === 111);\r\n\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n )\r\n SELECT * from cnt`);\r\n\r\n let slm = new SequentialLogMatcher();\r\n // these two are generated by sqlite\r\n slm.append().error().category(\"ECDb\").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);\r\n assert(rows.length === 1);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n ),\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // should fail as cte_1 is used for two ct expression.\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n slm = new SequentialLogMatcher();\r\n // these two are generated by ECSQL. Its not clear why this message is logged twice.\r\n slm.append().error().category(\"ECDb\").message(/Common table 'cte_1' has 3 values for columns 2/gm);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // number are to ct expression does not match select\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n });\r\n});\r\n"]}
@@ -126,24 +126,24 @@ describe.skip("ConcurrentQueryLoad", () => {
126
126
  createReader: (dbs) => {
127
127
  const quries = [
128
128
  {
129
- sql: `
130
- WITH sequence(n) AS (
131
- SELECT 1
132
- UNION ALL
133
- SELECT n + 1 FROM sequence WHERE n < 10000
134
- )
135
- SELECT COUNT(*)
136
- FROM bis.SpatialIndex i, sequence s
137
- WHERE i.ECInstanceId MATCH iModel_spatial_overlap_aabb(
129
+ sql: `
130
+ WITH sequence(n) AS (
131
+ SELECT 1
132
+ UNION ALL
133
+ SELECT n + 1 FROM sequence WHERE n < 10000
134
+ )
135
+ SELECT COUNT(*)
136
+ FROM bis.SpatialIndex i, sequence s
137
+ WHERE i.ECInstanceId MATCH iModel_spatial_overlap_aabb(
138
138
  iModel_bbox(random(), random(), random(), random(),random(), random()))`
139
139
  },
140
140
  {
141
- sql: `
142
- WITH sequence(n) AS (
143
- SELECT 1
144
- UNION ALL
145
- SELECT n + 1 FROM sequence WHERE n < 1000000
146
- )
141
+ sql: `
142
+ WITH sequence(n) AS (
143
+ SELECT 1
144
+ UNION ALL
145
+ SELECT n + 1 FROM sequence WHERE n < 1000000
146
+ )
147
147
  SELECT COUNT(*) FROM sequence`
148
148
  },
149
149
  {