@itwin/core-backend 5.5.0-dev.1 → 5.5.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +2 -2
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +248 -248
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +5 -5
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +47 -47
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.js +8 -8
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.js.map +1 -1
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.js +1 -1
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
- package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/OnlineStatus.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BisCoreSchema.js.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +2 -2
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangedElementsDb.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +248 -248
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.js +5 -5
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/CustomViewState3dCreator.js.map +1 -1
- package/lib/esm/DevTools.js.map +1 -1
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSchemaXmlContext.js.map +1 -1
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/EntityReferences.js.map +1 -1
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/FontFile.js.map +1 -1
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/GeometrySummary.js +47 -47
- package/lib/esm/GeometrySummary.js.map +1 -1
- package/lib/esm/IModelDb.js +8 -8
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelDbFonts.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/ImageSourceConversion.js.map +1 -1
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.js +1 -1
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/NativeAppStorage.js.map +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/PromiseMemoizer.js.map +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/RpcBackend.js.map +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/Schema.js.map +1 -1
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/FunctionalSchema.js.map +1 -1
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/domains/GenericSchema.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/internal/FontFileImpl.js.map +1 -1
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/esm/internal/NativePlatform.js.map +1 -1
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/OnlineStatus.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/esm/rpc/multipart.js.map +1 -1
- package/lib/esm/rpc/tracing.js.map +1 -1
- package/lib/esm/rpc/web/logging.js.map +1 -1
- package/lib/esm/rpc/web/request.js.map +1 -1
- package/lib/esm/rpc/web/response.js.map +1 -1
- package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/AdvancedEqual.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/AttachDb.test.js +11 -11
- package/lib/esm/test/AttachDb.test.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.js +23 -23
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/GeometryTestUtil.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/KnownTestLocations.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +25 -25
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +53 -53
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +88 -88
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +72 -72
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
- package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
- package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +22 -22
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +13 -13
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/FontFile.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +40 -40
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/imageData.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +44 -44
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/misc/DevTools.test.js.map +1 -1
- package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
- package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
- package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/rpc/response.test.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +124 -124
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Setting.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextBlock.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/TextBlock.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { expect } from \"chai\";\r\nimport { computeGraphemeOffsets, ComputeGraphemeOffsetsArgs, layoutTextBlock, LineLayout, RunLayout, TextBlockLayout, TextLayoutRanges, TextStyleResolver } from \"../../annotations/TextBlockLayout\";\r\nimport { Geometry, Range2d } from \"@itwin/core-geometry\";\r\nimport { ColorDef, FontType, FractionRun, LineBreakRun, LineLayoutResult, List, ListMarkerEnumerator, Paragraph, ParagraphProps, Run, RunLayoutResult, TabRun, TextAnnotation, TextAnnotationAnchor, TextBlock, TextBlockGeometryPropsEntry, TextBlockLayoutResult, TextBlockMargins, TextJustification, TextRun, TextStringProps, TextStyleSettings } from \"@itwin/core-common\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { Id64String, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { produceTextBlockGeometry } from \"../../core-backend\";\r\nimport { computeTextRangeAsStringLength, doLayout } from \"../AnnotationTestUtils\";\r\n\r\nfunction makeTextRun(content: string): TextRun {\r\n return TextRun.create({ content });\r\n}\r\n\r\nfunction isIntlSupported(): boolean {\r\n // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile\r\n // users are not expected to do any editing, but long term we will attempt to find a better\r\n // solution.\r\n return !ProcessDetector.isMobileAppBackend;\r\n}\r\n\r\nfunction findTextStyleImpl(id: Id64String): TextStyleSettings {\r\n if (id === \"0x42\") {\r\n return TextStyleSettings.fromJSON({ lineSpacingFactor: 12, font: { name: \"block\" }, isBold: true });\r\n }\r\n\r\n return TextStyleSettings.fromJSON({ lineSpacingFactor: 1, font: { name: \"other\" } });\r\n}\r\n\r\ndescribe(\"layoutTextBlock\", () => {\r\n describe(\"resolves TextStyleSettings\", () => {\r\n it(\"inherits styling from TextBlock when Paragraph and Run have no style overrides\", () => {\r\n const textBlock = TextBlock.create();\r\n const run = TextRun.create({ content: \"test\" });\r\n textBlock.appendParagraph();\r\n textBlock.appendRun(run);\r\n\r\n const tb = doLayout(textBlock, {\r\n textStyleId: \"0x42\",\r\n findTextStyle: findTextStyleImpl,\r\n });\r\n\r\n expect(tb.lines.length).to.equal(1);\r\n expect(tb.lines[0].runs.length).to.equal(1);\r\n\r\n const runStyle = tb.lines[0].runs[0].style;\r\n expect(runStyle.font.name).to.equal(\"block\");\r\n expect(runStyle.lineSpacingFactor).to.equal(12);\r\n expect(runStyle.isBold).to.be.true;\r\n });\r\n\r\n it(\"inherits style overrides from Paragraph when Run has no style overrides\", () => {\r\n const textBlock = TextBlock.create();\r\n textBlock.appendParagraph({ styleOverrides: { font: { name: \"paragraph\" } } });\r\n textBlock.appendRun(TextRun.create({ content: \"test\" }));\r\n\r\n const tb = doLayout(textBlock, {\r\n textStyleId: \"0x42\",\r\n findTextStyle: findTextStyleImpl,\r\n });\r\n\r\n expect(tb.lines.length).to.equal(1);\r\n expect(tb.lines[0].runs.length).to.equal(1);\r\n\r\n const runStyle = tb.lines[0].runs[0].style;\r\n expect(runStyle.font.name).to.equal(\"paragraph\");\r\n expect(runStyle.isBold).to.be.true;\r\n });\r\n\r\n it(\"uses Run style overrides when Run has overrides\", () => {\r\n const textBlock = TextBlock.create();\r\n textBlock.appendParagraph({ styleOverrides: { lineSpacingFactor: 55, font: { name: \"paragraph\" } } });\r\n textBlock.appendRun(TextRun.create({ content: \"test\", styleOverrides: { lineSpacingFactor: 99, font: { name: \"run\" } } }));\r\n\r\n const tb = doLayout(textBlock, {\r\n textStyleId: \"0x42\",\r\n findTextStyle: findTextStyleImpl,\r\n });\r\n\r\n expect(tb.lines.length).to.equal(1);\r\n expect(tb.lines[0].runs.length).to.equal(1);\r\n\r\n const runStyle = tb.lines[0].runs[0].style;\r\n expect(runStyle.font.name).to.equal(\"run\");\r\n expect(runStyle.isBold).to.be.true;\r\n });\r\n\r\n it(\"still uses TextBlock specific styles when Run has style overrides\", () => {\r\n // Some style settings make sense on a TextBlock, so they are always applied from the TextBlock, even if the Run has a style override.\r\n const textBlock = TextBlock.create();\r\n const run = TextRun.create({ content: \"test\", styleOverrides: { lineSpacingFactor: 99, font: { name: \"run\" } } });\r\n textBlock.appendParagraph();\r\n textBlock.appendRun(run);\r\n\r\n const tb = doLayout(textBlock, {\r\n textStyleId: \"0x42\",\r\n findTextStyle: findTextStyleImpl,\r\n });\r\n\r\n expect(tb.lines.length).to.equal(1);\r\n expect(tb.lines[0].runs.length).to.equal(1);\r\n\r\n const runStyle = tb.lines[0].runs[0].style;\r\n expect(runStyle.lineSpacingFactor).to.equal(12);\r\n });\r\n\r\n it(\"inherits overrides from TextBlock, Paragraph and Run when there is no styleId\", () => {\r\n const textBlock = TextBlock.create({ styleOverrides: { widthFactor: 34, textHeight: 3, lineSpacingFactor: 12, paragraphSpacingFactor: 2, isBold: true } });\r\n const run = TextRun.create({ content: \"test\", styleOverrides: { widthFactor: 78, font: { name: \"override\" }, leader: { wantElbow: true } } });\r\n textBlock.appendParagraph({ styleOverrides: { textHeight: 56, paragraphSpacingFactor: 25, color: 0xff0000, frame: { shape: \"octagon\" } } });\r\n textBlock.appendRun(run);\r\n\r\n const tb = doLayout(textBlock, {\r\n findTextStyle: findTextStyleImpl,\r\n });\r\n\r\n expect(tb.lines.length).to.equal(1);\r\n expect(tb.lines[0].runs.length).to.equal(1);\r\n\r\n const runStyle = tb.lines[0].runs[0].style;\r\n // widthFactor is always taken from the TextBlock, even if the Run has overrides\r\n expect(runStyle.widthFactor).to.equal(34);\r\n // paragraphSpacingFactor is always taken from the TextBlock, even if the Run has overrides\r\n expect(runStyle.paragraphSpacingFactor).to.equal(2);\r\n // lineSpacingFactor is always taken from the TextBlock, even if the Run has overrides\r\n expect(runStyle.lineSpacingFactor).to.equal(12);\r\n // frame settings are always taken from the TextBlock, even if the Paragraph or Run has overrides\r\n expect(runStyle.frame.shape).to.equal(\"none\");\r\n // leader settings are always taken from the TextBlock, even if the Paragraph or Run has overrides\r\n expect(runStyle.leader.wantElbow).to.be.false;\r\n expect(runStyle.font.name).to.equal(\"override\");\r\n expect(runStyle.color).to.equal(0xff0000);\r\n expect(runStyle.isBold).to.be.true;\r\n expect(runStyle.textHeight).to.equal(56);\r\n });\r\n\r\n it(\"does not inherit overrides in TextBlock or Paragraph when Run has same propertied overriden - unless they are TextBlock specific settings\", () => {\r\n const textBlock = TextBlock.create({ styleOverrides: { widthFactor: 34, margins: { left: 3 }, textHeight: 3, lineSpacingFactor: 12, paragraphSpacingFactor: 2, isBold: true, justification: \"center\" } });\r\n const run = TextRun.create({ content: \"test\", styleOverrides: { widthFactor: 78, margins: { left: 4, right: 3 }, textHeight: 6, paragraphSpacingFactor: 25, lineSpacingFactor: 24, font: { name: \"override\" }, isBold: false, justification: \"right\" } });\r\n textBlock.appendParagraph({ styleOverrides: { textHeight: 56, paragraphSpacingFactor: 50, color: 0xff0000, justification: \"left\" } });\r\n textBlock.appendRun(run);\r\n\r\n const tb = doLayout(textBlock, {\r\n textStyleId: \"0x42\",\r\n findTextStyle: findTextStyleImpl,\r\n });\r\n\r\n expect(tb.lines.length).to.equal(1);\r\n expect(tb.lines[0].runs.length).to.equal(1);\r\n\r\n const runStyle = tb.lines[0].runs[0].style;\r\n // widthFactor is always taken from the TextBlock, even if the Run has a styleId or overrides\r\n expect(runStyle.widthFactor).to.equal(34);\r\n // paragraphSpacingFactor is always taken from the TextBlock, even if the Run has overrides\r\n expect(runStyle.paragraphSpacingFactor).to.equal(2);\r\n // lineSpacingFactor is always taken from the TextBlock, even if the Run has a styleId or overrides\r\n expect(runStyle.lineSpacingFactor).to.equal(12);\r\n // margins are always taken from the TextBlock, even if the Paragraph or Run has overrides\r\n expect(runStyle.margins.left).to.equal(3);\r\n expect(runStyle.margins.right).to.equal(0);\r\n // justification is always taken from the TextBlock, even if the Paragraph or Run has overrides\r\n expect(runStyle.justification).to.equal(\"center\");\r\n expect(runStyle.font.name).to.equal(\"override\");\r\n expect(runStyle.color).to.equal(0xff0000);\r\n expect(runStyle.isBold).to.be.false;\r\n expect(runStyle.textHeight).to.equal(6);\r\n });\r\n\r\n it(\"takes child overrides over parent overrides\", () => {\r\n //...unless they are TextBlock specific as covered in other tests\r\n const textBlock = TextBlock.create({ styleOverrides: { font: { name: \"grandparent\" } } });\r\n const run = TextRun.create({ content: \"test\", styleOverrides: { font: { name: \"child\" } } });\r\n textBlock.appendParagraph({ styleOverrides: { font: { name: \"parent\" } } });\r\n textBlock.appendRun(run);\r\n\r\n const tb = doLayout(textBlock, {\r\n findTextStyle: findTextStyleImpl,\r\n });\r\n\r\n expect(tb.lines.length).to.equal(1);\r\n expect(tb.lines[0].runs.length).to.equal(1);\r\n\r\n const runStyle = tb.lines[0].runs[0].style;\r\n expect(runStyle.font.name).to.equal(\"child\");\r\n });\r\n });\r\n\r\n it(\"has consistent data when converted to a layout result\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n // Initialize a new TextBlockLayout object\r\n const textBlock = TextBlock.create({ width: 50, styleOverrides: { widthFactor: 34, color: 0x00ff00, font: { name: \"arial\" } } });\r\n const run0 = TextRun.create({\r\n content: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium mi sit amet magna malesuada, at venenatis ante eleifend.\",\r\n styleOverrides: { textHeight: 56, color: 0xff0000 },\r\n });\r\n const run1 = TextRun.create({\r\n content: \"Donec sit amet semper sapien. Nullam commodo, libero a accumsan lacinia, metus enim pharetra lacus, eu facilisis sem nisi eu dui.\",\r\n styleOverrides: { widthFactor: 78, font: { name: \"run1\" } },\r\n });\r\n const run2 = TextRun.create({\r\n content: \"Duis dui quam, suscipit quis feugiat id, fermentum ut augue. Mauris iaculis odio rhoncus lorem eleifend, posuere viverra turpis elementum.\",\r\n styleOverrides: {},\r\n });\r\n const fractionRun = FractionRun.create({ numerator: \"num\", denominator: \"denom\", styleOverrides: {} });\r\n textBlock.appendRun(run0);\r\n textBlock.appendRun(fractionRun);\r\n textBlock.appendParagraph();\r\n textBlock.appendRun(run1);\r\n textBlock.appendRun(run2);\r\n\r\n // Call the toResult() method\r\n const textBlockLayout = doLayout(\r\n textBlock,\r\n {\r\n findFontId: (fontName: string) => {\r\n if (fontName === \"arial\") {\r\n return 1;\r\n } else if (fontName === \"run1\") {\r\n return 2;\r\n }\r\n return 0;\r\n },\r\n });\r\n const result = textBlockLayout.toResult();\r\n\r\n // Assert that the result object has the same data as the original TextBlockLayout object\r\n expect(result.range).to.deep.equal(textBlockLayout.range.toJSON());\r\n expect(result.lines.length).to.equal(textBlockLayout.lines.length);\r\n\r\n // Loop through each line in the result and the original object\r\n for (let i = 0; i < result.lines.length; i++) {\r\n const resultLine: LineLayoutResult = result.lines[i];\r\n const originalLine: LineLayout = textBlockLayout.lines[i];\r\n\r\n // Ranges match\r\n expect(resultLine.range).to.deep.equal(originalLine.range.toJSON());\r\n expect(resultLine.justificationRange).to.deep.equal(originalLine.justificationRange.toJSON());\r\n // Offset matches\r\n expect(resultLine.offsetFromDocument).to.deep.equal(originalLine.offsetFromDocument);\r\n\r\n for (let j = 0; j < resultLine.runs.length; j++) {\r\n const resultRun: RunLayoutResult = resultLine.runs[j];\r\n const originalRun: RunLayout = originalLine.runs[j];\r\n\r\n // FontId matches\r\n expect(resultRun.fontId).to.equal(originalRun.fontId);\r\n // Offsets match\r\n expect(resultRun.characterOffset).to.equal(originalRun.charOffset);\r\n expect(resultRun.characterCount).to.equal(originalRun.numChars);\r\n expect(resultRun.offsetFromLine).to.deep.equal(originalRun.offsetFromLine);\r\n // Range matches\r\n expect(resultRun.range).to.deep.equal(originalRun.range.toJSON());\r\n // Text style matches\r\n expect(resultRun.textStyle).to.deep.equal(originalRun.style.toJSON());\r\n // Optional values match existence and values\r\n if (resultRun.justificationRange) {\r\n expect(originalRun.justificationRange);\r\n }\r\n if (originalRun.justificationRange) {\r\n expect(resultRun.justificationRange);\r\n }\r\n if (resultRun.justificationRange && originalRun.justificationRange) {\r\n expect(resultRun.justificationRange).to.deep.equal(originalRun.justificationRange.toJSON());\r\n }\r\n if (resultRun.numeratorRange) {\r\n expect(originalRun.numeratorRange);\r\n }\r\n if (originalRun.numeratorRange) {\r\n expect(resultRun.numeratorRange);\r\n }\r\n if (resultRun.numeratorRange && originalRun.numeratorRange) {\r\n expect(resultRun.numeratorRange).to.deep.equal(originalRun.numeratorRange.toJSON());\r\n }\r\n if (resultRun.denominatorRange) {\r\n expect(originalRun.denominatorRange);\r\n }\r\n if (originalRun.denominatorRange) {\r\n expect(resultRun.denominatorRange);\r\n }\r\n if (resultRun.denominatorRange && originalRun.denominatorRange) {\r\n expect(resultRun.denominatorRange).to.deep.equal(originalRun.denominatorRange.toJSON());\r\n }\r\n\r\n // Check that the result string matches what we expect\r\n const inputRun = originalRun.source;\r\n if (inputRun.type === \"text\") {\r\n const resultText = inputRun.content.substring(resultRun.characterOffset, resultRun.characterOffset + resultRun.characterCount);\r\n const originalText = inputRun.content.substring(originalRun.charOffset, originalRun.charOffset + originalRun.numChars);\r\n expect(resultText).to.equal(originalText);\r\n }\r\n }\r\n }\r\n });\r\n\r\n it(\"adds margins\", function () {\r\n const expectMargins = (layoutRange: Range2d, marginRange: Range2d, margins: TextBlockMargins) => {\r\n expect(marginRange.low.x).to.equal(layoutRange.low.x - (margins.left ?? 0));\r\n expect(marginRange.high.x).to.equal(layoutRange.high.x + (margins.right ?? 0));\r\n expect(marginRange.low.y).to.equal(layoutRange.low.y - (margins.bottom ?? 0));\r\n expect(marginRange.high.y).to.equal(layoutRange.high.y + (margins.top ?? 0));\r\n }\r\n\r\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor: 0 } });\r\n textBlock.appendRun(makeTextRun(\"abc\"));\r\n textBlock.appendRun(makeTextRun(\"defg\"));\r\n\r\n const marginStyleCallback = (margins: TextBlockMargins) => {\r\n return () => TextStyleSettings.fromJSON({ margins: { ...margins } })\r\n }\r\n\r\n let layout = doLayout(textBlock, {\r\n findTextStyle: marginStyleCallback({}),\r\n });\r\n\r\n // Margins should be 0 by default\r\n expect(layout.range.isAlmostEqual(layout.textRange)).to.be.true;\r\n expectMargins(layout.textRange, layout.range, {});\r\n\r\n // All margins should be applied to the range\r\n layout = doLayout(textBlock, {\r\n findTextStyle: marginStyleCallback({ left: 1, right: 2, top: 3, bottom: 4 }),\r\n });\r\n\r\n expectMargins(layout.textRange, layout.range, { left: 1, right: 2, top: 3, bottom: 4 });\r\n\r\n // Just horizontal margins should be applied\r\n layout = doLayout(textBlock, {\r\n findTextStyle: marginStyleCallback({ left: 1, right: 2 }),\r\n });\r\n\r\n expectMargins(layout.textRange, layout.range, { left: 1, right: 2 });\r\n\r\n // Just vertical margins should be applied\r\n layout = doLayout(textBlock, {\r\n findTextStyle: marginStyleCallback({ top: 1, bottom: 2 }),\r\n });\r\n\r\n expectMargins(layout.textRange, layout.range, { top: 1, bottom: 2 });\r\n });\r\n\r\n describe(\"range\", () => {\r\n const round = (num: number, numDecimalPlaces: number) => {\r\n const multiplier = Math.pow(100, numDecimalPlaces);\r\n return Math.round(num * multiplier) / multiplier;\r\n };\r\n\r\n it(\"aligns text of the same size on the bottom of the line\", () => {\r\n const textBlock = TextBlock.create();\r\n const run1 = TextRun.create({ content: \"abc\" });\r\n const run2 = TextRun.create({ content: \"defg\" });\r\n textBlock.appendRun(run1);\r\n textBlock.appendRun(run2);\r\n\r\n const layout = doLayout(textBlock);\r\n const run1Layout = layout.lines[0].runs[0];\r\n const run2Layout = layout.lines[0].runs[1];\r\n\r\n expect(run1Layout.range.yLength()).to.equal(1);\r\n expect(run2Layout.range.yLength()).to.equal(1);\r\n\r\n expect(run1Layout.offsetFromLine.y).to.equal(0);\r\n expect(run2Layout.offsetFromLine.y).to.equal(0);\r\n });\r\n\r\n it(\"aligns text of varying sizes to the baseline of the largest text\", () => {\r\n const textBlock = TextBlock.create();\r\n const smallText = TextRun.create({ content: \"small\", styleOverrides: { textHeight: 1 } });\r\n const largeText = TextRun.create({ content: \"large\", styleOverrides: { textHeight: 3 } });\r\n textBlock.appendRun(smallText);\r\n textBlock.appendRun(largeText);\r\n\r\n const layout = doLayout(textBlock);\r\n const smallLayout = layout.lines[0].runs[0];\r\n const largeLayout = layout.lines[0].runs[1];\r\n\r\n expect(smallLayout.range.yLength()).to.equal(1);\r\n expect(largeLayout.range.yLength()).to.equal(3);\r\n\r\n expect(largeLayout.offsetFromLine.y).to.equal(0);\r\n expect(smallLayout.offsetFromLine.y).to.equal(0);\r\n });\r\n\r\n it(\"aligns text to center based on height of the largest stacked fraction\", () => {\r\n const textBlock = TextBlock.create();\r\n const fractionRun = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleOverrides: { textHeight: 4 } });\r\n const textRun = TextRun.create({ content: \"text\", styleOverrides: { textHeight: 2 } });\r\n textBlock.appendRun(fractionRun);\r\n textBlock.appendRun(textRun);\r\n\r\n const layout = doLayout(textBlock);\r\n const fractionLayout = layout.lines[0].runs[0];\r\n const textLayout = layout.lines[0].runs[1];\r\n\r\n expect(round(fractionLayout.range.yLength(), 2)).to.equal(7);\r\n expect(textLayout.range.yLength()).to.equal(2);\r\n\r\n // Fraction should be defining the line height\r\n expect(fractionLayout.offsetFromLine.y).to.equal(0);\r\n expect(round(textLayout.offsetFromLine.y, 2)).to.equal(2.5);\r\n });\r\n\r\n it(\"aligns the largest non-fraction text to the center based on height of stacked fraction and aligns all other text to the baseline\", () => {\r\n const textBlock = TextBlock.create();\r\n const smallText = TextRun.create({ content: \"s\", styleOverrides: { textHeight: 1 } });\r\n const mediumText = TextRun.create({ content: \"m\", styleOverrides: { textHeight: 2 } });\r\n const fraction = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleOverrides: { textHeight: 4 } });\r\n textBlock.appendRun(smallText);\r\n textBlock.appendRun(mediumText);\r\n textBlock.appendRun(fraction);\r\n\r\n const layout = doLayout(textBlock);\r\n const smallLayout = layout.lines[0].runs[0];\r\n const mediumLayout = layout.lines[0].runs[1];\r\n const fractionLayout = layout.lines[0].runs[2];\r\n\r\n expect(smallLayout.range.yLength()).to.equal(1);\r\n expect(mediumLayout.range.yLength()).to.equal(2);\r\n expect(round(fractionLayout.range.yLength(), 2)).to.equal(7);\r\n\r\n expect(round(mediumLayout.offsetFromLine.y, 2)).to.equal(2.5);\r\n expect(round(smallLayout.offsetFromLine.y, 2)).to.equal(2.5);\r\n expect(fractionLayout.offsetFromLine.y).to.equal(0);\r\n });\r\n\r\n it(\"aligns fractions to the baseline of same sized text\", () => {\r\n const textBlock = TextBlock.create();\r\n const text = TextRun.create({ content: \"t\", styleOverrides: { textHeight: 3 } });\r\n const fraction = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleOverrides: { textHeight: 3 } });\r\n\r\n textBlock.appendRun(text);\r\n textBlock.appendRun(fraction);\r\n\r\n const layout = doLayout(textBlock);\r\n const textLayout = layout.lines[0].runs[0];\r\n const fractionLayout = layout.lines[0].runs[1];\r\n\r\n expect(textLayout.range.yLength()).to.equal(3);\r\n expect(round(fractionLayout.range.yLength(), 2)).to.equal(5.25);\r\n\r\n expect(round(textLayout.offsetFromLine.y, 3)).to.equal(1.125);\r\n\r\n // Slightly lower than text baseline so that the fraction appears centered on the text\r\n expect(round(fractionLayout.offsetFromLine.y, 3)).to.equal(0.075);\r\n });\r\n\r\n it(\"produces one line per paragraph if document width <= 0\", () => {\r\n const lineSpacingFactor = 0.5;\r\n const paragraphSpacingFactor = 0.25;\r\n const textBlock = TextBlock.create({ styleOverrides: { paragraphSpacingFactor, lineSpacingFactor } });\r\n for (let i = 0; i < 4; i++) {\r\n const layout = doLayout(textBlock);\r\n if (i === 0) {\r\n expect(layout.range.isNull).to.be.true;\r\n } else {\r\n expect(layout.lines.length).to.equal(i);\r\n expect(layout.range.low.x).to.equal(0);\r\n expect(layout.range.low.y).to.equal(-i - ((i - 1) * (lineSpacingFactor + paragraphSpacingFactor)));\r\n expect(layout.range.high.x).to.equal(i * 3);\r\n expect(layout.range.high.y).to.equal(0);\r\n }\r\n\r\n for (let l = 0; l < layout.lines.length; l++) {\r\n const line = layout.lines[l];\r\n expect(line.runs.length).to.equal(l + 1);\r\n expect(line.range.low.x).to.equal(0);\r\n expect(line.range.low.y).to.equal(0);\r\n expect(line.range.high.y).to.equal(1);\r\n expect(line.range.high.x).to.equal(3 * (l + 1));\r\n for (const run of line.runs) {\r\n expect(run.charOffset).to.equal(0);\r\n expect(run.numChars).to.equal(3);\r\n expect(run.range.low.x).to.equal(0);\r\n expect(run.range.low.y).to.equal(0);\r\n expect(run.range.high.x).to.equal(3);\r\n expect(run.range.high.y).to.equal(1);\r\n }\r\n }\r\n\r\n const p = textBlock.appendParagraph();\r\n for (let j = 0; j <= i; j++) {\r\n p.children.push(TextRun.create({ content: \"Run\" }));\r\n }\r\n }\r\n });\r\n\r\n it(\"produces a new line for each LineBreakRun\", () => {\r\n const lineSpacingFactor = 0.5;\r\n const textHeight = 1;\r\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor, textHeight } });\r\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n textBlock.appendRun(TextRun.create({ content: \"def\" }));\r\n textBlock.appendRun(TextRun.create({ content: \"ghi\" }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n textBlock.appendRun(TextRun.create({ content: \"jkl\" }));\r\n\r\n const tb = doLayout(textBlock);\r\n expect(tb.lines.length).to.equal(3);\r\n expect(tb.lines[0].runs.length).to.equal(2);\r\n expect(tb.lines[1].runs.length).to.equal(3);\r\n expect(tb.lines[2].runs.length).to.equal(1);\r\n\r\n expect(tb.range.low.x).to.equal(0);\r\n expect(tb.range.high.x).to.equal(6);\r\n expect(tb.range.high.y).to.equal(0);\r\n // paragraphSpacingFactor should not be applied to linebreaks, but lineSpacingFactor should.\r\n expect(tb.range.low.y).to.equal(-(lineSpacingFactor * 2 + textHeight * 3));\r\n });\r\n\r\n it(\"applies tab shifts\", () => {\r\n const textHeight = 1;\r\n const tabInterval = 6;\r\n const textBlock = TextBlock.create({ styleOverrides: { textHeight, tabInterval } });\r\n\r\n // Appends a line that looks like `stringOne` TAB `stringTwo` LINEBREAK\r\n const appendLine = (stringOne: string, stringTwo: string, wantLineBreak: boolean = true) => {\r\n if (stringOne.length > 0) textBlock.appendRun(TextRun.create({ content: stringOne }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\r\n if (stringTwo.length > 0) textBlock.appendRun(TextRun.create({ content: stringTwo }));\r\n if (wantLineBreak) textBlock.appendRun(LineBreakRun.create());\r\n }\r\n\r\n // The extra comments are intentional to show where the tab stops should be.\r\n appendLine(\"\", /*______*/ \"a\");\r\n appendLine(\"\", /*______*/ \"bc\");\r\n appendLine(\"a\", /*_____*/ \"a\");\r\n appendLine(\"bc\", /*____*/ \"bc\");\r\n appendLine(\"cde\", /*___*/ \"cde\");\r\n appendLine(\"cdefg\", /*_*/ \"cde\"); // this one is the max tab distance before needing to move to the next tab stop\r\n appendLine(\"cdefgh\", /*______*/ \"cde\"); // This one should push to the next tab stop.\r\n appendLine(\"cdefghi\", /*_____*/ \"cde\", false); // This one should push to the next tab stop.\r\n\r\n const tb = doLayout(textBlock);\r\n tb.lines.forEach((line, index) => {\r\n const firstTextRun = (line.runs[0].source.type === \"text\") ? line.runs[0] : undefined;\r\n const firstTabRun = (line.runs[0].source.type === \"tab\") ? line.runs[0] : line.runs[1];\r\n\r\n const distance = (firstTextRun?.range.xLength() ?? 0) + firstTabRun.range.xLength();\r\n const expectedDistance = ((firstTextRun?.range.xLength() || 0) >= tabInterval) ? tabInterval * 2 : tabInterval;\r\n expect(distance).to.equal(expectedDistance, `Line ${index} does not have the expected tab distance. ${expectedDistance}`);\r\n });\r\n });\r\n\r\n it(\"applies consecutive tab shifts\", () => {\r\n const textHeight = 1;\r\n const tabInterval = 6;\r\n const textBlock = TextBlock.create({ styleOverrides: { textHeight, tabInterval } });\r\n\r\n // line 0: ----->----->----->LINEBREAK\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n\r\n // line 1: abc-->----->LINEBREAK\r\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n\r\n // line 2: abc--->->------>LINEBREAK\r\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 2 } }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n\r\n // line 3: abc--->1/23->abcde->LINEBREAK\r\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\r\n textBlock.appendRun(FractionRun.create({ numerator: \"1\", denominator: \"23\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\r\n textBlock.appendRun(TextRun.create({ content: \"abcde\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n\r\n const tb = doLayout(textBlock);\r\n\r\n const line0 = tb.lines[0];\r\n const line1 = tb.lines[1];\r\n const line2 = tb.lines[2];\r\n const line3 = tb.lines[3];\r\n\r\n expect(line0.runs.length).to.equal(4);\r\n expect(line0.range.xLength()).to.equal(3 * tabInterval, `Lines with tabs should have the correct range length`);\r\n\r\n expect(line1.runs.length).to.equal(4);\r\n expect(line1.range.xLength()).to.equal(2 * tabInterval, `Tabs should be applied correctly when they are at the end of a line`);\r\n\r\n expect(line2.runs.length).to.equal(5);\r\n expect(line2.range.xLength()).to.equal(7 + 2 + 7, `Multiple tabs with different intervals should be applied correctly`);\r\n\r\n expect(line3.runs.length).to.equal(7);\r\n expect(line3.range.xLength()).to.equal(7 + 3 + 7, `Multiple tabs with different intervals should be applied correctly`);\r\n });\r\n\r\n it(\"computes ranges based on custom line spacing, text height, and indentation\", () => {\r\n const lineSpacingFactor = 2;\r\n const textHeight = 3;\r\n const paragraphSpacingFactor = 13;\r\n const indentation = 7;\r\n\r\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor, textHeight, paragraphSpacingFactor, indentation } });\r\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n textBlock.appendRun(TextRun.create({ content: \"def\" }));\r\n textBlock.appendRun(TextRun.create({ content: \"ghi\" }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n textBlock.appendRun(TextRun.create({ content: \"jkl\" }));\r\n\r\n const tb = doLayout(textBlock);\r\n expect(tb.lines.length).to.equal(3);\r\n expect(tb.lines[0].runs.length).to.equal(2);\r\n expect(tb.lines[1].runs.length).to.equal(3);\r\n expect(tb.lines[2].runs.length).to.equal(1);\r\n\r\n /* Final TextBlock should look like:\r\n ⇥abc↵\r\n ⇥defghi↵\r\n ⇥jkl\r\n\r\n Where ↵ = LineBreak, ¶ = ParagraphBreak, ⇥ = indentation\r\n\r\n We have 3 lines each `textHeight` high, plus 2 line breaks in between each `textHeight*lineSpacingFactor` high.\r\n No paragraph spacing should be applied since there is one paragraph.\r\n */\r\n\r\n expect(tb.range.low.x).to.equal(7);\r\n expect(tb.range.high.x).to.equal(6 + 7); // 7 for indentation, 6 for the length of \"defghi\"\r\n expect(tb.range.high.y).to.equal(0);\r\n expect(tb.range.low.y).to.equal(-(textHeight * 3 + (textHeight * lineSpacingFactor) * 2));\r\n\r\n expect(tb.lines[0].offsetFromDocument.y).to.equal(-textHeight);\r\n expect(tb.lines[1].offsetFromDocument.y).to.equal(tb.lines[0].offsetFromDocument.y - (textHeight + textHeight * lineSpacingFactor));\r\n expect(tb.lines[2].offsetFromDocument.y).to.equal(tb.lines[1].offsetFromDocument.y - (textHeight + textHeight * lineSpacingFactor));\r\n\r\n tb.lines.forEach((line) => expect(line.offsetFromDocument.x).to.equal(7));\r\n });\r\n\r\n it(\"computes paragraph spacing and indentation\", () => {\r\n const lineSpacingFactor = 2;\r\n const textHeight = 3;\r\n const paragraphSpacingFactor = 13;\r\n const indentation = 7;\r\n const tabInterval = 5;\r\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor, textHeight, paragraphSpacingFactor, indentation, tabInterval } });\r\n\r\n const p1 = textBlock.appendParagraph();\r\n p1.children.push(TextRun.create({ content: \"abc\" })); // Line 1\r\n p1.children.push(LineBreakRun.create());\r\n p1.children.push(TextRun.create({ content: \"def\" })); // Line 2\r\n\r\n const p2 = textBlock.appendParagraph();\r\n p2.children.push(TextRun.create({ content: \"ghi\" })); // Line 3\r\n\r\n const list = List.create();\r\n list.children.push(Paragraph.create({ children: [{ type: \"text\", content: \"list item 1\" }] })); // Line 4\r\n list.children.push(Paragraph.create({ children: [{ type: \"text\", content: \"list item 2\" }] })); // Line 5\r\n list.children.push(Paragraph.create({ children: [{ type: \"text\", content: \"list item 3\" }] })); // Line 6\r\n p2.children.push(list);\r\n\r\n const tb = doLayout(textBlock);\r\n expect(tb.lines.length).to.equal(6);\r\n\r\n /* Final TextBlock should look like:\r\n ⇥abc↵\r\n ⇥def¶\r\n ⇥ghi¶\r\n ⇥→1. list item 1¶\r\n ⇥→2. list item 2¶\r\n ⇥→3. list item 3\r\n\r\n Where ↵ = LineBreak, ¶ = ParagraphBreak, → = tabInterval/2, ⇥ = indentation\r\n\r\n We have:\r\n 6 lines each `textHeight` high\r\n 5 line breaks in between each `textHeight*lineSpacingFactor` high\r\n 4 paragraph breaks in between each `textHeight*paragraphSpacingFactor` high\r\n */\r\n\r\n expect(tb.range.low.x).to.equal(7); // 7 for indentation\r\n expect(tb.range.high.x).to.equal(7 + 5 + 11); // 7 for indentation, 5 for the tab stop, 11 for the length of \"list item 1\"\r\n expect(tb.range.high.y).to.equal(0);\r\n expect(tb.range.low.y).to.equal(-(textHeight * 6 + (textHeight * lineSpacingFactor) * 5 + (textHeight * paragraphSpacingFactor) * 4));\r\n\r\n // Cumulative vertical offsets to help make the test more readable.\r\n let offsetY = -textHeight;\r\n let offsetX = indentation;\r\n\r\n expect(tb.lines[0].offsetFromDocument.y).to.equal(offsetY);\r\n expect(tb.lines[0].offsetFromDocument.x).to.equal(offsetX);\r\n\r\n offsetY -= (textHeight + textHeight * lineSpacingFactor);\r\n expect(tb.lines[1].offsetFromDocument.y).to.equal(offsetY);\r\n expect(tb.lines[1].offsetFromDocument.x).to.equal(offsetX);\r\n\r\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\r\n expect(tb.lines[2].offsetFromDocument.y).to.equal(offsetY);\r\n expect(tb.lines[2].offsetFromDocument.x).to.equal(offsetX);\r\n\r\n offsetX += tabInterval; // List items are indented using tabInterval.\r\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\r\n expect(tb.lines[3].offsetFromDocument.y).to.equal(offsetY);\r\n expect(tb.lines[3].offsetFromDocument.x).to.equal(offsetX);\r\n\r\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\r\n expect(tb.lines[4].offsetFromDocument.y).to.equal(offsetY);\r\n expect(tb.lines[4].offsetFromDocument.x).to.equal(offsetX);\r\n\r\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\r\n expect(tb.lines[5].offsetFromDocument.y).to.equal(offsetY);\r\n expect(tb.lines[5].offsetFromDocument.x).to.equal(offsetX);\r\n });\r\n\r\n function expectRange(width: number, height: number, range: Range2d): void {\r\n expect(range.xLength()).to.equal(width);\r\n expect(range.yLength()).to.equal(height);\r\n }\r\n\r\n it(\"computes range for wrapped lines\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ width: 3, styleOverrides: { textHeight: 1, lineSpacingFactor: 0 } });\r\n\r\n function expectBlockRange(width: number, height: number): void {\r\n const layout = doLayout(block);\r\n expectRange(width, height, layout.range);\r\n }\r\n\r\n block.appendRun(makeTextRun(\"abc\"));\r\n expectBlockRange(3, 1);\r\n\r\n block.appendRun(makeTextRun(\"defg\"));\r\n expectBlockRange(4, 2);\r\n\r\n block.width = 1;\r\n expectBlockRange(4, 2);\r\n\r\n block.width = 8;\r\n expectBlockRange(8, 1);\r\n\r\n block.width = 6;\r\n expectBlockRange(6, 2);\r\n\r\n block.width = 10;\r\n expectBlockRange(10, 1);\r\n block.appendRun(makeTextRun(\"hijk\"));\r\n expectBlockRange(10, 2);\r\n });\r\n\r\n it(\"computes range for split runs\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ styleOverrides: { textHeight: 1, lineSpacingFactor: 0 } });\r\n\r\n function expectBlockRange(width: number, height: number): void {\r\n const layout = doLayout(block);\r\n expectRange(width, height, layout.range);\r\n }\r\n\r\n const sentence = \"a bc def ghij klmno\";\r\n expect(sentence.length).to.equal(19);\r\n block.appendRun(makeTextRun(sentence));\r\n\r\n block.width = 19;\r\n expectBlockRange(19, 1);\r\n\r\n block.width = 10;\r\n expectBlockRange(10, 2);\r\n });\r\n\r\n it(\"computes range for list markers and list items based on indentation\", function () {\r\n const lineSpacingFactor = 2;\r\n const textHeight = 3;\r\n const paragraphSpacingFactor = 13;\r\n const indentation = 7;\r\n const tabInterval = 5;\r\n\r\n const listChildren: ParagraphProps[] = [\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Oranges\",\r\n }\r\n ]\r\n },\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Apples\",\r\n },\r\n {\r\n type: \"list\",\r\n styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.Bullet } },\r\n children: [\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Red\",\r\n }\r\n ]\r\n },\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Green\",\r\n },\r\n {\r\n type: \"list\",\r\n styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.RomanNumeral, case: \"lower\", terminator: \"period\" } },\r\n children: [\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Granny Smith\",\r\n }\r\n ]\r\n },\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Rhode Island Greening\",\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Yellow\",\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ];\r\n\r\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor, textHeight, paragraphSpacingFactor, indentation, tabInterval } });\r\n const p1 = textBlock.appendParagraph();\r\n p1.children.push(List.create({ children: listChildren }));\r\n\r\n /* Final TextBlock should look like:\r\n →1.→Oranges¶\r\n →2.→Apples¶\r\n →→•→Red¶\r\n →→•→Green¶\r\n → →→i. →Granny Smith¶\r\n → →→ii.→Rhode Island Greening¶\r\n →→•→Yellow\r\n\r\n Where ↵ = LineBreak, ¶ = ParagraphBreak, → = tab, → = tabInterval/2, ⇥ = indentation\r\n\r\n We have:\r\n 7 lines each `textHeight` high\r\n 6 line breaks in between each `textHeight*lineSpacingFactor` high\r\n 6 paragraph breaks in between each `textHeight*paragraphSpacingFactor` high\r\n */\r\n\r\n const tb = doLayout(textBlock);\r\n expect(tb.lines.length).to.equal(7);\r\n\r\n expect(tb.range.low.x).to.equal(7 + 5 - 5 / 2 - 2); // indentation + tabInterval - tabInterval/2 (for marker offset) + 2 (for the marker \"1.\" justification, it's 2 characters wide)\r\n expect(tb.range.high.x).to.equal(7 + 3 * 5 + 21); // 7 for indentation, 3 * 5 for the most nested tab stops, 21 for the length of \"Rhode Island Greening\"\r\n expect(tb.range.high.y).to.equal(0);\r\n expect(tb.range.low.y).to.equal(-(textHeight * 7 + (textHeight * lineSpacingFactor) * 6 + (textHeight * paragraphSpacingFactor) * 6));\r\n\r\n // Cumulative vertical offsets to help make the test more readable.\r\n let offsetY = -textHeight;\r\n\r\n for (const line of tb.lines) {\r\n expect(line.offsetFromDocument.y).to.equal(offsetY);\r\n expect(line.marker).to.not.be.undefined;\r\n expect(line.marker?.offsetFromLine.y).to.equal((textHeight - line.marker!.range.yLength()) / 2);\r\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\r\n }\r\n\r\n let markerXLength = tb.lines[0].marker!.range.xLength();\r\n let inset = indentation + tabInterval;\r\n expect(tb.lines[0].offsetFromDocument.x).to.equal(inset); // →Oranges\r\n expect(markerXLength).to.equal(2); // \"1.\" is 2 characters wide\r\n expect(tb.lines[0].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\r\n\r\n markerXLength = tb.lines[1].marker!.range.xLength();\r\n expect(tb.lines[1].offsetFromDocument.x).to.equal(inset); // →Apples\r\n expect(tb.lines[1].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\r\n\r\n markerXLength = tb.lines[2].marker!.range.xLength();\r\n inset = indentation + tabInterval * 2;\r\n expect(tb.lines[2].offsetFromDocument.x).to.equal(indentation + tabInterval * 2); // →→Red\r\n expect(tb.lines[2].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\r\n\r\n markerXLength = tb.lines[3].marker!.range.xLength();\r\n expect(tb.lines[3].offsetFromDocument.x).to.equal(indentation + tabInterval * 2); // →→Green\r\n expect(tb.lines[3].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\r\n\r\n markerXLength = tb.lines[4].marker!.range.xLength();\r\n expect(tb.lines[4].offsetFromDocument.x).to.equal(indentation + tabInterval * 3); // →→→Granny Smith\r\n expect(tb.lines[4].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\r\n\r\n markerXLength = tb.lines[5].marker!.range.xLength();\r\n expect(tb.lines[5].offsetFromDocument.x).to.equal(indentation + tabInterval * 3); // →→→Rhode Island Greening\r\n expect(tb.lines[5].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\r\n\r\n markerXLength = tb.lines[6].marker!.range.xLength();\r\n expect(tb.lines[6].offsetFromDocument.x).to.equal(indentation + tabInterval * 2); // →→Yellow\r\n expect(tb.lines[6].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\r\n });\r\n\r\n it(\"justifies lines\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ styleOverrides: { lineSpacingFactor: 0 } });\r\n\r\n function expectBlockRange(width: number, height: number, justification: TextJustification): void {\r\n const layout = doLayout(block, {\r\n findTextStyle: () => TextStyleSettings.fromJSON({ justification })\r\n });\r\n expectRange(width, height, layout.range);\r\n }\r\n\r\n function expectLineOffset(offset: number, lineIndex: number, justification: TextJustification): void {\r\n const layout = doLayout(block, {\r\n findTextStyle: () => TextStyleSettings.fromJSON({ justification }),\r\n });\r\n expect(layout.lines.length).least(lineIndex + 1);\r\n\r\n const line = layout.lines[lineIndex];\r\n expect(line.offsetFromDocument.y).to.equal(-(lineIndex + 1));\r\n expect(line.offsetFromDocument.x).to.equal(offset);\r\n }\r\n\r\n // Two text runs with 7 characters total.\r\n block.appendRun(makeTextRun(\"abc\"));\r\n block.appendRun(makeTextRun(\"defg\"));\r\n\r\n // 1 line of text with width 0: left, right, center justification.\r\n expectBlockRange(7, 1, \"left\");\r\n expectLineOffset(0, 0, \"left\");\r\n\r\n expectBlockRange(7, 1, \"right\");\r\n expectLineOffset(0, 0, \"right\");\r\n\r\n expectBlockRange(7, 1, \"center\");\r\n expectLineOffset(0, 0, \"center\");\r\n\r\n // 1 line of text from a width greater than number of characters: left, right, center justification.\r\n block.width = 10;\r\n\r\n expectBlockRange(10, 1, \"left\");\r\n expectLineOffset(0, 0, \"left\");\r\n\r\n expectBlockRange(10, 1, \"right\");\r\n expectLineOffset(3, 0, \"right\"); // 3 = 10 - 7\r\n\r\n expectBlockRange(10, 1, \"center\");\r\n expectLineOffset(1.5, 0, \"center\"); // 1.5 = (10 - 7) / 2\r\n\r\n // 2 line of text from a width less than number of characters: left, right, center justification.\r\n block.width = 4;\r\n expectBlockRange(4, 2, \"left\");\r\n expectLineOffset(0, 0, \"left\");\r\n expectLineOffset(0, 1, \"left\");\r\n\r\n expectBlockRange(4, 2, \"right\");\r\n expectLineOffset(1, 0, \"right\");\r\n expectLineOffset(0, 1, \"right\");\r\n\r\n expectBlockRange(4, 2, \"center\");\r\n expectLineOffset(0.5, 0, \"center\");\r\n expectLineOffset(0, 1, \"center\");\r\n\r\n // Testing text longer the the width of the text block.\r\n block.width = 2;\r\n expectBlockRange(4, 2, \"left\");\r\n expectLineOffset(0, 0, \"left\");\r\n expectLineOffset(0, 1, \"left\");\r\n\r\n expectBlockRange(4, 2, \"right\");\r\n expectLineOffset(-1, 0, \"right\");\r\n expectLineOffset(-2, 1, \"right\");\r\n\r\n block.appendRun(makeTextRun(\"123456789\"));\r\n expectBlockRange(9, 3, \"right\");\r\n expectLineOffset(-1, 0, \"right\");\r\n expectLineOffset(-2, 1, \"right\");\r\n expectLineOffset(-7, 2, \"right\");\r\n\r\n expectBlockRange(9, 3, \"center\");\r\n expectLineOffset(-0.5, 0, \"center\");\r\n expectLineOffset(-1, 1, \"center\");\r\n expectLineOffset(-3.5, 2, \"center\");\r\n });\r\n });\r\n\r\n describe(\"word-wrapping\", () => {\r\n\r\n function expectLines(input: string, width: number, expectedLines: string[]): TextBlockLayout {\r\n const textBlock = TextBlock.create({ styleOverrides: { paragraphSpacingFactor: 0, lineSpacingFactor: 0, textHeight: 1 } });\r\n textBlock.width = width;\r\n const run = makeTextRun(input);\r\n textBlock.appendRun(run);\r\n\r\n const layout = doLayout(textBlock);\r\n const content = run.stringify();\r\n expect(layout.lines.every((line) => line.runs.every((r) => r.source.stringify() === content))).to.be.true;\r\n\r\n const actual = layout.lines.map((line) => line.runs.map((runLayout) => (runLayout.source as TextRun).content.substring(runLayout.charOffset, runLayout.charOffset + runLayout.numChars)).join(\"\"));\r\n expect(actual).to.deep.equal(expectedLines);\r\n\r\n return layout;\r\n }\r\n\r\n it(\"splits paragraphs into multiple lines if runs exceed the document width\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const textBlock = TextBlock.create();\r\n textBlock.width = 6;\r\n textBlock.appendRun(makeTextRun(\"ab\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(1);\r\n textBlock.appendRun(makeTextRun(\"cd\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(1);\r\n\r\n textBlock.appendRun(makeTextRun(\"ef\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(1);\r\n textBlock.appendRun(makeTextRun(\"ghi\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(2);\r\n\r\n textBlock.appendRun(makeTextRun(\"jklmnop\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(3);\r\n\r\n textBlock.appendRun(makeTextRun(\"q\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(4);\r\n textBlock.appendRun(makeTextRun(\"r\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(4);\r\n textBlock.appendRun(makeTextRun(\"stu\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(4);\r\n\r\n textBlock.appendRun(makeTextRun(\"vwxyz\"));\r\n expect(doLayout(textBlock).lines.length).to.equal(5);\r\n });\r\n\r\n it(\"splits a single TextRun at word boundaries if it exceeds the document width\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n expectLines(\"a bc def ghij klmno pqrstu vwxyz\", 5, [\r\n \"a bc \",\r\n \"def \",\r\n \"ghij \",\r\n \"klmno \",\r\n \"pqrstu \",\r\n \"vwxyz\",\r\n ]);\r\n\r\n const fox = \"The quick brown fox jumped over the lazy dog\";\r\n expectLines(fox, 50, [fox]);\r\n expectLines(fox, 40, [\r\n // 1 2 3 4\r\n // 34567890123456789012345678901234567890\r\n \"The quick brown fox jumped over the \",\r\n \"lazy dog\",\r\n ]);\r\n expectLines(fox, 30, [\r\n // 1 2 3\r\n // 3456789012345678901234567890\r\n \"The quick brown fox jumped \",\r\n \"over the lazy dog\",\r\n ]);\r\n expectLines(fox, 20, [\r\n // 1 2\r\n // 345678901234567890\r\n \"The quick brown fox \",\r\n \"jumped over the \",\r\n \"lazy dog\",\r\n ]);\r\n expectLines(fox, 10, [\r\n // 1\r\n // 234567890\r\n \"The quick \",\r\n \"brown fox \",\r\n \"jumped \",\r\n \"over the \",\r\n \"lazy dog\",\r\n ]);\r\n });\r\n\r\n it(\"considers consecutive whitespace part of a single 'word'\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n expectLines(\"a b c d e f \", 3, [\r\n \"a \",\r\n \"b \",\r\n \"c \",\r\n \"d \",\r\n \"e \",\r\n \"f \",\r\n ]);\r\n });\r\n\r\n it(\"wraps Japanese text\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n // \"I am a cat. The name is Tanuki.\"\r\n expectLines(\"吾輩は猫である。名前はたぬき。\", 1, [\"吾\", \"輩\", \"は\", \"猫\", \"で\", \"あ\", \"る。\", \"名\", \"前\", \"は\", \"た\", \"ぬ\", \"き。\"]);\r\n });\r\n\r\n it(\"wraps tabs\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const textHeight = 1;\r\n const textBlock = TextBlock.create({ styleOverrides: { textHeight } });\r\n\r\n // line 0: -->-->------> LINEBREAK\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n\r\n // line 1: a->b->cd-----> LINEBREAK\r\n textBlock.appendRun(TextRun.create({ content: \"a\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\r\n textBlock.appendRun(TextRun.create({ content: \"b\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\r\n textBlock.appendRun(TextRun.create({ content: \"cd\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n\r\n // line 2: -->a->b------>cd LINEBREAK\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\r\n textBlock.appendRun(TextRun.create({ content: \"a\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\r\n textBlock.appendRun(TextRun.create({ content: \"b\" }));\r\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\r\n textBlock.appendRun(TextRun.create({ content: \"cd\" }));\r\n textBlock.appendRun(LineBreakRun.create());\r\n\r\n /* Full Width:\r\n * -->-->------>\r\n * a->b->cd---->\r\n * -->a->b----->cd\r\n */\r\n let tb = doLayout(textBlock);\r\n expect(tb.lines.length).to.equal(3, ``);\r\n expect(tb.lines[0].range.xLength()).to.equal(13, ``);\r\n expect(tb.lines[1].range.xLength()).to.equal(13, ``);\r\n expect(tb.lines[2].range.xLength()).to.equal(15, ``);\r\n\r\n /* Width of 10:\r\n * -->-->\r\n * ------>\r\n * a->b->cd\r\n * ------>\r\n * -->a->b\r\n * ------>cd\r\n */\r\n\r\n textBlock.width = 10;\r\n tb = doLayout(textBlock);\r\n expect(tb.lines.length).to.equal(6, ``);\r\n expect(tb.lines[0].range.xLength()).to.equal(6, ``);\r\n expect(tb.lines[1].range.xLength()).to.equal(7, ``);\r\n expect(tb.lines[2].range.xLength()).to.equal(8, ``);\r\n expect(tb.lines[3].range.xLength()).to.equal(7, ``);\r\n expect(tb.lines[4].range.xLength()).to.equal(7, ``);\r\n expect(tb.lines[5].range.xLength()).to.equal(9, ``);\r\n });\r\n\r\n it(\"performs word-wrapping with punctuation\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n expectLines(\"1.24 56.7 8,910\", 1, [\"1.24 \", \"56.7 \", \"8,910\"]);\r\n\r\n expectLines(\"a.bc de.f g,hij\", 1, [\"a.bc \", \"de.f \", \"g,hij\"]);\r\n\r\n expectLines(\"Let's see... can you (or anyone) predict?!\", 1, [\r\n \"Let's \",\r\n \"see... \",\r\n \"can \",\r\n \"you \",\r\n \"(or \",\r\n \"anyone) \",\r\n \"predict?!\",\r\n ]);\r\n });\r\n\r\n it(\"performs word-wrapping and line-splitting with multiple runs\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const textBlock = TextBlock.create();\r\n for (const str of [\"The \", \"quick brown\", \" fox jumped over \", \"the lazy \", \"dog\"]) {\r\n textBlock.appendRun(makeTextRun(str));\r\n }\r\n\r\n function test(width: number, expected: string[]): void {\r\n textBlock.width = width;\r\n const layout = doLayout(textBlock);\r\n const actual = layout.lines.map((line) => line.runs.map((runLayout) => (runLayout.source as TextRun).content.substring(runLayout.charOffset, runLayout.charOffset + runLayout.numChars)).join(\"\"));\r\n expect(actual).to.deep.equal(expected);\r\n }\r\n\r\n test(50, [\"The quick brown fox jumped over the lazy dog\"]);\r\n test(40, [\r\n // 1 2 3 4\r\n // 34567890123456789012345678901234567890\r\n \"The quick brown fox jumped over the \",\r\n \"lazy dog\",\r\n ]);\r\n test(30, [\r\n // 1 2 3\r\n // 3456789012345678901234567890\r\n \"The quick brown fox jumped \",\r\n \"over the lazy dog\",\r\n ]);\r\n test(20, [\r\n // 1 2\r\n // 345678901234567890\r\n \"The quick brown fox \",\r\n \"jumped over the \",\r\n \"lazy dog\",\r\n ]);\r\n test(10, [\r\n // 1\r\n // 34567890\r\n \"The quick \",\r\n \"brown fox \",\r\n \"jumped \",\r\n \"over the \",\r\n \"lazy dog\",\r\n ]);\r\n });\r\n\r\n it(\"wraps multiple runs\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create();\r\n block.appendRun(makeTextRun(\"aa\")); // 2 chars wide\r\n block.appendRun(makeTextRun(\"bb ccc d ee\")); // 11 chars wide\r\n block.appendRun(makeTextRun(\"ff ggg h\")); // 8 chars wide\r\n\r\n function expectLayout(width: number, expected: string): void {\r\n block.width = width;\r\n const layout = doLayout(block);\r\n expect(layout.stringify()).to.equal(expected);\r\n }\r\n\r\n expectLayout(23, \"aabb ccc d eeff ggg h\");\r\n expectLayout(22, \"aabb ccc d eeff ggg h\");\r\n expectLayout(21, \"aabb ccc d eeff ggg h\");\r\n expectLayout(20, \"aabb ccc d eeff ggg \\nh\");\r\n expectLayout(19, \"aabb ccc d eeff \\nggg h\");\r\n expectLayout(18, \"aabb ccc d eeff \\nggg h\");\r\n expectLayout(17, \"aabb ccc d eeff \\nggg h\");\r\n expectLayout(16, \"aabb ccc d eeff \\nggg h\");\r\n expectLayout(15, \"aabb ccc d ee\\nff ggg h\");\r\n expectLayout(14, \"aabb ccc d ee\\nff ggg h\");\r\n expectLayout(13, \"aabb ccc d ee\\nff ggg h\");\r\n expectLayout(12, \"aabb ccc d \\neeff ggg h\");\r\n expectLayout(11, \"aabb ccc d \\neeff ggg h\");\r\n expectLayout(10, \"aabb ccc \\nd eeff \\nggg h\");\r\n expectLayout(9, \"aabb ccc \\nd eeff \\nggg h\");\r\n expectLayout(8, \"aabb \\nccc d ee\\nff ggg h\");\r\n expectLayout(7, \"aabb \\nccc d \\neeff \\nggg h\");\r\n expectLayout(6, \"aabb \\nccc d \\neeff \\nggg h\");\r\n expectLayout(5, \"aabb \\nccc \\nd ee\\nff \\nggg h\");\r\n expectLayout(4, \"aa\\nbb \\nccc \\nd ee\\nff \\nggg \\nh\");\r\n expectLayout(3, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\r\n expectLayout(2, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\r\n expectLayout(1, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\r\n expectLayout(0, \"aabb ccc d eeff ggg h\");\r\n expectLayout(-1, \"aabb ccc d eeff ggg h\");\r\n expectLayout(-2, \"aabb ccc d eeff ggg h\");\r\n });\r\n\r\n it(\"does not word wrap due to floating point rounding error\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const block = TextBlock.create({ styleOverrides: { textHeight: 1, lineSpacingFactor: 0 } });\r\n block.appendRun(makeTextRun(\"abc defg\"));\r\n const layout1 = doLayout(block);\r\n let width = layout1.range.xLength();\r\n // Simulate a floating point rounding error by slightly reducing the width\r\n width -= Geometry.smallFloatingPoint;\r\n block.width = width;\r\n const layout2 = doLayout(block);\r\n expect(layout2.range.yLength()).to.equal(1);\r\n })\r\n\r\n it(\"wraps list items and applies indentation/insets for narrow text block width\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const textBlock = TextBlock.create({ styleOverrides: { indentation: 2, tabInterval: 3, textHeight: 1, lineSpacingFactor: 0, paragraphSpacingFactor: 0 } });\r\n\r\n /* Final TextBlock should look like:\r\n ⇥→1.→Lorem ipsum dolor sit amet, consectetur adipiscing elit¶ | Inset by 5\r\n ⇥→2.→sed do¶ | Inset by 5\r\n ⇥→→a.→eiusmod tempor¶ | Inset by 8\r\n ⇥→→b.→incididunt ut labore et dolore magna aliqua | Inset by 8\r\n\r\n Where ↵ = LineBreak, ¶ = ParagraphBreak, → = tab, → = tabInterval/2, ⇥ = indentation\r\n */\r\n\r\n // Create nested list structure\r\n const list = List.create();\r\n list.children.push(Paragraph.create({ children: [TextRun.create({ content: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit\" })] }));\r\n const apples = Paragraph.create({ children: [TextRun.create({ content: \"sed do\" })] });\r\n\r\n const subList = List.create({ styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.Letter, case: \"lower\", terminator: \"period\" } } });\r\n subList.children.push(Paragraph.create({ children: [TextRun.create({ content: \"eiusmod tempor\" })] }));\r\n subList.children.push(Paragraph.create({ children: [TextRun.create({ content: \"incididunt ut labore et dolore magna aliqua\" })] }));\r\n\r\n apples.children.push(subList);\r\n list.children.push(apples);\r\n\r\n textBlock.appendParagraph().children.push(list);\r\n\r\n\r\n function expectLayout(width: number, expected: string): void {\r\n textBlock.width = width;\r\n const layout = doLayout(textBlock);\r\n\r\n // Check that each line is wrapped to width\r\n const minWidth = Math.max(19, width); // 19 for the width of the longest word with inset: \"⇥→→b.→incididunt \"\r\n if (width > 0) {\r\n layout.lines.forEach((line) => {\r\n expect(line.justificationRange.xLength() + line.offsetFromDocument.x).to.be.at.most(minWidth);\r\n });\r\n }\r\n\r\n\r\n expect(layout.stringify()).to.equal(expected);\r\n\r\n // Top-level items should have indentation + tabInterval\r\n let inset = 2 + 3;\r\n layout.lines.forEach((line) => {\r\n if (line.stringify().includes(\"eiusmod\")) inset += 3; // SubList items should have increased indentation\r\n\r\n expect(line.offsetFromDocument.x).to.equal(inset);\r\n });\r\n }\r\n\r\n // Check indentation/insets for each line, indentation: 2, tabInterval: 5\r\n expectLayout(0, \"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\nsed do\\neiusmod tempor\\nincididunt ut labore et dolore magna aliqua\");\r\n expectLayout(70, \"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\nsed do\\neiusmod tempor\\nincididunt ut labore et dolore magna aliqua\");\r\n expectLayout(40, \"Lorem ipsum dolor sit amet, \\nconsectetur adipiscing elit\\nsed do\\neiusmod tempor\\nincididunt ut labore et dolore \\nmagna aliqua\");\r\n // TODO: layout should not pay attention to trailing whitespace when wrapping. I'll do this in another PR.\r\n expectLayout(21, \"Lorem ipsum \\ndolor sit amet, \\nconsectetur \\nadipiscing elit\\nsed do\\neiusmod \\ntempor\\nincididunt \\nut labore et \\ndolore magna \\naliqua\");\r\n expectLayout(15, \"Lorem \\nipsum \\ndolor sit \\namet, \\nconsectetur \\nadipiscing \\nelit\\nsed do\\neiusmod \\ntempor\\nincididunt \\nut \\nlabore \\net \\ndolore \\nmagna \\naliqua\");\r\n });\r\n });\r\n\r\n describe(\"grapheme offsets\", () => {\r\n function getLayoutResultAndStyleResolver(textBlock: TextBlock): { textStyleResolver: TextStyleResolver, result: TextBlockLayoutResult } {\r\n const layout = doLayout(textBlock);\r\n const result = layout.toResult();\r\n const textStyleResolver = new TextStyleResolver({\r\n textBlock,\r\n textStyleId: \"\",\r\n iModel: {} as any,\r\n findTextStyle: () => TextStyleSettings.defaults\r\n });\r\n return { textStyleResolver, result };\r\n }\r\n\r\n it(\"should return an empty array if source type is not text\", function () {\r\n const textBlock = TextBlock.create();\r\n const fractionRun = FractionRun.create({ numerator: \"1\", denominator: \"2\" });\r\n textBlock.appendRun(fractionRun);\r\n\r\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\r\n const source = textBlock.children[0]; // FractionRun is not a TextRun\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n source,\r\n iModel: {} as any,\r\n textStyleResolver,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0],\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.is.empty;\r\n });\r\n\r\n it(\"should handle empty text content\", function () {\r\n const textBlock = TextBlock.create();\r\n const textRun = TextRun.create({ content: \"\" });\r\n textBlock.appendRun(textRun);\r\n\r\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\r\n const source = textBlock.children[0]; // FractionRun is not a TextRun\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n source,\r\n iModel: {} as any,\r\n textStyleResolver,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0], // Supply a grapheme index even though there is no text\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.is.empty;\r\n });\r\n\r\n it(\"should compute grapheme offsets correctly for a given text\", function () {\r\n const textBlock = TextBlock.create();\r\n const textRun = TextRun.create({ content: \"hello\"});\r\n textBlock.appendRun(textRun);\r\n\r\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\r\n const source = textBlock.children[0].children[0];\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n source,\r\n iModel: {} as any,\r\n textStyleResolver,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0, 1, 2, 3, 4],\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(5);\r\n expect(graphemeRanges[0].high.x).to.equal(1);\r\n expect(graphemeRanges[4].high.x).to.equal(5);\r\n });\r\n\r\n it(\"should compute grapheme offsets correctly for non-English text\", function () {\r\n const textBlock = TextBlock.create();\r\n // Hindi - \"Paragraph\"\r\n const textRun = TextRun.create({ content: \"अनुच्छेद\" });\r\n textBlock.appendRun(textRun);\r\n\r\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\r\n const source = textBlock.children[0].children[0];\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n source,\r\n iModel: {} as any,\r\n textStyleResolver,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0, 1, 3, 7],\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(4); // Length based on actual grapheme segmentation\r\n expect(graphemeRanges[0].high.x).to.equal(1);\r\n expect(graphemeRanges[1].high.x).to.equal(3);\r\n expect(graphemeRanges[2].high.x).to.equal(7);\r\n expect(graphemeRanges[3].high.x).to.equal(8);\r\n });\r\n\r\n it(\"should compute grapheme offsets correctly for emoji content\", function () {\r\n const textBlock = TextBlock.create();\r\n const textRun = TextRun.create({ content: \"👨👦\" });\r\n textBlock.appendRun(textRun);\r\n\r\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\r\n const source = textBlock.children[0].children[0];\r\n const args: ComputeGraphemeOffsetsArgs = {\r\n source,\r\n iModel: {} as any,\r\n textStyleResolver,\r\n findFontId: () => 0,\r\n computeTextRange: computeTextRangeAsStringLength,\r\n runLayoutResult: result.lines[0].runs[0],\r\n graphemeCharIndexes: [0],\r\n };\r\n const graphemeRanges = computeGraphemeOffsets(args);\r\n\r\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(1); // Length based on actual grapheme segmentation\r\n expect(graphemeRanges[0].high.x).to.equal(5);\r\n });\r\n });\r\n\r\n describe(\"using native font library\", () => {\r\n let iModel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"NativeFonts\", \"NativeFonts.bim\");\r\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => iModel.close());\r\n\r\n it(\"maps font names to Id\", async () => {\r\n const vera = iModel.fonts.findId({ name: \"Vera\" });\r\n expect(vera).to.equal(1);\r\n\r\n const arial = await iModel.fonts.acquireId({ name: \"Arial\", type: FontType.TrueType });\r\n const comic = await iModel.fonts.acquireId({ name: \"Comic Sans\", type: FontType.TrueType });\r\n iModel.saveChanges();\r\n\r\n expect(arial).to.equal(2);\r\n expect(comic).to.equal(3);\r\n expect(iModel.fonts.findId({ name: \"Consolas\" })).to.be.undefined;\r\n\r\n function test(fontName: string, expectedFontId: number): void {\r\n const textBlock = TextBlock.create();\r\n textBlock.appendRun(TextRun.create({ styleOverrides: { font: { name: fontName } } }));\r\n const textStyleResolver = new TextStyleResolver({textBlock, textStyleId: \"\", iModel});\r\n const layout = layoutTextBlock({ textBlock, iModel, textStyleResolver });\r\n const run = layout.lines[0].runs[0];\r\n expect(run).not.to.be.undefined;\r\n expect(run.fontId).to.equal(expectedFontId);\r\n }\r\n\r\n test(\"Arial\", arial);\r\n test(\"Comic Sans\", comic);\r\n test(\"Consolas\", 0);\r\n\r\n test(\"arial\", arial);\r\n test(\"aRIaL\", arial);\r\n });\r\n\r\n function computeDimensions(args: { content?: string, bold?: boolean, italic?: boolean, font?: string, height?: number, width?: number }): { x: number, y: number } {\r\n const textBlock = TextBlock.create({\r\n styleOverrides: {\r\n textHeight: args.height,\r\n widthFactor: args.width,\r\n },\r\n });\r\n\r\n textBlock.appendRun(TextRun.create({\r\n content: args.content ?? \"This is a string of text.\",\r\n styleOverrides: {\r\n isBold: args.bold,\r\n isItalic: args.italic,\r\n font: { name: args.font ?? \"Vera\" },\r\n },\r\n }));\r\n\r\n const textStyleResolver = new TextStyleResolver({textBlock, textStyleId: \"\", iModel});\r\n const range = layoutTextBlock({ textBlock, iModel, textStyleResolver }).range;\r\n return { x: range.high.x - range.low.x, y: range.high.y - range.low.y };\r\n }\r\n\r\n it(\"computes different ranges for different strings\", () => {\r\n expect(computeDimensions({ content: \"text\" })).to.deep.equal(computeDimensions({ content: \"text\" }));\r\n expect(computeDimensions({ content: \"text\" })).not.to.deep.equal(computeDimensions({ content: \"texttexttext\" }));\r\n expect(computeDimensions({ content: \"text\" })).not.to.deep.equal(computeDimensions({ content: \"TEXT\" }));\r\n });\r\n\r\n it(\"computes different ranges for different fonts\", () => {\r\n // These two are embedded in the iModel.\r\n expect(computeDimensions({ font: \"Vera\" })).not.to.deep.equal(computeDimensions({ font: \"Karla\" }));\r\n\r\n // These two are not embedded in the iModel, but do exist in its font table - they should both fall back to the default font.\r\n expect(computeDimensions({ font: \"Arial\" })).to.deep.equal(computeDimensions({ font: \"Comic Sans\" }));\r\n });\r\n\r\n it(\"computes different ranges for different height and width\", () => {\r\n expect(computeDimensions({ height: 2 })).to.deep.equal(computeDimensions({ height: 2 }));\r\n expect(computeDimensions({ height: 2 })).not.to.deep.equal(computeDimensions({ height: 3 }));\r\n expect(computeDimensions({ width: 2 })).to.deep.equal(computeDimensions({ width: 2 }));\r\n expect(computeDimensions({ width: 2 })).not.to.deep.equal(computeDimensions({ width: 3 }));\r\n });\r\n\r\n it(\"excludes trailing blank glyphs from justification ranges\", () => {\r\n function computeRanges(chars: string): TextLayoutRanges {\r\n return iModel.computeRangesForText({\r\n chars,\r\n bold: false,\r\n italic: false,\r\n fontId: 1,\r\n widthFactor: 1,\r\n textHeight: 1,\r\n baselineShift: \"none\",\r\n });\r\n }\r\n\r\n function test(chars: string, expectEqualRanges: boolean): void {\r\n const { justification, layout } = computeRanges(chars);\r\n expect(layout.low.x).to.equal(justification.low.x);\r\n expect(layout.high.y).to.equal(justification.high.y);\r\n expect(layout.low.y).to.equal(justification.low.y);\r\n\r\n if (expectEqualRanges) {\r\n expect(layout.high.x).to.equal(justification.high.x);\r\n } else {\r\n expect(layout.high.x).greaterThan(justification.high.x);\r\n }\r\n }\r\n\r\n test(\"abcdef\", true);\r\n test(\"abcdef \", false);\r\n test(\"abcdef \", false);\r\n test(\"abc def\", true);\r\n\r\n // new line has no width ever.\r\n test(\"abcdef\\n\", true);\r\n\r\n // apparently native code doesn't consider tab characters to be \"blank\".\r\n test(\"abcdef\\t\", true);\r\n\r\n // apparently native code doesn't consider \"thin space\" to be \"blank\".\r\n test(\"abcdef\\u2009\", true);\r\n\r\n const r1 = computeRanges(\"abcdef \");\r\n const r2 = computeRanges(\"abcdef \");\r\n expect(r1.layout.xLength()).lessThan(r2.layout.xLength());\r\n expect(r1.justification.xLength()).to.equal(r2.justification.xLength());\r\n });\r\n });\r\n});\r\n\r\ndescribe(\"produceTextBlockGeometry\", () => {\r\n type Color = ColorDef | \"subcategory\";\r\n\r\n function makeText(color?: Color): TextRun {\r\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\r\n return TextRun.create({ styleOverrides, content: \"text\" });\r\n }\r\n\r\n function makeFraction(color?: Color): FractionRun {\r\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\r\n return FractionRun.create({ numerator: \"num\", denominator: \"denom\", styleOverrides });\r\n }\r\n\r\n function makeBreak(color?: Color): LineBreakRun {\r\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\r\n return LineBreakRun.create({ styleOverrides });\r\n }\r\n\r\n function makeTextBlock(runs: Run[]): TextBlock {\r\n const block = TextBlock.create();\r\n for (const run of runs) {\r\n block.appendRun(run);\r\n }\r\n\r\n return block;\r\n }\r\n\r\n function makeGeometry(runs: Run[]): TextBlockGeometryPropsEntry[] {\r\n const block = makeTextBlock(runs);\r\n const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\r\n const layout = doLayout(block);\r\n return produceTextBlockGeometry(layout, annotation.computeTransform(layout.range)).entries;\r\n }\r\n\r\n function makeListGeometry(children: ParagraphProps[]): TextBlockGeometryPropsEntry[] {\r\n const textBlock = TextBlock.create();\r\n const p1 = textBlock.appendParagraph();\r\n p1.children.push(List.create({ children }));\r\n\r\n const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });\r\n const layout = doLayout(textBlock);\r\n return produceTextBlockGeometry(layout, annotation.computeTransform(layout.range)).entries;\r\n }\r\n\r\n it(\"produces an empty array for an empty text block\", () => {\r\n expect(makeGeometry([])).to.deep.equal([]);\r\n });\r\n\r\n it(\"produces an empty array for a block consisting of line breaks\", () => {\r\n expect(makeGeometry([makeBreak(), makeBreak(), makeBreak()])).to.deep.equal([]);\r\n });\r\n\r\n it(\"produces one appearance entry if all runs use subcategory color\", () => {\r\n const geom = makeGeometry([makeText(), makeFraction(), makeText(\"subcategory\"), makeFraction(\"subcategory\")]);\r\n expect(geom.length).to.equal(9);\r\n expect(geom[0].color).to.equal(\"subcategory\");\r\n expect(geom.slice(1).some((entry) => entry.color !== undefined)).to.be.false;\r\n });\r\n\r\n it(\"produces strings and fraction separators\", () => {\r\n const geom = makeGeometry([makeText(), makeFraction(), makeFraction(), makeText()]);\r\n expect(geom.length).to.equal(9);\r\n expect(geom[0].color).to.equal(\"subcategory\");\r\n\r\n expect(geom[1].text).not.to.be.undefined;\r\n\r\n expect(geom[2].text).not.to.be.undefined;\r\n expect(geom[3].separator).not.to.be.undefined;\r\n expect(geom[4].text).not.to.be.undefined;\r\n\r\n expect(geom[5].text).not.to.be.undefined;\r\n expect(geom[6].separator).not.to.be.undefined;\r\n expect(geom[7].text).not.to.be.undefined;\r\n\r\n expect(geom[8].text).not.to.be.undefined;\r\n });\r\n\r\n it(\"produces an appearance change for each non-break run that is a different color from the previous run\", () => {\r\n const geom = makeGeometry([\r\n makeText(ColorDef.blue),\r\n makeText(), // subcategory by default\r\n makeText(),\r\n makeText(ColorDef.red),\r\n makeText(ColorDef.white),\r\n makeText(ColorDef.white),\r\n makeBreak(\"subcategory\"),\r\n makeFraction(ColorDef.green),\r\n makeText(ColorDef.green),\r\n makeBreak(ColorDef.black),\r\n makeText(ColorDef.green),\r\n ]).map((entry) => entry.text ? \"text\" : (entry.separator ? \"sep\" : (typeof entry.color === \"number\" ? ColorDef.fromJSON(entry.color) : entry.color)));\r\n\r\n expect(geom).to.deep.equal([\r\n ColorDef.blue,\r\n \"text\",\r\n \"subcategory\",\r\n \"text\",\r\n \"text\",\r\n ColorDef.red,\r\n \"text\",\r\n ColorDef.white,\r\n \"text\",\r\n \"text\",\r\n ColorDef.green,\r\n \"text\", \"sep\", \"text\",\r\n \"text\",\r\n \"text\",\r\n ]);\r\n });\r\n\r\n it(\"produces entries for list markers\", () => {\r\n /* Final TextBlock should look like:\r\n 1. Oranges // Oranges -> default \"subcategory\" text\r\n 2. Apples // Apples -> Switch to red text\r\n • Red\r\n • Green // Green -> Switch to green text, not including the bullet.\r\n i. Granny Smith\r\n ii. Rhode Island Greening\r\n • Yellow // Yellow -> Back to red text\r\n\r\n We have:\r\n 7 lines each containing one TextString for the list marker and one for the text,\r\n 4 appearance overrides\r\n */\r\n\r\n const listChildren: ParagraphProps[] = [\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Oranges\",\r\n }\r\n ]\r\n },\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Apples\",\r\n },\r\n {\r\n type: \"list\",\r\n styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.Bullet }, color: ColorDef.red.tbgr },\r\n children: [\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Red\",\r\n }\r\n ]\r\n },\r\n {\r\n styleOverrides: { color: ColorDef.green.tbgr },\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Green\",\r\n },\r\n {\r\n type: \"list\",\r\n styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.RomanNumeral, case: \"lower\", terminator: \"period\" } },\r\n children: [\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Granny Smith\",\r\n }\r\n ]\r\n },\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Rhode Island Greening\",\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n children: [\r\n {\r\n type: \"text\",\r\n content: \"Yellow\",\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ];\r\n\r\n const entries = makeListGeometry(listChildren);\r\n expect(entries.length).to.equal(14 + 4); // 14 text strings + 4 appearance entry\r\n\r\n expect(entries[0].color).to.equal(\"subcategory\");\r\n expect(entries[1].text?.text).to.equal(\"1.\");\r\n expect(entries[2].text?.text).to.equal(\"Oranges\");\r\n expect(entries[3].text?.text).to.equal(\"2.\");\r\n expect(entries[4].text?.text).to.equal(\"Apples\");\r\n expect(entries[5].color).to.equal(ColorDef.red.tbgr);\r\n expect(entries[6].text?.text).to.equal(\"•\");\r\n expect(entries[7].text?.text).to.equal(\"Red\");\r\n expect(entries[8].text?.text).to.equal(\"•\");\r\n expect(entries[9].color).to.equal(ColorDef.green.tbgr);\r\n expect(entries[10].text?.text).to.equal(\"Green\");\r\n expect(entries[11].text?.text).to.equal(\"i.\");\r\n expect(entries[12].text?.text).to.equal(\"Granny Smith\");\r\n expect(entries[13].text?.text).to.equal(\"ii.\");\r\n expect(entries[14].text?.text).to.equal(\"Rhode Island Greening\");\r\n expect(entries[15].color).to.equal(ColorDef.red.tbgr);\r\n expect(entries[16].text?.text).to.equal(\"•\");\r\n expect(entries[17].text?.text).to.equal(\"Yellow\");\r\n\r\n });\r\n\r\n it(\"offsets geometry entries by margins\", () => {\r\n function makeGeometryWithMargins(anchor: TextAnnotationAnchor, margins: TextBlockMargins): TextStringProps | undefined {\r\n const runs = [makeText()];\r\n const block = makeTextBlock(runs);\r\n const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\r\n annotation.anchor = anchor;\r\n const layout = doLayout(block, {\r\n findTextStyle: () => TextStyleSettings.fromJSON({ margins: { ...margins } }),\r\n });\r\n const geom = produceTextBlockGeometry(layout, annotation.computeTransform(layout.range)).entries;\r\n\r\n return geom[1].text;\r\n }\r\n\r\n function testMargins(margins: Required<TextBlockMargins>, height: number, width: number) {\r\n // We want to disregard negative margins. Note, I'm not changing the margins object itself. It gets passed into makeGeometryWithMargins as it is.\r\n const left = margins.left >= 0 ? margins.left : 0;\r\n const right = margins.right >= 0 ? margins.right : 0;\r\n const top = margins.top >= 0 ? margins.top : 0;\r\n const bottom = margins.bottom >= 0 ? margins.bottom : 0;\r\n\r\n // Test case: bottom, left\r\n let props = makeGeometryWithMargins({ horizontal: \"left\", vertical: \"bottom\" }, margins);\r\n expect(props).not.to.be.undefined;\r\n expect(props?.origin, \"Expected geometry to be offset by left and bottom margins\").to.deep.equal({ x: left, y: bottom, z: 0 });\r\n\r\n // Test case: top, right\r\n props = makeGeometryWithMargins({ vertical: \"top\", horizontal: \"right\" }, margins);\r\n\r\n let x = (right + width) * -1;\r\n let y = (top + height) * -1;\r\n expect(props).not.to.be.undefined;\r\n expect(props?.origin, \"Expected geometry to be offset by top and right margins\").to.deep.equal({ x, y, z: 0 });\r\n\r\n // Test case: middle, center\r\n props = makeGeometryWithMargins({ vertical: \"middle\", horizontal: \"center\" }, margins);\r\n\r\n x = (left - right - width) / 2;\r\n y = (bottom - top - height) / 2;\r\n expect(props).not.to.be.undefined;\r\n expect(props?.origin, \"Expected geometry to be centered in the margins\").to.deep.equal({ x, y, z: 0 });\r\n }\r\n\r\n // xLength will be 4 because of the mock implementation on line 16.\r\n // yLength will be 1 because of the mock implementation on line 16.\r\n testMargins({ top: 0, right: 0, bottom: 0, left: 0 }, 1, 4);\r\n testMargins({ top: 1, right: 2, bottom: 3, left: 4 }, 1, 4);\r\n testMargins({ top: -1, right: -2, bottom: -3, left: -4 }, 1, 4);\r\n });\r\n});\r\n\r\n// Ignoring the text strings from the spell checker\r\n// cspell:ignore jklmnop vwxyz defg hijk ghij klmno pqrstu Tanuki aabb eeff nggg amet adipiscing elit Phasellus pretium malesuada venenatis eleifend Donec sapien Nullam commodo accumsan lacinia metus enim pharetra lacus facilisis Duis suscipit quis feugiat fermentum ut augue Mauris iaculis odio rhoncus lorem viverra turpis elementum posuere Consolas अनुच्छेद cdefg cdefgh cdefghi eiusmod tempor incididunt ut labore et dolore magna aliqua sed defghi"]}
|
|
1
|
+
{"version":3,"file":"TextBlock.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/TextBlock.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { expect } from \"chai\";\nimport { computeGraphemeOffsets, ComputeGraphemeOffsetsArgs, layoutTextBlock, LineLayout, RunLayout, TextBlockLayout, TextLayoutRanges, TextStyleResolver } from \"../../annotations/TextBlockLayout\";\nimport { Geometry, Range2d } from \"@itwin/core-geometry\";\nimport { ColorDef, FontType, FractionRun, LineBreakRun, LineLayoutResult, List, ListMarkerEnumerator, Paragraph, ParagraphProps, Run, RunLayoutResult, TabRun, TextAnnotation, TextAnnotationAnchor, TextBlock, TextBlockGeometryPropsEntry, TextBlockLayoutResult, TextBlockMargins, TextJustification, TextRun, TextStringProps, TextStyleSettings } from \"@itwin/core-common\";\nimport { SnapshotDb } from \"../../IModelDb\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { Id64String, ProcessDetector } from \"@itwin/core-bentley\";\nimport { produceTextBlockGeometry } from \"../../core-backend\";\nimport { computeTextRangeAsStringLength, doLayout } from \"../AnnotationTestUtils\";\n\nfunction makeTextRun(content: string): TextRun {\n return TextRun.create({ content });\n}\n\nfunction isIntlSupported(): boolean {\n // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile\n // users are not expected to do any editing, but long term we will attempt to find a better\n // solution.\n return !ProcessDetector.isMobileAppBackend;\n}\n\nfunction findTextStyleImpl(id: Id64String): TextStyleSettings {\n if (id === \"0x42\") {\n return TextStyleSettings.fromJSON({ lineSpacingFactor: 12, font: { name: \"block\" }, isBold: true });\n }\n\n return TextStyleSettings.fromJSON({ lineSpacingFactor: 1, font: { name: \"other\" } });\n}\n\ndescribe(\"layoutTextBlock\", () => {\n describe(\"resolves TextStyleSettings\", () => {\n it(\"inherits styling from TextBlock when Paragraph and Run have no style overrides\", () => {\n const textBlock = TextBlock.create();\n const run = TextRun.create({ content: \"test\" });\n textBlock.appendParagraph();\n textBlock.appendRun(run);\n\n const tb = doLayout(textBlock, {\n textStyleId: \"0x42\",\n findTextStyle: findTextStyleImpl,\n });\n\n expect(tb.lines.length).to.equal(1);\n expect(tb.lines[0].runs.length).to.equal(1);\n\n const runStyle = tb.lines[0].runs[0].style;\n expect(runStyle.font.name).to.equal(\"block\");\n expect(runStyle.lineSpacingFactor).to.equal(12);\n expect(runStyle.isBold).to.be.true;\n });\n\n it(\"inherits style overrides from Paragraph when Run has no style overrides\", () => {\n const textBlock = TextBlock.create();\n textBlock.appendParagraph({ styleOverrides: { font: { name: \"paragraph\" } } });\n textBlock.appendRun(TextRun.create({ content: \"test\" }));\n\n const tb = doLayout(textBlock, {\n textStyleId: \"0x42\",\n findTextStyle: findTextStyleImpl,\n });\n\n expect(tb.lines.length).to.equal(1);\n expect(tb.lines[0].runs.length).to.equal(1);\n\n const runStyle = tb.lines[0].runs[0].style;\n expect(runStyle.font.name).to.equal(\"paragraph\");\n expect(runStyle.isBold).to.be.true;\n });\n\n it(\"uses Run style overrides when Run has overrides\", () => {\n const textBlock = TextBlock.create();\n textBlock.appendParagraph({ styleOverrides: { lineSpacingFactor: 55, font: { name: \"paragraph\" } } });\n textBlock.appendRun(TextRun.create({ content: \"test\", styleOverrides: { lineSpacingFactor: 99, font: { name: \"run\" } } }));\n\n const tb = doLayout(textBlock, {\n textStyleId: \"0x42\",\n findTextStyle: findTextStyleImpl,\n });\n\n expect(tb.lines.length).to.equal(1);\n expect(tb.lines[0].runs.length).to.equal(1);\n\n const runStyle = tb.lines[0].runs[0].style;\n expect(runStyle.font.name).to.equal(\"run\");\n expect(runStyle.isBold).to.be.true;\n });\n\n it(\"still uses TextBlock specific styles when Run has style overrides\", () => {\n // Some style settings make sense on a TextBlock, so they are always applied from the TextBlock, even if the Run has a style override.\n const textBlock = TextBlock.create();\n const run = TextRun.create({ content: \"test\", styleOverrides: { lineSpacingFactor: 99, font: { name: \"run\" } } });\n textBlock.appendParagraph();\n textBlock.appendRun(run);\n\n const tb = doLayout(textBlock, {\n textStyleId: \"0x42\",\n findTextStyle: findTextStyleImpl,\n });\n\n expect(tb.lines.length).to.equal(1);\n expect(tb.lines[0].runs.length).to.equal(1);\n\n const runStyle = tb.lines[0].runs[0].style;\n expect(runStyle.lineSpacingFactor).to.equal(12);\n });\n\n it(\"inherits overrides from TextBlock, Paragraph and Run when there is no styleId\", () => {\n const textBlock = TextBlock.create({ styleOverrides: { widthFactor: 34, textHeight: 3, lineSpacingFactor: 12, paragraphSpacingFactor: 2, isBold: true } });\n const run = TextRun.create({ content: \"test\", styleOverrides: { widthFactor: 78, font: { name: \"override\" }, leader: { wantElbow: true } } });\n textBlock.appendParagraph({ styleOverrides: { textHeight: 56, paragraphSpacingFactor: 25, color: 0xff0000, frame: { shape: \"octagon\" } } });\n textBlock.appendRun(run);\n\n const tb = doLayout(textBlock, {\n findTextStyle: findTextStyleImpl,\n });\n\n expect(tb.lines.length).to.equal(1);\n expect(tb.lines[0].runs.length).to.equal(1);\n\n const runStyle = tb.lines[0].runs[0].style;\n // widthFactor is always taken from the TextBlock, even if the Run has overrides\n expect(runStyle.widthFactor).to.equal(34);\n // paragraphSpacingFactor is always taken from the TextBlock, even if the Run has overrides\n expect(runStyle.paragraphSpacingFactor).to.equal(2);\n // lineSpacingFactor is always taken from the TextBlock, even if the Run has overrides\n expect(runStyle.lineSpacingFactor).to.equal(12);\n // frame settings are always taken from the TextBlock, even if the Paragraph or Run has overrides\n expect(runStyle.frame.shape).to.equal(\"none\");\n // leader settings are always taken from the TextBlock, even if the Paragraph or Run has overrides\n expect(runStyle.leader.wantElbow).to.be.false;\n expect(runStyle.font.name).to.equal(\"override\");\n expect(runStyle.color).to.equal(0xff0000);\n expect(runStyle.isBold).to.be.true;\n expect(runStyle.textHeight).to.equal(56);\n });\n\n it(\"does not inherit overrides in TextBlock or Paragraph when Run has same propertied overriden - unless they are TextBlock specific settings\", () => {\n const textBlock = TextBlock.create({ styleOverrides: { widthFactor: 34, margins: { left: 3 }, textHeight: 3, lineSpacingFactor: 12, paragraphSpacingFactor: 2, isBold: true, justification: \"center\" } });\n const run = TextRun.create({ content: \"test\", styleOverrides: { widthFactor: 78, margins: { left: 4, right: 3 }, textHeight: 6, paragraphSpacingFactor: 25, lineSpacingFactor: 24, font: { name: \"override\" }, isBold: false, justification: \"right\" } });\n textBlock.appendParagraph({ styleOverrides: { textHeight: 56, paragraphSpacingFactor: 50, color: 0xff0000, justification: \"left\" } });\n textBlock.appendRun(run);\n\n const tb = doLayout(textBlock, {\n textStyleId: \"0x42\",\n findTextStyle: findTextStyleImpl,\n });\n\n expect(tb.lines.length).to.equal(1);\n expect(tb.lines[0].runs.length).to.equal(1);\n\n const runStyle = tb.lines[0].runs[0].style;\n // widthFactor is always taken from the TextBlock, even if the Run has a styleId or overrides\n expect(runStyle.widthFactor).to.equal(34);\n // paragraphSpacingFactor is always taken from the TextBlock, even if the Run has overrides\n expect(runStyle.paragraphSpacingFactor).to.equal(2);\n // lineSpacingFactor is always taken from the TextBlock, even if the Run has a styleId or overrides\n expect(runStyle.lineSpacingFactor).to.equal(12);\n // margins are always taken from the TextBlock, even if the Paragraph or Run has overrides\n expect(runStyle.margins.left).to.equal(3);\n expect(runStyle.margins.right).to.equal(0);\n // justification is always taken from the TextBlock, even if the Paragraph or Run has overrides\n expect(runStyle.justification).to.equal(\"center\");\n expect(runStyle.font.name).to.equal(\"override\");\n expect(runStyle.color).to.equal(0xff0000);\n expect(runStyle.isBold).to.be.false;\n expect(runStyle.textHeight).to.equal(6);\n });\n\n it(\"takes child overrides over parent overrides\", () => {\n //...unless they are TextBlock specific as covered in other tests\n const textBlock = TextBlock.create({ styleOverrides: { font: { name: \"grandparent\" } } });\n const run = TextRun.create({ content: \"test\", styleOverrides: { font: { name: \"child\" } } });\n textBlock.appendParagraph({ styleOverrides: { font: { name: \"parent\" } } });\n textBlock.appendRun(run);\n\n const tb = doLayout(textBlock, {\n findTextStyle: findTextStyleImpl,\n });\n\n expect(tb.lines.length).to.equal(1);\n expect(tb.lines[0].runs.length).to.equal(1);\n\n const runStyle = tb.lines[0].runs[0].style;\n expect(runStyle.font.name).to.equal(\"child\");\n });\n });\n\n it(\"has consistent data when converted to a layout result\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n // Initialize a new TextBlockLayout object\n const textBlock = TextBlock.create({ width: 50, styleOverrides: { widthFactor: 34, color: 0x00ff00, font: { name: \"arial\" } } });\n const run0 = TextRun.create({\n content: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium mi sit amet magna malesuada, at venenatis ante eleifend.\",\n styleOverrides: { textHeight: 56, color: 0xff0000 },\n });\n const run1 = TextRun.create({\n content: \"Donec sit amet semper sapien. Nullam commodo, libero a accumsan lacinia, metus enim pharetra lacus, eu facilisis sem nisi eu dui.\",\n styleOverrides: { widthFactor: 78, font: { name: \"run1\" } },\n });\n const run2 = TextRun.create({\n content: \"Duis dui quam, suscipit quis feugiat id, fermentum ut augue. Mauris iaculis odio rhoncus lorem eleifend, posuere viverra turpis elementum.\",\n styleOverrides: {},\n });\n const fractionRun = FractionRun.create({ numerator: \"num\", denominator: \"denom\", styleOverrides: {} });\n textBlock.appendRun(run0);\n textBlock.appendRun(fractionRun);\n textBlock.appendParagraph();\n textBlock.appendRun(run1);\n textBlock.appendRun(run2);\n\n // Call the toResult() method\n const textBlockLayout = doLayout(\n textBlock,\n {\n findFontId: (fontName: string) => {\n if (fontName === \"arial\") {\n return 1;\n } else if (fontName === \"run1\") {\n return 2;\n }\n return 0;\n },\n });\n const result = textBlockLayout.toResult();\n\n // Assert that the result object has the same data as the original TextBlockLayout object\n expect(result.range).to.deep.equal(textBlockLayout.range.toJSON());\n expect(result.lines.length).to.equal(textBlockLayout.lines.length);\n\n // Loop through each line in the result and the original object\n for (let i = 0; i < result.lines.length; i++) {\n const resultLine: LineLayoutResult = result.lines[i];\n const originalLine: LineLayout = textBlockLayout.lines[i];\n\n // Ranges match\n expect(resultLine.range).to.deep.equal(originalLine.range.toJSON());\n expect(resultLine.justificationRange).to.deep.equal(originalLine.justificationRange.toJSON());\n // Offset matches\n expect(resultLine.offsetFromDocument).to.deep.equal(originalLine.offsetFromDocument);\n\n for (let j = 0; j < resultLine.runs.length; j++) {\n const resultRun: RunLayoutResult = resultLine.runs[j];\n const originalRun: RunLayout = originalLine.runs[j];\n\n // FontId matches\n expect(resultRun.fontId).to.equal(originalRun.fontId);\n // Offsets match\n expect(resultRun.characterOffset).to.equal(originalRun.charOffset);\n expect(resultRun.characterCount).to.equal(originalRun.numChars);\n expect(resultRun.offsetFromLine).to.deep.equal(originalRun.offsetFromLine);\n // Range matches\n expect(resultRun.range).to.deep.equal(originalRun.range.toJSON());\n // Text style matches\n expect(resultRun.textStyle).to.deep.equal(originalRun.style.toJSON());\n // Optional values match existence and values\n if (resultRun.justificationRange) {\n expect(originalRun.justificationRange);\n }\n if (originalRun.justificationRange) {\n expect(resultRun.justificationRange);\n }\n if (resultRun.justificationRange && originalRun.justificationRange) {\n expect(resultRun.justificationRange).to.deep.equal(originalRun.justificationRange.toJSON());\n }\n if (resultRun.numeratorRange) {\n expect(originalRun.numeratorRange);\n }\n if (originalRun.numeratorRange) {\n expect(resultRun.numeratorRange);\n }\n if (resultRun.numeratorRange && originalRun.numeratorRange) {\n expect(resultRun.numeratorRange).to.deep.equal(originalRun.numeratorRange.toJSON());\n }\n if (resultRun.denominatorRange) {\n expect(originalRun.denominatorRange);\n }\n if (originalRun.denominatorRange) {\n expect(resultRun.denominatorRange);\n }\n if (resultRun.denominatorRange && originalRun.denominatorRange) {\n expect(resultRun.denominatorRange).to.deep.equal(originalRun.denominatorRange.toJSON());\n }\n\n // Check that the result string matches what we expect\n const inputRun = originalRun.source;\n if (inputRun.type === \"text\") {\n const resultText = inputRun.content.substring(resultRun.characterOffset, resultRun.characterOffset + resultRun.characterCount);\n const originalText = inputRun.content.substring(originalRun.charOffset, originalRun.charOffset + originalRun.numChars);\n expect(resultText).to.equal(originalText);\n }\n }\n }\n });\n\n it(\"adds margins\", function () {\n const expectMargins = (layoutRange: Range2d, marginRange: Range2d, margins: TextBlockMargins) => {\n expect(marginRange.low.x).to.equal(layoutRange.low.x - (margins.left ?? 0));\n expect(marginRange.high.x).to.equal(layoutRange.high.x + (margins.right ?? 0));\n expect(marginRange.low.y).to.equal(layoutRange.low.y - (margins.bottom ?? 0));\n expect(marginRange.high.y).to.equal(layoutRange.high.y + (margins.top ?? 0));\n }\n\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor: 0 } });\n textBlock.appendRun(makeTextRun(\"abc\"));\n textBlock.appendRun(makeTextRun(\"defg\"));\n\n const marginStyleCallback = (margins: TextBlockMargins) => {\n return () => TextStyleSettings.fromJSON({ margins: { ...margins } })\n }\n\n let layout = doLayout(textBlock, {\n findTextStyle: marginStyleCallback({}),\n });\n\n // Margins should be 0 by default\n expect(layout.range.isAlmostEqual(layout.textRange)).to.be.true;\n expectMargins(layout.textRange, layout.range, {});\n\n // All margins should be applied to the range\n layout = doLayout(textBlock, {\n findTextStyle: marginStyleCallback({ left: 1, right: 2, top: 3, bottom: 4 }),\n });\n\n expectMargins(layout.textRange, layout.range, { left: 1, right: 2, top: 3, bottom: 4 });\n\n // Just horizontal margins should be applied\n layout = doLayout(textBlock, {\n findTextStyle: marginStyleCallback({ left: 1, right: 2 }),\n });\n\n expectMargins(layout.textRange, layout.range, { left: 1, right: 2 });\n\n // Just vertical margins should be applied\n layout = doLayout(textBlock, {\n findTextStyle: marginStyleCallback({ top: 1, bottom: 2 }),\n });\n\n expectMargins(layout.textRange, layout.range, { top: 1, bottom: 2 });\n });\n\n describe(\"range\", () => {\n const round = (num: number, numDecimalPlaces: number) => {\n const multiplier = Math.pow(100, numDecimalPlaces);\n return Math.round(num * multiplier) / multiplier;\n };\n\n it(\"aligns text of the same size on the bottom of the line\", () => {\n const textBlock = TextBlock.create();\n const run1 = TextRun.create({ content: \"abc\" });\n const run2 = TextRun.create({ content: \"defg\" });\n textBlock.appendRun(run1);\n textBlock.appendRun(run2);\n\n const layout = doLayout(textBlock);\n const run1Layout = layout.lines[0].runs[0];\n const run2Layout = layout.lines[0].runs[1];\n\n expect(run1Layout.range.yLength()).to.equal(1);\n expect(run2Layout.range.yLength()).to.equal(1);\n\n expect(run1Layout.offsetFromLine.y).to.equal(0);\n expect(run2Layout.offsetFromLine.y).to.equal(0);\n });\n\n it(\"aligns text of varying sizes to the baseline of the largest text\", () => {\n const textBlock = TextBlock.create();\n const smallText = TextRun.create({ content: \"small\", styleOverrides: { textHeight: 1 } });\n const largeText = TextRun.create({ content: \"large\", styleOverrides: { textHeight: 3 } });\n textBlock.appendRun(smallText);\n textBlock.appendRun(largeText);\n\n const layout = doLayout(textBlock);\n const smallLayout = layout.lines[0].runs[0];\n const largeLayout = layout.lines[0].runs[1];\n\n expect(smallLayout.range.yLength()).to.equal(1);\n expect(largeLayout.range.yLength()).to.equal(3);\n\n expect(largeLayout.offsetFromLine.y).to.equal(0);\n expect(smallLayout.offsetFromLine.y).to.equal(0);\n });\n\n it(\"aligns text to center based on height of the largest stacked fraction\", () => {\n const textBlock = TextBlock.create();\n const fractionRun = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleOverrides: { textHeight: 4 } });\n const textRun = TextRun.create({ content: \"text\", styleOverrides: { textHeight: 2 } });\n textBlock.appendRun(fractionRun);\n textBlock.appendRun(textRun);\n\n const layout = doLayout(textBlock);\n const fractionLayout = layout.lines[0].runs[0];\n const textLayout = layout.lines[0].runs[1];\n\n expect(round(fractionLayout.range.yLength(), 2)).to.equal(7);\n expect(textLayout.range.yLength()).to.equal(2);\n\n // Fraction should be defining the line height\n expect(fractionLayout.offsetFromLine.y).to.equal(0);\n expect(round(textLayout.offsetFromLine.y, 2)).to.equal(2.5);\n });\n\n it(\"aligns the largest non-fraction text to the center based on height of stacked fraction and aligns all other text to the baseline\", () => {\n const textBlock = TextBlock.create();\n const smallText = TextRun.create({ content: \"s\", styleOverrides: { textHeight: 1 } });\n const mediumText = TextRun.create({ content: \"m\", styleOverrides: { textHeight: 2 } });\n const fraction = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleOverrides: { textHeight: 4 } });\n textBlock.appendRun(smallText);\n textBlock.appendRun(mediumText);\n textBlock.appendRun(fraction);\n\n const layout = doLayout(textBlock);\n const smallLayout = layout.lines[0].runs[0];\n const mediumLayout = layout.lines[0].runs[1];\n const fractionLayout = layout.lines[0].runs[2];\n\n expect(smallLayout.range.yLength()).to.equal(1);\n expect(mediumLayout.range.yLength()).to.equal(2);\n expect(round(fractionLayout.range.yLength(), 2)).to.equal(7);\n\n expect(round(mediumLayout.offsetFromLine.y, 2)).to.equal(2.5);\n expect(round(smallLayout.offsetFromLine.y, 2)).to.equal(2.5);\n expect(fractionLayout.offsetFromLine.y).to.equal(0);\n });\n\n it(\"aligns fractions to the baseline of same sized text\", () => {\n const textBlock = TextBlock.create();\n const text = TextRun.create({ content: \"t\", styleOverrides: { textHeight: 3 } });\n const fraction = FractionRun.create({ numerator: \"1\", denominator: \"2\", styleOverrides: { textHeight: 3 } });\n\n textBlock.appendRun(text);\n textBlock.appendRun(fraction);\n\n const layout = doLayout(textBlock);\n const textLayout = layout.lines[0].runs[0];\n const fractionLayout = layout.lines[0].runs[1];\n\n expect(textLayout.range.yLength()).to.equal(3);\n expect(round(fractionLayout.range.yLength(), 2)).to.equal(5.25);\n\n expect(round(textLayout.offsetFromLine.y, 3)).to.equal(1.125);\n\n // Slightly lower than text baseline so that the fraction appears centered on the text\n expect(round(fractionLayout.offsetFromLine.y, 3)).to.equal(0.075);\n });\n\n it(\"produces one line per paragraph if document width <= 0\", () => {\n const lineSpacingFactor = 0.5;\n const paragraphSpacingFactor = 0.25;\n const textBlock = TextBlock.create({ styleOverrides: { paragraphSpacingFactor, lineSpacingFactor } });\n for (let i = 0; i < 4; i++) {\n const layout = doLayout(textBlock);\n if (i === 0) {\n expect(layout.range.isNull).to.be.true;\n } else {\n expect(layout.lines.length).to.equal(i);\n expect(layout.range.low.x).to.equal(0);\n expect(layout.range.low.y).to.equal(-i - ((i - 1) * (lineSpacingFactor + paragraphSpacingFactor)));\n expect(layout.range.high.x).to.equal(i * 3);\n expect(layout.range.high.y).to.equal(0);\n }\n\n for (let l = 0; l < layout.lines.length; l++) {\n const line = layout.lines[l];\n expect(line.runs.length).to.equal(l + 1);\n expect(line.range.low.x).to.equal(0);\n expect(line.range.low.y).to.equal(0);\n expect(line.range.high.y).to.equal(1);\n expect(line.range.high.x).to.equal(3 * (l + 1));\n for (const run of line.runs) {\n expect(run.charOffset).to.equal(0);\n expect(run.numChars).to.equal(3);\n expect(run.range.low.x).to.equal(0);\n expect(run.range.low.y).to.equal(0);\n expect(run.range.high.x).to.equal(3);\n expect(run.range.high.y).to.equal(1);\n }\n }\n\n const p = textBlock.appendParagraph();\n for (let j = 0; j <= i; j++) {\n p.children.push(TextRun.create({ content: \"Run\" }));\n }\n }\n });\n\n it(\"produces a new line for each LineBreakRun\", () => {\n const lineSpacingFactor = 0.5;\n const textHeight = 1;\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor, textHeight } });\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\n textBlock.appendRun(LineBreakRun.create());\n textBlock.appendRun(TextRun.create({ content: \"def\" }));\n textBlock.appendRun(TextRun.create({ content: \"ghi\" }));\n textBlock.appendRun(LineBreakRun.create());\n textBlock.appendRun(TextRun.create({ content: \"jkl\" }));\n\n const tb = doLayout(textBlock);\n expect(tb.lines.length).to.equal(3);\n expect(tb.lines[0].runs.length).to.equal(2);\n expect(tb.lines[1].runs.length).to.equal(3);\n expect(tb.lines[2].runs.length).to.equal(1);\n\n expect(tb.range.low.x).to.equal(0);\n expect(tb.range.high.x).to.equal(6);\n expect(tb.range.high.y).to.equal(0);\n // paragraphSpacingFactor should not be applied to linebreaks, but lineSpacingFactor should.\n expect(tb.range.low.y).to.equal(-(lineSpacingFactor * 2 + textHeight * 3));\n });\n\n it(\"applies tab shifts\", () => {\n const textHeight = 1;\n const tabInterval = 6;\n const textBlock = TextBlock.create({ styleOverrides: { textHeight, tabInterval } });\n\n // Appends a line that looks like `stringOne` TAB `stringTwo` LINEBREAK\n const appendLine = (stringOne: string, stringTwo: string, wantLineBreak: boolean = true) => {\n if (stringOne.length > 0) textBlock.appendRun(TextRun.create({ content: stringOne }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\n if (stringTwo.length > 0) textBlock.appendRun(TextRun.create({ content: stringTwo }));\n if (wantLineBreak) textBlock.appendRun(LineBreakRun.create());\n }\n\n // The extra comments are intentional to show where the tab stops should be.\n appendLine(\"\", /*______*/ \"a\");\n appendLine(\"\", /*______*/ \"bc\");\n appendLine(\"a\", /*_____*/ \"a\");\n appendLine(\"bc\", /*____*/ \"bc\");\n appendLine(\"cde\", /*___*/ \"cde\");\n appendLine(\"cdefg\", /*_*/ \"cde\"); // this one is the max tab distance before needing to move to the next tab stop\n appendLine(\"cdefgh\", /*______*/ \"cde\"); // This one should push to the next tab stop.\n appendLine(\"cdefghi\", /*_____*/ \"cde\", false); // This one should push to the next tab stop.\n\n const tb = doLayout(textBlock);\n tb.lines.forEach((line, index) => {\n const firstTextRun = (line.runs[0].source.type === \"text\") ? line.runs[0] : undefined;\n const firstTabRun = (line.runs[0].source.type === \"tab\") ? line.runs[0] : line.runs[1];\n\n const distance = (firstTextRun?.range.xLength() ?? 0) + firstTabRun.range.xLength();\n const expectedDistance = ((firstTextRun?.range.xLength() || 0) >= tabInterval) ? tabInterval * 2 : tabInterval;\n expect(distance).to.equal(expectedDistance, `Line ${index} does not have the expected tab distance. ${expectedDistance}`);\n });\n });\n\n it(\"applies consecutive tab shifts\", () => {\n const textHeight = 1;\n const tabInterval = 6;\n const textBlock = TextBlock.create({ styleOverrides: { textHeight, tabInterval } });\n\n // line 0: ----->----->----->LINEBREAK\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\n textBlock.appendRun(LineBreakRun.create());\n\n // line 1: abc-->----->LINEBREAK\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval } }));\n textBlock.appendRun(LineBreakRun.create());\n\n // line 2: abc--->->------>LINEBREAK\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 2 } }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\n textBlock.appendRun(LineBreakRun.create());\n\n // line 3: abc--->1/23->abcde->LINEBREAK\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\n textBlock.appendRun(FractionRun.create({ numerator: \"1\", denominator: \"23\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\n textBlock.appendRun(TextRun.create({ content: \"abcde\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\n textBlock.appendRun(LineBreakRun.create());\n\n const tb = doLayout(textBlock);\n\n const line0 = tb.lines[0];\n const line1 = tb.lines[1];\n const line2 = tb.lines[2];\n const line3 = tb.lines[3];\n\n expect(line0.runs.length).to.equal(4);\n expect(line0.range.xLength()).to.equal(3 * tabInterval, `Lines with tabs should have the correct range length`);\n\n expect(line1.runs.length).to.equal(4);\n expect(line1.range.xLength()).to.equal(2 * tabInterval, `Tabs should be applied correctly when they are at the end of a line`);\n\n expect(line2.runs.length).to.equal(5);\n expect(line2.range.xLength()).to.equal(7 + 2 + 7, `Multiple tabs with different intervals should be applied correctly`);\n\n expect(line3.runs.length).to.equal(7);\n expect(line3.range.xLength()).to.equal(7 + 3 + 7, `Multiple tabs with different intervals should be applied correctly`);\n });\n\n it(\"computes ranges based on custom line spacing, text height, and indentation\", () => {\n const lineSpacingFactor = 2;\n const textHeight = 3;\n const paragraphSpacingFactor = 13;\n const indentation = 7;\n\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor, textHeight, paragraphSpacingFactor, indentation } });\n textBlock.appendRun(TextRun.create({ content: \"abc\" }));\n textBlock.appendRun(LineBreakRun.create());\n textBlock.appendRun(TextRun.create({ content: \"def\" }));\n textBlock.appendRun(TextRun.create({ content: \"ghi\" }));\n textBlock.appendRun(LineBreakRun.create());\n textBlock.appendRun(TextRun.create({ content: \"jkl\" }));\n\n const tb = doLayout(textBlock);\n expect(tb.lines.length).to.equal(3);\n expect(tb.lines[0].runs.length).to.equal(2);\n expect(tb.lines[1].runs.length).to.equal(3);\n expect(tb.lines[2].runs.length).to.equal(1);\n\n /* Final TextBlock should look like:\n ⇥abc↵\n ⇥defghi↵\n ⇥jkl\n\n Where ↵ = LineBreak, ¶ = ParagraphBreak, ⇥ = indentation\n\n We have 3 lines each `textHeight` high, plus 2 line breaks in between each `textHeight*lineSpacingFactor` high.\n No paragraph spacing should be applied since there is one paragraph.\n */\n\n expect(tb.range.low.x).to.equal(7);\n expect(tb.range.high.x).to.equal(6 + 7); // 7 for indentation, 6 for the length of \"defghi\"\n expect(tb.range.high.y).to.equal(0);\n expect(tb.range.low.y).to.equal(-(textHeight * 3 + (textHeight * lineSpacingFactor) * 2));\n\n expect(tb.lines[0].offsetFromDocument.y).to.equal(-textHeight);\n expect(tb.lines[1].offsetFromDocument.y).to.equal(tb.lines[0].offsetFromDocument.y - (textHeight + textHeight * lineSpacingFactor));\n expect(tb.lines[2].offsetFromDocument.y).to.equal(tb.lines[1].offsetFromDocument.y - (textHeight + textHeight * lineSpacingFactor));\n\n tb.lines.forEach((line) => expect(line.offsetFromDocument.x).to.equal(7));\n });\n\n it(\"computes paragraph spacing and indentation\", () => {\n const lineSpacingFactor = 2;\n const textHeight = 3;\n const paragraphSpacingFactor = 13;\n const indentation = 7;\n const tabInterval = 5;\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor, textHeight, paragraphSpacingFactor, indentation, tabInterval } });\n\n const p1 = textBlock.appendParagraph();\n p1.children.push(TextRun.create({ content: \"abc\" })); // Line 1\n p1.children.push(LineBreakRun.create());\n p1.children.push(TextRun.create({ content: \"def\" })); // Line 2\n\n const p2 = textBlock.appendParagraph();\n p2.children.push(TextRun.create({ content: \"ghi\" })); // Line 3\n\n const list = List.create();\n list.children.push(Paragraph.create({ children: [{ type: \"text\", content: \"list item 1\" }] })); // Line 4\n list.children.push(Paragraph.create({ children: [{ type: \"text\", content: \"list item 2\" }] })); // Line 5\n list.children.push(Paragraph.create({ children: [{ type: \"text\", content: \"list item 3\" }] })); // Line 6\n p2.children.push(list);\n\n const tb = doLayout(textBlock);\n expect(tb.lines.length).to.equal(6);\n\n /* Final TextBlock should look like:\n ⇥abc↵\n ⇥def¶\n ⇥ghi¶\n ⇥→1. list item 1¶\n ⇥→2. list item 2¶\n ⇥→3. list item 3\n\n Where ↵ = LineBreak, ¶ = ParagraphBreak, → = tabInterval/2, ⇥ = indentation\n\n We have:\n 6 lines each `textHeight` high\n 5 line breaks in between each `textHeight*lineSpacingFactor` high\n 4 paragraph breaks in between each `textHeight*paragraphSpacingFactor` high\n */\n\n expect(tb.range.low.x).to.equal(7); // 7 for indentation\n expect(tb.range.high.x).to.equal(7 + 5 + 11); // 7 for indentation, 5 for the tab stop, 11 for the length of \"list item 1\"\n expect(tb.range.high.y).to.equal(0);\n expect(tb.range.low.y).to.equal(-(textHeight * 6 + (textHeight * lineSpacingFactor) * 5 + (textHeight * paragraphSpacingFactor) * 4));\n\n // Cumulative vertical offsets to help make the test more readable.\n let offsetY = -textHeight;\n let offsetX = indentation;\n\n expect(tb.lines[0].offsetFromDocument.y).to.equal(offsetY);\n expect(tb.lines[0].offsetFromDocument.x).to.equal(offsetX);\n\n offsetY -= (textHeight + textHeight * lineSpacingFactor);\n expect(tb.lines[1].offsetFromDocument.y).to.equal(offsetY);\n expect(tb.lines[1].offsetFromDocument.x).to.equal(offsetX);\n\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\n expect(tb.lines[2].offsetFromDocument.y).to.equal(offsetY);\n expect(tb.lines[2].offsetFromDocument.x).to.equal(offsetX);\n\n offsetX += tabInterval; // List items are indented using tabInterval.\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\n expect(tb.lines[3].offsetFromDocument.y).to.equal(offsetY);\n expect(tb.lines[3].offsetFromDocument.x).to.equal(offsetX);\n\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\n expect(tb.lines[4].offsetFromDocument.y).to.equal(offsetY);\n expect(tb.lines[4].offsetFromDocument.x).to.equal(offsetX);\n\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\n expect(tb.lines[5].offsetFromDocument.y).to.equal(offsetY);\n expect(tb.lines[5].offsetFromDocument.x).to.equal(offsetX);\n });\n\n function expectRange(width: number, height: number, range: Range2d): void {\n expect(range.xLength()).to.equal(width);\n expect(range.yLength()).to.equal(height);\n }\n\n it(\"computes range for wrapped lines\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ width: 3, styleOverrides: { textHeight: 1, lineSpacingFactor: 0 } });\n\n function expectBlockRange(width: number, height: number): void {\n const layout = doLayout(block);\n expectRange(width, height, layout.range);\n }\n\n block.appendRun(makeTextRun(\"abc\"));\n expectBlockRange(3, 1);\n\n block.appendRun(makeTextRun(\"defg\"));\n expectBlockRange(4, 2);\n\n block.width = 1;\n expectBlockRange(4, 2);\n\n block.width = 8;\n expectBlockRange(8, 1);\n\n block.width = 6;\n expectBlockRange(6, 2);\n\n block.width = 10;\n expectBlockRange(10, 1);\n block.appendRun(makeTextRun(\"hijk\"));\n expectBlockRange(10, 2);\n });\n\n it(\"computes range for split runs\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ styleOverrides: { textHeight: 1, lineSpacingFactor: 0 } });\n\n function expectBlockRange(width: number, height: number): void {\n const layout = doLayout(block);\n expectRange(width, height, layout.range);\n }\n\n const sentence = \"a bc def ghij klmno\";\n expect(sentence.length).to.equal(19);\n block.appendRun(makeTextRun(sentence));\n\n block.width = 19;\n expectBlockRange(19, 1);\n\n block.width = 10;\n expectBlockRange(10, 2);\n });\n\n it(\"computes range for list markers and list items based on indentation\", function () {\n const lineSpacingFactor = 2;\n const textHeight = 3;\n const paragraphSpacingFactor = 13;\n const indentation = 7;\n const tabInterval = 5;\n\n const listChildren: ParagraphProps[] = [\n {\n children: [\n {\n type: \"text\",\n content: \"Oranges\",\n }\n ]\n },\n {\n children: [\n {\n type: \"text\",\n content: \"Apples\",\n },\n {\n type: \"list\",\n styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.Bullet } },\n children: [\n {\n children: [\n {\n type: \"text\",\n content: \"Red\",\n }\n ]\n },\n {\n children: [\n {\n type: \"text\",\n content: \"Green\",\n },\n {\n type: \"list\",\n styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.RomanNumeral, case: \"lower\", terminator: \"period\" } },\n children: [\n {\n children: [\n {\n type: \"text\",\n content: \"Granny Smith\",\n }\n ]\n },\n {\n children: [\n {\n type: \"text\",\n content: \"Rhode Island Greening\",\n }\n ]\n }\n ]\n }\n ]\n },\n {\n children: [\n {\n type: \"text\",\n content: \"Yellow\",\n }\n ]\n }\n ]\n }\n ]\n }\n ];\n\n const textBlock = TextBlock.create({ styleOverrides: { lineSpacingFactor, textHeight, paragraphSpacingFactor, indentation, tabInterval } });\n const p1 = textBlock.appendParagraph();\n p1.children.push(List.create({ children: listChildren }));\n\n /* Final TextBlock should look like:\n →1.→Oranges¶\n →2.→Apples¶\n →→•→Red¶\n →→•→Green¶\n → →→i. →Granny Smith¶\n → →→ii.→Rhode Island Greening¶\n →→•→Yellow\n\n Where ↵ = LineBreak, ¶ = ParagraphBreak, → = tab, → = tabInterval/2, ⇥ = indentation\n\n We have:\n 7 lines each `textHeight` high\n 6 line breaks in between each `textHeight*lineSpacingFactor` high\n 6 paragraph breaks in between each `textHeight*paragraphSpacingFactor` high\n */\n\n const tb = doLayout(textBlock);\n expect(tb.lines.length).to.equal(7);\n\n expect(tb.range.low.x).to.equal(7 + 5 - 5 / 2 - 2); // indentation + tabInterval - tabInterval/2 (for marker offset) + 2 (for the marker \"1.\" justification, it's 2 characters wide)\n expect(tb.range.high.x).to.equal(7 + 3 * 5 + 21); // 7 for indentation, 3 * 5 for the most nested tab stops, 21 for the length of \"Rhode Island Greening\"\n expect(tb.range.high.y).to.equal(0);\n expect(tb.range.low.y).to.equal(-(textHeight * 7 + (textHeight * lineSpacingFactor) * 6 + (textHeight * paragraphSpacingFactor) * 6));\n\n // Cumulative vertical offsets to help make the test more readable.\n let offsetY = -textHeight;\n\n for (const line of tb.lines) {\n expect(line.offsetFromDocument.y).to.equal(offsetY);\n expect(line.marker).to.not.be.undefined;\n expect(line.marker?.offsetFromLine.y).to.equal((textHeight - line.marker!.range.yLength()) / 2);\n offsetY -= (textHeight + textHeight * lineSpacingFactor + textHeight * paragraphSpacingFactor);\n }\n\n let markerXLength = tb.lines[0].marker!.range.xLength();\n let inset = indentation + tabInterval;\n expect(tb.lines[0].offsetFromDocument.x).to.equal(inset); // →Oranges\n expect(markerXLength).to.equal(2); // \"1.\" is 2 characters wide\n expect(tb.lines[0].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\n\n markerXLength = tb.lines[1].marker!.range.xLength();\n expect(tb.lines[1].offsetFromDocument.x).to.equal(inset); // →Apples\n expect(tb.lines[1].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\n\n markerXLength = tb.lines[2].marker!.range.xLength();\n inset = indentation + tabInterval * 2;\n expect(tb.lines[2].offsetFromDocument.x).to.equal(indentation + tabInterval * 2); // →→Red\n expect(tb.lines[2].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\n\n markerXLength = tb.lines[3].marker!.range.xLength();\n expect(tb.lines[3].offsetFromDocument.x).to.equal(indentation + tabInterval * 2); // →→Green\n expect(tb.lines[3].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\n\n markerXLength = tb.lines[4].marker!.range.xLength();\n expect(tb.lines[4].offsetFromDocument.x).to.equal(indentation + tabInterval * 3); // →→→Granny Smith\n expect(tb.lines[4].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\n\n markerXLength = tb.lines[5].marker!.range.xLength();\n expect(tb.lines[5].offsetFromDocument.x).to.equal(indentation + tabInterval * 3); // →→→Rhode Island Greening\n expect(tb.lines[5].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\n\n markerXLength = tb.lines[6].marker!.range.xLength();\n expect(tb.lines[6].offsetFromDocument.x).to.equal(indentation + tabInterval * 2); // →→Yellow\n expect(tb.lines[6].marker!.offsetFromLine.x).to.equal(0 - markerXLength - (tabInterval / 2));\n });\n\n it(\"justifies lines\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ styleOverrides: { lineSpacingFactor: 0 } });\n\n function expectBlockRange(width: number, height: number, justification: TextJustification): void {\n const layout = doLayout(block, {\n findTextStyle: () => TextStyleSettings.fromJSON({ justification })\n });\n expectRange(width, height, layout.range);\n }\n\n function expectLineOffset(offset: number, lineIndex: number, justification: TextJustification): void {\n const layout = doLayout(block, {\n findTextStyle: () => TextStyleSettings.fromJSON({ justification }),\n });\n expect(layout.lines.length).least(lineIndex + 1);\n\n const line = layout.lines[lineIndex];\n expect(line.offsetFromDocument.y).to.equal(-(lineIndex + 1));\n expect(line.offsetFromDocument.x).to.equal(offset);\n }\n\n // Two text runs with 7 characters total.\n block.appendRun(makeTextRun(\"abc\"));\n block.appendRun(makeTextRun(\"defg\"));\n\n // 1 line of text with width 0: left, right, center justification.\n expectBlockRange(7, 1, \"left\");\n expectLineOffset(0, 0, \"left\");\n\n expectBlockRange(7, 1, \"right\");\n expectLineOffset(0, 0, \"right\");\n\n expectBlockRange(7, 1, \"center\");\n expectLineOffset(0, 0, \"center\");\n\n // 1 line of text from a width greater than number of characters: left, right, center justification.\n block.width = 10;\n\n expectBlockRange(10, 1, \"left\");\n expectLineOffset(0, 0, \"left\");\n\n expectBlockRange(10, 1, \"right\");\n expectLineOffset(3, 0, \"right\"); // 3 = 10 - 7\n\n expectBlockRange(10, 1, \"center\");\n expectLineOffset(1.5, 0, \"center\"); // 1.5 = (10 - 7) / 2\n\n // 2 line of text from a width less than number of characters: left, right, center justification.\n block.width = 4;\n expectBlockRange(4, 2, \"left\");\n expectLineOffset(0, 0, \"left\");\n expectLineOffset(0, 1, \"left\");\n\n expectBlockRange(4, 2, \"right\");\n expectLineOffset(1, 0, \"right\");\n expectLineOffset(0, 1, \"right\");\n\n expectBlockRange(4, 2, \"center\");\n expectLineOffset(0.5, 0, \"center\");\n expectLineOffset(0, 1, \"center\");\n\n // Testing text longer the the width of the text block.\n block.width = 2;\n expectBlockRange(4, 2, \"left\");\n expectLineOffset(0, 0, \"left\");\n expectLineOffset(0, 1, \"left\");\n\n expectBlockRange(4, 2, \"right\");\n expectLineOffset(-1, 0, \"right\");\n expectLineOffset(-2, 1, \"right\");\n\n block.appendRun(makeTextRun(\"123456789\"));\n expectBlockRange(9, 3, \"right\");\n expectLineOffset(-1, 0, \"right\");\n expectLineOffset(-2, 1, \"right\");\n expectLineOffset(-7, 2, \"right\");\n\n expectBlockRange(9, 3, \"center\");\n expectLineOffset(-0.5, 0, \"center\");\n expectLineOffset(-1, 1, \"center\");\n expectLineOffset(-3.5, 2, \"center\");\n });\n });\n\n describe(\"word-wrapping\", () => {\n\n function expectLines(input: string, width: number, expectedLines: string[]): TextBlockLayout {\n const textBlock = TextBlock.create({ styleOverrides: { paragraphSpacingFactor: 0, lineSpacingFactor: 0, textHeight: 1 } });\n textBlock.width = width;\n const run = makeTextRun(input);\n textBlock.appendRun(run);\n\n const layout = doLayout(textBlock);\n const content = run.stringify();\n expect(layout.lines.every((line) => line.runs.every((r) => r.source.stringify() === content))).to.be.true;\n\n const actual = layout.lines.map((line) => line.runs.map((runLayout) => (runLayout.source as TextRun).content.substring(runLayout.charOffset, runLayout.charOffset + runLayout.numChars)).join(\"\"));\n expect(actual).to.deep.equal(expectedLines);\n\n return layout;\n }\n\n it(\"splits paragraphs into multiple lines if runs exceed the document width\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const textBlock = TextBlock.create();\n textBlock.width = 6;\n textBlock.appendRun(makeTextRun(\"ab\"));\n expect(doLayout(textBlock).lines.length).to.equal(1);\n textBlock.appendRun(makeTextRun(\"cd\"));\n expect(doLayout(textBlock).lines.length).to.equal(1);\n\n textBlock.appendRun(makeTextRun(\"ef\"));\n expect(doLayout(textBlock).lines.length).to.equal(1);\n textBlock.appendRun(makeTextRun(\"ghi\"));\n expect(doLayout(textBlock).lines.length).to.equal(2);\n\n textBlock.appendRun(makeTextRun(\"jklmnop\"));\n expect(doLayout(textBlock).lines.length).to.equal(3);\n\n textBlock.appendRun(makeTextRun(\"q\"));\n expect(doLayout(textBlock).lines.length).to.equal(4);\n textBlock.appendRun(makeTextRun(\"r\"));\n expect(doLayout(textBlock).lines.length).to.equal(4);\n textBlock.appendRun(makeTextRun(\"stu\"));\n expect(doLayout(textBlock).lines.length).to.equal(4);\n\n textBlock.appendRun(makeTextRun(\"vwxyz\"));\n expect(doLayout(textBlock).lines.length).to.equal(5);\n });\n\n it(\"splits a single TextRun at word boundaries if it exceeds the document width\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n expectLines(\"a bc def ghij klmno pqrstu vwxyz\", 5, [\n \"a bc \",\n \"def \",\n \"ghij \",\n \"klmno \",\n \"pqrstu \",\n \"vwxyz\",\n ]);\n\n const fox = \"The quick brown fox jumped over the lazy dog\";\n expectLines(fox, 50, [fox]);\n expectLines(fox, 40, [\n // 1 2 3 4\n // 34567890123456789012345678901234567890\n \"The quick brown fox jumped over the \",\n \"lazy dog\",\n ]);\n expectLines(fox, 30, [\n // 1 2 3\n // 3456789012345678901234567890\n \"The quick brown fox jumped \",\n \"over the lazy dog\",\n ]);\n expectLines(fox, 20, [\n // 1 2\n // 345678901234567890\n \"The quick brown fox \",\n \"jumped over the \",\n \"lazy dog\",\n ]);\n expectLines(fox, 10, [\n // 1\n // 234567890\n \"The quick \",\n \"brown fox \",\n \"jumped \",\n \"over the \",\n \"lazy dog\",\n ]);\n });\n\n it(\"considers consecutive whitespace part of a single 'word'\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n expectLines(\"a b c d e f \", 3, [\n \"a \",\n \"b \",\n \"c \",\n \"d \",\n \"e \",\n \"f \",\n ]);\n });\n\n it(\"wraps Japanese text\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n // \"I am a cat. The name is Tanuki.\"\n expectLines(\"吾輩は猫である。名前はたぬき。\", 1, [\"吾\", \"輩\", \"は\", \"猫\", \"で\", \"あ\", \"る。\", \"名\", \"前\", \"は\", \"た\", \"ぬ\", \"き。\"]);\n });\n\n it(\"wraps tabs\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const textHeight = 1;\n const textBlock = TextBlock.create({ styleOverrides: { textHeight } });\n\n // line 0: -->-->------> LINEBREAK\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\n textBlock.appendRun(LineBreakRun.create());\n\n // line 1: a->b->cd-----> LINEBREAK\n textBlock.appendRun(TextRun.create({ content: \"a\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\n textBlock.appendRun(TextRun.create({ content: \"b\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\n textBlock.appendRun(TextRun.create({ content: \"cd\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\n textBlock.appendRun(LineBreakRun.create());\n\n // line 2: -->a->b------>cd LINEBREAK\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\n textBlock.appendRun(TextRun.create({ content: \"a\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 3 } }));\n textBlock.appendRun(TextRun.create({ content: \"b\" }));\n textBlock.appendRun(TabRun.create({ styleOverrides: { tabInterval: 7 } }));\n textBlock.appendRun(TextRun.create({ content: \"cd\" }));\n textBlock.appendRun(LineBreakRun.create());\n\n /* Full Width:\n * -->-->------>\n * a->b->cd---->\n * -->a->b----->cd\n */\n let tb = doLayout(textBlock);\n expect(tb.lines.length).to.equal(3, ``);\n expect(tb.lines[0].range.xLength()).to.equal(13, ``);\n expect(tb.lines[1].range.xLength()).to.equal(13, ``);\n expect(tb.lines[2].range.xLength()).to.equal(15, ``);\n\n /* Width of 10:\n * -->-->\n * ------>\n * a->b->cd\n * ------>\n * -->a->b\n * ------>cd\n */\n\n textBlock.width = 10;\n tb = doLayout(textBlock);\n expect(tb.lines.length).to.equal(6, ``);\n expect(tb.lines[0].range.xLength()).to.equal(6, ``);\n expect(tb.lines[1].range.xLength()).to.equal(7, ``);\n expect(tb.lines[2].range.xLength()).to.equal(8, ``);\n expect(tb.lines[3].range.xLength()).to.equal(7, ``);\n expect(tb.lines[4].range.xLength()).to.equal(7, ``);\n expect(tb.lines[5].range.xLength()).to.equal(9, ``);\n });\n\n it(\"performs word-wrapping with punctuation\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n expectLines(\"1.24 56.7 8,910\", 1, [\"1.24 \", \"56.7 \", \"8,910\"]);\n\n expectLines(\"a.bc de.f g,hij\", 1, [\"a.bc \", \"de.f \", \"g,hij\"]);\n\n expectLines(\"Let's see... can you (or anyone) predict?!\", 1, [\n \"Let's \",\n \"see... \",\n \"can \",\n \"you \",\n \"(or \",\n \"anyone) \",\n \"predict?!\",\n ]);\n });\n\n it(\"performs word-wrapping and line-splitting with multiple runs\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const textBlock = TextBlock.create();\n for (const str of [\"The \", \"quick brown\", \" fox jumped over \", \"the lazy \", \"dog\"]) {\n textBlock.appendRun(makeTextRun(str));\n }\n\n function test(width: number, expected: string[]): void {\n textBlock.width = width;\n const layout = doLayout(textBlock);\n const actual = layout.lines.map((line) => line.runs.map((runLayout) => (runLayout.source as TextRun).content.substring(runLayout.charOffset, runLayout.charOffset + runLayout.numChars)).join(\"\"));\n expect(actual).to.deep.equal(expected);\n }\n\n test(50, [\"The quick brown fox jumped over the lazy dog\"]);\n test(40, [\n // 1 2 3 4\n // 34567890123456789012345678901234567890\n \"The quick brown fox jumped over the \",\n \"lazy dog\",\n ]);\n test(30, [\n // 1 2 3\n // 3456789012345678901234567890\n \"The quick brown fox jumped \",\n \"over the lazy dog\",\n ]);\n test(20, [\n // 1 2\n // 345678901234567890\n \"The quick brown fox \",\n \"jumped over the \",\n \"lazy dog\",\n ]);\n test(10, [\n // 1\n // 34567890\n \"The quick \",\n \"brown fox \",\n \"jumped \",\n \"over the \",\n \"lazy dog\",\n ]);\n });\n\n it(\"wraps multiple runs\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create();\n block.appendRun(makeTextRun(\"aa\")); // 2 chars wide\n block.appendRun(makeTextRun(\"bb ccc d ee\")); // 11 chars wide\n block.appendRun(makeTextRun(\"ff ggg h\")); // 8 chars wide\n\n function expectLayout(width: number, expected: string): void {\n block.width = width;\n const layout = doLayout(block);\n expect(layout.stringify()).to.equal(expected);\n }\n\n expectLayout(23, \"aabb ccc d eeff ggg h\");\n expectLayout(22, \"aabb ccc d eeff ggg h\");\n expectLayout(21, \"aabb ccc d eeff ggg h\");\n expectLayout(20, \"aabb ccc d eeff ggg \\nh\");\n expectLayout(19, \"aabb ccc d eeff \\nggg h\");\n expectLayout(18, \"aabb ccc d eeff \\nggg h\");\n expectLayout(17, \"aabb ccc d eeff \\nggg h\");\n expectLayout(16, \"aabb ccc d eeff \\nggg h\");\n expectLayout(15, \"aabb ccc d ee\\nff ggg h\");\n expectLayout(14, \"aabb ccc d ee\\nff ggg h\");\n expectLayout(13, \"aabb ccc d ee\\nff ggg h\");\n expectLayout(12, \"aabb ccc d \\neeff ggg h\");\n expectLayout(11, \"aabb ccc d \\neeff ggg h\");\n expectLayout(10, \"aabb ccc \\nd eeff \\nggg h\");\n expectLayout(9, \"aabb ccc \\nd eeff \\nggg h\");\n expectLayout(8, \"aabb \\nccc d ee\\nff ggg h\");\n expectLayout(7, \"aabb \\nccc d \\neeff \\nggg h\");\n expectLayout(6, \"aabb \\nccc d \\neeff \\nggg h\");\n expectLayout(5, \"aabb \\nccc \\nd ee\\nff \\nggg h\");\n expectLayout(4, \"aa\\nbb \\nccc \\nd ee\\nff \\nggg \\nh\");\n expectLayout(3, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\n expectLayout(2, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\n expectLayout(1, \"aa\\nbb \\nccc \\nd \\nee\\nff \\nggg \\nh\");\n expectLayout(0, \"aabb ccc d eeff ggg h\");\n expectLayout(-1, \"aabb ccc d eeff ggg h\");\n expectLayout(-2, \"aabb ccc d eeff ggg h\");\n });\n\n it(\"does not word wrap due to floating point rounding error\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const block = TextBlock.create({ styleOverrides: { textHeight: 1, lineSpacingFactor: 0 } });\n block.appendRun(makeTextRun(\"abc defg\"));\n const layout1 = doLayout(block);\n let width = layout1.range.xLength();\n // Simulate a floating point rounding error by slightly reducing the width\n width -= Geometry.smallFloatingPoint;\n block.width = width;\n const layout2 = doLayout(block);\n expect(layout2.range.yLength()).to.equal(1);\n })\n\n it(\"wraps list items and applies indentation/insets for narrow text block width\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const textBlock = TextBlock.create({ styleOverrides: { indentation: 2, tabInterval: 3, textHeight: 1, lineSpacingFactor: 0, paragraphSpacingFactor: 0 } });\n\n /* Final TextBlock should look like:\n ⇥→1.→Lorem ipsum dolor sit amet, consectetur adipiscing elit¶ | Inset by 5\n ⇥→2.→sed do¶ | Inset by 5\n ⇥→→a.→eiusmod tempor¶ | Inset by 8\n ⇥→→b.→incididunt ut labore et dolore magna aliqua | Inset by 8\n\n Where ↵ = LineBreak, ¶ = ParagraphBreak, → = tab, → = tabInterval/2, ⇥ = indentation\n */\n\n // Create nested list structure\n const list = List.create();\n list.children.push(Paragraph.create({ children: [TextRun.create({ content: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit\" })] }));\n const apples = Paragraph.create({ children: [TextRun.create({ content: \"sed do\" })] });\n\n const subList = List.create({ styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.Letter, case: \"lower\", terminator: \"period\" } } });\n subList.children.push(Paragraph.create({ children: [TextRun.create({ content: \"eiusmod tempor\" })] }));\n subList.children.push(Paragraph.create({ children: [TextRun.create({ content: \"incididunt ut labore et dolore magna aliqua\" })] }));\n\n apples.children.push(subList);\n list.children.push(apples);\n\n textBlock.appendParagraph().children.push(list);\n\n\n function expectLayout(width: number, expected: string): void {\n textBlock.width = width;\n const layout = doLayout(textBlock);\n\n // Check that each line is wrapped to width\n const minWidth = Math.max(19, width); // 19 for the width of the longest word with inset: \"⇥→→b.→incididunt \"\n if (width > 0) {\n layout.lines.forEach((line) => {\n expect(line.justificationRange.xLength() + line.offsetFromDocument.x).to.be.at.most(minWidth);\n });\n }\n\n\n expect(layout.stringify()).to.equal(expected);\n\n // Top-level items should have indentation + tabInterval\n let inset = 2 + 3;\n layout.lines.forEach((line) => {\n if (line.stringify().includes(\"eiusmod\")) inset += 3; // SubList items should have increased indentation\n\n expect(line.offsetFromDocument.x).to.equal(inset);\n });\n }\n\n // Check indentation/insets for each line, indentation: 2, tabInterval: 5\n expectLayout(0, \"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\nsed do\\neiusmod tempor\\nincididunt ut labore et dolore magna aliqua\");\n expectLayout(70, \"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\nsed do\\neiusmod tempor\\nincididunt ut labore et dolore magna aliqua\");\n expectLayout(40, \"Lorem ipsum dolor sit amet, \\nconsectetur adipiscing elit\\nsed do\\neiusmod tempor\\nincididunt ut labore et dolore \\nmagna aliqua\");\n // TODO: layout should not pay attention to trailing whitespace when wrapping. I'll do this in another PR.\n expectLayout(21, \"Lorem ipsum \\ndolor sit amet, \\nconsectetur \\nadipiscing elit\\nsed do\\neiusmod \\ntempor\\nincididunt \\nut labore et \\ndolore magna \\naliqua\");\n expectLayout(15, \"Lorem \\nipsum \\ndolor sit \\namet, \\nconsectetur \\nadipiscing \\nelit\\nsed do\\neiusmod \\ntempor\\nincididunt \\nut \\nlabore \\net \\ndolore \\nmagna \\naliqua\");\n });\n });\n\n describe(\"grapheme offsets\", () => {\n function getLayoutResultAndStyleResolver(textBlock: TextBlock): { textStyleResolver: TextStyleResolver, result: TextBlockLayoutResult } {\n const layout = doLayout(textBlock);\n const result = layout.toResult();\n const textStyleResolver = new TextStyleResolver({\n textBlock,\n textStyleId: \"\",\n iModel: {} as any,\n findTextStyle: () => TextStyleSettings.defaults\n });\n return { textStyleResolver, result };\n }\n\n it(\"should return an empty array if source type is not text\", function () {\n const textBlock = TextBlock.create();\n const fractionRun = FractionRun.create({ numerator: \"1\", denominator: \"2\" });\n textBlock.appendRun(fractionRun);\n\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\n const source = textBlock.children[0]; // FractionRun is not a TextRun\n const args: ComputeGraphemeOffsetsArgs = {\n source,\n iModel: {} as any,\n textStyleResolver,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0],\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.is.empty;\n });\n\n it(\"should handle empty text content\", function () {\n const textBlock = TextBlock.create();\n const textRun = TextRun.create({ content: \"\" });\n textBlock.appendRun(textRun);\n\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\n const source = textBlock.children[0]; // FractionRun is not a TextRun\n const args: ComputeGraphemeOffsetsArgs = {\n source,\n iModel: {} as any,\n textStyleResolver,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0], // Supply a grapheme index even though there is no text\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.is.empty;\n });\n\n it(\"should compute grapheme offsets correctly for a given text\", function () {\n const textBlock = TextBlock.create();\n const textRun = TextRun.create({ content: \"hello\"});\n textBlock.appendRun(textRun);\n\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\n const source = textBlock.children[0].children[0];\n const args: ComputeGraphemeOffsetsArgs = {\n source,\n iModel: {} as any,\n textStyleResolver,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0, 1, 2, 3, 4],\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(5);\n expect(graphemeRanges[0].high.x).to.equal(1);\n expect(graphemeRanges[4].high.x).to.equal(5);\n });\n\n it(\"should compute grapheme offsets correctly for non-English text\", function () {\n const textBlock = TextBlock.create();\n // Hindi - \"Paragraph\"\n const textRun = TextRun.create({ content: \"अनुच्छेद\" });\n textBlock.appendRun(textRun);\n\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\n const source = textBlock.children[0].children[0];\n const args: ComputeGraphemeOffsetsArgs = {\n source,\n iModel: {} as any,\n textStyleResolver,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0, 1, 3, 7],\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(4); // Length based on actual grapheme segmentation\n expect(graphemeRanges[0].high.x).to.equal(1);\n expect(graphemeRanges[1].high.x).to.equal(3);\n expect(graphemeRanges[2].high.x).to.equal(7);\n expect(graphemeRanges[3].high.x).to.equal(8);\n });\n\n it(\"should compute grapheme offsets correctly for emoji content\", function () {\n const textBlock = TextBlock.create();\n const textRun = TextRun.create({ content: \"👨👦\" });\n textBlock.appendRun(textRun);\n\n const { textStyleResolver, result } = getLayoutResultAndStyleResolver(textBlock);\n const source = textBlock.children[0].children[0];\n const args: ComputeGraphemeOffsetsArgs = {\n source,\n iModel: {} as any,\n textStyleResolver,\n findFontId: () => 0,\n computeTextRange: computeTextRangeAsStringLength,\n runLayoutResult: result.lines[0].runs[0],\n graphemeCharIndexes: [0],\n };\n const graphemeRanges = computeGraphemeOffsets(args);\n\n expect(graphemeRanges).to.be.an(\"array\").that.has.lengthOf(1); // Length based on actual grapheme segmentation\n expect(graphemeRanges[0].high.x).to.equal(5);\n });\n });\n\n describe(\"using native font library\", () => {\n let iModel: SnapshotDb;\n\n before(() => {\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const testFileName = IModelTestUtils.prepareOutputFile(\"NativeFonts\", \"NativeFonts.bim\");\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\n });\n\n after(() => iModel.close());\n\n it(\"maps font names to Id\", async () => {\n const vera = iModel.fonts.findId({ name: \"Vera\" });\n expect(vera).to.equal(1);\n\n const arial = await iModel.fonts.acquireId({ name: \"Arial\", type: FontType.TrueType });\n const comic = await iModel.fonts.acquireId({ name: \"Comic Sans\", type: FontType.TrueType });\n iModel.saveChanges();\n\n expect(arial).to.equal(2);\n expect(comic).to.equal(3);\n expect(iModel.fonts.findId({ name: \"Consolas\" })).to.be.undefined;\n\n function test(fontName: string, expectedFontId: number): void {\n const textBlock = TextBlock.create();\n textBlock.appendRun(TextRun.create({ styleOverrides: { font: { name: fontName } } }));\n const textStyleResolver = new TextStyleResolver({textBlock, textStyleId: \"\", iModel});\n const layout = layoutTextBlock({ textBlock, iModel, textStyleResolver });\n const run = layout.lines[0].runs[0];\n expect(run).not.to.be.undefined;\n expect(run.fontId).to.equal(expectedFontId);\n }\n\n test(\"Arial\", arial);\n test(\"Comic Sans\", comic);\n test(\"Consolas\", 0);\n\n test(\"arial\", arial);\n test(\"aRIaL\", arial);\n });\n\n function computeDimensions(args: { content?: string, bold?: boolean, italic?: boolean, font?: string, height?: number, width?: number }): { x: number, y: number } {\n const textBlock = TextBlock.create({\n styleOverrides: {\n textHeight: args.height,\n widthFactor: args.width,\n },\n });\n\n textBlock.appendRun(TextRun.create({\n content: args.content ?? \"This is a string of text.\",\n styleOverrides: {\n isBold: args.bold,\n isItalic: args.italic,\n font: { name: args.font ?? \"Vera\" },\n },\n }));\n\n const textStyleResolver = new TextStyleResolver({textBlock, textStyleId: \"\", iModel});\n const range = layoutTextBlock({ textBlock, iModel, textStyleResolver }).range;\n return { x: range.high.x - range.low.x, y: range.high.y - range.low.y };\n }\n\n it(\"computes different ranges for different strings\", () => {\n expect(computeDimensions({ content: \"text\" })).to.deep.equal(computeDimensions({ content: \"text\" }));\n expect(computeDimensions({ content: \"text\" })).not.to.deep.equal(computeDimensions({ content: \"texttexttext\" }));\n expect(computeDimensions({ content: \"text\" })).not.to.deep.equal(computeDimensions({ content: \"TEXT\" }));\n });\n\n it(\"computes different ranges for different fonts\", () => {\n // These two are embedded in the iModel.\n expect(computeDimensions({ font: \"Vera\" })).not.to.deep.equal(computeDimensions({ font: \"Karla\" }));\n\n // These two are not embedded in the iModel, but do exist in its font table - they should both fall back to the default font.\n expect(computeDimensions({ font: \"Arial\" })).to.deep.equal(computeDimensions({ font: \"Comic Sans\" }));\n });\n\n it(\"computes different ranges for different height and width\", () => {\n expect(computeDimensions({ height: 2 })).to.deep.equal(computeDimensions({ height: 2 }));\n expect(computeDimensions({ height: 2 })).not.to.deep.equal(computeDimensions({ height: 3 }));\n expect(computeDimensions({ width: 2 })).to.deep.equal(computeDimensions({ width: 2 }));\n expect(computeDimensions({ width: 2 })).not.to.deep.equal(computeDimensions({ width: 3 }));\n });\n\n it(\"excludes trailing blank glyphs from justification ranges\", () => {\n function computeRanges(chars: string): TextLayoutRanges {\n return iModel.computeRangesForText({\n chars,\n bold: false,\n italic: false,\n fontId: 1,\n widthFactor: 1,\n textHeight: 1,\n baselineShift: \"none\",\n });\n }\n\n function test(chars: string, expectEqualRanges: boolean): void {\n const { justification, layout } = computeRanges(chars);\n expect(layout.low.x).to.equal(justification.low.x);\n expect(layout.high.y).to.equal(justification.high.y);\n expect(layout.low.y).to.equal(justification.low.y);\n\n if (expectEqualRanges) {\n expect(layout.high.x).to.equal(justification.high.x);\n } else {\n expect(layout.high.x).greaterThan(justification.high.x);\n }\n }\n\n test(\"abcdef\", true);\n test(\"abcdef \", false);\n test(\"abcdef \", false);\n test(\"abc def\", true);\n\n // new line has no width ever.\n test(\"abcdef\\n\", true);\n\n // apparently native code doesn't consider tab characters to be \"blank\".\n test(\"abcdef\\t\", true);\n\n // apparently native code doesn't consider \"thin space\" to be \"blank\".\n test(\"abcdef\\u2009\", true);\n\n const r1 = computeRanges(\"abcdef \");\n const r2 = computeRanges(\"abcdef \");\n expect(r1.layout.xLength()).lessThan(r2.layout.xLength());\n expect(r1.justification.xLength()).to.equal(r2.justification.xLength());\n });\n });\n});\n\ndescribe(\"produceTextBlockGeometry\", () => {\n type Color = ColorDef | \"subcategory\";\n\n function makeText(color?: Color): TextRun {\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\n return TextRun.create({ styleOverrides, content: \"text\" });\n }\n\n function makeFraction(color?: Color): FractionRun {\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\n return FractionRun.create({ numerator: \"num\", denominator: \"denom\", styleOverrides });\n }\n\n function makeBreak(color?: Color): LineBreakRun {\n const styleOverrides = undefined !== color ? { color: color instanceof ColorDef ? color.toJSON() : color } : undefined;\n return LineBreakRun.create({ styleOverrides });\n }\n\n function makeTextBlock(runs: Run[]): TextBlock {\n const block = TextBlock.create();\n for (const run of runs) {\n block.appendRun(run);\n }\n\n return block;\n }\n\n function makeGeometry(runs: Run[]): TextBlockGeometryPropsEntry[] {\n const block = makeTextBlock(runs);\n const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\n const layout = doLayout(block);\n return produceTextBlockGeometry(layout, annotation.computeTransform(layout.range)).entries;\n }\n\n function makeListGeometry(children: ParagraphProps[]): TextBlockGeometryPropsEntry[] {\n const textBlock = TextBlock.create();\n const p1 = textBlock.appendParagraph();\n p1.children.push(List.create({ children }));\n\n const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });\n const layout = doLayout(textBlock);\n return produceTextBlockGeometry(layout, annotation.computeTransform(layout.range)).entries;\n }\n\n it(\"produces an empty array for an empty text block\", () => {\n expect(makeGeometry([])).to.deep.equal([]);\n });\n\n it(\"produces an empty array for a block consisting of line breaks\", () => {\n expect(makeGeometry([makeBreak(), makeBreak(), makeBreak()])).to.deep.equal([]);\n });\n\n it(\"produces one appearance entry if all runs use subcategory color\", () => {\n const geom = makeGeometry([makeText(), makeFraction(), makeText(\"subcategory\"), makeFraction(\"subcategory\")]);\n expect(geom.length).to.equal(9);\n expect(geom[0].color).to.equal(\"subcategory\");\n expect(geom.slice(1).some((entry) => entry.color !== undefined)).to.be.false;\n });\n\n it(\"produces strings and fraction separators\", () => {\n const geom = makeGeometry([makeText(), makeFraction(), makeFraction(), makeText()]);\n expect(geom.length).to.equal(9);\n expect(geom[0].color).to.equal(\"subcategory\");\n\n expect(geom[1].text).not.to.be.undefined;\n\n expect(geom[2].text).not.to.be.undefined;\n expect(geom[3].separator).not.to.be.undefined;\n expect(geom[4].text).not.to.be.undefined;\n\n expect(geom[5].text).not.to.be.undefined;\n expect(geom[6].separator).not.to.be.undefined;\n expect(geom[7].text).not.to.be.undefined;\n\n expect(geom[8].text).not.to.be.undefined;\n });\n\n it(\"produces an appearance change for each non-break run that is a different color from the previous run\", () => {\n const geom = makeGeometry([\n makeText(ColorDef.blue),\n makeText(), // subcategory by default\n makeText(),\n makeText(ColorDef.red),\n makeText(ColorDef.white),\n makeText(ColorDef.white),\n makeBreak(\"subcategory\"),\n makeFraction(ColorDef.green),\n makeText(ColorDef.green),\n makeBreak(ColorDef.black),\n makeText(ColorDef.green),\n ]).map((entry) => entry.text ? \"text\" : (entry.separator ? \"sep\" : (typeof entry.color === \"number\" ? ColorDef.fromJSON(entry.color) : entry.color)));\n\n expect(geom).to.deep.equal([\n ColorDef.blue,\n \"text\",\n \"subcategory\",\n \"text\",\n \"text\",\n ColorDef.red,\n \"text\",\n ColorDef.white,\n \"text\",\n \"text\",\n ColorDef.green,\n \"text\", \"sep\", \"text\",\n \"text\",\n \"text\",\n ]);\n });\n\n it(\"produces entries for list markers\", () => {\n /* Final TextBlock should look like:\n 1. Oranges // Oranges -> default \"subcategory\" text\n 2. Apples // Apples -> Switch to red text\n • Red\n • Green // Green -> Switch to green text, not including the bullet.\n i. Granny Smith\n ii. Rhode Island Greening\n • Yellow // Yellow -> Back to red text\n\n We have:\n 7 lines each containing one TextString for the list marker and one for the text,\n 4 appearance overrides\n */\n\n const listChildren: ParagraphProps[] = [\n {\n children: [\n {\n type: \"text\",\n content: \"Oranges\",\n }\n ]\n },\n {\n children: [\n {\n type: \"text\",\n content: \"Apples\",\n },\n {\n type: \"list\",\n styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.Bullet }, color: ColorDef.red.tbgr },\n children: [\n {\n children: [\n {\n type: \"text\",\n content: \"Red\",\n }\n ]\n },\n {\n styleOverrides: { color: ColorDef.green.tbgr },\n children: [\n {\n type: \"text\",\n content: \"Green\",\n },\n {\n type: \"list\",\n styleOverrides: { listMarker: { enumerator: ListMarkerEnumerator.RomanNumeral, case: \"lower\", terminator: \"period\" } },\n children: [\n {\n children: [\n {\n type: \"text\",\n content: \"Granny Smith\",\n }\n ]\n },\n {\n children: [\n {\n type: \"text\",\n content: \"Rhode Island Greening\",\n }\n ]\n }\n ]\n }\n ]\n },\n {\n children: [\n {\n type: \"text\",\n content: \"Yellow\",\n }\n ]\n }\n ]\n }\n ]\n }\n ];\n\n const entries = makeListGeometry(listChildren);\n expect(entries.length).to.equal(14 + 4); // 14 text strings + 4 appearance entry\n\n expect(entries[0].color).to.equal(\"subcategory\");\n expect(entries[1].text?.text).to.equal(\"1.\");\n expect(entries[2].text?.text).to.equal(\"Oranges\");\n expect(entries[3].text?.text).to.equal(\"2.\");\n expect(entries[4].text?.text).to.equal(\"Apples\");\n expect(entries[5].color).to.equal(ColorDef.red.tbgr);\n expect(entries[6].text?.text).to.equal(\"•\");\n expect(entries[7].text?.text).to.equal(\"Red\");\n expect(entries[8].text?.text).to.equal(\"•\");\n expect(entries[9].color).to.equal(ColorDef.green.tbgr);\n expect(entries[10].text?.text).to.equal(\"Green\");\n expect(entries[11].text?.text).to.equal(\"i.\");\n expect(entries[12].text?.text).to.equal(\"Granny Smith\");\n expect(entries[13].text?.text).to.equal(\"ii.\");\n expect(entries[14].text?.text).to.equal(\"Rhode Island Greening\");\n expect(entries[15].color).to.equal(ColorDef.red.tbgr);\n expect(entries[16].text?.text).to.equal(\"•\");\n expect(entries[17].text?.text).to.equal(\"Yellow\");\n\n });\n\n it(\"offsets geometry entries by margins\", () => {\n function makeGeometryWithMargins(anchor: TextAnnotationAnchor, margins: TextBlockMargins): TextStringProps | undefined {\n const runs = [makeText()];\n const block = makeTextBlock(runs);\n const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });\n annotation.anchor = anchor;\n const layout = doLayout(block, {\n findTextStyle: () => TextStyleSettings.fromJSON({ margins: { ...margins } }),\n });\n const geom = produceTextBlockGeometry(layout, annotation.computeTransform(layout.range)).entries;\n\n return geom[1].text;\n }\n\n function testMargins(margins: Required<TextBlockMargins>, height: number, width: number) {\n // We want to disregard negative margins. Note, I'm not changing the margins object itself. It gets passed into makeGeometryWithMargins as it is.\n const left = margins.left >= 0 ? margins.left : 0;\n const right = margins.right >= 0 ? margins.right : 0;\n const top = margins.top >= 0 ? margins.top : 0;\n const bottom = margins.bottom >= 0 ? margins.bottom : 0;\n\n // Test case: bottom, left\n let props = makeGeometryWithMargins({ horizontal: \"left\", vertical: \"bottom\" }, margins);\n expect(props).not.to.be.undefined;\n expect(props?.origin, \"Expected geometry to be offset by left and bottom margins\").to.deep.equal({ x: left, y: bottom, z: 0 });\n\n // Test case: top, right\n props = makeGeometryWithMargins({ vertical: \"top\", horizontal: \"right\" }, margins);\n\n let x = (right + width) * -1;\n let y = (top + height) * -1;\n expect(props).not.to.be.undefined;\n expect(props?.origin, \"Expected geometry to be offset by top and right margins\").to.deep.equal({ x, y, z: 0 });\n\n // Test case: middle, center\n props = makeGeometryWithMargins({ vertical: \"middle\", horizontal: \"center\" }, margins);\n\n x = (left - right - width) / 2;\n y = (bottom - top - height) / 2;\n expect(props).not.to.be.undefined;\n expect(props?.origin, \"Expected geometry to be centered in the margins\").to.deep.equal({ x, y, z: 0 });\n }\n\n // xLength will be 4 because of the mock implementation on line 16.\n // yLength will be 1 because of the mock implementation on line 16.\n testMargins({ top: 0, right: 0, bottom: 0, left: 0 }, 1, 4);\n testMargins({ top: 1, right: 2, bottom: 3, left: 4 }, 1, 4);\n testMargins({ top: -1, right: -2, bottom: -3, left: -4 }, 1, 4);\n });\n});\n\n// Ignoring the text strings from the spell checker\n// cspell:ignore jklmnop vwxyz defg hijk ghij klmno pqrstu Tanuki aabb eeff nggg amet adipiscing elit Phasellus pretium malesuada venenatis eleifend Donec sapien Nullam commodo accumsan lacinia metus enim pharetra lacus facilisis Duis suscipit quis feugiat fermentum ut augue Mauris iaculis odio rhoncus lorem viverra turpis elementum posuere Consolas अनुच्छेद cdefg cdefgh cdefghi eiusmod tempor incididunt ut labore et dolore magna aliqua sed defghi"]}
|