@itwin/core-backend 5.8.0-dev.8 → 5.9.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/CHANGELOG.md +11 -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.js.map +1 -1
  26. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  27. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  28. package/lib/cjs/ECSqlStatement.js.map +1 -1
  29. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  30. package/lib/cjs/Element.js.map +1 -1
  31. package/lib/cjs/ElementAspect.js.map +1 -1
  32. package/lib/cjs/ElementGraphics.js.map +1 -1
  33. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  34. package/lib/cjs/Entity.js.map +1 -1
  35. package/lib/cjs/EntityReferences.js.map +1 -1
  36. package/lib/cjs/ExportGraphics.js.map +1 -1
  37. package/lib/cjs/ExternalSource.js.map +1 -1
  38. package/lib/cjs/FontFile.js.map +1 -1
  39. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  40. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  41. package/lib/cjs/GeometrySummary.js +47 -47
  42. package/lib/cjs/GeometrySummary.js.map +1 -1
  43. package/lib/cjs/IModelDb.d.ts +5 -0
  44. package/lib/cjs/IModelDb.d.ts.map +1 -1
  45. package/lib/cjs/IModelDb.js +20 -11
  46. package/lib/cjs/IModelDb.js.map +1 -1
  47. package/lib/cjs/IModelDbFonts.js.map +1 -1
  48. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  49. package/lib/cjs/IModelHost.js.map +1 -1
  50. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  51. package/lib/cjs/IModelJsFs.js.map +1 -1
  52. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  53. package/lib/cjs/IpcHost.d.ts.map +1 -1
  54. package/lib/cjs/IpcHost.js +28 -4
  55. package/lib/cjs/IpcHost.js.map +1 -1
  56. package/lib/cjs/LineStyle.d.ts +6 -0
  57. package/lib/cjs/LineStyle.d.ts.map +1 -1
  58. package/lib/cjs/LineStyle.js +41 -32
  59. package/lib/cjs/LineStyle.js.map +1 -1
  60. package/lib/cjs/LocalHub.d.ts +17 -10
  61. package/lib/cjs/LocalHub.d.ts.map +1 -1
  62. package/lib/cjs/LocalHub.js +127 -29
  63. package/lib/cjs/LocalHub.js.map +1 -1
  64. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  65. package/lib/cjs/LockControl.js.map +1 -1
  66. package/lib/cjs/Material.js.map +1 -1
  67. package/lib/cjs/Model.js.map +1 -1
  68. package/lib/cjs/NativeAppStorage.js.map +1 -1
  69. package/lib/cjs/NativeHost.js.map +1 -1
  70. package/lib/cjs/NavigationRelationship.js.map +1 -1
  71. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  72. package/lib/cjs/PropertyStore.js.map +1 -1
  73. package/lib/cjs/Relationship.js.map +1 -1
  74. package/lib/cjs/RpcBackend.js.map +1 -1
  75. package/lib/cjs/SQLiteDb.js.map +1 -1
  76. package/lib/cjs/Schema.js.map +1 -1
  77. package/lib/cjs/SchemaSync.js.map +1 -1
  78. package/lib/cjs/SchemaUtils.js.map +1 -1
  79. package/lib/cjs/SheetIndex.js.map +1 -1
  80. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  81. package/lib/cjs/SqliteStatement.js.map +1 -1
  82. package/lib/cjs/StashManager.js.map +1 -1
  83. package/lib/cjs/Texture.js.map +1 -1
  84. package/lib/cjs/TileStorage.js.map +1 -1
  85. package/lib/cjs/TxnManager.js.map +1 -1
  86. package/lib/cjs/ViewDefinition.js.map +1 -1
  87. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  88. package/lib/cjs/ViewStore.js.map +1 -1
  89. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  90. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  91. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  92. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  93. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  94. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  95. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  96. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  97. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  98. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  99. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  100. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  101. package/lib/cjs/core-backend.d.ts +2 -0
  102. package/lib/cjs/core-backend.d.ts.map +1 -1
  103. package/lib/cjs/core-backend.js +2 -0
  104. package/lib/cjs/core-backend.js.map +1 -1
  105. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  106. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  107. package/lib/cjs/domains/GenericElements.js.map +1 -1
  108. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  109. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  110. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  111. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  112. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  113. package/lib/cjs/internal/HubMock.js.map +1 -1
  114. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  115. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  116. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  117. package/lib/cjs/internal/NoLocks.js.map +1 -1
  118. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  119. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  120. package/lib/cjs/internal/Symbols.js.map +1 -1
  121. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  122. package/lib/cjs/internal/cross-package.js.map +1 -1
  123. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
  124. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  125. package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
  126. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
  127. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  128. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  129. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
  130. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
  131. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
  132. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  133. package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
  134. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  135. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  136. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  137. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  138. package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
  139. package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
  140. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
  141. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  142. package/lib/cjs/internal/workspace/WorkspaceImpl.js +57 -14
  143. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  144. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  145. package/lib/cjs/rpc/multipart.js.map +1 -1
  146. package/lib/cjs/rpc/tracing.js.map +1 -1
  147. package/lib/cjs/rpc/web/logging.js.map +1 -1
  148. package/lib/cjs/rpc/web/request.js.map +1 -1
  149. package/lib/cjs/rpc/web/response.js.map +1 -1
  150. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  151. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  152. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  153. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  154. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  155. package/lib/cjs/workspace/Settings.d.ts +8 -0
  156. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  157. package/lib/cjs/workspace/Settings.js.map +1 -1
  158. package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
  159. package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
  160. package/lib/cjs/workspace/SettingsDb.js +19 -0
  161. package/lib/cjs/workspace/SettingsDb.js.map +1 -0
  162. package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
  163. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
  164. package/lib/cjs/workspace/SettingsEditor.js +53 -0
  165. package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
  166. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  167. package/lib/cjs/workspace/Workspace.d.ts +42 -19
  168. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  169. package/lib/cjs/workspace/Workspace.js.map +1 -1
  170. package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
  171. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  172. package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
  173. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  174. package/lib/esm/BackendHubAccess.js.map +1 -1
  175. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  176. package/lib/esm/BisCoreSchema.js.map +1 -1
  177. package/lib/esm/BlobContainerService.js.map +1 -1
  178. package/lib/esm/BriefcaseManager.js.map +1 -1
  179. package/lib/esm/CatalogDb.js.map +1 -1
  180. package/lib/esm/Category.js.map +1 -1
  181. package/lib/esm/ChangeSummaryManager.js +2 -2
  182. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  183. package/lib/esm/ChangedElementsDb.js.map +1 -1
  184. package/lib/esm/ChangesetECAdaptor.js +248 -248
  185. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  186. package/lib/esm/ChannelControl.js.map +1 -1
  187. package/lib/esm/CheckpointManager.js.map +1 -1
  188. package/lib/esm/ClassRegistry.js +5 -5
  189. package/lib/esm/ClassRegistry.js.map +1 -1
  190. package/lib/esm/CloudSqlite.js.map +1 -1
  191. package/lib/esm/CodeService.js.map +1 -1
  192. package/lib/esm/CodeSpecs.js.map +1 -1
  193. package/lib/esm/ConcurrentQuery.js.map +1 -1
  194. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  195. package/lib/esm/DevTools.js.map +1 -1
  196. package/lib/esm/DisplayStyle.js.map +1 -1
  197. package/lib/esm/ECDb.js.map +1 -1
  198. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  199. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  200. package/lib/esm/ECSqlStatement.js.map +1 -1
  201. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  202. package/lib/esm/Element.js.map +1 -1
  203. package/lib/esm/ElementAspect.js.map +1 -1
  204. package/lib/esm/ElementGraphics.js.map +1 -1
  205. package/lib/esm/ElementTreeWalker.js.map +1 -1
  206. package/lib/esm/Entity.js.map +1 -1
  207. package/lib/esm/EntityReferences.js.map +1 -1
  208. package/lib/esm/ExportGraphics.js.map +1 -1
  209. package/lib/esm/ExternalSource.js.map +1 -1
  210. package/lib/esm/FontFile.js.map +1 -1
  211. package/lib/esm/GeoCoordConfig.js.map +1 -1
  212. package/lib/esm/GeographicCRSServices.js.map +1 -1
  213. package/lib/esm/GeometrySummary.js +47 -47
  214. package/lib/esm/GeometrySummary.js.map +1 -1
  215. package/lib/esm/IModelDb.d.ts +5 -0
  216. package/lib/esm/IModelDb.d.ts.map +1 -1
  217. package/lib/esm/IModelDb.js +20 -11
  218. package/lib/esm/IModelDb.js.map +1 -1
  219. package/lib/esm/IModelDbFonts.js.map +1 -1
  220. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  221. package/lib/esm/IModelHost.js.map +1 -1
  222. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  223. package/lib/esm/IModelJsFs.js.map +1 -1
  224. package/lib/esm/ImageSourceConversion.js.map +1 -1
  225. package/lib/esm/IpcHost.d.ts.map +1 -1
  226. package/lib/esm/IpcHost.js +28 -4
  227. package/lib/esm/IpcHost.js.map +1 -1
  228. package/lib/esm/LineStyle.d.ts +6 -0
  229. package/lib/esm/LineStyle.d.ts.map +1 -1
  230. package/lib/esm/LineStyle.js +41 -32
  231. package/lib/esm/LineStyle.js.map +1 -1
  232. package/lib/esm/LocalHub.d.ts +17 -10
  233. package/lib/esm/LocalHub.d.ts.map +1 -1
  234. package/lib/esm/LocalHub.js +128 -30
  235. package/lib/esm/LocalHub.js.map +1 -1
  236. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  237. package/lib/esm/LockControl.js.map +1 -1
  238. package/lib/esm/Material.js.map +1 -1
  239. package/lib/esm/Model.js.map +1 -1
  240. package/lib/esm/NativeAppStorage.js.map +1 -1
  241. package/lib/esm/NativeHost.js.map +1 -1
  242. package/lib/esm/NavigationRelationship.js.map +1 -1
  243. package/lib/esm/PromiseMemoizer.js.map +1 -1
  244. package/lib/esm/PropertyStore.js.map +1 -1
  245. package/lib/esm/Relationship.js.map +1 -1
  246. package/lib/esm/RpcBackend.js.map +1 -1
  247. package/lib/esm/SQLiteDb.js.map +1 -1
  248. package/lib/esm/Schema.js.map +1 -1
  249. package/lib/esm/SchemaSync.js.map +1 -1
  250. package/lib/esm/SchemaUtils.js.map +1 -1
  251. package/lib/esm/SheetIndex.js.map +1 -1
  252. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  253. package/lib/esm/SqliteStatement.js.map +1 -1
  254. package/lib/esm/StashManager.js.map +1 -1
  255. package/lib/esm/Texture.js.map +1 -1
  256. package/lib/esm/TileStorage.js.map +1 -1
  257. package/lib/esm/TxnManager.js.map +1 -1
  258. package/lib/esm/ViewDefinition.js.map +1 -1
  259. package/lib/esm/ViewStateHydrator.js.map +1 -1
  260. package/lib/esm/ViewStore.js.map +1 -1
  261. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  262. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  263. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  264. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  265. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  266. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  267. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  268. package/lib/esm/core-backend.d.ts +2 -0
  269. package/lib/esm/core-backend.d.ts.map +1 -1
  270. package/lib/esm/core-backend.js +2 -0
  271. package/lib/esm/core-backend.js.map +1 -1
  272. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  273. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  274. package/lib/esm/domains/GenericElements.js.map +1 -1
  275. package/lib/esm/domains/GenericSchema.js.map +1 -1
  276. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  277. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  278. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  279. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  280. package/lib/esm/internal/HubMock.js.map +1 -1
  281. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  282. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  283. package/lib/esm/internal/NativePlatform.js.map +1 -1
  284. package/lib/esm/internal/NoLocks.js.map +1 -1
  285. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  286. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  287. package/lib/esm/internal/Symbols.js.map +1 -1
  288. package/lib/esm/internal/annotations/fields.js.map +1 -1
  289. package/lib/esm/internal/cross-package.js.map +1 -1
  290. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
  291. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  292. package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
  293. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
  294. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  295. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  296. package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
  297. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
  298. package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
  299. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  300. package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
  301. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  302. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  303. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  304. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  305. package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
  306. package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
  307. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
  308. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  309. package/lib/esm/internal/workspace/WorkspaceImpl.js +57 -15
  310. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  311. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  312. package/lib/esm/rpc/multipart.js.map +1 -1
  313. package/lib/esm/rpc/tracing.js.map +1 -1
  314. package/lib/esm/rpc/web/logging.js.map +1 -1
  315. package/lib/esm/rpc/web/request.js.map +1 -1
  316. package/lib/esm/rpc/web/response.js.map +1 -1
  317. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  318. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  319. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  320. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  321. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  322. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  323. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  324. package/lib/esm/test/AttachDb.test.js +11 -11
  325. package/lib/esm/test/AttachDb.test.js.map +1 -1
  326. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  327. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  328. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  329. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  330. package/lib/esm/test/IModelHost.test.js.map +1 -1
  331. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  332. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  333. package/lib/esm/test/IpcHost.test.js +64 -13
  334. package/lib/esm/test/IpcHost.test.js.map +1 -1
  335. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  336. package/lib/esm/test/PrintElementTree.js.map +1 -1
  337. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  338. package/lib/esm/test/RevisionUtility.js.map +1 -1
  339. package/lib/esm/test/SchemaUtils.test.js +25 -25
  340. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  341. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  342. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  343. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  344. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  345. package/lib/esm/test/TestUtils.js.map +1 -1
  346. package/lib/esm/test/annotations/Fields.test.js +53 -53
  347. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  348. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  349. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  350. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  351. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  352. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  353. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  354. package/lib/esm/test/categories/Category.test.js.map +1 -1
  355. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  356. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  357. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  358. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  359. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  360. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  361. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  362. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  363. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  364. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  365. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  366. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  367. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  368. package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
  369. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  370. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  371. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  372. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  373. package/lib/esm/test/ecdb/QueryReaders.test.js +62 -27
  374. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  375. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  376. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
  377. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +4 -1
  378. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  379. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  380. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  381. package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts.map +1 -1
  382. package/lib/esm/test/ecsql/src/ECSqlTestParser.js +4 -0
  383. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  384. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +14 -2
  385. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  386. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  387. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  388. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  389. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  390. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  391. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  392. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  393. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  394. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  395. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  396. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  397. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  398. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  399. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  400. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  401. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  402. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  403. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  404. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  405. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  406. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  407. package/lib/esm/test/hubaccess/SemanticRebase.test.js +145 -145
  408. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  409. package/lib/esm/test/imageData.js.map +1 -1
  410. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  411. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  412. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  413. package/lib/esm/test/imodel/IModel.test.js +44 -44
  414. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  415. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  416. package/lib/esm/test/imodel/SchemaXmlImport.test.js +13 -13
  417. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  418. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  419. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  420. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  421. package/lib/esm/test/index.js.map +1 -1
  422. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  423. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  424. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  425. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  426. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  427. package/lib/esm/test/rpc/response.test.js.map +1 -1
  428. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  429. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  430. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  431. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  432. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  433. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  434. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  435. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  436. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  437. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  438. package/lib/esm/test/standalone/ChangesetReader.test.js +135 -135
  439. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  440. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  441. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  442. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  443. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  444. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  445. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  446. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  447. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  448. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  449. package/lib/esm/test/standalone/HubMock.test.js +177 -7
  450. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  451. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  452. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  453. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  454. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  455. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  456. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  457. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  458. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  459. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  460. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  461. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  462. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  463. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  464. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  465. package/lib/esm/test/standalone/Settings.test.js +18 -0
  466. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  467. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  468. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  469. package/lib/esm/test/standalone/StandaloneDb.test.js +51 -1
  470. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  471. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  472. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  473. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  474. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  475. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  476. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  477. package/lib/esm/test/standalone/Workspace.test.js +160 -0
  478. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  479. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  480. package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
  481. package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
  482. package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
  483. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
  484. package/lib/esm/workspace/Settings.d.ts +8 -0
  485. package/lib/esm/workspace/Settings.d.ts.map +1 -1
  486. package/lib/esm/workspace/Settings.js.map +1 -1
  487. package/lib/esm/workspace/SettingsDb.d.ts +109 -0
  488. package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
  489. package/lib/esm/workspace/SettingsDb.js +16 -0
  490. package/lib/esm/workspace/SettingsDb.js.map +1 -0
  491. package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
  492. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
  493. package/lib/esm/workspace/SettingsEditor.js +50 -0
  494. package/lib/esm/workspace/SettingsEditor.js.map +1 -0
  495. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  496. package/lib/esm/workspace/Workspace.d.ts +42 -19
  497. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  498. package/lib/esm/workspace/Workspace.js.map +1 -1
  499. package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
  500. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  501. package/lib/esm/workspace/WorkspaceEditor.js +19 -0
  502. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  503. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlTestParser.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestParser.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 * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { marked, Tokens } from \"marked\";\r\n\r\nexport interface ECDbTestProps {\r\n fileName: string;\r\n title: string;\r\n\r\n // Things from properties:\r\n only?: boolean; // This flag handles the only property to filter tests\r\n skip?: string; // This flag handles the skip property to filter tests\r\n dataset?: string;\r\n mode: ECDbTestMode;\r\n rowFormat: ECDbTestRowFormat;\r\n abbreviateBlobs: boolean;\r\n convertClassIdsToClassNames: boolean;\r\n errorDuringPrepare?: boolean;\r\n indexesToIncludeInResults?: number[]; // We now have the feature to check only certain columns of expected results\r\n // but if the rowFormat is ECSqlIndexes then there is no way to uniquely identify the columns, in that case this flag is used to include certain property indexes\r\n // for checking and ignore the rest, if this flag is not given while the rowFormat is ECSqlIndexes then the expected Results column\r\n // will assume an incremental 0 based indexing by default. This flag serves as a mapping for the actual results while checking with the expected results.\r\n\r\n // TODO: implement, it's currently being parsed but not used\r\n stepStatus?: string;\r\n\r\n // Things from code blocks or tables\r\n sql?: string;\r\n expectedResults?: { [key: string]: any }[] | any[];\r\n columnInfo?: ColumnInfoProps[];\r\n\r\n // Things from lists\r\n binders?: ECDbTestBinderProps[];\r\n}\r\n\r\nexport interface ECDbTestBinderProps {\r\n indexOrName: string;\r\n type: string;\r\n value: string;\r\n}\r\n\r\nexport interface ColumnInfoProps {\r\n name: string;\r\n className?: string;\r\n accessString?: string;\r\n generated?: boolean;\r\n index?: number;\r\n jsonName?: string;\r\n // expected extendedType value should be given when we know that the actual column info extendedType will be a valid non empty string for test to pass.\r\n // This extendedType value is internally used to check both extendType and extendedType values of column metadata.\r\n extendedType?: string;\r\n type?: string; // type is used on ECSqlStatement because it can differ from TypeName\r\n typeName?: string; // typeName is used on ConcurrentQuery\r\n originPropertyName?: string; // only supported for ECSqlStatement\r\n}\r\n\r\nexport const columnInfoPropsKeys: Set<keyof ColumnInfoProps> = new Set([\r\n \"name\",\r\n \"className\",\r\n \"accessString\",\r\n \"generated\",\r\n \"index\",\r\n \"jsonName\",\r\n \"extendedType\",\r\n \"type\",\r\n \"typeName\",\r\n \"originPropertyName\",\r\n]);\r\n\r\n/* interface QueryPropertyMetaData\r\n className: string;\r\n accessString?: string;\r\n generated: boolean;\r\n index: number;\r\n jsonName: string;\r\n name: string;\r\n extendType: string;\r\n typeName: string;\r\n*/\r\n\r\nfunction isColumnInfoProps(obj: any): obj is ColumnInfoProps {\r\n const numberOfKeys = typeof obj === \"object\" ? Object.keys(obj).length : 0;\r\n const isValid = typeof obj === \"object\" &&\r\n typeof obj.name === \"string\" &&\r\n (obj.className === undefined || typeof obj.className === \"string\") &&\r\n (obj.accessString === undefined || typeof obj.accessString === \"string\") &&\r\n (obj.generated === undefined || typeof obj.generated === \"boolean\") &&\r\n (obj.index === undefined || typeof obj.index === \"number\") &&\r\n (obj.jsonName === undefined || typeof obj.jsonName === \"string\") &&\r\n (obj.extendedType === undefined || typeof obj.extendedType === \"string\") &&\r\n (obj.type === undefined || typeof obj.type === \"string\") &&\r\n (obj.typeName === undefined || typeof obj.typeName === \"string\");\r\n\r\n if (!isValid) {\r\n const errors: string[] = [];\r\n if (typeof obj !== \"object\") errors.push(\"Object is not of type 'object'\");\r\n if (numberOfKeys < 1 || numberOfKeys > 7) errors.push(\"Number of keys is not between 1 and 7\");\r\n if (typeof obj.name !== \"string\") errors.push(\"Property 'name' is not of type 'string'\");\r\n if (obj.className !== undefined && typeof obj.className !== \"string\") errors.push(\"Property 'className' is not of type 'string'\");\r\n if (obj.accessString !== undefined && typeof obj.accessString !== \"string\") errors.push(\"Property 'accessString' is not of type 'string'\");\r\n if (obj.generated !== undefined && typeof obj.generated !== \"boolean\") errors.push(\"Property 'generated' is not of type 'boolean'\");\r\n if (obj.index !== undefined && typeof obj.index !== \"number\") errors.push(\"Property 'index' is not of type 'number'\");\r\n if (obj.jsonName !== undefined && typeof obj.jsonName !== \"string\") errors.push(\"Property 'jsonName' is not of type 'string'\");\r\n if (obj.extendedType !== undefined && typeof obj.extendedType !== \"string\") errors.push(\"Property 'extendedType' is not of type 'string'\");\r\n if (obj.type !== undefined && typeof obj.type !== \"string\") errors.push(\"Property 'type' is not of type 'string'\");\r\n if (obj.typeName !== undefined && typeof obj.typeName !== \"string\") errors.push(\"Property 'typeName' is not of type 'string'\");\r\n logWarning(`Validation failed for ColumnInfoProps. Object: ${JSON.stringify(obj)}. Errors: ${errors.join(\", \")}`);\r\n }\r\n\r\n return isValid;\r\n}\r\n\r\nexport enum ECDbTestMode {\r\n Both = \"Both\",\r\n Statement = \"Statement\",\r\n QueryReader = \"QueryReader\",\r\n};\r\n\r\nexport enum ECDbTestRowFormat {\r\n ECSqlNames = \"ECSqlNames\",\r\n ECSqlIndexes = \"ECSqlIndexes\",\r\n JsNames = \"JsNames\",\r\n}\r\n\r\nfunction tableTextToValue(text: string): any {\r\n if (text.startsWith(\"\\\"\") && text.endsWith(\"\\\"\"))\r\n return text.slice(1, text.length - 1);\r\n if (text === \"null\")\r\n return null;\r\n if (text === \"undefined\")\r\n return undefined;\r\n if (text.startsWith(\"{\") || text.startsWith(\"[\"))\r\n return JSON.parse(text);\r\n if (text === \"true\" || text === \"false\")\r\n return text === \"true\";\r\n if (text.startsWith(\"0x\"))\r\n return text; // we use this for IDs and they are handled as strings, the parseInt below would attempt to convert them to numbers\r\n if (/^-?\\d+(\\.\\d+)?$/.test(text)) {\r\n const flt = parseFloat(text);\r\n if (!Number.isNaN(flt))\r\n return flt;\r\n }\r\n\r\n if (/^-?\\d+$/.test(text)) {\r\n // eslint-disable-next-line radix\r\n const asInt = parseInt(text);\r\n if (!Number.isNaN(asInt))\r\n return asInt;\r\n }\r\n\r\n return text;\r\n}\r\n\r\nexport function buildBinaryData(obj: any): any { //TODO: we should do this during table parsing\r\n for (const key in obj) {\r\n if (typeof obj[key] === \"string\" && obj[key].startsWith(\"BIN(\") && obj[key].endsWith(\")\"))\r\n obj[key] = understandAndReplaceBinaryData(obj[key])\r\n else if (typeof obj[key] === \"object\" || Array.isArray(obj[key]))\r\n obj[key] = buildBinaryData(obj[key])\r\n }\r\n return obj;\r\n}\r\n\r\nfunction understandAndReplaceBinaryData(str: string): any {\r\n const startInd = str.indexOf(\"(\") + 1;\r\n const endInd = str.indexOf(\")\");\r\n str = str.slice(startInd, endInd);\r\n const ans: number[] = []\r\n const numbers: string[] = str.split(\",\");\r\n numbers.forEach((value: string) => {\r\n value = value.trim();\r\n // eslint-disable-next-line radix\r\n ans.push(parseInt(value));\r\n }\r\n );\r\n return Uint8Array.of(...ans);\r\n}\r\n\r\n\r\nexport class ECDbMarkdownTestParser {\r\n public static parse(): ECDbTestProps[] {\r\n const testAssetsDir = path.join(__dirname, \"..\", \"queries\");\r\n const testFiles = fs.readdirSync(testAssetsDir, \"utf-8\").filter((fileName) => fileName.toLowerCase().endsWith(\"ecsql.md\"));\r\n const out: ECDbTestProps[] = [];\r\n\r\n for (const fileName of testFiles) {\r\n try {\r\n const tests = this.parseFile(testAssetsDir, fileName);\r\n out.push(...tests);\r\n } catch (error) {\r\n logWarning(`Failed to parse file ${fileName}. Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n private static parseFile(testAssetsDir: string, fileName: string): ECDbTestProps[] {\r\n const markdownFilePath = path.join(testAssetsDir, fileName);\r\n const baseFileName = fileName.replace(/\\.ecdbtest\\.md$/i, \"\");\r\n const markdownContent = fs.readFileSync(markdownFilePath, \"utf-8\");\r\n const tokens = marked.lexer(markdownContent);\r\n\r\n const out: ECDbTestProps[] = [];\r\n let currentTest: ECDbTestProps | undefined;\r\n\r\n for (const token of tokens) {\r\n switch (token.type) {\r\n case \"space\":\r\n case \"html\":\r\n case \"paragraph\":\r\n case \"hr\":\r\n continue;\r\n case \"heading\":\r\n if (currentTest !== undefined) {\r\n out.push(currentTest);\r\n }\r\n currentTest = {\r\n title: token.text, mode: ECDbTestMode.Both, fileName: baseFileName,\r\n rowFormat: ECDbTestRowFormat.ECSqlNames, abbreviateBlobs: false, convertClassIdsToClassNames: false\r\n };\r\n break;\r\n case \"list\":\r\n this.handleListToken(token as Tokens.List, currentTest, markdownFilePath);\r\n break;\r\n case \"code\":\r\n this.handleCodeToken(token as Tokens.Code, currentTest, markdownFilePath);\r\n break;\r\n case \"table\":\r\n this.handleTableToken(token as Tokens.Table, currentTest, markdownFilePath);\r\n break;\r\n default:\r\n logWarning(`Unknown token type ${token.type} found in file ${markdownFilePath}. Skipping.`);\r\n break;\r\n }\r\n }\r\n\r\n if (currentTest !== undefined) {\r\n out.push(currentTest);\r\n }\r\n return out;\r\n }\r\n\r\n\r\n private static handleListToken(token: Tokens.List, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`List token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n const variableRegex = /^(\\w+):\\s*(.+)$/;\r\n const bindRegex = /^bind(\\w+)\\s([^,\\s]+),\\s?(.+)$/;\r\n for (const item of token.items) {\r\n const match = item.text.match(variableRegex);\r\n if (match) {\r\n const key = match[1];\r\n const value = match[2];\r\n switch (key.toLowerCase()) {\r\n case \"dataset\":\r\n currentTest.dataset = value;\r\n continue;\r\n case \"errorduringprepare\":\r\n currentTest.errorDuringPrepare = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"stepstatus\":\r\n currentTest.stepStatus = value;\r\n continue;\r\n case \"only\":\r\n currentTest.only = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"skip\":\r\n currentTest.skip = value;\r\n continue;\r\n case \"mode\":\r\n this.handleMode(value, currentTest, markdownFilePath);\r\n continue;\r\n case \"rowformat\":\r\n this.handleRowFormat(value, currentTest, markdownFilePath);\r\n continue;\r\n case \"abbreviateblobs\":\r\n currentTest.abbreviateBlobs = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"convertclassidstoclassnames\":\r\n currentTest.convertClassIdsToClassNames = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"indexestoinclude\":\r\n currentTest.indexesToIncludeInResults = this.handleValidIndexList(value);\r\n continue;\r\n }\r\n }\r\n const bindMatch = item.text.match(bindRegex);\r\n if (bindMatch) {\r\n currentTest.binders = currentTest.binders || [];\r\n currentTest.binders.push({ indexOrName: bindMatch[2], type: bindMatch[1], value: bindMatch[3] });\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n private static handleMode(value: string, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n switch (value.toLowerCase()) {\r\n case \"statement\":\r\n currentTest.mode = ECDbTestMode.Statement;\r\n break;\r\n case \"queryreader\":\r\n currentTest.mode = ECDbTestMode.QueryReader;\r\n break;\r\n case \"both\":\r\n currentTest.mode = ECDbTestMode.Both;\r\n break;\r\n default:\r\n logWarning(`Mode value (${value}) is not recognized in file ${markdownFilePath} and test ${currentTest.title}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleRowFormat(value: string, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n switch (value.toLowerCase()) {\r\n case \"ecsqlnames\":\r\n currentTest.rowFormat = ECDbTestRowFormat.ECSqlNames;\r\n break;\r\n case \"ecsqlindexes\":\r\n currentTest.rowFormat = ECDbTestRowFormat.ECSqlIndexes;\r\n break;\r\n case \"jsnames\":\r\n currentTest.rowFormat = ECDbTestRowFormat.JsNames;\r\n break;\r\n default:\r\n logWarning(`Row Format value (${value}) is not recognized in file ${markdownFilePath} and test ${currentTest.title}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleValidIndexList(obj: string): number[] | undefined {\r\n try {\r\n const numsArr = JSON.parse(obj);\r\n if (Array.isArray(numsArr) && numsArr.every((val: any) => typeof val === \"number\"))\r\n return numsArr;\r\n logWarning(\"The given value is not valid for the property indexestoinclude\");\r\n return undefined;\r\n }\r\n catch {\r\n logWarning(\"The given value is not valid for the property indexestoinclude\");\r\n return undefined;\r\n }\r\n }\r\n\r\n private static handleCodeToken(token: Tokens.Code, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`Code token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n if (token.lang === \"sql\") {\r\n currentTest.sql = token.text;\r\n } else if (token.lang === \"json\") {\r\n let json: any;\r\n try {\r\n json = JSON.parse(token.text);\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n logWarning(`Failed to parse JSON ${token.text} in file ${markdownFilePath}. ${error.message} Skipping.`);\r\n } else {\r\n logWarning(`Failed to parse SON ${token.text} in file ${markdownFilePath}. Unknown error. Skipping.`);\r\n }\r\n }\r\n\r\n if (typeof json === \"object\" && Array.isArray(json.columns)) {\r\n this.handleJSONColumnMetadata(json, currentTest, markdownFilePath);\r\n return;\r\n }\r\n\r\n this.handleJSONExpectedResults(json, currentTest); // TODO: validate the expected results\r\n } else {\r\n logWarning(`Unknown code language ${token.lang} found in file ${markdownFilePath}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleJSONColumnMetadata(json: any, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n const extraProps: Set<string> = new Set();\r\n\r\n if (json.columns.every(isColumnInfoProps)) {\r\n currentTest.columnInfo = json.columns;\r\n for (const column of json.columns) {\r\n for (const key in column) {\r\n if (!columnInfoPropsKeys.has(key as keyof ColumnInfoProps)) {\r\n extraProps.add(key);\r\n }\r\n }\r\n }\r\n\r\n if (extraProps.size > 0) {\r\n logWarning(`Found extra properties in column infos: ${Array.from(extraProps).join(\", \")} in file '${markdownFilePath}' test '${currentTest.title}'.`);\r\n }\r\n } else {\r\n logWarning(`Columns format in file '${markdownFilePath}' test '${currentTest.title}' failed type guard. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleJSONExpectedResults(json: any, currentTest: ECDbTestProps) {\r\n currentTest.expectedResults = json\r\n }\r\n\r\n private static handleTableToken(token: Tokens.Table, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`Table token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n this.handleTable(token, currentTest, markdownFilePath);\r\n }\r\n\r\n private static handleTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (token.header.length > 0 && currentTest.columnInfo === undefined && columnInfoPropsKeys.has(token.header[0].text as keyof ColumnInfoProps)) {\r\n this.handleColumnTable(token, currentTest, markdownFilePath);\r\n return;\r\n }\r\n else if (token.header.length > 0 && token.header[0].text === \"\") {\r\n this.handleExpectedResultsTableForECSqlPropertyIndexesOption(token, currentTest, markdownFilePath);\r\n } else {\r\n this.handleExpectedResultsTable(token, currentTest, markdownFilePath);\r\n }\r\n }\r\n\r\n private static handleColumnTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n const columnInfos: any[] = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n const columnInfo: { [key: string]: any } = {};\r\n for (let i = 0; i < token.header.length; i++) {\r\n const header = token.header[i].text;\r\n const cell = row[i].text;\r\n columnInfo[header] = tableTextToValue(cell);\r\n }\r\n columnInfos.push(columnInfo);\r\n }\r\n\r\n this.handleJSONColumnMetadata({ columns: columnInfos }, currentTest, markdownFilePath);\r\n }\r\n\r\n private static handleExpectedResultsTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (currentTest.expectedResults !== undefined) {\r\n logWarning(`Expected results already set for test ${currentTest.title} in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n currentTest.expectedResults = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n\r\n const expectedResult: { [key: string]: any } = {};\r\n for (let i = 0; i < token.header.length; i++) {\r\n const header = token.header[i].text;\r\n const cell = row[i].text;\r\n const value = tableTextToValue(cell);\r\n if (value !== undefined)\r\n expectedResult[header] = value;\r\n }\r\n currentTest.expectedResults.push(expectedResult);\r\n }\r\n }\r\n\r\n private static handleExpectedResultsTableForECSqlPropertyIndexesOption(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (currentTest.expectedResults !== undefined) {\r\n logWarning(`Expected results already set for test ${currentTest.title} in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n currentTest.expectedResults = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n\r\n const expectedResult: any[] = [];\r\n for (let i = 0; i < token.header.length; i++) {\r\n const cell = row[i].text;\r\n const value = tableTextToValue(cell);\r\n if (value !== undefined)\r\n expectedResult.push(value);\r\n }\r\n currentTest.expectedResults.push(expectedResult);\r\n }\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":"ECSqlTestParser.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestParser.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 * as path from \"path\";\nimport * as fs from \"fs\";\nimport { marked, Tokens } from \"marked\";\n\nexport interface ECDbTestProps {\n fileName: string;\n title: string;\n\n // Things from properties:\n only?: boolean; // This flag handles the only property to filter tests\n skip?: string; // This flag handles the skip property to filter tests\n dataset?: string;\n mode: ECDbTestMode;\n rowFormat: ECDbTestRowFormat;\n abbreviateBlobs: boolean;\n convertClassIdsToClassNames: boolean;\n errorDuringPrepare?: boolean;\n indexesToIncludeInResults?: number[]; // We now have the feature to check only certain columns of expected results\n // but if the rowFormat is ECSqlIndexes then there is no way to uniquely identify the columns, in that case this flag is used to include certain property indexes\n // for checking and ignore the rest, if this flag is not given while the rowFormat is ECSqlIndexes then the expected Results column\n // will assume an incremental 0 based indexing by default. This flag serves as a mapping for the actual results while checking with the expected results.\n\n // TODO: implement, it's currently being parsed but not used\n stepStatus?: string;\n\n // Things from code blocks or tables\n sql?: string;\n expectedResults?: { [key: string]: any }[] | any[];\n columnInfo?: ColumnInfoProps[];\n\n // Things from lists\n binders?: ECDbTestBinderProps[];\n}\n\nexport interface ECDbTestBinderProps {\n indexOrName: string;\n type: string;\n value: string;\n}\n\nexport interface ColumnInfoProps {\n name: string;\n className?: string;\n accessString?: string;\n generated?: boolean;\n index?: number;\n jsonName?: string;\n // expected extendedType value should be given when we know that the actual column info extendedType will be a valid non empty string for test to pass.\n // This extendedType value is internally used to check both extendType and extendedType values of column metadata.\n extendedType?: string;\n type?: string; // type is used on ECSqlStatement because it can differ from TypeName\n typeName?: string; // typeName is used on ConcurrentQuery\n originPropertyName?: string; // only supported for ECSqlStatement\n}\n\nexport const columnInfoPropsKeys: Set<keyof ColumnInfoProps> = new Set([\n \"name\",\n \"className\",\n \"accessString\",\n \"generated\",\n \"index\",\n \"jsonName\",\n \"extendedType\",\n \"type\",\n \"typeName\",\n \"originPropertyName\",\n]);\n\n/* interface QueryPropertyMetaData\n className: string;\n accessString?: string;\n generated: boolean;\n index: number;\n jsonName: string;\n name: string;\n extendType: string;\n typeName: string;\n*/\n\nfunction isColumnInfoProps(obj: any): obj is ColumnInfoProps {\n const numberOfKeys = typeof obj === \"object\" ? Object.keys(obj).length : 0;\n const isValid = typeof obj === \"object\" &&\n typeof obj.name === \"string\" &&\n (obj.className === undefined || typeof obj.className === \"string\") &&\n (obj.accessString === undefined || typeof obj.accessString === \"string\") &&\n (obj.generated === undefined || typeof obj.generated === \"boolean\") &&\n (obj.index === undefined || typeof obj.index === \"number\") &&\n (obj.jsonName === undefined || typeof obj.jsonName === \"string\") &&\n (obj.extendedType === undefined || typeof obj.extendedType === \"string\") &&\n (obj.type === undefined || typeof obj.type === \"string\") &&\n (obj.typeName === undefined || typeof obj.typeName === \"string\");\n\n if (!isValid) {\n const errors: string[] = [];\n if (typeof obj !== \"object\") errors.push(\"Object is not of type 'object'\");\n if (numberOfKeys < 1 || numberOfKeys > 7) errors.push(\"Number of keys is not between 1 and 7\");\n if (typeof obj.name !== \"string\") errors.push(\"Property 'name' is not of type 'string'\");\n if (obj.className !== undefined && typeof obj.className !== \"string\") errors.push(\"Property 'className' is not of type 'string'\");\n if (obj.accessString !== undefined && typeof obj.accessString !== \"string\") errors.push(\"Property 'accessString' is not of type 'string'\");\n if (obj.generated !== undefined && typeof obj.generated !== \"boolean\") errors.push(\"Property 'generated' is not of type 'boolean'\");\n if (obj.index !== undefined && typeof obj.index !== \"number\") errors.push(\"Property 'index' is not of type 'number'\");\n if (obj.jsonName !== undefined && typeof obj.jsonName !== \"string\") errors.push(\"Property 'jsonName' is not of type 'string'\");\n if (obj.extendedType !== undefined && typeof obj.extendedType !== \"string\") errors.push(\"Property 'extendedType' is not of type 'string'\");\n if (obj.type !== undefined && typeof obj.type !== \"string\") errors.push(\"Property 'type' is not of type 'string'\");\n if (obj.typeName !== undefined && typeof obj.typeName !== \"string\") errors.push(\"Property 'typeName' is not of type 'string'\");\n logWarning(`Validation failed for ColumnInfoProps. Object: ${JSON.stringify(obj)}. Errors: ${errors.join(\", \")}`);\n }\n\n return isValid;\n}\n\nexport enum ECDbTestMode {\n Both = \"Both\",\n Statement = \"Statement\",\n QueryReader = \"QueryReader\",\n};\n\nexport enum ECDbTestRowFormat {\n ECSqlNames = \"ECSqlNames\",\n ECSqlIndexes = \"ECSqlIndexes\",\n JsNames = \"JsNames\",\n}\n\nfunction tableTextToValue(text: string): any {\n // Unescape literal \\n sequences to actual newline characters\n text = text.replace(/\\\\n/g, \"\\n\");\n // Trim leading/trailing whitespaces\n text = text.trim();\n if (text.startsWith(\"\\\"\") && text.endsWith(\"\\\"\"))\n return text.slice(1, text.length - 1);\n if (text === \"null\")\n return null;\n if (text === \"undefined\")\n return undefined;\n if (text.startsWith(\"{\") || text.startsWith(\"[\"))\n return JSON.parse(text);\n if (text === \"true\" || text === \"false\")\n return text === \"true\";\n if (text.startsWith(\"0x\"))\n return text; // we use this for IDs and they are handled as strings, the parseInt below would attempt to convert them to numbers\n if (/^-?\\d+(\\.\\d+)?$/.test(text)) {\n const flt = parseFloat(text);\n if (!Number.isNaN(flt))\n return flt;\n }\n\n if (/^-?\\d+$/.test(text)) {\n // eslint-disable-next-line radix\n const asInt = parseInt(text);\n if (!Number.isNaN(asInt))\n return asInt;\n }\n\n return text;\n}\n\nexport function buildBinaryData(obj: any): any { //TODO: we should do this during table parsing\n for (const key in obj) {\n if (typeof obj[key] === \"string\" && obj[key].startsWith(\"BIN(\") && obj[key].endsWith(\")\"))\n obj[key] = understandAndReplaceBinaryData(obj[key])\n else if (typeof obj[key] === \"object\" || Array.isArray(obj[key]))\n obj[key] = buildBinaryData(obj[key])\n }\n return obj;\n}\n\nfunction understandAndReplaceBinaryData(str: string): any {\n const startInd = str.indexOf(\"(\") + 1;\n const endInd = str.indexOf(\")\");\n str = str.slice(startInd, endInd);\n const ans: number[] = []\n const numbers: string[] = str.split(\",\");\n numbers.forEach((value: string) => {\n value = value.trim();\n // eslint-disable-next-line radix\n ans.push(parseInt(value));\n }\n );\n return Uint8Array.of(...ans);\n}\n\n\nexport class ECDbMarkdownTestParser {\n public static parse(): ECDbTestProps[] {\n const testAssetsDir = path.join(__dirname, \"..\", \"queries\");\n const testFiles = fs.readdirSync(testAssetsDir, \"utf-8\").filter((fileName) => fileName.toLowerCase().endsWith(\"ecsql.md\"));\n const out: ECDbTestProps[] = [];\n\n for (const fileName of testFiles) {\n try {\n const tests = this.parseFile(testAssetsDir, fileName);\n out.push(...tests);\n } catch (error) {\n logWarning(`Failed to parse file ${fileName}. Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n return out;\n }\n\n private static parseFile(testAssetsDir: string, fileName: string): ECDbTestProps[] {\n const markdownFilePath = path.join(testAssetsDir, fileName);\n const baseFileName = fileName.replace(/\\.ecdbtest\\.md$/i, \"\");\n const markdownContent = fs.readFileSync(markdownFilePath, \"utf-8\");\n const tokens = marked.lexer(markdownContent);\n\n const out: ECDbTestProps[] = [];\n let currentTest: ECDbTestProps | undefined;\n\n for (const token of tokens) {\n switch (token.type) {\n case \"space\":\n case \"html\":\n case \"paragraph\":\n case \"hr\":\n continue;\n case \"heading\":\n if (currentTest !== undefined) {\n out.push(currentTest);\n }\n currentTest = {\n title: token.text, mode: ECDbTestMode.Both, fileName: baseFileName,\n rowFormat: ECDbTestRowFormat.ECSqlNames, abbreviateBlobs: false, convertClassIdsToClassNames: false\n };\n break;\n case \"list\":\n this.handleListToken(token as Tokens.List, currentTest, markdownFilePath);\n break;\n case \"code\":\n this.handleCodeToken(token as Tokens.Code, currentTest, markdownFilePath);\n break;\n case \"table\":\n this.handleTableToken(token as Tokens.Table, currentTest, markdownFilePath);\n break;\n default:\n logWarning(`Unknown token type ${token.type} found in file ${markdownFilePath}. Skipping.`);\n break;\n }\n }\n\n if (currentTest !== undefined) {\n out.push(currentTest);\n }\n return out;\n }\n\n\n private static handleListToken(token: Tokens.List, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\n if (currentTest === undefined) {\n logWarning(`List token found without a test title in file ${markdownFilePath}. Skipping.`);\n return;\n }\n\n const variableRegex = /^(\\w+):\\s*(.+)$/;\n const bindRegex = /^bind(\\w+)\\s([^,\\s]+),\\s?(.+)$/;\n for (const item of token.items) {\n const match = item.text.match(variableRegex);\n if (match) {\n const key = match[1];\n const value = match[2];\n switch (key.toLowerCase()) {\n case \"dataset\":\n currentTest.dataset = value;\n continue;\n case \"errorduringprepare\":\n currentTest.errorDuringPrepare = value.toLowerCase() === \"true\";\n continue;\n case \"stepstatus\":\n currentTest.stepStatus = value;\n continue;\n case \"only\":\n currentTest.only = value.toLowerCase() === \"true\";\n continue;\n case \"skip\":\n currentTest.skip = value;\n continue;\n case \"mode\":\n this.handleMode(value, currentTest, markdownFilePath);\n continue;\n case \"rowformat\":\n this.handleRowFormat(value, currentTest, markdownFilePath);\n continue;\n case \"abbreviateblobs\":\n currentTest.abbreviateBlobs = value.toLowerCase() === \"true\";\n continue;\n case \"convertclassidstoclassnames\":\n currentTest.convertClassIdsToClassNames = value.toLowerCase() === \"true\";\n continue;\n case \"indexestoinclude\":\n currentTest.indexesToIncludeInResults = this.handleValidIndexList(value);\n continue;\n }\n }\n const bindMatch = item.text.match(bindRegex);\n if (bindMatch) {\n currentTest.binders = currentTest.binders || [];\n currentTest.binders.push({ indexOrName: bindMatch[2], type: bindMatch[1], value: bindMatch[3] });\n continue;\n }\n }\n }\n\n private static handleMode(value: string, currentTest: ECDbTestProps, markdownFilePath: string) {\n switch (value.toLowerCase()) {\n case \"statement\":\n currentTest.mode = ECDbTestMode.Statement;\n break;\n case \"queryreader\":\n currentTest.mode = ECDbTestMode.QueryReader;\n break;\n case \"both\":\n currentTest.mode = ECDbTestMode.Both;\n break;\n default:\n logWarning(`Mode value (${value}) is not recognized in file ${markdownFilePath} and test ${currentTest.title}. Skipping.`);\n }\n }\n\n private static handleRowFormat(value: string, currentTest: ECDbTestProps, markdownFilePath: string) {\n switch (value.toLowerCase()) {\n case \"ecsqlnames\":\n currentTest.rowFormat = ECDbTestRowFormat.ECSqlNames;\n break;\n case \"ecsqlindexes\":\n currentTest.rowFormat = ECDbTestRowFormat.ECSqlIndexes;\n break;\n case \"jsnames\":\n currentTest.rowFormat = ECDbTestRowFormat.JsNames;\n break;\n default:\n logWarning(`Row Format value (${value}) is not recognized in file ${markdownFilePath} and test ${currentTest.title}. Skipping.`);\n }\n }\n\n private static handleValidIndexList(obj: string): number[] | undefined {\n try {\n const numsArr = JSON.parse(obj);\n if (Array.isArray(numsArr) && numsArr.every((val: any) => typeof val === \"number\"))\n return numsArr;\n logWarning(\"The given value is not valid for the property indexestoinclude\");\n return undefined;\n }\n catch {\n logWarning(\"The given value is not valid for the property indexestoinclude\");\n return undefined;\n }\n }\n\n private static handleCodeToken(token: Tokens.Code, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\n if (currentTest === undefined) {\n logWarning(`Code token found without a test title in file ${markdownFilePath}. Skipping.`);\n return;\n }\n\n if (token.lang === \"sql\") {\n currentTest.sql = token.text;\n } else if (token.lang === \"json\") {\n let json: any;\n try {\n json = JSON.parse(token.text);\n } catch (error) {\n if (error instanceof Error) {\n logWarning(`Failed to parse JSON ${token.text} in file ${markdownFilePath}. ${error.message} Skipping.`);\n } else {\n logWarning(`Failed to parse SON ${token.text} in file ${markdownFilePath}. Unknown error. Skipping.`);\n }\n }\n\n if (typeof json === \"object\" && Array.isArray(json.columns)) {\n this.handleJSONColumnMetadata(json, currentTest, markdownFilePath);\n return;\n }\n\n this.handleJSONExpectedResults(json, currentTest); // TODO: validate the expected results\n } else {\n logWarning(`Unknown code language ${token.lang} found in file ${markdownFilePath}. Skipping.`);\n }\n }\n\n private static handleJSONColumnMetadata(json: any, currentTest: ECDbTestProps, markdownFilePath: string) {\n const extraProps: Set<string> = new Set();\n\n if (json.columns.every(isColumnInfoProps)) {\n currentTest.columnInfo = json.columns;\n for (const column of json.columns) {\n for (const key in column) {\n if (!columnInfoPropsKeys.has(key as keyof ColumnInfoProps)) {\n extraProps.add(key);\n }\n }\n }\n\n if (extraProps.size > 0) {\n logWarning(`Found extra properties in column infos: ${Array.from(extraProps).join(\", \")} in file '${markdownFilePath}' test '${currentTest.title}'.`);\n }\n } else {\n logWarning(`Columns format in file '${markdownFilePath}' test '${currentTest.title}' failed type guard. Skipping.`);\n }\n }\n\n private static handleJSONExpectedResults(json: any, currentTest: ECDbTestProps) {\n currentTest.expectedResults = json\n }\n\n private static handleTableToken(token: Tokens.Table, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\n if (currentTest === undefined) {\n logWarning(`Table token found without a test title in file ${markdownFilePath}. Skipping.`);\n return;\n }\n\n this.handleTable(token, currentTest, markdownFilePath);\n }\n\n private static handleTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\n if (token.header.length > 0 && currentTest.columnInfo === undefined && columnInfoPropsKeys.has(token.header[0].text as keyof ColumnInfoProps)) {\n this.handleColumnTable(token, currentTest, markdownFilePath);\n return;\n }\n else if (token.header.length > 0 && token.header[0].text === \"\") {\n this.handleExpectedResultsTableForECSqlPropertyIndexesOption(token, currentTest, markdownFilePath);\n } else {\n this.handleExpectedResultsTable(token, currentTest, markdownFilePath);\n }\n }\n\n private static handleColumnTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\n const columnInfos: any[] = [];\n for (const row of token.rows) {\n if (row.length < 1 || row.length !== token.header.length) {\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\n continue;\n }\n const columnInfo: { [key: string]: any } = {};\n for (let i = 0; i < token.header.length; i++) {\n const header = token.header[i].text;\n const cell = row[i].text;\n columnInfo[header] = tableTextToValue(cell);\n }\n columnInfos.push(columnInfo);\n }\n\n this.handleJSONColumnMetadata({ columns: columnInfos }, currentTest, markdownFilePath);\n }\n\n private static handleExpectedResultsTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\n if (currentTest.expectedResults !== undefined) {\n logWarning(`Expected results already set for test ${currentTest.title} in file ${markdownFilePath}. Skipping.`);\n return;\n }\n currentTest.expectedResults = [];\n for (const row of token.rows) {\n if (row.length < 1 || row.length !== token.header.length) {\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\n continue;\n }\n\n const expectedResult: { [key: string]: any } = {};\n for (let i = 0; i < token.header.length; i++) {\n const header = token.header[i].text;\n const cell = row[i].text;\n const value = tableTextToValue(cell);\n if (value !== undefined)\n expectedResult[header] = value;\n }\n currentTest.expectedResults.push(expectedResult);\n }\n }\n\n private static handleExpectedResultsTableForECSqlPropertyIndexesOption(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\n if (currentTest.expectedResults !== undefined) {\n logWarning(`Expected results already set for test ${currentTest.title} in file ${markdownFilePath}. Skipping.`);\n return;\n }\n currentTest.expectedResults = [];\n for (const row of token.rows) {\n if (row.length < 1 || row.length !== token.header.length) {\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\n continue;\n }\n\n const expectedResult: any[] = [];\n for (let i = 0; i < token.header.length; i++) {\n const cell = row[i].text;\n const value = tableTextToValue(cell);\n if (value !== undefined)\n expectedResult.push(value);\n }\n currentTest.expectedResults.push(expectedResult);\n }\n }\n}\n\nfunction logWarning(message: string) {\n // eslint-disable-next-line no-console\n console.log(`\\x1b[33m${message}\\x1b[0m`);\n}"]}
@@ -144,6 +144,10 @@ function runECSqlStatementTest(test, dataset) {
144
144
  const parsedVal3d = JSON.parse(binder.value);
145
145
  stmt.bindPoint3d(id, { x: parsedVal3d.X, y: parsedVal3d.Y, z: parsedVal3d.Z });
146
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;
147
151
  case "blob":
148
152
  const arrayValues = binder.value.slice(1, -1).split(",");
149
153
  const numbers = arrayValues.map((value) =>
@@ -270,6 +274,10 @@ function buildQueryBinder(test) {
270
274
  const parsedVal3d = JSON.parse(binder.value);
271
275
  params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));
272
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;
273
281
  case "blob":
274
282
  const arrayValues = binder.value.slice(1, -1).split(",");
275
283
  const numbers = arrayValues.map((value) =>
@@ -426,13 +434,17 @@ function checkingExpectedResults(rowFormat, actualResult, expectedResult, indexe
426
434
  if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {
427
435
  let i = 0;
428
436
  for (const key of Object.keys(expectedResult)) {
429
- 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]])}`);
430
440
  i++;
431
441
  }
432
442
  }
433
443
  else {
434
444
  for (const key of Object.keys(expectedResult)) {
435
- 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])}`);
436
448
  }
437
449
  }
438
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, ECSqlSyncReader, SnapshotDb, SynchronousQueryOptions } from \"../../../core-backend\";\r\nimport { KnownTestLocations } from \"../../KnownTestLocations\";\r\nimport { ECSqlReader, ECSqlValueType, QueryBinder, QueryOptions, QueryPropertyMetaData, 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.QueryReader) {\r\n if (test.skip) {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader) skipped. Reason: ${test.skip}`);\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader) skipped. Reason: ${test.skip}`);\r\n }\r\n else if (test.only) {\r\n it.only(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it.only(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n else {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\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\n/** Builds a QueryBinder from the test's binder definitions. Returns undefined when the test has no binders. */\r\nfunction buildQueryBinder(test: ECDbTestProps): QueryBinder | undefined {\r\n if (test.binders === undefined)\r\n return undefined;\r\n\r\n const 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 return params;\r\n}\r\n\r\n/** Builds the common query options object from the test configuration. */\r\nfunction buildReaderQueryOptions(test: ECDbTestProps): QueryOptions {\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 return queryOptions;\r\n}\r\n\r\n/**\r\n * Shared assertion logic for QueryReader tests that operates on the result rows and column metadata.\r\n * Used by both ECSqlReader and ECSqlSyncReader test paths.\r\n */\r\nfunction runResultAssertions(test: ECDbTestProps, rows: any, colMetaData: QueryPropertyMetaData[]) {\r\n let resultCount = 0;\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 (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\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlReader test paths.\r\n */\r\nasync function runAssertionsOnReader(test: ECDbTestProps, reader: ECSqlReader, label: string): Promise<void> {\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 execution of ${label}: ${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 runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlSyncReader test paths.\r\n */\r\nfunction runAssertionsOnSyncReader(test: ECDbTestProps, reader: ECSqlSyncReader, label: string): void {\r\n let rows;\r\n try {\r\n rows = 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 execution of ${label}: ${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 = reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\nasync function runECSqlReaderTest(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 if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const params = buildQueryBinder(test);\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n let reader: ECSqlReader;\r\n try {\r\n reader = imodel.createQueryReader(test.sql, params, queryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlReader: ${error.message}`);\r\n }\r\n\r\n await runAssertionsOnReader(test, reader, \"ECSqlReader\");\r\n}\r\n\r\nasync function runECSqlSyncReaderTest(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 if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const params = buildQueryBinder(test);\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n try {\r\n imodel.withQueryReader(test.sql, reader => {\r\n runAssertionsOnSyncReader(test, reader, \"ECSqlSyncReader\");\r\n }, params, queryOptions as SynchronousQueryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlSyncReader: ${error.message}`);\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}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteDefinitionElements.test.js","sourceRoot":"","sources":["../../../../src/test/element/DeleteDefinitionElements.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\n\r\nimport { assert } from \"chai\";\r\nimport * as path from \"path\";\r\nimport { Id64, Id64Set } from \"@itwin/core-bentley\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nimport { GeometryPartProps, IModel } from \"@itwin/core-common\";\r\nimport {\r\n CategorySelector, DisplayStyle2d, DisplayStyle3d, DrawingCategory, DrawingViewDefinition, GeometryPart, IModelJsFs, InformationPartitionElement,\r\n ModelSelector, OrthographicViewDefinition, RenderMaterialElement, SnapshotDb, SpatialCategory, SubCategory, Subject, Texture,\r\n} from \"../../core-backend\";\r\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\n\r\ndescribe(\"DeleteDefinitionElements\", () => {\r\n const outputDir: string = path.join(KnownTestLocations.outputDir, \"DeleteDefinitionElements\");\r\n\r\n before(async () => {\r\n if (!IModelJsFs.existsSync(KnownTestLocations.outputDir)) {\r\n IModelJsFs.mkdirSync(KnownTestLocations.outputDir);\r\n }\r\n if (!IModelJsFs.existsSync(outputDir)) {\r\n IModelJsFs.mkdirSync(outputDir);\r\n }\r\n });\r\n\r\n it(\"should delete if not used\", async () => {\r\n const iModelFile: string = IModelTestUtils.prepareOutputFile(\"DeleteDefinitionElements\", \"DeleteDefinitionElements.bim\");\r\n const iModelDb = SnapshotDb.createEmpty(iModelFile, { rootSubject: { name: \"DeleteDefinitionElements\" } });\r\n await ExtensiveTestScenario.prepareDb(iModelDb);\r\n await ExtensiveTestScenario.populateDb(iModelDb);\r\n\r\n // Get ElementIds of DefinitionElements created by populateDb\r\n const subjectId = iModelDb.elements.queryElementIdByCode(Subject.createCode(iModelDb, IModel.rootSubjectId, \"Subject\"))!;\r\n const definitionModelId = iModelDb.elements.queryElementIdByCode(InformationPartitionElement.createCode(iModelDb, subjectId, \"Definition\"))!;\r\n const spatialCategoryId = iModelDb.elements.queryElementIdByCode(SpatialCategory.createCode(iModelDb, definitionModelId, \"SpatialCategory\"))!;\r\n const subCategoryId = iModelDb.elements.queryElementIdByCode(SubCategory.createCode(iModelDb, spatialCategoryId, \"SubCategory\"))!;\r\n const spatialCategorySelectorId = iModelDb.elements.queryElementIdByCode(CategorySelector.createCode(iModelDb, definitionModelId, \"SpatialCategories\"))!;\r\n const modelSelectorId = iModelDb.elements.queryElementIdByCode(ModelSelector.createCode(iModelDb, definitionModelId, \"SpatialModels\"))!;\r\n const displayStyle3dId = iModelDb.elements.queryElementIdByCode(DisplayStyle3d.createCode(iModelDb, definitionModelId, \"DisplayStyle3d\"))!;\r\n const viewId = iModelDb.elements.queryElementIdByCode(OrthographicViewDefinition.createCode(iModelDb, definitionModelId, \"Orthographic View\"))!;\r\n const drawingCategoryId = iModelDb.elements.queryElementIdByCode(DrawingCategory.createCode(iModelDb, definitionModelId, \"DrawingCategory\"))!;\r\n const drawingCategorySelectorId = iModelDb.elements.queryElementIdByCode(CategorySelector.createCode(iModelDb, definitionModelId, \"DrawingCategories\"))!;\r\n const displayStyle2dId = iModelDb.elements.queryElementIdByCode(DisplayStyle2d.createCode(iModelDb, definitionModelId, \"DisplayStyle2d\"))!;\r\n const drawingViewId = iModelDb.elements.queryElementIdByCode(DrawingViewDefinition.createCode(iModelDb, definitionModelId, \"Drawing View\"))!;\r\n const geometryPartId = iModelDb.elements.queryElementIdByCode(GeometryPart.createCode(iModelDb, definitionModelId, \"GeometryPart\"))!;\r\n const renderMaterialId = iModelDb.elements.queryElementIdByCode(RenderMaterialElement.createCode(iModelDb, definitionModelId, \"RenderMaterial\"))!;\r\n const textureId = iModelDb.elements.queryElementIdByCode(Texture.createCode(iModelDb, definitionModelId, \"Texture\"))!;\r\n const physicalObjectId1 = IModelTestUtils.queryByUserLabel(iModelDb, \"PhysicalObject1\");\r\n const physicalObjectId2 = IModelTestUtils.queryByUserLabel(iModelDb, \"PhysicalObject2\");\r\n const physicalObjectId3 = IModelTestUtils.queryByUserLabel(iModelDb, \"PhysicalObject3\");\r\n assert.isTrue(Id64.isValidId64(spatialCategoryId));\r\n assert.isTrue(Id64.isValidId64(subCategoryId));\r\n assert.isTrue(Id64.isValidId64(spatialCategorySelectorId));\r\n assert.isTrue(Id64.isValidId64(modelSelectorId));\r\n assert.isTrue(Id64.isValidId64(displayStyle3dId));\r\n assert.isTrue(Id64.isValidId64(viewId));\r\n assert.isTrue(Id64.isValidId64(drawingCategoryId));\r\n assert.isTrue(Id64.isValidId64(drawingCategorySelectorId));\r\n assert.isTrue(Id64.isValidId64(displayStyle2dId));\r\n assert.isTrue(Id64.isValidId64(drawingViewId));\r\n assert.isTrue(Id64.isValidId64(geometryPartId));\r\n assert.isTrue(Id64.isValidId64(renderMaterialId));\r\n assert.isTrue(Id64.isValidId64(textureId));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId1));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId2));\r\n assert.isTrue(Id64.isValidId64(physicalObjectId3));\r\n\r\n let usedDefinitionElementIds: Id64Set;\r\n\r\n // make sure deleteDefinitionElements skips Elements that are not DefinitionElements\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId1));\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId2));\r\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId3));\r\n assert.isDefined(iModelDb.elements.tryGetElement(subjectId));\r\n\r\n // make sure deleteDefinitionElements skips invalid Ids\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([Id64.invalid, Id64.invalid]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n\r\n // delete/deleteDefinitionElements for a used GeometryPart should fail\r\n assert.throws(() => iModelDb.elements.deleteElement(geometryPartId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([geometryPartId]);\r\n assert.isTrue(usedDefinitionElementIds.has(geometryPartId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(geometryPartId));\r\n\r\n // deleteDefinitionElements for an unused GeometryPart should succeed, delete should still fail\r\n const unusedGeometryPartProps: GeometryPartProps = {\r\n classFullName: GeometryPart.classFullName,\r\n model: definitionModelId,\r\n code: GeometryPart.createCode(iModelDb, definitionModelId, \"Unused GeometryPart\"),\r\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\r\n };\r\n const unusedGeometryPartId = iModelDb.elements.insertElement(unusedGeometryPartProps);\r\n assert.isTrue(Id64.isValidId64(unusedGeometryPartId));\r\n assert.throws(() => iModelDb.elements.deleteElement(unusedGeometryPartId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedGeometryPartId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedGeometryPartId));\r\n\r\n // delete/deleteDefinitionElements for a used RenderMaterial should fail\r\n assert.throws(() => iModelDb.elements.deleteElement(renderMaterialId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([renderMaterialId]);\r\n assert.isTrue(usedDefinitionElementIds.has(renderMaterialId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(renderMaterialId));\r\n\r\n // deleteDefinitionElements for an unused RenderMaterial should succeed, delete should still fail\r\n const unusedRenderMaterialId = RenderMaterialElement.insert(iModelDb, definitionModelId, \"Unused RenderMaterial\", { paletteName: \"PaletteName\" });\r\n assert.isTrue(Id64.isValidId64(unusedRenderMaterialId));\r\n assert.throws(() => iModelDb.elements.deleteElement(unusedRenderMaterialId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedRenderMaterialId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedRenderMaterialId));\r\n\r\n // delete/deleteDefinitionElements for a used Texture should fail\r\n assert.throws(() => iModelDb.elements.deleteElement(textureId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([textureId]);\r\n assert.isTrue(usedDefinitionElementIds.has(textureId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(textureId));\r\n\r\n // deleteDefinitionElements for an unused Texture should succeed, delete should still fail\r\n const unusedTextureId = IModelTestUtils.insertTextureElement(iModelDb, definitionModelId, \"Unused Texture\");\r\n assert.isTrue(Id64.isValidId64(unusedTextureId));\r\n assert.throws(() => iModelDb.elements.deleteElement(unusedTextureId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedTextureId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedTextureId));\r\n\r\n // delete/deleteDefinitionElements for a used SpatialCategory should fail\r\n assert.throws(() => iModelDb.elements.deleteElement(spatialCategoryId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([spatialCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(spatialCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategoryId));\r\n\r\n // delete/deleteDefinitionElements for a default SubCategory should fail\r\n const spatialCategory = iModelDb.elements.getElement<SpatialCategory>(spatialCategoryId, SpatialCategory);\r\n const defaultSpatialSubCategoryId = spatialCategory.myDefaultSubCategoryId();\r\n assert.throws(() => iModelDb.elements.deleteElement(defaultSpatialSubCategoryId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([defaultSpatialSubCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(defaultSpatialSubCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(defaultSpatialSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements for a used, non-default SubCategory should fail\r\n assert.throws(() => iModelDb.elements.deleteElement(subCategoryId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([subCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(subCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(subCategoryId));\r\n\r\n // deleteDefinitionElements for an unused SubCategory should succeed, delete should still fail\r\n const unusedSubCategoryId = SubCategory.insert(iModelDb, spatialCategoryId, \"Unused SubCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedSubCategoryId));\r\n assert.throws(() => iModelDb.elements.deleteElement(unusedSubCategoryId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedSubCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSubCategoryId));\r\n\r\n // deleteDefinitionElements for an unused SpatialCategory should succeed, delete should still fail\r\n const unusedSpatialCategoryId = SpatialCategory.insert(iModelDb, definitionModelId, \"Unused SpatialCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryId));\r\n const unusedSpatialCategory = iModelDb.elements.getElement<SpatialCategory>(unusedSpatialCategoryId, SpatialCategory);\r\n const unusedSpatialCategoryDefaultSubCategoryId = unusedSpatialCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryDefaultSubCategoryId));\r\n assert.throws(() => iModelDb.elements.deleteElement(unusedSpatialCategoryId));\r\n assert.throws(() => iModelDb.elements.deleteElement(unusedSpatialCategoryDefaultSubCategoryId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedSpatialCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryDefaultSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements of a used DrawingCategory should fail\r\n assert.throws(() => iModelDb.elements.deleteElement(drawingCategoryId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([drawingCategoryId]);\r\n assert.isTrue(usedDefinitionElementIds.has(drawingCategoryId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategoryId));\r\n\r\n // deleteDefinitionElements for an unused DrawingCategory should succeed, delete should still fail\r\n const unusedDrawingCategoryId = DrawingCategory.insert(iModelDb, definitionModelId, \"Unused DrawingCategory\", {});\r\n assert.isTrue(Id64.isValidId64(unusedDrawingCategoryId));\r\n const unusedDrawingCategory = iModelDb.elements.getElement<DrawingCategory>(unusedDrawingCategoryId, DrawingCategory);\r\n const unusedDrawingSubCategoryId = unusedDrawingCategory.myDefaultSubCategoryId();\r\n assert.isTrue(Id64.isValidId64(unusedDrawingSubCategoryId));\r\n assert.throws(() => iModelDb.elements.deleteElement(unusedDrawingSubCategoryId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedDrawingCategoryId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingCategoryId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingSubCategoryId));\r\n\r\n // delete/deleteDefinitionElements of DefinitionElements used by an existing SpatialViewDefinition should fail\r\n assert.throws(() => iModelDb.elements.deleteElement(spatialCategorySelectorId));\r\n assert.throws(() => iModelDb.elements.deleteElement(modelSelectorId));\r\n assert.throws(() => iModelDb.elements.deleteElement(displayStyle3dId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([spatialCategorySelectorId, modelSelectorId, displayStyle3dId]);\r\n assert.isTrue(usedDefinitionElementIds.has(spatialCategorySelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(modelSelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(displayStyle3dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(modelSelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle3dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(viewId));\r\n\r\n // deleteDefinitionElements should succeed when the list includes the SpatialViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n assert.throws(() => iModelDb.elements.deleteElement(viewId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(modelSelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle3dId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(viewId));\r\n\r\n // delete/deleteDefinitionElements of DefinitionElements used by an existing DrawingViewDefinition should fail\r\n assert.throws(() => iModelDb.elements.deleteElement(drawingCategorySelectorId));\r\n assert.throws(() => iModelDb.elements.deleteElement(displayStyle2dId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([drawingCategorySelectorId, displayStyle2dId]);\r\n assert.isTrue(usedDefinitionElementIds.has(drawingCategorySelectorId));\r\n assert.isTrue(usedDefinitionElementIds.has(displayStyle2dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle2dId));\r\n assert.isDefined(iModelDb.elements.tryGetElement(drawingViewId));\r\n\r\n // deleteDefinitionElements should succeed when the list includes the DrawingViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\r\n assert.throws(() => iModelDb.elements.deleteElement(drawingViewId));\r\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([drawingViewId, drawingCategorySelectorId, displayStyle2dId]);\r\n assert.equal(usedDefinitionElementIds.size, 0);\r\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle2dId));\r\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingViewId));\r\n\r\n iModelDb.saveChanges();\r\n iModelDb.close();\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"DeleteDefinitionElements.test.js","sourceRoot":"","sources":["../../../../src/test/element/DeleteDefinitionElements.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*--------------------------------------------------------------------------------------------*/\n\nimport { assert } from \"chai\";\nimport * as path from \"path\";\nimport { Id64, Id64Set } from \"@itwin/core-bentley\";\nimport { Point3d } from \"@itwin/core-geometry\";\nimport { GeometryPartProps, IModel } from \"@itwin/core-common\";\nimport {\n CategorySelector, DisplayStyle2d, DisplayStyle3d, DrawingCategory, DrawingViewDefinition, GeometryPart, IModelJsFs, InformationPartitionElement,\n ModelSelector, OrthographicViewDefinition, RenderMaterialElement, SnapshotDb, SpatialCategory, SubCategory, Subject, Texture,\n} from \"../../core-backend\";\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\n\ndescribe(\"DeleteDefinitionElements\", () => {\n const outputDir: string = path.join(KnownTestLocations.outputDir, \"DeleteDefinitionElements\");\n\n before(async () => {\n if (!IModelJsFs.existsSync(KnownTestLocations.outputDir)) {\n IModelJsFs.mkdirSync(KnownTestLocations.outputDir);\n }\n if (!IModelJsFs.existsSync(outputDir)) {\n IModelJsFs.mkdirSync(outputDir);\n }\n });\n\n it(\"should delete if not used\", async () => {\n const iModelFile: string = IModelTestUtils.prepareOutputFile(\"DeleteDefinitionElements\", \"DeleteDefinitionElements.bim\");\n const iModelDb = SnapshotDb.createEmpty(iModelFile, { rootSubject: { name: \"DeleteDefinitionElements\" } });\n await ExtensiveTestScenario.prepareDb(iModelDb);\n await ExtensiveTestScenario.populateDb(iModelDb);\n\n // Get ElementIds of DefinitionElements created by populateDb\n const subjectId = iModelDb.elements.queryElementIdByCode(Subject.createCode(iModelDb, IModel.rootSubjectId, \"Subject\"))!;\n const definitionModelId = iModelDb.elements.queryElementIdByCode(InformationPartitionElement.createCode(iModelDb, subjectId, \"Definition\"))!;\n const spatialCategoryId = iModelDb.elements.queryElementIdByCode(SpatialCategory.createCode(iModelDb, definitionModelId, \"SpatialCategory\"))!;\n const subCategoryId = iModelDb.elements.queryElementIdByCode(SubCategory.createCode(iModelDb, spatialCategoryId, \"SubCategory\"))!;\n const spatialCategorySelectorId = iModelDb.elements.queryElementIdByCode(CategorySelector.createCode(iModelDb, definitionModelId, \"SpatialCategories\"))!;\n const modelSelectorId = iModelDb.elements.queryElementIdByCode(ModelSelector.createCode(iModelDb, definitionModelId, \"SpatialModels\"))!;\n const displayStyle3dId = iModelDb.elements.queryElementIdByCode(DisplayStyle3d.createCode(iModelDb, definitionModelId, \"DisplayStyle3d\"))!;\n const viewId = iModelDb.elements.queryElementIdByCode(OrthographicViewDefinition.createCode(iModelDb, definitionModelId, \"Orthographic View\"))!;\n const drawingCategoryId = iModelDb.elements.queryElementIdByCode(DrawingCategory.createCode(iModelDb, definitionModelId, \"DrawingCategory\"))!;\n const drawingCategorySelectorId = iModelDb.elements.queryElementIdByCode(CategorySelector.createCode(iModelDb, definitionModelId, \"DrawingCategories\"))!;\n const displayStyle2dId = iModelDb.elements.queryElementIdByCode(DisplayStyle2d.createCode(iModelDb, definitionModelId, \"DisplayStyle2d\"))!;\n const drawingViewId = iModelDb.elements.queryElementIdByCode(DrawingViewDefinition.createCode(iModelDb, definitionModelId, \"Drawing View\"))!;\n const geometryPartId = iModelDb.elements.queryElementIdByCode(GeometryPart.createCode(iModelDb, definitionModelId, \"GeometryPart\"))!;\n const renderMaterialId = iModelDb.elements.queryElementIdByCode(RenderMaterialElement.createCode(iModelDb, definitionModelId, \"RenderMaterial\"))!;\n const textureId = iModelDb.elements.queryElementIdByCode(Texture.createCode(iModelDb, definitionModelId, \"Texture\"))!;\n const physicalObjectId1 = IModelTestUtils.queryByUserLabel(iModelDb, \"PhysicalObject1\");\n const physicalObjectId2 = IModelTestUtils.queryByUserLabel(iModelDb, \"PhysicalObject2\");\n const physicalObjectId3 = IModelTestUtils.queryByUserLabel(iModelDb, \"PhysicalObject3\");\n assert.isTrue(Id64.isValidId64(spatialCategoryId));\n assert.isTrue(Id64.isValidId64(subCategoryId));\n assert.isTrue(Id64.isValidId64(spatialCategorySelectorId));\n assert.isTrue(Id64.isValidId64(modelSelectorId));\n assert.isTrue(Id64.isValidId64(displayStyle3dId));\n assert.isTrue(Id64.isValidId64(viewId));\n assert.isTrue(Id64.isValidId64(drawingCategoryId));\n assert.isTrue(Id64.isValidId64(drawingCategorySelectorId));\n assert.isTrue(Id64.isValidId64(displayStyle2dId));\n assert.isTrue(Id64.isValidId64(drawingViewId));\n assert.isTrue(Id64.isValidId64(geometryPartId));\n assert.isTrue(Id64.isValidId64(renderMaterialId));\n assert.isTrue(Id64.isValidId64(textureId));\n assert.isTrue(Id64.isValidId64(physicalObjectId1));\n assert.isTrue(Id64.isValidId64(physicalObjectId2));\n assert.isTrue(Id64.isValidId64(physicalObjectId3));\n\n let usedDefinitionElementIds: Id64Set;\n\n // make sure deleteDefinitionElements skips Elements that are not DefinitionElements\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([physicalObjectId1, physicalObjectId2, physicalObjectId3, subjectId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId1));\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId2));\n assert.isDefined(iModelDb.elements.tryGetElement(physicalObjectId3));\n assert.isDefined(iModelDb.elements.tryGetElement(subjectId));\n\n // make sure deleteDefinitionElements skips invalid Ids\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([Id64.invalid, Id64.invalid]);\n assert.equal(usedDefinitionElementIds.size, 0);\n\n // delete/deleteDefinitionElements for a used GeometryPart should fail\n assert.throws(() => iModelDb.elements.deleteElement(geometryPartId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([geometryPartId]);\n assert.isTrue(usedDefinitionElementIds.has(geometryPartId));\n assert.isDefined(iModelDb.elements.tryGetElement(geometryPartId));\n\n // deleteDefinitionElements for an unused GeometryPart should succeed, delete should still fail\n const unusedGeometryPartProps: GeometryPartProps = {\n classFullName: GeometryPart.classFullName,\n model: definitionModelId,\n code: GeometryPart.createCode(iModelDb, definitionModelId, \"Unused GeometryPart\"),\n geom: IModelTestUtils.createBox(Point3d.create(1, 1, 1)),\n };\n const unusedGeometryPartId = iModelDb.elements.insertElement(unusedGeometryPartProps);\n assert.isTrue(Id64.isValidId64(unusedGeometryPartId));\n assert.throws(() => iModelDb.elements.deleteElement(unusedGeometryPartId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedGeometryPartId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedGeometryPartId));\n\n // delete/deleteDefinitionElements for a used RenderMaterial should fail\n assert.throws(() => iModelDb.elements.deleteElement(renderMaterialId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([renderMaterialId]);\n assert.isTrue(usedDefinitionElementIds.has(renderMaterialId));\n assert.isDefined(iModelDb.elements.tryGetElement(renderMaterialId));\n\n // deleteDefinitionElements for an unused RenderMaterial should succeed, delete should still fail\n const unusedRenderMaterialId = RenderMaterialElement.insert(iModelDb, definitionModelId, \"Unused RenderMaterial\", { paletteName: \"PaletteName\" });\n assert.isTrue(Id64.isValidId64(unusedRenderMaterialId));\n assert.throws(() => iModelDb.elements.deleteElement(unusedRenderMaterialId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedRenderMaterialId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedRenderMaterialId));\n\n // delete/deleteDefinitionElements for a used Texture should fail\n assert.throws(() => iModelDb.elements.deleteElement(textureId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([textureId]);\n assert.isTrue(usedDefinitionElementIds.has(textureId));\n assert.isDefined(iModelDb.elements.tryGetElement(textureId));\n\n // deleteDefinitionElements for an unused Texture should succeed, delete should still fail\n const unusedTextureId = IModelTestUtils.insertTextureElement(iModelDb, definitionModelId, \"Unused Texture\");\n assert.isTrue(Id64.isValidId64(unusedTextureId));\n assert.throws(() => iModelDb.elements.deleteElement(unusedTextureId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedTextureId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedTextureId));\n\n // delete/deleteDefinitionElements for a used SpatialCategory should fail\n assert.throws(() => iModelDb.elements.deleteElement(spatialCategoryId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([spatialCategoryId]);\n assert.isTrue(usedDefinitionElementIds.has(spatialCategoryId));\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategoryId));\n\n // delete/deleteDefinitionElements for a default SubCategory should fail\n const spatialCategory = iModelDb.elements.getElement<SpatialCategory>(spatialCategoryId, SpatialCategory);\n const defaultSpatialSubCategoryId = spatialCategory.myDefaultSubCategoryId();\n assert.throws(() => iModelDb.elements.deleteElement(defaultSpatialSubCategoryId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([defaultSpatialSubCategoryId]);\n assert.isTrue(usedDefinitionElementIds.has(defaultSpatialSubCategoryId));\n assert.isDefined(iModelDb.elements.tryGetElement(defaultSpatialSubCategoryId));\n\n // delete/deleteDefinitionElements for a used, non-default SubCategory should fail\n assert.throws(() => iModelDb.elements.deleteElement(subCategoryId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([subCategoryId]);\n assert.isTrue(usedDefinitionElementIds.has(subCategoryId));\n assert.isDefined(iModelDb.elements.tryGetElement(subCategoryId));\n\n // deleteDefinitionElements for an unused SubCategory should succeed, delete should still fail\n const unusedSubCategoryId = SubCategory.insert(iModelDb, spatialCategoryId, \"Unused SubCategory\", {});\n assert.isTrue(Id64.isValidId64(unusedSubCategoryId));\n assert.throws(() => iModelDb.elements.deleteElement(unusedSubCategoryId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedSubCategoryId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSubCategoryId));\n\n // deleteDefinitionElements for an unused SpatialCategory should succeed, delete should still fail\n const unusedSpatialCategoryId = SpatialCategory.insert(iModelDb, definitionModelId, \"Unused SpatialCategory\", {});\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryId));\n const unusedSpatialCategory = iModelDb.elements.getElement<SpatialCategory>(unusedSpatialCategoryId, SpatialCategory);\n const unusedSpatialCategoryDefaultSubCategoryId = unusedSpatialCategory.myDefaultSubCategoryId();\n assert.isTrue(Id64.isValidId64(unusedSpatialCategoryDefaultSubCategoryId));\n assert.throws(() => iModelDb.elements.deleteElement(unusedSpatialCategoryId));\n assert.throws(() => iModelDb.elements.deleteElement(unusedSpatialCategoryDefaultSubCategoryId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedSpatialCategoryId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryId));\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedSpatialCategoryDefaultSubCategoryId));\n\n // delete/deleteDefinitionElements of a used DrawingCategory should fail\n assert.throws(() => iModelDb.elements.deleteElement(drawingCategoryId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([drawingCategoryId]);\n assert.isTrue(usedDefinitionElementIds.has(drawingCategoryId));\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategoryId));\n\n // deleteDefinitionElements for an unused DrawingCategory should succeed, delete should still fail\n const unusedDrawingCategoryId = DrawingCategory.insert(iModelDb, definitionModelId, \"Unused DrawingCategory\", {});\n assert.isTrue(Id64.isValidId64(unusedDrawingCategoryId));\n const unusedDrawingCategory = iModelDb.elements.getElement<DrawingCategory>(unusedDrawingCategoryId, DrawingCategory);\n const unusedDrawingSubCategoryId = unusedDrawingCategory.myDefaultSubCategoryId();\n assert.isTrue(Id64.isValidId64(unusedDrawingSubCategoryId));\n assert.throws(() => iModelDb.elements.deleteElement(unusedDrawingSubCategoryId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([unusedDrawingCategoryId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingCategoryId));\n assert.isUndefined(iModelDb.elements.tryGetElement(unusedDrawingSubCategoryId));\n\n // delete/deleteDefinitionElements of DefinitionElements used by an existing SpatialViewDefinition should fail\n assert.throws(() => iModelDb.elements.deleteElement(spatialCategorySelectorId));\n assert.throws(() => iModelDb.elements.deleteElement(modelSelectorId));\n assert.throws(() => iModelDb.elements.deleteElement(displayStyle3dId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([spatialCategorySelectorId, modelSelectorId, displayStyle3dId]);\n assert.isTrue(usedDefinitionElementIds.has(spatialCategorySelectorId));\n assert.isTrue(usedDefinitionElementIds.has(modelSelectorId));\n assert.isTrue(usedDefinitionElementIds.has(displayStyle3dId));\n assert.isDefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\n assert.isDefined(iModelDb.elements.tryGetElement(modelSelectorId));\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle3dId));\n assert.isDefined(iModelDb.elements.tryGetElement(viewId));\n\n // deleteDefinitionElements should succeed when the list includes the SpatialViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\n assert.throws(() => iModelDb.elements.deleteElement(viewId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([viewId, spatialCategorySelectorId, modelSelectorId, displayStyle3dId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isUndefined(iModelDb.elements.tryGetElement(spatialCategorySelectorId));\n assert.isUndefined(iModelDb.elements.tryGetElement(modelSelectorId));\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle3dId));\n assert.isUndefined(iModelDb.elements.tryGetElement(viewId));\n\n // delete/deleteDefinitionElements of DefinitionElements used by an existing DrawingViewDefinition should fail\n assert.throws(() => iModelDb.elements.deleteElement(drawingCategorySelectorId));\n assert.throws(() => iModelDb.elements.deleteElement(displayStyle2dId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([drawingCategorySelectorId, displayStyle2dId]);\n assert.isTrue(usedDefinitionElementIds.has(drawingCategorySelectorId));\n assert.isTrue(usedDefinitionElementIds.has(displayStyle2dId));\n assert.isDefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\n assert.isDefined(iModelDb.elements.tryGetElement(displayStyle2dId));\n assert.isDefined(iModelDb.elements.tryGetElement(drawingViewId));\n\n // deleteDefinitionElements should succeed when the list includes the DrawingViewDefinition as the only thing referencing other DefinitionElements, delete should still fail\n assert.throws(() => iModelDb.elements.deleteElement(drawingViewId));\n usedDefinitionElementIds = iModelDb.elements.deleteDefinitionElements([drawingViewId, drawingCategorySelectorId, displayStyle2dId]);\n assert.equal(usedDefinitionElementIds.size, 0);\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingCategorySelectorId));\n assert.isUndefined(iModelDb.elements.tryGetElement(displayStyle2dId));\n assert.isUndefined(iModelDb.elements.tryGetElement(drawingViewId));\n\n iModelDb.saveChanges();\n iModelDb.close();\n });\n});\n"]}