@itwin/core-backend 5.8.0-dev.2 → 5.8.0-dev.20

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 (540) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/lib/cjs/BackendHubAccess.js.map +1 -1
  3. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  4. package/lib/cjs/BisCoreSchema.js.map +1 -1
  5. package/lib/cjs/BlobContainerService.js.map +1 -1
  6. package/lib/cjs/BriefcaseManager.js.map +1 -1
  7. package/lib/cjs/CatalogDb.js.map +1 -1
  8. package/lib/cjs/Category.js.map +1 -1
  9. package/lib/cjs/ChangeSummaryManager.js +2 -2
  10. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  11. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  12. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  13. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  14. package/lib/cjs/ChannelControl.js.map +1 -1
  15. package/lib/cjs/CheckpointManager.js.map +1 -1
  16. package/lib/cjs/ClassRegistry.js +5 -5
  17. package/lib/cjs/ClassRegistry.js.map +1 -1
  18. package/lib/cjs/CloudSqlite.js.map +1 -1
  19. package/lib/cjs/CodeService.js.map +1 -1
  20. package/lib/cjs/CodeSpecs.js.map +1 -1
  21. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  22. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  23. package/lib/cjs/DevTools.js.map +1 -1
  24. package/lib/cjs/DisplayStyle.js.map +1 -1
  25. package/lib/cjs/ECDb.d.ts +26 -0
  26. package/lib/cjs/ECDb.d.ts.map +1 -1
  27. package/lib/cjs/ECDb.js +53 -2
  28. package/lib/cjs/ECDb.js.map +1 -1
  29. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  30. package/lib/cjs/ECSqlRowExecutor.d.ts +66 -0
  31. package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -0
  32. package/lib/cjs/ECSqlRowExecutor.js +135 -0
  33. package/lib/cjs/ECSqlRowExecutor.js.map +1 -0
  34. package/lib/cjs/ECSqlStatement.d.ts +13 -1
  35. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  36. package/lib/cjs/ECSqlStatement.js +30 -0
  37. package/lib/cjs/ECSqlStatement.js.map +1 -1
  38. package/lib/cjs/ECSqlSyncReader.d.ts +104 -0
  39. package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -0
  40. package/lib/cjs/ECSqlSyncReader.js +191 -0
  41. package/lib/cjs/ECSqlSyncReader.js.map +1 -0
  42. package/lib/cjs/Element.js.map +1 -1
  43. package/lib/cjs/ElementAspect.js.map +1 -1
  44. package/lib/cjs/ElementGraphics.js.map +1 -1
  45. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  46. package/lib/cjs/Entity.js.map +1 -1
  47. package/lib/cjs/EntityReferences.js.map +1 -1
  48. package/lib/cjs/ExportGraphics.js.map +1 -1
  49. package/lib/cjs/ExternalSource.js.map +1 -1
  50. package/lib/cjs/FontFile.js.map +1 -1
  51. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  52. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  53. package/lib/cjs/GeometrySummary.js +47 -47
  54. package/lib/cjs/GeometrySummary.js.map +1 -1
  55. package/lib/cjs/IModelDb.d.ts +26 -1
  56. package/lib/cjs/IModelDb.d.ts.map +1 -1
  57. package/lib/cjs/IModelDb.js +63 -11
  58. package/lib/cjs/IModelDb.js.map +1 -1
  59. package/lib/cjs/IModelDbFonts.js.map +1 -1
  60. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  61. package/lib/cjs/IModelHost.js.map +1 -1
  62. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  63. package/lib/cjs/IModelJsFs.js.map +1 -1
  64. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  65. package/lib/cjs/IpcHost.d.ts.map +1 -1
  66. package/lib/cjs/IpcHost.js +28 -4
  67. package/lib/cjs/IpcHost.js.map +1 -1
  68. package/lib/cjs/LineStyle.d.ts +6 -0
  69. package/lib/cjs/LineStyle.d.ts.map +1 -1
  70. package/lib/cjs/LineStyle.js +41 -32
  71. package/lib/cjs/LineStyle.js.map +1 -1
  72. package/lib/cjs/LocalHub.d.ts +17 -10
  73. package/lib/cjs/LocalHub.d.ts.map +1 -1
  74. package/lib/cjs/LocalHub.js +127 -29
  75. package/lib/cjs/LocalHub.js.map +1 -1
  76. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  77. package/lib/cjs/LockControl.js.map +1 -1
  78. package/lib/cjs/Material.js.map +1 -1
  79. package/lib/cjs/Model.js.map +1 -1
  80. package/lib/cjs/NativeAppStorage.js.map +1 -1
  81. package/lib/cjs/NativeHost.js.map +1 -1
  82. package/lib/cjs/NavigationRelationship.js.map +1 -1
  83. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  84. package/lib/cjs/PropertyStore.js.map +1 -1
  85. package/lib/cjs/Relationship.js.map +1 -1
  86. package/lib/cjs/RpcBackend.js.map +1 -1
  87. package/lib/cjs/SQLiteDb.js.map +1 -1
  88. package/lib/cjs/Schema.js.map +1 -1
  89. package/lib/cjs/SchemaSync.js.map +1 -1
  90. package/lib/cjs/SchemaUtils.js.map +1 -1
  91. package/lib/cjs/SheetIndex.js.map +1 -1
  92. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  93. package/lib/cjs/SqliteStatement.js.map +1 -1
  94. package/lib/cjs/StashManager.js.map +1 -1
  95. package/lib/cjs/Texture.js.map +1 -1
  96. package/lib/cjs/TileStorage.js.map +1 -1
  97. package/lib/cjs/TxnManager.js.map +1 -1
  98. package/lib/cjs/ViewDefinition.js.map +1 -1
  99. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  100. package/lib/cjs/ViewStore.js.map +1 -1
  101. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  102. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  103. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  104. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  105. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  106. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  107. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  108. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  109. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  110. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  111. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  112. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  113. package/lib/cjs/core-backend.d.ts +3 -0
  114. package/lib/cjs/core-backend.d.ts.map +1 -1
  115. package/lib/cjs/core-backend.js +3 -0
  116. package/lib/cjs/core-backend.js.map +1 -1
  117. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  118. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  119. package/lib/cjs/domains/GenericElements.js.map +1 -1
  120. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  121. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  122. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  123. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  124. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  125. package/lib/cjs/internal/HubMock.js.map +1 -1
  126. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  127. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  128. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  129. package/lib/cjs/internal/NoLocks.js.map +1 -1
  130. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  131. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  132. package/lib/cjs/internal/Symbols.js.map +1 -1
  133. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  134. package/lib/cjs/internal/cross-package.js.map +1 -1
  135. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
  136. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  137. package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
  138. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
  139. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  140. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  141. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
  142. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
  143. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
  144. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  145. package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
  146. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  147. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  148. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  149. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  150. package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
  151. package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
  152. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
  153. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  154. package/lib/cjs/internal/workspace/WorkspaceImpl.js +67 -16
  155. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  156. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  157. package/lib/cjs/rpc/multipart.js.map +1 -1
  158. package/lib/cjs/rpc/tracing.js.map +1 -1
  159. package/lib/cjs/rpc/web/logging.js.map +1 -1
  160. package/lib/cjs/rpc/web/request.js.map +1 -1
  161. package/lib/cjs/rpc/web/response.js.map +1 -1
  162. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  163. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  164. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  165. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  166. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  167. package/lib/cjs/workspace/Settings.d.ts +8 -0
  168. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  169. package/lib/cjs/workspace/Settings.js.map +1 -1
  170. package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
  171. package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
  172. package/lib/cjs/workspace/SettingsDb.js +19 -0
  173. package/lib/cjs/workspace/SettingsDb.js.map +1 -0
  174. package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
  175. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
  176. package/lib/cjs/workspace/SettingsEditor.js +53 -0
  177. package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
  178. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  179. package/lib/cjs/workspace/Workspace.d.ts +42 -19
  180. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  181. package/lib/cjs/workspace/Workspace.js.map +1 -1
  182. package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
  183. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  184. package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
  185. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  186. package/lib/esm/BackendHubAccess.js.map +1 -1
  187. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  188. package/lib/esm/BisCoreSchema.js.map +1 -1
  189. package/lib/esm/BlobContainerService.js.map +1 -1
  190. package/lib/esm/BriefcaseManager.js.map +1 -1
  191. package/lib/esm/CatalogDb.js.map +1 -1
  192. package/lib/esm/Category.js.map +1 -1
  193. package/lib/esm/ChangeSummaryManager.js +2 -2
  194. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  195. package/lib/esm/ChangedElementsDb.js.map +1 -1
  196. package/lib/esm/ChangesetECAdaptor.js +248 -248
  197. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  198. package/lib/esm/ChannelControl.js.map +1 -1
  199. package/lib/esm/CheckpointManager.js.map +1 -1
  200. package/lib/esm/ClassRegistry.js +5 -5
  201. package/lib/esm/ClassRegistry.js.map +1 -1
  202. package/lib/esm/CloudSqlite.js.map +1 -1
  203. package/lib/esm/CodeService.js.map +1 -1
  204. package/lib/esm/CodeSpecs.js.map +1 -1
  205. package/lib/esm/ConcurrentQuery.js.map +1 -1
  206. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  207. package/lib/esm/DevTools.js.map +1 -1
  208. package/lib/esm/DisplayStyle.js.map +1 -1
  209. package/lib/esm/ECDb.d.ts +26 -0
  210. package/lib/esm/ECDb.d.ts.map +1 -1
  211. package/lib/esm/ECDb.js +54 -3
  212. package/lib/esm/ECDb.js.map +1 -1
  213. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  214. package/lib/esm/ECSqlRowExecutor.d.ts +66 -0
  215. package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -0
  216. package/lib/esm/ECSqlRowExecutor.js +131 -0
  217. package/lib/esm/ECSqlRowExecutor.js.map +1 -0
  218. package/lib/esm/ECSqlStatement.d.ts +13 -1
  219. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  220. package/lib/esm/ECSqlStatement.js +30 -0
  221. package/lib/esm/ECSqlStatement.js.map +1 -1
  222. package/lib/esm/ECSqlSyncReader.d.ts +104 -0
  223. package/lib/esm/ECSqlSyncReader.d.ts.map +1 -0
  224. package/lib/esm/ECSqlSyncReader.js +187 -0
  225. package/lib/esm/ECSqlSyncReader.js.map +1 -0
  226. package/lib/esm/Element.js.map +1 -1
  227. package/lib/esm/ElementAspect.js.map +1 -1
  228. package/lib/esm/ElementGraphics.js.map +1 -1
  229. package/lib/esm/ElementTreeWalker.js.map +1 -1
  230. package/lib/esm/Entity.js.map +1 -1
  231. package/lib/esm/EntityReferences.js.map +1 -1
  232. package/lib/esm/ExportGraphics.js.map +1 -1
  233. package/lib/esm/ExternalSource.js.map +1 -1
  234. package/lib/esm/FontFile.js.map +1 -1
  235. package/lib/esm/GeoCoordConfig.js.map +1 -1
  236. package/lib/esm/GeographicCRSServices.js.map +1 -1
  237. package/lib/esm/GeometrySummary.js +47 -47
  238. package/lib/esm/GeometrySummary.js.map +1 -1
  239. package/lib/esm/IModelDb.d.ts +26 -1
  240. package/lib/esm/IModelDb.d.ts.map +1 -1
  241. package/lib/esm/IModelDb.js +63 -11
  242. package/lib/esm/IModelDb.js.map +1 -1
  243. package/lib/esm/IModelDbFonts.js.map +1 -1
  244. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  245. package/lib/esm/IModelHost.js.map +1 -1
  246. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  247. package/lib/esm/IModelJsFs.js.map +1 -1
  248. package/lib/esm/ImageSourceConversion.js.map +1 -1
  249. package/lib/esm/IpcHost.d.ts.map +1 -1
  250. package/lib/esm/IpcHost.js +28 -4
  251. package/lib/esm/IpcHost.js.map +1 -1
  252. package/lib/esm/LineStyle.d.ts +6 -0
  253. package/lib/esm/LineStyle.d.ts.map +1 -1
  254. package/lib/esm/LineStyle.js +41 -32
  255. package/lib/esm/LineStyle.js.map +1 -1
  256. package/lib/esm/LocalHub.d.ts +17 -10
  257. package/lib/esm/LocalHub.d.ts.map +1 -1
  258. package/lib/esm/LocalHub.js +128 -30
  259. package/lib/esm/LocalHub.js.map +1 -1
  260. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  261. package/lib/esm/LockControl.js.map +1 -1
  262. package/lib/esm/Material.js.map +1 -1
  263. package/lib/esm/Model.js.map +1 -1
  264. package/lib/esm/NativeAppStorage.js.map +1 -1
  265. package/lib/esm/NativeHost.js.map +1 -1
  266. package/lib/esm/NavigationRelationship.js.map +1 -1
  267. package/lib/esm/PromiseMemoizer.js.map +1 -1
  268. package/lib/esm/PropertyStore.js.map +1 -1
  269. package/lib/esm/Relationship.js.map +1 -1
  270. package/lib/esm/RpcBackend.js.map +1 -1
  271. package/lib/esm/SQLiteDb.js.map +1 -1
  272. package/lib/esm/Schema.js.map +1 -1
  273. package/lib/esm/SchemaSync.js.map +1 -1
  274. package/lib/esm/SchemaUtils.js.map +1 -1
  275. package/lib/esm/SheetIndex.js.map +1 -1
  276. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  277. package/lib/esm/SqliteStatement.js.map +1 -1
  278. package/lib/esm/StashManager.js.map +1 -1
  279. package/lib/esm/Texture.js.map +1 -1
  280. package/lib/esm/TileStorage.js.map +1 -1
  281. package/lib/esm/TxnManager.js.map +1 -1
  282. package/lib/esm/ViewDefinition.js.map +1 -1
  283. package/lib/esm/ViewStateHydrator.js.map +1 -1
  284. package/lib/esm/ViewStore.js.map +1 -1
  285. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  286. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  287. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  288. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  289. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  290. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  291. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  292. package/lib/esm/core-backend.d.ts +3 -0
  293. package/lib/esm/core-backend.d.ts.map +1 -1
  294. package/lib/esm/core-backend.js +3 -0
  295. package/lib/esm/core-backend.js.map +1 -1
  296. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  297. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  298. package/lib/esm/domains/GenericElements.js.map +1 -1
  299. package/lib/esm/domains/GenericSchema.js.map +1 -1
  300. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  301. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  302. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  303. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  304. package/lib/esm/internal/HubMock.js.map +1 -1
  305. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  306. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  307. package/lib/esm/internal/NativePlatform.js.map +1 -1
  308. package/lib/esm/internal/NoLocks.js.map +1 -1
  309. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  310. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  311. package/lib/esm/internal/Symbols.js.map +1 -1
  312. package/lib/esm/internal/annotations/fields.js.map +1 -1
  313. package/lib/esm/internal/cross-package.js.map +1 -1
  314. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
  315. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  316. package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
  317. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
  318. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  319. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  320. package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
  321. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
  322. package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
  323. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  324. package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
  325. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  326. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  327. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  328. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  329. package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
  330. package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
  331. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
  332. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  333. package/lib/esm/internal/workspace/WorkspaceImpl.js +67 -17
  334. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  335. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  336. package/lib/esm/rpc/multipart.js.map +1 -1
  337. package/lib/esm/rpc/tracing.js.map +1 -1
  338. package/lib/esm/rpc/web/logging.js.map +1 -1
  339. package/lib/esm/rpc/web/request.js.map +1 -1
  340. package/lib/esm/rpc/web/response.js.map +1 -1
  341. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  342. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  343. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  344. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  345. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  346. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  347. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  348. package/lib/esm/test/AttachDb.test.js +11 -11
  349. package/lib/esm/test/AttachDb.test.js.map +1 -1
  350. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  351. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  352. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  353. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  354. package/lib/esm/test/IModelHost.test.js.map +1 -1
  355. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  356. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  357. package/lib/esm/test/IpcHost.test.js +64 -13
  358. package/lib/esm/test/IpcHost.test.js.map +1 -1
  359. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  360. package/lib/esm/test/PrintElementTree.js.map +1 -1
  361. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  362. package/lib/esm/test/RevisionUtility.js.map +1 -1
  363. package/lib/esm/test/SchemaUtils.test.js +25 -25
  364. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  365. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  366. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  367. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  368. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  369. package/lib/esm/test/TestUtils.js.map +1 -1
  370. package/lib/esm/test/annotations/Fields.test.js +53 -53
  371. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  372. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  373. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  374. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  375. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  376. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  377. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  378. package/lib/esm/test/categories/Category.test.js.map +1 -1
  379. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  380. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  381. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  382. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  383. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  384. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  385. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  386. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  387. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  388. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  389. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  390. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  391. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  392. package/lib/esm/test/ecdb/ECSqlQuery.test.js +100 -12
  393. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  394. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  395. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  396. package/lib/esm/test/ecdb/ECSqlSyncReader.test.d.ts +2 -0
  397. package/lib/esm/test/ecdb/ECSqlSyncReader.test.d.ts.map +1 -0
  398. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +122 -0
  399. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -0
  400. package/lib/esm/test/ecdb/QueryReaders.test.d.ts +2 -0
  401. package/lib/esm/test/ecdb/QueryReaders.test.d.ts.map +1 -0
  402. package/lib/esm/test/ecdb/QueryReaders.test.js +1462 -0
  403. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -0
  404. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  405. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
  406. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +4 -1
  407. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  408. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  409. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  410. package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts +1 -1
  411. package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts.map +1 -1
  412. package/lib/esm/test/ecsql/src/ECSqlTestParser.js +11 -5
  413. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  414. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +186 -100
  415. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  416. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  417. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  418. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  419. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  420. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  421. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  422. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  423. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  424. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  425. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  426. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  427. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  428. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  429. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  430. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  431. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  432. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  433. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  434. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  435. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  436. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  437. package/lib/esm/test/hubaccess/SemanticRebase.test.js +145 -145
  438. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  439. package/lib/esm/test/imageData.js.map +1 -1
  440. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  441. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  442. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  443. package/lib/esm/test/imodel/IModel.test.js +44 -44
  444. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  445. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  446. package/lib/esm/test/imodel/SchemaXmlImport.test.js +13 -13
  447. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  448. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  449. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  450. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  451. package/lib/esm/test/index.js.map +1 -1
  452. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  453. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  454. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  455. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  456. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  457. package/lib/esm/test/rpc/response.test.js.map +1 -1
  458. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  459. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  460. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  461. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  462. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  463. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  464. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  465. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  466. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  467. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  468. package/lib/esm/test/standalone/ChangesetReader.test.js +135 -135
  469. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  470. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  471. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  472. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  473. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  474. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  475. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  476. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  477. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  478. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  479. package/lib/esm/test/standalone/HubMock.test.js +177 -7
  480. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  481. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  482. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  483. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  484. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  485. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  486. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  487. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  488. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  489. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  490. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  491. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  492. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  493. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  494. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  495. package/lib/esm/test/standalone/Settings.test.js +18 -0
  496. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  497. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  498. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  499. package/lib/esm/test/standalone/StandaloneDb.test.js +51 -1
  500. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  501. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  502. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  503. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  504. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  505. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  506. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  507. package/lib/esm/test/standalone/Workspace.test.js +213 -0
  508. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  509. package/lib/esm/test/standalone/iModelDb.test.d.ts +2 -0
  510. package/lib/esm/test/standalone/iModelDb.test.d.ts.map +1 -0
  511. package/lib/esm/test/standalone/iModelDb.test.js +35 -0
  512. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -0
  513. package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
  514. package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
  515. package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
  516. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
  517. package/lib/esm/workspace/Settings.d.ts +8 -0
  518. package/lib/esm/workspace/Settings.d.ts.map +1 -1
  519. package/lib/esm/workspace/Settings.js.map +1 -1
  520. package/lib/esm/workspace/SettingsDb.d.ts +109 -0
  521. package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
  522. package/lib/esm/workspace/SettingsDb.js +16 -0
  523. package/lib/esm/workspace/SettingsDb.js.map +1 -0
  524. package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
  525. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
  526. package/lib/esm/workspace/SettingsEditor.js +50 -0
  527. package/lib/esm/workspace/SettingsEditor.js.map +1 -0
  528. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  529. package/lib/esm/workspace/Workspace.d.ts +42 -19
  530. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  531. package/lib/esm/workspace/Workspace.js.map +1 -1
  532. package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
  533. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  534. package/lib/esm/workspace/WorkspaceEditor.js +19 -0
  535. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  536. package/package.json +15 -15
  537. package/lib/esm/test/ecdb/ECSqlReader.test.d.ts +0 -2
  538. package/lib/esm/test/ecdb/ECSqlReader.test.d.ts.map +0 -1
  539. package/lib/esm/test/ecdb/ECSqlReader.test.js +0 -669
  540. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +0 -1
@@ -57,17 +57,27 @@ describe("Markdown based ECDb test runner", async () => {
57
57
  runECSqlStatementTest(test, dataset);
58
58
  });
59
59
  }
60
- if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.ConcurrentQuery) {
61
- if (test.skip)
62
- it(`${test.fileName}: ${test.title} (ConcurrentQuery) skipped. Reason: ${test.skip}`);
63
- else if (test.only)
64
- it.only(`${test.fileName}: ${test.title} (ConcurrentQuery)`, async () => {
65
- await runConcurrentQueryTest(test, dataset);
60
+ if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.QueryReader) {
61
+ if (test.skip) {
62
+ it(`${test.fileName}: ${test.title} (ECSqlReader) skipped. Reason: ${test.skip}`);
63
+ it(`${test.fileName}: ${test.title} (ECSqlSyncReader) skipped. Reason: ${test.skip}`);
64
+ }
65
+ else if (test.only) {
66
+ it.only(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {
67
+ await runECSqlReaderTest(test, dataset);
66
68
  });
67
- else
68
- it(`${test.fileName}: ${test.title} (ConcurrentQuery)`, async () => {
69
- await runConcurrentQueryTest(test, dataset);
69
+ it.only(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {
70
+ await runECSqlSyncReaderTest(test, dataset);
71
+ });
72
+ }
73
+ else {
74
+ it(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {
75
+ await runECSqlReaderTest(test, dataset);
70
76
  });
77
+ it(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {
78
+ await runECSqlSyncReaderTest(test, dataset);
79
+ });
80
+ }
71
81
  }
72
82
  }
73
83
  });
@@ -134,6 +144,10 @@ function runECSqlStatementTest(test, dataset) {
134
144
  const parsedVal3d = JSON.parse(binder.value);
135
145
  stmt.bindPoint3d(id, { x: parsedVal3d.X, y: parsedVal3d.Y, z: parsedVal3d.Z });
136
146
  break;
147
+ case "range3d":
148
+ const parsedRange3d = JSON.parse(binder.value);
149
+ stmt.bindRange3d(id, { low: { x: parsedRange3d.low.x, y: parsedRange3d.low.y, z: parsedRange3d.low.z }, high: { x: parsedRange3d.high.x, y: parsedRange3d.high.y, z: parsedRange3d.high.z } });
150
+ break;
137
151
  case "blob":
138
152
  const arrayValues = binder.value.slice(1, -1).split(",");
139
153
  const numbers = arrayValues.map((value) =>
@@ -216,72 +230,72 @@ function getRowFormat(rowFormat) {
216
230
  return QueryRowFormat.UseECSqlPropertyNames;
217
231
  }
218
232
  }
219
- async function runConcurrentQueryTest(test, dataset) {
220
- const imodel = snapshotDbs[dataset];
221
- if (!imodel) {
222
- assert.fail(`Dataset ${dataset} is not loaded`);
223
- }
224
- let reader;
225
- if (test.sql === undefined) {
226
- assert.fail("Test does not have an ECSql statement");
227
- }
228
- let params;
229
- if (test.binders !== undefined) {
230
- params = new QueryBinder();
231
- for (const binder of test.binders) {
232
- // eslint-disable-next-line radix
233
- let id = Number.parseInt(binder.indexOrName);
234
- if (isNaN(id))
235
- id = binder.indexOrName;
236
- switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value
237
- case "null":
238
- params.bindNull(id);
239
- break;
240
- case "string":
241
- params.bindString(id, binder.value);
242
- break;
243
- case "int":
244
- // eslint-disable-next-line radix
245
- params.bindInt(id, Number.parseInt(binder.value));
246
- break;
247
- case "long":
248
- // eslint-disable-next-line radix
249
- params.bindLong(id, Number.parseInt(binder.value));
250
- break;
251
- case "double":
252
- params.bindDouble(id, Number.parseFloat(binder.value));
253
- break;
254
- case "id":
255
- params.bindId(id, binder.value);
256
- break;
257
- case "idset":
258
- const values = binder.value.slice(1, -1).split(",");
259
- const trimmedValues = values.map((value) => value.trim());
260
- params.bindIdSet(id, trimmedValues);
261
- break;
262
- case "point2d":
263
- const parsedVal2d = JSON.parse(binder.value);
264
- params.bindPoint2d(id, new Point2d(parsedVal2d.X, parsedVal2d.Y));
265
- break;
266
- case "point3d":
267
- const parsedVal3d = JSON.parse(binder.value);
268
- params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));
269
- break;
270
- case "blob":
271
- const arrayValues = binder.value.slice(1, -1).split(",");
272
- const numbers = arrayValues.map((value) =>
273
- // eslint-disable-next-line radix
274
- parseInt(value.trim()));
275
- params.bindBlob(id, Uint8Array.of(...numbers));
276
- break;
277
- case "struct":
278
- params.bindStruct(id, JSON.parse(binder.value));
279
- break;
280
- default:
281
- assert.fail(`Unsupported binder type ${binder.type}`);
282
- } // switch binder.type
283
- } // for binder
284
- } // if test.binders
233
+ /** Builds a QueryBinder from the test's binder definitions. Returns undefined when the test has no binders. */
234
+ function buildQueryBinder(test) {
235
+ if (test.binders === undefined)
236
+ return undefined;
237
+ const params = new QueryBinder();
238
+ for (const binder of test.binders) {
239
+ // eslint-disable-next-line radix
240
+ let id = Number.parseInt(binder.indexOrName);
241
+ if (isNaN(id))
242
+ id = binder.indexOrName;
243
+ switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value
244
+ case "null":
245
+ params.bindNull(id);
246
+ break;
247
+ case "string":
248
+ params.bindString(id, binder.value);
249
+ break;
250
+ case "int":
251
+ // eslint-disable-next-line radix
252
+ params.bindInt(id, Number.parseInt(binder.value));
253
+ break;
254
+ case "long":
255
+ // eslint-disable-next-line radix
256
+ params.bindLong(id, Number.parseInt(binder.value));
257
+ break;
258
+ case "double":
259
+ params.bindDouble(id, Number.parseFloat(binder.value));
260
+ break;
261
+ case "id":
262
+ params.bindId(id, binder.value);
263
+ break;
264
+ case "idset":
265
+ const values = binder.value.slice(1, -1).split(",");
266
+ const trimmedValues = values.map((value) => value.trim());
267
+ params.bindIdSet(id, trimmedValues);
268
+ break;
269
+ case "point2d":
270
+ const parsedVal2d = JSON.parse(binder.value);
271
+ params.bindPoint2d(id, new Point2d(parsedVal2d.X, parsedVal2d.Y));
272
+ break;
273
+ case "point3d":
274
+ const parsedVal3d = JSON.parse(binder.value);
275
+ params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));
276
+ break;
277
+ case "range3d":
278
+ const parsedRange3d = JSON.parse(binder.value);
279
+ params.bindRange3d(id, { low: { x: parsedRange3d.low.x, y: parsedRange3d.low.y, z: parsedRange3d.low.z }, high: { x: parsedRange3d.high.x, y: parsedRange3d.high.y, z: parsedRange3d.high.z } });
280
+ break;
281
+ case "blob":
282
+ const arrayValues = binder.value.slice(1, -1).split(",");
283
+ const numbers = arrayValues.map((value) =>
284
+ // eslint-disable-next-line radix
285
+ parseInt(value.trim()));
286
+ params.bindBlob(id, Uint8Array.of(...numbers));
287
+ break;
288
+ case "struct":
289
+ params.bindStruct(id, JSON.parse(binder.value));
290
+ break;
291
+ default:
292
+ assert.fail(`Unsupported binder type ${binder.type}`);
293
+ } // switch binder.type
294
+ } // for binder
295
+ return params;
296
+ }
297
+ /** Builds the common query options object from the test configuration. */
298
+ function buildReaderQueryOptions(test) {
285
299
  const queryOptions = {};
286
300
  queryOptions.rowFormat = getRowFormat(test.rowFormat);
287
301
  if (test.abbreviateBlobs)
@@ -290,26 +304,14 @@ async function runConcurrentQueryTest(test, dataset) {
290
304
  // eslint-disable-next-line @typescript-eslint/no-deprecated
291
305
  queryOptions.convertClassIdsToClassNames = true;
292
306
  }
293
- try {
294
- reader = imodel.createQueryReader(test.sql, params, queryOptions); // TODO: Wire up logic for tests we expect to fail during prepare
295
- }
296
- catch (error) {
297
- assert.fail(`Error during creating QueryReader: ${error.message}`);
298
- }
307
+ return queryOptions;
308
+ }
309
+ /**
310
+ * Shared assertion logic for QueryReader tests that operates on the result rows and column metadata.
311
+ * Used by both ECSqlReader and ECSqlSyncReader test paths.
312
+ */
313
+ function runResultAssertions(test, rows, colMetaData) {
299
314
  let resultCount = 0;
300
- let rows;
301
- try {
302
- rows = await reader.toArray();
303
- }
304
- catch (error) {
305
- if (test.errorDuringPrepare)
306
- return;
307
- else
308
- assert.fail(`Error during prepare of Concurrent Query: ${error.message}`);
309
- }
310
- if (test.errorDuringPrepare)
311
- assert.fail(`Statement is expected to fail during prepare`);
312
- const colMetaData = await reader.getMetaData();
313
315
  while (resultCount < rows.length) {
314
316
  if (resultCount === 0 && test.columnInfo) {
315
317
  // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)
@@ -340,25 +342,109 @@ async function runConcurrentQueryTest(test, dataset) {
340
342
  }
341
343
  resultCount++;
342
344
  }
343
- // if (resultCount === 0 && test.stepStatus) {
344
- // const stepResultString = DbResult[stepResult];
345
- // assert.strictEqual(stepResultString, test.stepStatus, `Expected step status ${test.stepStatus} but got ${stepResultString}`);
346
- // }
347
345
  if (test.expectedResults && test.expectedResults.length !== resultCount) {
348
346
  assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);
349
347
  }
350
348
  }
349
+ /**
350
+ * Shared assertion logic that operates on an already-created ECSqlReader.
351
+ * Used by ECSqlReader test paths.
352
+ */
353
+ async function runAssertionsOnReader(test, reader, label) {
354
+ let rows;
355
+ try {
356
+ rows = await reader.toArray();
357
+ }
358
+ catch (error) {
359
+ if (test.errorDuringPrepare)
360
+ return;
361
+ else
362
+ assert.fail(`Error during execution of ${label}: ${error.message}`);
363
+ }
364
+ if (test.errorDuringPrepare)
365
+ assert.fail(`Statement is expected to fail during prepare`);
366
+ const colMetaData = await reader.getMetaData();
367
+ runResultAssertions(test, rows, colMetaData);
368
+ }
369
+ /**
370
+ * Shared assertion logic that operates on an already-created ECSqlReader.
371
+ * Used by ECSqlSyncReader test paths.
372
+ */
373
+ function runAssertionsOnSyncReader(test, reader, label) {
374
+ let rows;
375
+ try {
376
+ rows = reader.toArray();
377
+ }
378
+ catch (error) {
379
+ if (test.errorDuringPrepare)
380
+ return;
381
+ else
382
+ assert.fail(`Error during execution of ${label}: ${error.message}`);
383
+ }
384
+ if (test.errorDuringPrepare)
385
+ assert.fail(`Statement is expected to fail during prepare`);
386
+ const colMetaData = reader.getMetaData();
387
+ runResultAssertions(test, rows, colMetaData);
388
+ }
389
+ async function runECSqlReaderTest(test, dataset) {
390
+ const imodel = snapshotDbs[dataset];
391
+ if (!imodel) {
392
+ assert.fail(`Dataset ${dataset} is not loaded`);
393
+ }
394
+ if (test.sql === undefined) {
395
+ assert.fail("Test does not have an ECSql statement");
396
+ }
397
+ const params = buildQueryBinder(test);
398
+ const queryOptions = buildReaderQueryOptions(test);
399
+ let reader;
400
+ try {
401
+ reader = imodel.createQueryReader(test.sql, params, queryOptions);
402
+ }
403
+ catch (error) {
404
+ if (test.errorDuringPrepare)
405
+ return;
406
+ else
407
+ assert.fail(`Error during creating ECSqlReader: ${error.message}`);
408
+ }
409
+ await runAssertionsOnReader(test, reader, "ECSqlReader");
410
+ }
411
+ async function runECSqlSyncReaderTest(test, dataset) {
412
+ const imodel = snapshotDbs[dataset];
413
+ if (!imodel) {
414
+ assert.fail(`Dataset ${dataset} is not loaded`);
415
+ }
416
+ if (test.sql === undefined) {
417
+ assert.fail("Test does not have an ECSql statement");
418
+ }
419
+ const params = buildQueryBinder(test);
420
+ const queryOptions = buildReaderQueryOptions(test);
421
+ try {
422
+ imodel.withQueryReader(test.sql, reader => {
423
+ runAssertionsOnSyncReader(test, reader, "ECSqlSyncReader");
424
+ }, params, queryOptions);
425
+ }
426
+ catch (error) {
427
+ if (test.errorDuringPrepare)
428
+ return;
429
+ else
430
+ assert.fail(`Error during creating ECSqlSyncReader: ${error.message}`);
431
+ }
432
+ }
351
433
  function checkingExpectedResults(rowFormat, actualResult, expectedResult, indexesToInclude) {
352
434
  if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {
353
435
  let i = 0;
354
436
  for (const key of Object.keys(expectedResult)) {
355
- assert.deepEqual(actualResult[indexesToInclude[i]], expectedResult[key], `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);
437
+ const expected = typeof expectedResult[key] === "string" ? expectedResult[key].trim() : expectedResult[key];
438
+ const actual = typeof actualResult[indexesToInclude[i]] === "string" ? actualResult[indexesToInclude[i]].trim() : actualResult[indexesToInclude[i]];
439
+ assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);
356
440
  i++;
357
441
  }
358
442
  }
359
443
  else {
360
444
  for (const key of Object.keys(expectedResult)) {
361
- assert.deepEqual(actualResult[key], expectedResult[key], `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);
445
+ const expected = typeof expectedResult[key] === "string" ? expectedResult[key].trim() : expectedResult[key];
446
+ const actual = typeof actualResult[key] === "string" ? actualResult[key].trim() : actualResult[key];
447
+ assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);
362
448
  }
363
449
  }
364
450
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlTestRunner.test.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestRunner.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 { DbResult } from \"@itwin/core-bentley\";\r\nimport { ECSqlRowArg, ECSqlStatement, SnapshotDb } from \"../../../core-backend\";\r\nimport { KnownTestLocations } from \"../../KnownTestLocations\";\r\nimport { ECSqlReader, ECSqlValueType, QueryBinder, QueryOptions, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { buildBinaryData, ECDbMarkdownTestParser, ECDbTestMode, ECDbTestProps, ECDbTestRowFormat } from \"./ECSqlTestParser\";\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { ECSqlDatasets } from \"../dataset/ECSqlDatasets\";\r\nimport { Point2d, Point3d } from \"@itwin/core-geometry\";\r\n\r\nenum TestDataset {\r\n AllProperties = \"AllProperties.bim\"\r\n}\r\n\r\nconst snapshotDbs: { [key in TestDataset]?: SnapshotDb } = {};\r\n\r\ndescribe(\"Markdown based ECDb test runner\", async () => {\r\n before(async () => {\r\n await ECSqlDatasets.generateFiles();\r\n const datasetFilePath = path.join(KnownTestLocations.outputDir, \"ECSqlTests\", TestDataset.AllProperties);\r\n if (!fs.existsSync(datasetFilePath)) {\r\n throw new Error(`Dataset file ${datasetFilePath} does not exist`);\r\n }\r\n snapshotDbs[TestDataset.AllProperties] = SnapshotDb.openFile(datasetFilePath);\r\n });\r\n\r\n after(() => {\r\n for (const key in snapshotDbs) {\r\n if (snapshotDbs.hasOwnProperty(key)) {\r\n (snapshotDbs[key as keyof typeof snapshotDbs])?.close();\r\n }\r\n }\r\n });\r\n const tests: ECDbTestProps[] = ECDbMarkdownTestParser.parse();\r\n\r\n //TODO: Mechanism to run a single test, put something like it.only into the test md which causes this loop to only run those tests\r\n for (const test of tests) {\r\n if (!test.dataset) {\r\n logWarning(`Skipping test ${test.title} because it does not have a dataset`);\r\n continue;\r\n }\r\n\r\n if (test.dataset.toLowerCase() !== TestDataset.AllProperties.toLowerCase()) {\r\n logWarning(`Skipping test ${test.title} because dataset ${test.dataset} is not recognized`);\r\n continue;\r\n }\r\n const dataset = TestDataset.AllProperties;\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.Statement) {\r\n if (test.skip)\r\n it(`${test.fileName}: ${test.title} (Statement) skipped. Reason: ${test.skip}`);\r\n else if (test.only)\r\n it.only(`${test.fileName}: ${test.title} (Statement)`, () => {\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n else\r\n it(`${test.fileName}: ${test.title} (Statement)`, () => {\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n }\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.ConcurrentQuery) {\r\n if (test.skip)\r\n it(`${test.fileName}: ${test.title} (ConcurrentQuery) skipped. Reason: ${test.skip}`);\r\n else if (test.only)\r\n it.only(`${test.fileName}: ${test.title} (ConcurrentQuery)`, async () => {\r\n await runConcurrentQueryTest(test, dataset);\r\n });\r\n else\r\n it(`${test.fileName}: ${test.title} (ConcurrentQuery)`, async () => {\r\n await runConcurrentQueryTest(test, dataset);\r\n });\r\n }\r\n }\r\n});\r\n\r\nfunction runECSqlStatementTest(test: ECDbTestProps, dataset: TestDataset) {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n let stmt: ECSqlStatement | undefined;\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n try {\r\n // TODO: statement options should be exposed through the markdown\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n stmt = imodel.prepareStatement(test.sql); // TODO: Wire up logic for tests we expect to fail during prepare\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during prepare of Statement: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n try {\r\n if (test.binders !== undefined) {\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n stmt.bindNull(id);\r\n break;\r\n case \"string\":\r\n stmt.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n stmt.bindInteger(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n stmt.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n stmt.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n stmt.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"datetime\":\r\n stmt.bindDateTime(id, binder.value);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n stmt.bindPoint2d(id, { x: parsedVal2d.X, y: parsedVal2d.Y });\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n stmt.bindPoint3d(id, { x: parsedVal3d.X, y: parsedVal3d.Y, z: parsedVal3d.Z });\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n stmt.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"navigation\":\r\n stmt.bindNavigation(id, JSON.parse(binder.value));\r\n break;\r\n case \"array\":\r\n stmt.bindArray(id, JSON.parse(binder.value));\r\n break;\r\n case \"struct\":\r\n stmt.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n } // if test.binders\r\n\r\n let resultCount = 0;\r\n let stepResult: DbResult;\r\n while ((stepResult = stmt.step()) === DbResult.BE_SQLITE_ROW) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n const colCount = stmt.getColumnCount();\r\n assert.strictEqual(colCount, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colCount}`);\r\n for (let i = 0; i < colCount; i++) {\r\n const colInfo = stmt.getValue(i).columnInfo;\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.getPropertyName(), expectedColInfo.name, `Expected property name ${expectedColInfo.name} but got ${colInfo.getPropertyName()} for column index ${i}`);\r\n //if (expectedColInfo.isDynamicProp !== undefined) TODO: Is this not exposed?\r\n // assert.strictEqual(colInfo..isDynamicProperty, expectedColInfo.isDynamicProp, `Expected dynamic property ${expectedColInfo.isDynamicProp} but got ${colInfo.isDynamicProperty} for column index ${i}`);\r\n // TODO: Extended type name not exposed??\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.isGeneratedProperty(), expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.isGeneratedProperty()} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.getAccessString(), expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.getAccessString()} for column index ${i}`);\r\n if (expectedColInfo.type !== undefined)\r\n assert.strictEqual(ECSqlValueType[colInfo.getType()], expectedColInfo.type, `Expected type ${expectedColInfo.type} but got ${ECSqlValueType[colInfo.getType()]} for column index ${i}`);\r\n if (expectedColInfo.originPropertyName !== undefined)\r\n assert.strictEqual(colInfo.getOriginPropertyName(), expectedColInfo.originPropertyName, `Expected Origin PropertyName ${expectedColInfo.originPropertyName} but got ${colInfo.getOriginPropertyName()} for column index ${i}`);\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n expectedResult = buildBinaryData(expectedResult);\r\n const rowArgs: ECSqlRowArg = { rowFormat: getRowFormat(test.rowFormat), classIdsToClassNames: test.convertClassIdsToClassNames };\r\n const actualResult = stmt.getRow(rowArgs);\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n stmt[Symbol.dispose]();\r\n stmt = undefined;\r\n\r\n if (resultCount === 0 && test.stepStatus) {\r\n const stepResultString = DbResult[stepResult];\r\n assert.strictEqual(stepResultString, test.stepStatus, `Expected step status ${test.stepStatus} but got ${stepResultString}`);\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n } finally {\r\n if (stmt !== undefined)\r\n stmt[Symbol.dispose]();\r\n }\r\n}\r\n\r\nfunction getRowFormat(rowFormat: ECDbTestRowFormat): QueryRowFormat {\r\n switch (rowFormat) {\r\n case ECDbTestRowFormat.ECSqlNames:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n case ECDbTestRowFormat.ECSqlIndexes:\r\n return QueryRowFormat.UseECSqlPropertyIndexes;\r\n case ECDbTestRowFormat.JsNames:\r\n return QueryRowFormat.UseJsPropertyNames;\r\n default:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n }\r\n}\r\n\r\nasync function runConcurrentQueryTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n let reader: ECSqlReader;\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n let params: QueryBinder | undefined;\r\n if (test.binders !== undefined) {\r\n params = new QueryBinder();\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n params.bindNull(id);\r\n break;\r\n case \"string\":\r\n params.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n params.bindInt(id, Number.parseInt(binder.value));\r\n break;\r\n case \"long\":\r\n // eslint-disable-next-line radix\r\n params.bindLong(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n params.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n params.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n params.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n params.bindPoint2d(id, new Point2d(parsedVal2d.X, parsedVal2d.Y));\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n params.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"struct\":\r\n params.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n } // if test.binders\r\n\r\n const queryOptions: QueryOptions = {};\r\n queryOptions.rowFormat = getRowFormat(test.rowFormat);\r\n if (test.abbreviateBlobs)\r\n queryOptions.abbreviateBlobs = true;\r\n if (test.convertClassIdsToClassNames) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n queryOptions.convertClassIdsToClassNames = true;\r\n }\r\n try {\r\n reader = imodel.createQueryReader(test.sql, params, queryOptions); // TODO: Wire up logic for tests we expect to fail during prepare\r\n } catch (error: any) {\r\n assert.fail(`Error during creating QueryReader: ${error.message}`);\r\n }\r\n\r\n let resultCount = 0;\r\n let rows;\r\n try {\r\n rows = await reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during prepare of Concurrent Query: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = await reader.getMetaData();\r\n while (resultCount < rows.length) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n assert.strictEqual(colMetaData.length, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colMetaData.length}`);\r\n for (let i = 0; i < colMetaData.length; i++) {\r\n const colInfo = colMetaData[i];\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.name, expectedColInfo.name, `Expected name ${expectedColInfo.name} but got ${colInfo.name} for column index ${i}`);\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.generated, expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.generated} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.accessString, expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.accessString} for column index ${i}`);\r\n if (expectedColInfo.typeName !== undefined)\r\n assert.strictEqual(colInfo.typeName, expectedColInfo.typeName, `Expected type name ${expectedColInfo.typeName} but got ${colInfo.typeName} for column index ${i}`);\r\n if (expectedColInfo.className !== undefined)\r\n assert.strictEqual(colInfo.className, expectedColInfo.className, `Expected class name ${expectedColInfo.className} but got ${colInfo.className} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendedType, expectedColInfo.extendedType, `Expected extended type ${expectedColInfo.extendedType} but got ${colInfo.extendedType} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendType, expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType, `Expected extend type ${expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType} but got ${colInfo.extendType} for column index ${i}`); // eslint-disable-line @typescript-eslint/no-deprecated\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n // replace props in expected result, TODO: optimize this\r\n expectedResult = buildBinaryData(expectedResult);\r\n\r\n const actualResult = rows[resultCount] // TODO: should we test getValue() as well?\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n\r\n // if (resultCount === 0 && test.stepStatus) {\r\n // const stepResultString = DbResult[stepResult];\r\n // assert.strictEqual(stepResultString, test.stepStatus, `Expected step status ${test.stepStatus} but got ${stepResultString}`);\r\n // }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n}\r\n\r\nfunction checkingExpectedResults(rowFormat: ECDbTestRowFormat, actualResult: any, expectedResult: any, indexesToInclude?: number[]) {\r\n if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {\r\n let i: any = 0;\r\n for (const key of Object.keys(expectedResult)) {\r\n assert.deepEqual(actualResult[indexesToInclude[i]], expectedResult[key], `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);\r\n i++;\r\n }\r\n }\r\n else {\r\n for (const key of Object.keys(expectedResult)) {\r\n assert.deepEqual(actualResult[key], expectedResult[key], `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);\r\n }\r\n }\r\n}\r\nfunction logWarning(message: string) {\r\n // eslint-disable-next-line no-console\r\n console.log(`\\x1b[33m${message}\\x1b[0m`);\r\n}"]}
1
+ {"version":3,"file":"ECSqlTestRunner.test.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestRunner.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 { DbResult } from \"@itwin/core-bentley\";\nimport { ECSqlRowArg, ECSqlStatement, ECSqlSyncReader, SnapshotDb, SynchronousQueryOptions } from \"../../../core-backend\";\nimport { KnownTestLocations } from \"../../KnownTestLocations\";\nimport { ECSqlReader, ECSqlValueType, QueryBinder, QueryOptions, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\nimport { buildBinaryData, ECDbMarkdownTestParser, ECDbTestMode, ECDbTestProps, ECDbTestRowFormat } from \"./ECSqlTestParser\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { ECSqlDatasets } from \"../dataset/ECSqlDatasets\";\nimport { Point2d, Point3d } from \"@itwin/core-geometry\";\n\nenum TestDataset {\n AllProperties = \"AllProperties.bim\"\n}\n\nconst snapshotDbs: { [key in TestDataset]?: SnapshotDb } = {};\n\ndescribe(\"Markdown based ECDb test runner\", async () => {\n before(async () => {\n await ECSqlDatasets.generateFiles();\n const datasetFilePath = path.join(KnownTestLocations.outputDir, \"ECSqlTests\", TestDataset.AllProperties);\n if (!fs.existsSync(datasetFilePath)) {\n throw new Error(`Dataset file ${datasetFilePath} does not exist`);\n }\n snapshotDbs[TestDataset.AllProperties] = SnapshotDb.openFile(datasetFilePath);\n });\n\n after(() => {\n for (const key in snapshotDbs) {\n if (snapshotDbs.hasOwnProperty(key)) {\n (snapshotDbs[key as keyof typeof snapshotDbs])?.close();\n }\n }\n });\n const tests: ECDbTestProps[] = ECDbMarkdownTestParser.parse();\n\n //TODO: Mechanism to run a single test, put something like it.only into the test md which causes this loop to only run those tests\n for (const test of tests) {\n if (!test.dataset) {\n logWarning(`Skipping test ${test.title} because it does not have a dataset`);\n continue;\n }\n\n if (test.dataset.toLowerCase() !== TestDataset.AllProperties.toLowerCase()) {\n logWarning(`Skipping test ${test.title} because dataset ${test.dataset} is not recognized`);\n continue;\n }\n const dataset = TestDataset.AllProperties;\n\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.Statement) {\n if (test.skip)\n it(`${test.fileName}: ${test.title} (Statement) skipped. Reason: ${test.skip}`);\n else if (test.only)\n it.only(`${test.fileName}: ${test.title} (Statement)`, () => {\n runECSqlStatementTest(test, dataset);\n });\n else\n it(`${test.fileName}: ${test.title} (Statement)`, () => {\n runECSqlStatementTest(test, dataset);\n });\n }\n\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.QueryReader) {\n if (test.skip) {\n it(`${test.fileName}: ${test.title} (ECSqlReader) skipped. Reason: ${test.skip}`);\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader) skipped. Reason: ${test.skip}`);\n }\n else if (test.only) {\n it.only(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\n await runECSqlReaderTest(test, dataset);\n });\n it.only(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\n await runECSqlSyncReaderTest(test, dataset);\n });\n }\n else {\n it(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\n await runECSqlReaderTest(test, dataset);\n });\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\n await runECSqlSyncReaderTest(test, dataset);\n });\n }\n }\n }\n});\n\nfunction runECSqlStatementTest(test: ECDbTestProps, dataset: TestDataset) {\n const imodel = snapshotDbs[dataset];\n if (!imodel) {\n assert.fail(`Dataset ${dataset} is not loaded`);\n }\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n let stmt: ECSqlStatement | undefined;\n if (test.sql === undefined) {\n assert.fail(\"Test does not have an ECSql statement\");\n }\n\n try {\n // TODO: statement options should be exposed through the markdown\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n stmt = imodel.prepareStatement(test.sql); // TODO: Wire up logic for tests we expect to fail during prepare\n } catch (error: any) {\n if (test.errorDuringPrepare)\n return;\n else\n assert.fail(`Error during prepare of Statement: ${error.message}`);\n }\n\n if (test.errorDuringPrepare)\n assert.fail(`Statement is expected to fail during prepare`);\n\n try {\n if (test.binders !== undefined) {\n for (const binder of test.binders) {\n // eslint-disable-next-line radix\n let id: number | string = Number.parseInt(binder.indexOrName);\n if (isNaN(id))\n id = binder.indexOrName;\n\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\n case \"null\":\n stmt.bindNull(id);\n break;\n case \"string\":\n stmt.bindString(id, binder.value);\n break;\n case \"int\":\n // eslint-disable-next-line radix\n stmt.bindInteger(id, Number.parseInt(binder.value));\n break;\n case \"double\":\n stmt.bindDouble(id, Number.parseFloat(binder.value));\n break;\n case \"id\":\n stmt.bindId(id, binder.value);\n break;\n case \"idset\":\n const values: string[] = binder.value.slice(1, -1).split(\",\");\n const trimmedValues = values.map((value: string) =>\n value.trim()\n );\n stmt.bindIdSet(id, trimmedValues);\n break;\n case \"datetime\":\n stmt.bindDateTime(id, binder.value);\n break;\n case \"point2d\":\n const parsedVal2d = JSON.parse(binder.value);\n stmt.bindPoint2d(id, { x: parsedVal2d.X, y: parsedVal2d.Y });\n break;\n case \"point3d\":\n const parsedVal3d = JSON.parse(binder.value);\n stmt.bindPoint3d(id, { x: parsedVal3d.X, y: parsedVal3d.Y, z: parsedVal3d.Z });\n break;\n case \"range3d\":\n const parsedRange3d = JSON.parse(binder.value);\n stmt.bindRange3d(id, { low: { x: parsedRange3d.low.x, y: parsedRange3d.low.y, z: parsedRange3d.low.z }, high: { x: parsedRange3d.high.x, y: parsedRange3d.high.y, z: parsedRange3d.high.z } });\n break;\n case \"blob\":\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\n const numbers = arrayValues.map((value: string) =>\n // eslint-disable-next-line radix\n parseInt(value.trim())\n );\n stmt.bindBlob(id, Uint8Array.of(...numbers));\n break;\n case \"navigation\":\n stmt.bindNavigation(id, JSON.parse(binder.value));\n break;\n case \"array\":\n stmt.bindArray(id, JSON.parse(binder.value));\n break;\n case \"struct\":\n stmt.bindStruct(id, JSON.parse(binder.value));\n break;\n default:\n assert.fail(`Unsupported binder type ${binder.type}`);\n } // switch binder.type\n } // for binder\n } // if test.binders\n\n let resultCount = 0;\n let stepResult: DbResult;\n while ((stepResult = stmt.step()) === DbResult.BE_SQLITE_ROW) {\n if (resultCount === 0 && test.columnInfo) {\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\n const colCount = stmt.getColumnCount();\n assert.strictEqual(colCount, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colCount}`);\n for (let i = 0; i < colCount; i++) {\n const colInfo = stmt.getValue(i).columnInfo;\n const expectedColInfo = test.columnInfo[i];\n // cannot directly compare against colInfo because it has methods instead of getters\n assert.strictEqual(colInfo.getPropertyName(), expectedColInfo.name, `Expected property name ${expectedColInfo.name} but got ${colInfo.getPropertyName()} for column index ${i}`);\n //if (expectedColInfo.isDynamicProp !== undefined) TODO: Is this not exposed?\n // assert.strictEqual(colInfo..isDynamicProperty, expectedColInfo.isDynamicProp, `Expected dynamic property ${expectedColInfo.isDynamicProp} but got ${colInfo.isDynamicProperty} for column index ${i}`);\n // TODO: Extended type name not exposed??\n if (expectedColInfo.generated !== undefined)\n assert.strictEqual(colInfo.isGeneratedProperty(), expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.isGeneratedProperty()} for column index ${i}`);\n if (expectedColInfo.accessString !== undefined)\n assert.strictEqual(colInfo.getAccessString(), expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.getAccessString()} for column index ${i}`);\n if (expectedColInfo.type !== undefined)\n assert.strictEqual(ECSqlValueType[colInfo.getType()], expectedColInfo.type, `Expected type ${expectedColInfo.type} but got ${ECSqlValueType[colInfo.getType()]} for column index ${i}`);\n if (expectedColInfo.originPropertyName !== undefined)\n assert.strictEqual(colInfo.getOriginPropertyName(), expectedColInfo.originPropertyName, `Expected Origin PropertyName ${expectedColInfo.originPropertyName} but got ${colInfo.getOriginPropertyName()} for column index ${i}`);\n }\n }\n\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\n let expectedResult = test.expectedResults[resultCount];\n expectedResult = buildBinaryData(expectedResult);\n const rowArgs: ECSqlRowArg = { rowFormat: getRowFormat(test.rowFormat), classIdsToClassNames: test.convertClassIdsToClassNames };\n const actualResult = stmt.getRow(rowArgs);\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\n }\n resultCount++;\n }\n stmt[Symbol.dispose]();\n stmt = undefined;\n\n if (resultCount === 0 && test.stepStatus) {\n const stepResultString = DbResult[stepResult];\n assert.strictEqual(stepResultString, test.stepStatus, `Expected step status ${test.stepStatus} but got ${stepResultString}`);\n }\n\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\n }\n } finally {\n if (stmt !== undefined)\n stmt[Symbol.dispose]();\n }\n}\n\nfunction getRowFormat(rowFormat: ECDbTestRowFormat): QueryRowFormat {\n switch (rowFormat) {\n case ECDbTestRowFormat.ECSqlNames:\n return QueryRowFormat.UseECSqlPropertyNames;\n case ECDbTestRowFormat.ECSqlIndexes:\n return QueryRowFormat.UseECSqlPropertyIndexes;\n case ECDbTestRowFormat.JsNames:\n return QueryRowFormat.UseJsPropertyNames;\n default:\n return QueryRowFormat.UseECSqlPropertyNames;\n }\n}\n\n/** Builds a QueryBinder from the test's binder definitions. Returns undefined when the test has no binders. */\nfunction buildQueryBinder(test: ECDbTestProps): QueryBinder | undefined {\n if (test.binders === undefined)\n return undefined;\n\n const params = new QueryBinder();\n for (const binder of test.binders) {\n // eslint-disable-next-line radix\n let id: number | string = Number.parseInt(binder.indexOrName);\n if (isNaN(id))\n id = binder.indexOrName;\n\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\n case \"null\":\n params.bindNull(id);\n break;\n case \"string\":\n params.bindString(id, binder.value);\n break;\n case \"int\":\n // eslint-disable-next-line radix\n params.bindInt(id, Number.parseInt(binder.value));\n break;\n case \"long\":\n // eslint-disable-next-line radix\n params.bindLong(id, Number.parseInt(binder.value));\n break;\n case \"double\":\n params.bindDouble(id, Number.parseFloat(binder.value));\n break;\n case \"id\":\n params.bindId(id, binder.value);\n break;\n case \"idset\":\n const values: string[] = binder.value.slice(1, -1).split(\",\");\n const trimmedValues = values.map((value: string) =>\n value.trim()\n );\n params.bindIdSet(id, trimmedValues);\n break;\n case \"point2d\":\n const parsedVal2d = JSON.parse(binder.value);\n params.bindPoint2d(id, new Point2d(parsedVal2d.X, parsedVal2d.Y));\n break;\n case \"point3d\":\n const parsedVal3d = JSON.parse(binder.value);\n params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));\n break;\n case \"range3d\":\n const parsedRange3d = JSON.parse(binder.value);\n params.bindRange3d(id, { low: { x: parsedRange3d.low.x, y: parsedRange3d.low.y, z: parsedRange3d.low.z }, high: { x: parsedRange3d.high.x, y: parsedRange3d.high.y, z: parsedRange3d.high.z } });\n break;\n case \"blob\":\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\n const numbers = arrayValues.map((value: string) =>\n // eslint-disable-next-line radix\n parseInt(value.trim())\n );\n params.bindBlob(id, Uint8Array.of(...numbers));\n break;\n case \"struct\":\n params.bindStruct(id, JSON.parse(binder.value));\n break;\n default:\n assert.fail(`Unsupported binder type ${binder.type}`);\n } // switch binder.type\n } // for binder\n return params;\n}\n\n/** Builds the common query options object from the test configuration. */\nfunction buildReaderQueryOptions(test: ECDbTestProps): QueryOptions {\n const queryOptions: QueryOptions = {};\n queryOptions.rowFormat = getRowFormat(test.rowFormat);\n if (test.abbreviateBlobs)\n queryOptions.abbreviateBlobs = true;\n if (test.convertClassIdsToClassNames) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n queryOptions.convertClassIdsToClassNames = true;\n }\n return queryOptions;\n}\n\n/**\n * Shared assertion logic for QueryReader tests that operates on the result rows and column metadata.\n * Used by both ECSqlReader and ECSqlSyncReader test paths.\n */\nfunction runResultAssertions(test: ECDbTestProps, rows: any, colMetaData: QueryPropertyMetaData[]) {\n let resultCount = 0;\n while (resultCount < rows.length) {\n if (resultCount === 0 && test.columnInfo) {\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\n assert.strictEqual(colMetaData.length, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colMetaData.length}`);\n for (let i = 0; i < colMetaData.length; i++) {\n const colInfo = colMetaData[i];\n const expectedColInfo = test.columnInfo[i];\n // cannot directly compare against colInfo because it has methods instead of getters\n assert.strictEqual(colInfo.name, expectedColInfo.name, `Expected name ${expectedColInfo.name} but got ${colInfo.name} for column index ${i}`);\n if (expectedColInfo.generated !== undefined)\n assert.strictEqual(colInfo.generated, expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.generated} for column index ${i}`);\n if (expectedColInfo.accessString !== undefined)\n assert.strictEqual(colInfo.accessString, expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.accessString} for column index ${i}`);\n if (expectedColInfo.typeName !== undefined)\n assert.strictEqual(colInfo.typeName, expectedColInfo.typeName, `Expected type name ${expectedColInfo.typeName} but got ${colInfo.typeName} for column index ${i}`);\n if (expectedColInfo.className !== undefined)\n assert.strictEqual(colInfo.className, expectedColInfo.className, `Expected class name ${expectedColInfo.className} but got ${colInfo.className} for column index ${i}`);\n assert.strictEqual(colInfo.extendedType, expectedColInfo.extendedType, `Expected extended type ${expectedColInfo.extendedType} but got ${colInfo.extendedType} for column index ${i}`);\n assert.strictEqual(colInfo.extendType, expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType, `Expected extend type ${expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType} but got ${colInfo.extendType} for column index ${i}`); // eslint-disable-line @typescript-eslint/no-deprecated\n }\n }\n\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\n let expectedResult = test.expectedResults[resultCount];\n // replace props in expected result, TODO: optimize this\n expectedResult = buildBinaryData(expectedResult);\n\n const actualResult = rows[resultCount]; // TODO: should we test getValue() as well?\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\n }\n resultCount++;\n }\n\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\n }\n}\n\n/**\n * Shared assertion logic that operates on an already-created ECSqlReader.\n * Used by ECSqlReader test paths.\n */\nasync function runAssertionsOnReader(test: ECDbTestProps, reader: ECSqlReader, label: string): Promise<void> {\n let rows;\n try {\n rows = await reader.toArray();\n }\n catch (error: any) {\n if (test.errorDuringPrepare)\n return;\n else\n assert.fail(`Error during execution of ${label}: ${error.message}`);\n }\n\n if (test.errorDuringPrepare)\n assert.fail(`Statement is expected to fail during prepare`);\n\n const colMetaData = await reader.getMetaData();\n runResultAssertions(test, rows, colMetaData);\n}\n\n/**\n * Shared assertion logic that operates on an already-created ECSqlReader.\n * Used by ECSqlSyncReader test paths.\n */\nfunction runAssertionsOnSyncReader(test: ECDbTestProps, reader: ECSqlSyncReader, label: string): void {\n let rows;\n try {\n rows = reader.toArray();\n }\n catch (error: any) {\n if (test.errorDuringPrepare)\n return;\n else\n assert.fail(`Error during execution of ${label}: ${error.message}`);\n }\n\n if (test.errorDuringPrepare)\n assert.fail(`Statement is expected to fail during prepare`);\n\n const colMetaData = reader.getMetaData();\n runResultAssertions(test, rows, colMetaData);\n}\n\nasync function runECSqlReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\n const imodel = snapshotDbs[dataset];\n if (!imodel) {\n assert.fail(`Dataset ${dataset} is not loaded`);\n }\n\n if (test.sql === undefined) {\n assert.fail(\"Test does not have an ECSql statement\");\n }\n\n const params = buildQueryBinder(test);\n const queryOptions = buildReaderQueryOptions(test);\n\n let reader: ECSqlReader;\n try {\n reader = imodel.createQueryReader(test.sql, params, queryOptions);\n } catch (error: any) {\n if (test.errorDuringPrepare)\n return;\n else\n assert.fail(`Error during creating ECSqlReader: ${error.message}`);\n }\n\n await runAssertionsOnReader(test, reader, \"ECSqlReader\");\n}\n\nasync function runECSqlSyncReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\n const imodel = snapshotDbs[dataset];\n if (!imodel) {\n assert.fail(`Dataset ${dataset} is not loaded`);\n }\n\n if (test.sql === undefined) {\n assert.fail(\"Test does not have an ECSql statement\");\n }\n\n const params = buildQueryBinder(test);\n const queryOptions = buildReaderQueryOptions(test);\n\n try {\n imodel.withQueryReader(test.sql, reader => {\n runAssertionsOnSyncReader(test, reader, \"ECSqlSyncReader\");\n }, params, queryOptions as SynchronousQueryOptions);\n } catch (error: any) {\n if (test.errorDuringPrepare)\n return;\n else\n assert.fail(`Error during creating ECSqlSyncReader: ${error.message}`);\n }\n}\n\nfunction checkingExpectedResults(rowFormat: ECDbTestRowFormat, actualResult: any, expectedResult: any, indexesToInclude?: number[]) {\n if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {\n let i: any = 0;\n for (const key of Object.keys(expectedResult)) {\n const expected = typeof expectedResult[key] === \"string\" ? expectedResult[key].trim() : expectedResult[key];\n const actual = typeof actualResult[indexesToInclude[i]] === \"string\" ? actualResult[indexesToInclude[i]].trim() : actualResult[indexesToInclude[i]];\n assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);\n i++;\n }\n }\n else {\n for (const key of Object.keys(expectedResult)) {\n const expected = typeof expectedResult[key] === \"string\" ? expectedResult[key].trim() : expectedResult[key];\n const actual = typeof actualResult[key] === \"string\" ? actualResult[key].trim() : actualResult[key];\n assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);\n }\n }\n}\nfunction logWarning(message: string) {\n // eslint-disable-next-line no-console\n console.log(`\\x1b[33m${message}\\x1b[0m`);\n}"]}