@itwin/core-backend 5.3.0-dev.9 → 5.4.0-dev.3
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/CHANGELOG.md +26 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +14 -0
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +11 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.d.ts.map +1 -1
- package/lib/cjs/DisplayStyle.js +4 -4
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/Element.d.ts +31 -3
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +55 -3
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +24 -1
- package/lib/cjs/ElementAspect.d.ts.map +1 -1
- package/lib/cjs/ElementAspect.js +102 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +26 -3
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +60 -5
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js +2 -2
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/Material.d.ts +1 -1
- package/lib/cjs/Material.d.ts.map +1 -1
- package/lib/cjs/Material.js +2 -2
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/NavigationRelationship.d.ts +15 -0
- package/lib/cjs/NavigationRelationship.d.ts.map +1 -1
- package/lib/cjs/NavigationRelationship.js +22 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +5 -0
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +7 -0
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +8 -0
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +30 -2
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +1 -1
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js +2 -2
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +4 -4
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts +13 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +90 -10
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +6 -5
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +34 -14
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.d.ts.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js +2 -0
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +14 -0
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +11 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.d.ts.map +1 -1
- package/lib/esm/DisplayStyle.js +4 -4
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/Element.d.ts +31 -3
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +55 -4
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts +24 -1
- package/lib/esm/ElementAspect.d.ts.map +1 -1
- package/lib/esm/ElementAspect.js +101 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +26 -3
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +60 -5
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts +1 -1
- package/lib/esm/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/esm/IModelElementCloneContext.js +2 -2
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/Material.d.ts +1 -1
- package/lib/esm/Material.d.ts.map +1 -1
- package/lib/esm/Material.js +2 -2
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/NavigationRelationship.d.ts +15 -0
- package/lib/esm/NavigationRelationship.d.ts.map +1 -1
- package/lib/esm/NavigationRelationship.js +19 -0
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/Relationship.d.ts +5 -0
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +7 -0
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +8 -0
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +30 -2
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +1 -1
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js +2 -2
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +4 -4
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts +13 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +91 -12
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +6 -5
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +34 -14
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.d.ts.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js +2 -0
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.d.ts +93 -0
- package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -0
- package/lib/esm/test/ElementDrivesElement.test.js +862 -0
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -0
- package/lib/esm/test/ElementLRUCache.test.js +19 -0
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +44 -0
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +48 -2
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +73 -27
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +2 -2
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +33 -2
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.d.ts +2 -0
- package/lib/esm/test/element/ProjectInformationRecord.test.d.ts.map +1 -0
- package/lib/esm/test/element/ProjectInformationRecord.test.js +80 -0
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -0
- package/lib/esm/test/element/SheetInformationAspect.test.d.ts +2 -0
- package/lib/esm/test/element/SheetInformationAspect.test.d.ts.map +1 -0
- package/lib/esm/test/element/SheetInformationAspect.test.js +182 -0
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -0
- package/lib/esm/test/hubaccess/Rebase.test.js +169 -2
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.d.ts +2 -0
- package/lib/esm/test/imodel/Code.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/Code.test.js +272 -0
- package/lib/esm/test/imodel/Code.test.js.map +1 -0
- package/lib/esm/test/imodel/IModel.test.js +175 -2
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +66 -60
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js +6 -6
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js +75 -6
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js +4 -4
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +33 -5
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fields.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/Fields.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 { Code, ElementAspectProps, FieldPropertyHost, FieldPropertyPath, FieldPropertyType, FieldRun, FieldValue, PhysicalElementProps, SubCategoryAppearance, TextAnnotation, TextBlock, TextBlockProps, TextRun } from \"@itwin/core-common\";\nimport { IModelDb, StandaloneDb } from \"../../IModelDb\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { createUpdateContext, updateField, updateFields } from \"../../internal/annotations/fields\";\nimport { DbResult, Id64, Id64String, ProcessDetector } from \"@itwin/core-bentley\";\nimport { SpatialCategory } from \"../../Category\";\nimport { Point3d, XYAndZ, YawPitchRollAngles } from \"@itwin/core-geometry\";\nimport { Schema, Schemas } from \"../../Schema\";\nimport { ClassRegistry } from \"../../ClassRegistry\";\nimport { PhysicalElement } from \"../../Element\";\nimport { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, IModelElementCloneContext, TextAnnotation3d } from \"../../core-backend\";\nimport { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault } from \"../../annotations/ElementDrivesTextAnnotation\";\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 createTestElement(imodel: StandaloneDb, model: Id64String, category: Id64String, overrides?: Partial<TestElementProps>, aspectProp = 999): Id64String {\n const props: TestElementProps = {\n classFullName: \"Fields:TestElement\",\n model,\n category,\n code: Code.createEmpty(),\n intProp: 100,\n point: { x: 1, y: 2, z: 3 },\n strings: [\"a\", \"b\", `\"name\": \"c\"`],\n datetime: new Date(\"2025-08-28T13:45:30.123Z\"),\n intEnum: 1,\n outerStruct: {\n innerStruct: { bool: false, doubles: [1, 2, 3] },\n innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],\n },\n outerStructs: [{\n innerStruct: { bool: true, doubles: [10, 9] },\n innerStructs: [{ bool: false, doubles: [5] }],\n }],\n placement: {\n origin: new Point3d(1, 2, 0),\n angles: new YawPitchRollAngles(),\n },\n jsonProperties: {\n stringProp: \"abc\",\n ints: [10, 11, 12, 13],\n bool: true,\n zoo: {\n address: {\n zipcode: 12345,\n },\n birds: [\n { name: \"duck\", sound: \"quack\" },\n { name: \"hawk\", sound: \"scree!\" },\n ],\n },\n },\n ...overrides,\n };\n\n const id = imodel.elements.insertElement(props);\n\n const aspectProps: TestAspectProps = {\n classFullName: TestAspect.classFullName,\n aspectProp,\n element: new ElementOwnsUniqueAspect(id),\n };\n imodel.elements.insertAspect(aspectProps);\n\n imodel.saveChanges();\n return id;\n}\n\ndescribe(\"updateField\", () => {\n const mockElementId = \"0x1\";\n const mockPath: FieldPropertyPath = {\n propertyName: \"mockProperty\",\n accessors: [0, \"nestedProperty\"],\n };\n const mockCachedContent = \"cachedContent\";\n const mockUpdatedContent = \"updatedContent\";\n\n const createMockContext = (elementId: string, propertyValue?: string) => ({\n hostElementId: elementId,\n getProperty: (field: FieldRun): FieldValue | undefined => {\n const propertyPath = field.propertyPath;\n if (\n propertyPath.propertyName === \"mockProperty\" &&\n propertyPath.accessors?.[0] === 0 &&\n propertyPath.accessors?.[1] === \"nestedProperty\" &&\n propertyValue !== undefined\n ) {\n return { value: propertyValue, type: \"string\" };\n }\n return undefined;\n },\n });\n\n it(\"does nothing if hostElementId does not match\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = createMockContext(\"0x2\", mockUpdatedContent);\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.false;\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\n });\n\n it(\"produces invalid content indicator if property value is undefined\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = createMockContext(mockElementId);\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.true;\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\n });\n\n it(\"returns false if cached content matches new content\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = createMockContext(mockElementId, mockCachedContent);\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.false;\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\n });\n\n it(\"returns true and updates cached content if new content is different\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = createMockContext(mockElementId, mockUpdatedContent);\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.true;\n expect(fieldRun.cachedContent).to.equal(mockUpdatedContent);\n });\n\n it(\"resolves to invalid content indicator if an exception occurs\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = {\n hostElementId: mockElementId,\n getProperty: () => {\n throw new Error(\"Test exception\");\n },\n };\n\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.true;\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\n });\n});\n\nconst fieldsSchemaXml = `\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ECSchema schemaName=\"Fields\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00.04\" alias=\"bis\"/>\n\n <ECEnumeration typeName=\"IntEnum\" backingTypeName=\"int\">\n <ECEnumerator name=\"one\" displayLabel=\"One\" value=\"1\" />\n <ECEnumerator name=\"two\" displayLabel=\"Two\" value=\"2\"/>\n </ECEnumeration>\n\n <ECStructClass typeName=\"InnerStruct\" modifier=\"None\">\n <ECProperty propertyName=\"bool\" typeName=\"boolean\"/>\n <ECArrayProperty propertyName=\"doubles\" typeName=\"double\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n </ECStructClass>\n\n <ECStructClass typeName=\"OuterStruct\" modifier=\"None\">\n <ECStructProperty propertyName=\"innerStruct\" typeName=\"InnerStruct\"/>\n <ECStructArrayProperty propertyName=\"innerStructs\" typeName=\"InnerStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n </ECStructClass>\n\n <ECEntityClass typeName=\"TestElement\" modifier=\"None\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n <ECProperty propertyName=\"intProp\" typeName=\"int\"/>\n <ECProperty propertyName=\"point\" typeName=\"point3d\"/>\n <ECProperty propertyName=\"maybeNull\" typeName=\"int\"/>\n <ECProperty propertyName=\"datetime\" typeName=\"dateTime\"/>\n <ECArrayProperty propertyName=\"strings\" typeName=\"string\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n <ECStructProperty propertyName=\"outerStruct\" typeName=\"OuterStruct\"/>\n <ECStructArrayProperty propertyName=\"outerStructs\" typeName=\"OuterStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n <ECProperty propertyName=\"intEnum\" typeName=\"IntEnum\"/>\n </ECEntityClass>\n\n <ECEntityClass typeName=\"TestAspect\" modifier=\"None\">\n <BaseClass>bis:ElementUniqueAspect</BaseClass>\n <ECProperty propertyName=\"aspectProp\" typeName=\"int\"/>\n </ECEntityClass>\n</ECSchema>\n`;\n\ninterface InnerStruct {\n bool: boolean;\n doubles: number[];\n}\n\ninterface OuterStruct {\n innerStruct: InnerStruct;\n innerStructs: InnerStruct[];\n}\n\ninterface TestElementProps extends PhysicalElementProps {\n intProp: number;\n point: XYAndZ;\n maybeNull?: number;\n strings: string[];\n datetime: Date;\n outerStruct: OuterStruct;\n outerStructs: OuterStruct[];\n intEnum?: number;\n}\n\nclass TestElement extends PhysicalElement {\n public static override get className() { return \"TestElement\"; }\n declare public intProp: number;\n declare public point: XYAndZ;\n declare public maybeNull?: number;\n declare public strings: string[];\n declare public datetime: Date;\n declare public outerStruct: OuterStruct;\n declare public outerStructs: OuterStruct[];\n}\n\nclass TestAspect extends ElementUniqueAspect {\n public static override get className() { return \"TestAspect\"; }\n\n declare public aspectProp: number;\n}\n\ninterface TestAspectProps extends ElementAspectProps {\n aspectProp: number;\n}\n\nclass FieldsSchema extends Schema {\n public static override get schemaName() { return \"Fields\"; }\n}\n\nasync function registerTestSchema(iModel: IModelDb): Promise<void> {\n if (!Schemas.getRegisteredSchema(\"Fields\")) {\n Schemas.registerSchema(FieldsSchema);\n ClassRegistry.register(TestElement, FieldsSchema);\n ClassRegistry.register(TestAspect, FieldsSchema);\n }\n\n await iModel.importSchemaStrings([fieldsSchemaXml]);\n iModel.saveChanges();\n}\n\ndescribe(\"Field evaluation\", () => {\n let imodel: StandaloneDb;\n let model: Id64String;\n let category: Id64String;\n let sourceElementId: Id64String;\n\n before(async () => {\n const iModelPath = IModelTestUtils.prepareOutputFile(\"UpdateFieldsContext\", \"test.bim\");\n imodel = StandaloneDb.createEmpty(iModelPath, { rootSubject: { name: \"UpdateFieldsContext\" }, allowEdit: JSON.stringify({ txns: true } )});\n\n await registerTestSchema(imodel);\n\n model = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), true)[1];\n category = SpatialCategory.insert(imodel, StandaloneDb.dictionaryId, \"UpdateFieldsContextCategory\", new SubCategoryAppearance());\n sourceElementId = insertTestElement();\n\n await imodel.fonts.embedFontFile({\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\n });\n });\n\n after(() => {\n imodel.close();\n });\n\n function insertTestElement(overrides?: Partial<TestElementProps>, aspectProp?: number): Id64String {\n return createTestElement(imodel, model, category, overrides, aspectProp);\n }\n\n function evaluateField(propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): FieldValue | undefined {\n if (typeof propertyHost === \"string\") {\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\n }\n\n const field = FieldRun.create({\n propertyPath,\n propertyHost,\n });\n\n const context = createUpdateContext(propertyHost.elementId, imodel, deletedDependency);\n return context.getProperty(field);\n }\n\n describe(\"getProperty\", () => {\n function expectValue(expected: any, propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): void {\n expect(evaluateField(propertyPath, propertyHost, deletedDependency)?.value).to.deep.equal(expected);\n }\n\n it(\"returns a primitive property value\", () => {\n expectValue(100, { propertyName: \"intProp\" }, sourceElementId);\n });\n\n it(\"returns an integer enum property value\", () => {\n expectValue(1, { propertyName: \"intEnum\" }, sourceElementId);\n });\n\n it(\"treats points as primitive values\", () => {\n expectValue({ x: 1, y: 2, z: 3 }, { propertyName: \"point\" }, sourceElementId);\n expectValue(undefined, { propertyName: \"point\", accessors: [\"x\"] }, sourceElementId);\n });\n\n it(\"returns a primitive array value\", () => {\n expectValue(\"a\", { propertyName: \"strings\", accessors: [0] }, sourceElementId);\n expectValue(\"b\", { propertyName: \"strings\", accessors: [1] }, sourceElementId);\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [2] }, sourceElementId);\n });\n\n it(\"supports negative array indices\", () => {\n expectValue(\"a\", { propertyName: \"strings\", accessors: [-3] }, sourceElementId);\n expectValue(\"b\", { propertyName: \"strings\", accessors: [-2] }, sourceElementId);\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [-1] }, sourceElementId);\n });\n\n it(\"returns undefined if the dependency was deleted\", () => {\n expectValue(undefined, { propertyName: \"intProp\" }, sourceElementId, true);\n });\n\n it(\"returns undefined if the host element does not exist\", () => {\n expectValue(undefined, { propertyName: \"intProp\" }, \"0xbaadf00d\");\n });\n\n it(\"returns undefined if the host element is not of the specified class or a subclass thereof\", () => {\n expectValue(undefined, { propertyName: \"origin\" }, { schemaName: \"BisCore\", className: \"GeometricElement2d\", elementId: sourceElementId });\n });\n\n it(\"returns undefined if an access string is specified for a non-object property\", () => {\n expectValue(undefined, { propertyName: \"intProp\", accessors: [\"property\"] }, sourceElementId);\n });\n\n it(\"returns undefined if the specified property does not exist\", () => {\n expectValue(undefined, { propertyName: \"nonExistentProperty\" }, sourceElementId);\n });\n\n it(\"returns undefined if the specified property is null\", () => {\n expectValue(undefined, { propertyName: \"maybeNull\" }, sourceElementId);\n });\n\n it(\"returns undefined if an array index is specified for a non-array property\", () => {\n expectValue(undefined, { propertyName: \"intProp\", accessors: [0] }, sourceElementId);\n });\n\n it(\"returns undefined if an array index is out of bounds\", () => {\n for (const index of [3, 4, -4, -5]) {\n expectValue(undefined, { propertyName: \"strings\", accessors: [index] }, sourceElementId);\n }\n });\n\n it(\"returns undefined for a non-primitive value\", () => {\n expectValue(undefined, { propertyName: \"strings\" }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStruct\" }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStruct\", accessors: [\"innerStruct\"] }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStructs\" }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0] }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\"] }, sourceElementId);\n });\n\n it(\"returns arbitrarily-nested properties of structs and struct arrays\", () => {\n expectValue(false, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] }, sourceElementId);\n for (const index of [0, 1, 2]) {\n expectValue(index + 1, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", index] },sourceElementId);\n expectValue(3 - index, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", -1 - index] },sourceElementId);\n }\n\n expectValue(9, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\", \"doubles\", 1] }, sourceElementId);\n expectValue(false, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", -1, \"bool\"] }, sourceElementId);\n expectValue(5, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", 0, \"doubles\", 0] }, sourceElementId);\n });\n\n it(\"returns the value of a property of an aspect\", () => {\n expect(imodel.elements.getAspects(sourceElementId, \"Fields:TestAspect\").length).to.equal(1);\n expectValue(999, { propertyName: \"aspectProp\" }, { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestAspect\" });\n });\n\n it(\"should fail to evaluate if prop type does not match\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"string\", accessors: [0] },\n cachedContent: \"oldValue\",\n formatOptions: {\n case: \"upper\",\n prefix: \"Value: \",\n suffix: \"!\"\n }\n });\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n\n const updated = updateField(fieldRun, context);\n\n expect(updated).to.be.true;\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\n });\n\n function getPropertyType(propertyHost: FieldPropertyHost, propertyPath: string | FieldPropertyPath): FieldPropertyType | undefined {\n if (typeof propertyPath === \"string\") {\n propertyPath = { propertyName: propertyPath };\n }\n\n return evaluateField(propertyPath, propertyHost)?.type;\n }\n\n it(\"deduces type for primitive properties\", () => {\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\n expect(getPropertyType(propertyHost, \"intProp\")).to.equal(\"string\");\n expect(getPropertyType(propertyHost, \"point\")).to.equal(\"coordinate\");\n expect(getPropertyType(propertyHost, { propertyName: \"strings\", accessors: [0] })).to.equal(\"string\");\n expect(getPropertyType(propertyHost, \"intEnum\")).to.equal(\"int-enum\");\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", 0] })).to.equal(\"quantity\");\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] })).to.equal(\"boolean\");\n\n propertyHost.schemaName = \"BisCore\";\n propertyHost.className = \"GeometricElement3d\";\n expect(getPropertyType(propertyHost, \"LastMod\")).to.equal(\"datetime\");\n expect(getPropertyType(propertyHost, \"FederationGuid\")).to.equal(\"string\");\n });\n\n it(\"returns undefined for non-primitive properties\", () => {\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\n expect(getPropertyType(propertyHost, \"outerStruct\")).to.equal(undefined);\n expect(getPropertyType(propertyHost, \"outerStructs\")).to.equal(undefined);\n });\n\n it(\"returns undefined for invalid property paths\", () => {\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\n expect(getPropertyType(propertyHost, \"unknownPropertyName\")).to.be.undefined;\n });\n\n it(\"should return undefined for unsupported primitive types\", () => {\n const host = { elementId: sourceElementId, schemaName: \"BisCore\", className: \"GeometricElement3d\" };\n expect(getPropertyType(host, \"GeometryStream\")).to.be.undefined;\n });\n });\n\n describe(\"updateFields\", () => {\n it(\"recomputes cached content\", () => {\n const textBlock = TextBlock.create();\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"intProp\" },\n cachedContent: \"oldValue\",\n });\n\n textBlock.appendRun(fieldRun);\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n const updatedCount = updateFields(textBlock, context);\n\n expect(updatedCount).to.equal(1);\n expect(fieldRun.cachedContent).to.equal(\"100\"); // `intProp` value from the test element\n });\n\n it(\"does not update a field if recomputed content matches cached content\", () => {\n const textBlock = TextBlock.create();\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"intProp\" },\n cachedContent: \"100\",\n });\n\n textBlock.appendRun(fieldRun);\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n const updatedCount = updateFields(textBlock, context);\n\n expect(updatedCount).to.equal(0);\n expect(fieldRun.cachedContent).to.equal(\"100\");\n });\n\n it(\"returns the number of fields updated\", () => {\n const textBlock = TextBlock.create();\n const fieldRun1 = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"intProp\" },\n cachedContent: \"100\",\n });\n\n const fieldRun2 = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"strings\", accessors: [0] },\n cachedContent: \"oldValue\",\n });\n\n textBlock.appendRun(fieldRun1);\n textBlock.appendRun(fieldRun2);\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n const updatedCount = updateFields(textBlock, context);\n\n expect(updatedCount).to.equal(1);\n expect(fieldRun1.cachedContent).to.equal(\"100\");\n expect(fieldRun2.cachedContent).to.equal(\"a\");\n });\n });\n\n function createAnnotationElement(textBlock: TextBlock | undefined): TextAnnotation3d {\n const elem = TextAnnotation3d.fromJSON({\n model,\n category,\n code: Code.createEmpty(),\n placement: {\n origin: { x: 0, y: 0, z: 0 },\n angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\n },\n classFullName: TextAnnotation3d.classFullName,\n defaultTextStyle: new TextAnnotationUsesTextStyleByDefault(\"0x123\").toJSON(),\n }, imodel);\n\n if (textBlock) {\n const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });\n elem.setAnnotation(annotation);\n }\n\n return elem;\n }\n\n function insertAnnotationElement(textBlock: TextBlock | undefined): Id64String {\n const elem = createAnnotationElement(textBlock);\n return elem.insert();\n }\n\n describe(\"ElementDrivesTextAnnotation\", () => {\n function expectNumRelationships(expected: number, targetId?: Id64String): void {\n const where = targetId ? ` WHERE TargetECInstanceId=${targetId}` : \"\";\n const ecsql = `SELECT COUNT(*) FROM BisCore.ElementDrivesTextAnnotation ${where}`;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n imodel.withPreparedStatement(ecsql, (stmt) => {\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);\n expect(stmt.getValue(0).getInteger()).to.equal(expected);\n });\n }\n\n it(\"can be inserted\", () => {\n expectNumRelationships(0);\n\n const targetId = insertAnnotationElement(undefined);\n expect(targetId).not.to.equal(Id64.invalid);\n\n const target = imodel.elements.getElement(targetId);\n expect(target.classFullName).to.equal(\"BisCore:TextAnnotation3d\");\n expect(target).instanceof(TextAnnotation3d);\n\n const targetAnno = imodel.elements.getElement<TextAnnotation3d>(targetId);\n expect(targetAnno).instanceof(TextAnnotation3d);\n\n const rel = ElementDrivesTextAnnotation.create(imodel, sourceElementId, targetId);\n const relId = rel.insert();\n expect(relId).not.to.equal(Id64.invalid);\n\n expectNumRelationships(1);\n\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementDrivesTextAnnotation\", relId);\n expect(relationship.sourceId).to.equal(sourceElementId);\n expect(relationship.targetId).to.equal(targetId);\n });\n\n function createField(propertyHost: Id64String | FieldPropertyHost, cachedContent: string, propertyName = \"intProp\", accessors?: Array<string | number>): FieldRun {\n if (typeof propertyHost === \"string\") {\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\n }\n\n return FieldRun.create({\n styleOverrides: { font: { name: \"Karla\" } },\n propertyHost,\n cachedContent,\n propertyPath: { propertyName, accessors },\n });\n }\n\n describe(\"updateFieldDependencies\", () => {\n it(\"creates exactly one relationship for each unique source element on insert and update\", () => {\n const source1 = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(source1, \"1\"));\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n expectNumRelationships(1, targetId);\n\n const source2 = insertTestElement();\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n const anno = target.getAnnotation()!;\n anno.textBlock.appendRun(createField(source2, \"2a\"));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(2, targetId);\n\n anno.textBlock.appendRun(createField(source2, \"2b\"));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(2, targetId);\n\n const source3 = insertTestElement();\n anno.textBlock.appendRun(createField(source3, \"3\"));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(3, targetId);\n });\n\n it(\"deletes stale relationships\", () => {\n const sourceA = insertTestElement();\n const sourceB = insertTestElement();\n\n const block = TextBlock.create();\n block.appendRun(createField(sourceA, \"A\"));\n block.appendRun(createField(sourceB, \"B\"));\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n expectNumRelationships(2, targetId);\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\n\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n const anno = target.getAnnotation()!;\n\n // Remove the sourceA FieldRun from the first paragraph.\n const p1 = anno.textBlock.children[0];\n p1.children.shift();\n\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(1, targetId);\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\n\n anno.textBlock.children.length = 0;\n anno.textBlock.appendRun(createField(sourceA, \"A2\"));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(1, targetId);\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\n\n anno.textBlock.children.length = 0;\n anno.textBlock.appendRun(TextRun.create({\n styleOverrides: { font: { name: \"Karla\" } },\n content: \"not a field\",\n }));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(0, targetId);\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\n });\n\n it(\"ignores invalid source element Ids\", () => {\n const source = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(Id64.invalid, \"invalid\"));\n block.appendRun(createField(\"0xbaadf00d\", \"non-existent\"));\n block.appendRun(createField(source, \"valid\"));\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n expectNumRelationships(1, targetId);\n });\n });\n\n function expectText(expected: string, elemId: Id64String, db?: StandaloneDb): void {\n db = db ?? imodel;\n const elem = db.elements.getElement<TextAnnotation3d>(elemId);\n const anno = elem.getAnnotation()!;\n const actual = anno.textBlock.stringify();\n expect(actual).to.equal(expected);\n }\n\n it(\"evaluates cachedContent when annotation element is inserted\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(sourceId, \"initial cached content\"));\n expect(block.stringify()).to.equal(\"initial cached content\");\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n expect(target.getAnnotation()!.textBlock.stringify()).to.equal(\"100\");\n });\n\n it(\"updates fields when source element is modified or deleted\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(sourceId, \"old value\"));;\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n expect(target.getAnnotation()).not.to.be.undefined;\n\n expectText(\"100\", targetId);\n\n let source = imodel.elements.getElement<TestElement>(sourceId);\n source.intProp = 50;\n source.update();\n\n expectText(\"100\", targetId);\n\n imodel.saveChanges();\n\n source = imodel.elements.getElement<TestElement>(sourceId);\n expect(source.intProp).to.equal(50);\n\n expectText(\"50\", targetId);\n\n imodel.elements.deleteElement(sourceId);\n expectText(\"50\", targetId);\n\n imodel.saveChanges();\n expectText(FieldRun.invalidContentIndicator, targetId);\n });\n\n it(\"updates fields when source element aspect is modified, deleted, or recreated\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField({ elementId: sourceId, schemaName: \"Fields\", className: \"TestAspect\" }, \"\", \"aspectProp\"));\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n expectText(\"999\", targetId);\n\n const aspects = imodel.elements.getAspects(sourceId, \"Fields:TestAspect\");\n expect(aspects.length).to.equal(1);\n const aspect = aspects[0] as TestAspect;\n expect(aspect.aspectProp).to.equal(999);\n\n aspect.aspectProp = 12345;\n imodel.elements.updateAspect(aspect.toJSON());\n imodel.saveChanges();\n expectText(\"12345\", targetId);\n\n imodel.elements.deleteAspect([aspect.id]);\n imodel.saveChanges();\n expectText(FieldRun.invalidContentIndicator, targetId);\n\n const newAspect: TestAspectProps = {\n element: new ElementOwnsUniqueAspect(sourceId),\n classFullName: TestAspect.classFullName,\n aspectProp: 42,\n };\n imodel.elements.insertAspect(newAspect);\n imodel.saveChanges();\n expectText(\"42\", targetId);\n });\n\n it(\"updates only fields for specific modified element\", () => {\n const sourceA = insertTestElement();\n const sourceB = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(sourceA, \"A\"));\n block.appendRun(createField(sourceB, \"B\"));\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n expectText(\"100100\", targetId);\n\n const sourceElem = imodel.elements.getElement<TestElement>(sourceB);\n sourceElem.intProp = 123;\n sourceElem.update();\n imodel.saveChanges();\n\n expectText(\"100123\", targetId);\n });\n\n it(\"supports complex property paths\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(sourceId, \"\", \"outerStruct\", [\"innerStructs\", 1, \"doubles\", -2]));\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n expectText(\"2\", targetId);\n\n const source = imodel.elements.getElement<TestElement>(sourceId);\n source.outerStruct.innerStructs[1].doubles[3] = 12.5;\n source.update();\n imodel.saveChanges();\n expectText(\"12.5\", targetId);\n });\n\n describe(\"remapFields\", () => {\n let dstIModel: StandaloneDb;\n let dstModel: Id64String;\n let dstCategory: Id64String;\n let dstSourceElementId: Id64String;\n\n before(async () => {\n const path = IModelTestUtils.prepareOutputFile(\"RemapFields\", `dst.bim`);\n dstIModel = StandaloneDb.createEmpty(path, { rootSubject: { name: `RemapFields-dst` }, allowEdit: JSON.stringify({ txns: true })});\n await registerTestSchema(dstIModel);\n\n // Insert additional unused elements to ensure element Ids differ between src and dst iModels\n for (let i = 0; i < 3; i++) {\n IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\n }\n\n const modelAndElement = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\n expect(modelAndElement[0]).to.equal(modelAndElement[1]);\n\n dstModel = modelAndElement[1];\n dstCategory = SpatialCategory.insert(dstIModel, StandaloneDb.dictionaryId, `dstCat`, new SubCategoryAppearance());\n dstSourceElementId = createTestElement(dstIModel, dstModel, dstCategory, {\n intProp: 200,\n point: { x: -1, y: -2, z: -3 },\n strings: [\"x\", \"y\", \"z\"],\n intEnum: 2,\n }, 1234);\n\n await dstIModel.fonts.embedFontFile({\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\n });\n\n expect(dstCategory).not.to.equal(category);\n expect(dstModel).not.to.equal(model);\n expect(dstSourceElementId).not.to.equal(sourceElementId);\n });\n\n after(() => {\n dstIModel.close();\n });\n\n function getTextBlockJson(): TextBlockProps {\n return {\n children: [{\n children: [{\n type: \"field\",\n propertyHost: {\n elementId: sourceElementId,\n schemaName: \"Fields\",\n className: \"TestElement\",\n },\n propertyPath: { propertyName: \"intProp\" },\n cachedContent: \"intProp\",\n }, {\n type: \"field\",\n propertyHost: {\n elementId: category,\n schemaName: \"BisCore\",\n className: \"Element\",\n },\n propertyPath: { propertyName: \"CodeValue\" },\n cachedContent: \"CodeValue\"\n }],\n }],\n };\n }\n\n function expectHostIds(elem: TextAnnotation3d, host1: Id64String, host2: Id64String): void {\n const anno = elem.getAnnotation()!;\n expect(anno.textBlock.children.length).to.equal(1);\n const para = anno.textBlock.children[0];\n expect(para.children.length).to.equal(2);\n expect(para.children.every((x) => x.type === \"field\"));\n const field1 = para.children[0] as FieldRun;\n expect(field1.propertyHost.elementId).to.equal(host1);\n const field2 = para.children[1] as FieldRun;\n expect(field2.propertyHost.elementId).to.equal(host2);\n }\n\n it(\"remaps field hosts\", () => {\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\n expectHostIds(elem, sourceElementId, category);\n\n const context = new IModelElementCloneContext(imodel, dstIModel);\n context.remapElement(sourceElementId, dstSourceElementId);\n context.remapElement(category, dstCategory);\n\n ElementDrivesTextAnnotation.remapFields(elem, context);\n expectHostIds(elem, dstSourceElementId, dstCategory);\n });\n\n it(\"invalidates field host if source element not remapped\", () => {\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\n expectHostIds(elem, sourceElementId, category);\n\n const context = new IModelElementCloneContext(imodel, dstIModel);\n\n ElementDrivesTextAnnotation.remapFields(elem, context);\n expectHostIds(elem, Id64.invalid, Id64.invalid);\n });\n });\n });\n\n describe(\"Format Validation\", () => {\n it(\"validates formatting options for string property type\", () => {\n // Create a FieldRun with string property type and some format options\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"strings\", accessors: [0] },\n cachedContent: \"oldValue\",\n formatOptions: {\n case: \"upper\",\n prefix: \"Value: \",\n suffix: \"!\"\n }\n });\n\n // Context returns a string value for the property\n const context = {\n hostElementId: sourceElementId,\n getProperty: () => { return { value: \"abc\", type: \"string\" as const } },\n };\n\n // Update the field and check the result\n const updated = updateField(fieldRun, context);\n\n // The formatted value should be uppercased and have prefix/suffix applied\n expect(updated).to.be.true;\n expect(fieldRun.cachedContent).to.equal(\"Value: ABC!\");\n });\n\n it(\"validates formatting options for datetime objects\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\n const fieldRun = FieldRun.create({\n propertyHost,\n propertyPath: { propertyName: \"datetime\"},\n cachedContent: \"oldval\",\n formatOptions: {\n dateTime: {\n formatOptions:{\n month: \"short\",\n day: \"2-digit\",\n year: \"numeric\",\n timeZone: \"UTC\"\n },\n locale: \"en-US\",\n },\n },\n });\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n const updated = updateField(fieldRun, context);\n\n expect(updated).to.be.true;\n expect(fieldRun.cachedContent).to.equal(\"Aug 28, 2025\");\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"Fields.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/Fields.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 { Code, ElementAspectProps, FieldPropertyHost, FieldPropertyPath, FieldPropertyType, FieldRun, FieldValue, PhysicalElementProps, SubCategoryAppearance, TextAnnotation, TextBlock, TextBlockProps, TextRun } from \"@itwin/core-common\";\nimport { IModelDb, StandaloneDb } from \"../../IModelDb\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { createUpdateContext, updateField, updateFields } from \"../../internal/annotations/fields\";\nimport { DbResult, Id64, Id64String, ProcessDetector } from \"@itwin/core-bentley\";\nimport { SpatialCategory } from \"../../Category\";\nimport { Point3d, XYAndZ, YawPitchRollAngles } from \"@itwin/core-geometry\";\nimport { Schema, Schemas } from \"../../Schema\";\nimport { ClassRegistry } from \"../../ClassRegistry\";\nimport { PhysicalElement } from \"../../Element\";\nimport { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, IModelElementCloneContext, TextAnnotation3d } from \"../../core-backend\";\nimport { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault } from \"../../annotations/ElementDrivesTextAnnotation\";\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 createTestElement(imodel: StandaloneDb, model: Id64String, category: Id64String, overrides?: Partial<TestElementProps>, aspectProp = 999): Id64String {\n const props: TestElementProps = {\n classFullName: \"Fields:TestElement\",\n model,\n category,\n code: Code.createEmpty(),\n intProp: 100,\n point: { x: 1, y: 2, z: 3 },\n strings: [\"a\", \"b\", `\"name\": \"c\"`],\n datetime: new Date(\"2025-08-28T13:45:30.123Z\"),\n intEnum: 1,\n outerStruct: {\n innerStruct: { bool: false, doubles: [1, 2, 3] },\n innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],\n },\n outerStructs: [{\n innerStruct: { bool: true, doubles: [10, 9] },\n innerStructs: [{ bool: false, doubles: [5] }],\n }],\n placement: {\n origin: new Point3d(1, 2, 0),\n angles: new YawPitchRollAngles(),\n },\n jsonProperties: {\n stringProp: \"abc\",\n ints: [10, 11, 12, 13],\n bool: true,\n zoo: {\n address: {\n zipcode: 12345,\n },\n birds: [\n { name: \"duck\", sound: \"quack\" },\n { name: \"hawk\", sound: \"scree!\" },\n ],\n },\n },\n ...overrides,\n };\n\n const id = imodel.elements.insertElement(props);\n\n const aspectProps: TestAspectProps = {\n classFullName: TestAspect.classFullName,\n aspectProp,\n element: new ElementOwnsUniqueAspect(id),\n };\n imodel.elements.insertAspect(aspectProps);\n\n imodel.saveChanges();\n return id;\n}\n\ndescribe(\"updateField\", () => {\n const mockElementId = \"0x1\";\n const mockPath: FieldPropertyPath = {\n propertyName: \"mockProperty\",\n accessors: [0, \"nestedProperty\"],\n };\n const mockCachedContent = \"cachedContent\";\n const mockUpdatedContent = \"updatedContent\";\n\n const createMockContext = (elementId: string, propertyValue?: string) => ({\n hostElementId: elementId,\n getProperty: (field: FieldRun): FieldValue | undefined => {\n const propertyPath = field.propertyPath;\n if (\n propertyPath.propertyName === \"mockProperty\" &&\n propertyPath.accessors?.[0] === 0 &&\n propertyPath.accessors?.[1] === \"nestedProperty\" &&\n propertyValue !== undefined\n ) {\n return { value: propertyValue, type: \"string\" };\n }\n return undefined;\n },\n });\n\n it(\"does nothing if hostElementId does not match\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = createMockContext(\"0x2\", mockUpdatedContent);\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.false;\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\n });\n\n it(\"produces invalid content indicator if property value is undefined\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = createMockContext(mockElementId);\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.true;\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\n });\n\n it(\"returns false if cached content matches new content\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = createMockContext(mockElementId, mockCachedContent);\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.false;\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\n });\n\n it(\"returns true and updates cached content if new content is different\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = createMockContext(mockElementId, mockUpdatedContent);\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.true;\n expect(fieldRun.cachedContent).to.equal(mockUpdatedContent);\n });\n\n it(\"resolves to invalid content indicator if an exception occurs\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\n propertyPath: mockPath,\n cachedContent: mockCachedContent,\n });\n\n const context = {\n hostElementId: mockElementId,\n getProperty: () => {\n throw new Error(\"Test exception\");\n },\n };\n\n const result = updateField(fieldRun, context);\n\n expect(result).to.be.true;\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\n });\n});\n\nconst fieldsSchemaXml = `\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ECSchema schemaName=\"Fields\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00.04\" alias=\"bis\"/>\n <ECSchemaReference name='ECDbMap' version='02.00.04' alias='ecdbmap' />\n\n <ECEnumeration typeName=\"IntEnum\" backingTypeName=\"int\">\n <ECEnumerator name=\"one\" displayLabel=\"One\" value=\"1\" />\n <ECEnumerator name=\"two\" displayLabel=\"Two\" value=\"2\"/>\n </ECEnumeration>\n\n <ECStructClass typeName=\"InnerStruct\" modifier=\"None\">\n <ECProperty propertyName=\"bool\" typeName=\"boolean\"/>\n <ECArrayProperty propertyName=\"doubles\" typeName=\"double\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n </ECStructClass>\n\n <ECStructClass typeName=\"OuterStruct\" modifier=\"None\">\n <ECStructProperty propertyName=\"innerStruct\" typeName=\"InnerStruct\"/>\n <ECStructArrayProperty propertyName=\"innerStructs\" typeName=\"InnerStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n </ECStructClass>\n\n <ECEntityClass typeName=\"TestElement\" modifier=\"None\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n <ECProperty propertyName=\"intProp\" typeName=\"int\"/>\n <ECProperty propertyName=\"point\" typeName=\"point3d\"/>\n <ECProperty propertyName=\"maybeNull\" typeName=\"int\"/>\n <ECProperty propertyName=\"datetime\" typeName=\"dateTime\"/>\n <ECArrayProperty propertyName=\"strings\" typeName=\"string\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n <ECStructProperty propertyName=\"outerStruct\" typeName=\"OuterStruct\"/>\n <ECStructArrayProperty propertyName=\"outerStructs\" typeName=\"OuterStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n <ECProperty propertyName=\"intEnum\" typeName=\"IntEnum\"/>\n </ECEntityClass>\n\n <ECEntityClass typeName=\"TestAspect\" modifier=\"None\">\n <BaseClass>bis:ElementUniqueAspect</BaseClass>\n <ECProperty propertyName=\"aspectProp\" typeName=\"int\"/>\n </ECEntityClass>\n\n <ECEntityClass typeName=\"TestElementStringProp\" modifier=\"Abstract\">\n <ECCustomAttributes>\n <QueryView xmlns=\"ECDbMap.02.00.04\">\n <Query>\n SELECT\n jo.ECInstanceId,\n ec_classid('Fields', 'TestElementStringProp') [ECClassId],\n json_extract(jo.jsonProperties, '$.stringProp') [StringProp]\n FROM Fields.TestElement jo\n </Query>\n </QueryView>\n </ECCustomAttributes>\n <ECProperty propertyName=\"StringProp\" typeName=\"string\" />\n </ECEntityClass>\n</ECSchema>\n`;\n\ninterface InnerStruct {\n bool: boolean;\n doubles: number[];\n}\n\ninterface OuterStruct {\n innerStruct: InnerStruct;\n innerStructs: InnerStruct[];\n}\n\ninterface TestElementProps extends PhysicalElementProps {\n intProp: number;\n point: XYAndZ;\n maybeNull?: number;\n strings: string[];\n datetime: Date;\n outerStruct: OuterStruct;\n outerStructs: OuterStruct[];\n intEnum?: number;\n}\n\nclass TestElement extends PhysicalElement {\n public static override get className() { return \"TestElement\"; }\n declare public intProp: number;\n declare public point: XYAndZ;\n declare public maybeNull?: number;\n declare public strings: string[];\n declare public datetime: Date;\n declare public outerStruct: OuterStruct;\n declare public outerStructs: OuterStruct[];\n}\n\nclass TestAspect extends ElementUniqueAspect {\n public static override get className() { return \"TestAspect\"; }\n\n declare public aspectProp: number;\n}\n\ninterface TestAspectProps extends ElementAspectProps {\n aspectProp: number;\n}\n\nclass FieldsSchema extends Schema {\n public static override get schemaName() { return \"Fields\"; }\n}\n\nasync function registerTestSchema(iModel: IModelDb): Promise<void> {\n if (!Schemas.getRegisteredSchema(\"Fields\")) {\n Schemas.registerSchema(FieldsSchema);\n ClassRegistry.register(TestElement, FieldsSchema);\n ClassRegistry.register(TestAspect, FieldsSchema);\n }\n\n await iModel.importSchemaStrings([fieldsSchemaXml]);\n iModel.saveChanges();\n}\n\ndescribe(\"Field evaluation\", () => {\n let imodel: StandaloneDb;\n let model: Id64String;\n let category: Id64String;\n let sourceElementId: Id64String;\n\n before(async () => {\n const iModelPath = IModelTestUtils.prepareOutputFile(\"UpdateFieldsContext\", \"test.bim\");\n imodel = StandaloneDb.createEmpty(iModelPath, { rootSubject: { name: \"UpdateFieldsContext\" }, allowEdit: JSON.stringify({ txns: true } )});\n\n await registerTestSchema(imodel);\n\n model = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), true)[1];\n category = SpatialCategory.insert(imodel, StandaloneDb.dictionaryId, \"UpdateFieldsContextCategory\", new SubCategoryAppearance());\n sourceElementId = insertTestElement();\n\n await imodel.fonts.embedFontFile({\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\n });\n });\n\n after(() => {\n imodel.close();\n });\n\n function insertTestElement(overrides?: Partial<TestElementProps>, aspectProp?: number): Id64String {\n return createTestElement(imodel, model, category, overrides, aspectProp);\n }\n\n function evaluateField(propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): FieldValue | undefined {\n if (typeof propertyHost === \"string\") {\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\n }\n\n const field = FieldRun.create({\n propertyPath,\n propertyHost,\n });\n\n const context = createUpdateContext(propertyHost.elementId, imodel, deletedDependency);\n return context.getProperty(field);\n }\n\n describe(\"getProperty\", () => {\n function expectValue(expected: any, propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): void {\n expect(evaluateField(propertyPath, propertyHost, deletedDependency)?.value).to.deep.equal(expected);\n }\n\n it(\"returns a primitive property value\", () => {\n expectValue(100, { propertyName: \"intProp\" }, sourceElementId);\n });\n\n it(\"returns an integer enum property value\", () => {\n expectValue(1, { propertyName: \"intEnum\" }, sourceElementId);\n });\n\n it(\"treats points as primitive values\", () => {\n expectValue({ x: 1, y: 2, z: 3 }, { propertyName: \"point\" }, sourceElementId);\n expectValue(undefined, { propertyName: \"point\", accessors: [\"x\"] }, sourceElementId);\n });\n\n it(\"returns a primitive array value\", () => {\n expectValue(\"a\", { propertyName: \"strings\", accessors: [0] }, sourceElementId);\n expectValue(\"b\", { propertyName: \"strings\", accessors: [1] }, sourceElementId);\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [2] }, sourceElementId);\n });\n\n it(\"supports negative array indices\", () => {\n expectValue(\"a\", { propertyName: \"strings\", accessors: [-3] }, sourceElementId);\n expectValue(\"b\", { propertyName: \"strings\", accessors: [-2] }, sourceElementId);\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [-1] }, sourceElementId);\n });\n\n it(\"supports properties of EC views\", () => {\n expectValue(\"abc\", { propertyName: \"stringProp\" }, { schemaName: \"Fields\", className: \"TestElementStringProp\", elementId: sourceElementId });\n });\n\n it(\"returns undefined if the dependency was deleted\", () => {\n expectValue(undefined, { propertyName: \"intProp\" }, sourceElementId, true);\n });\n\n it(\"returns undefined if the host element does not exist\", () => {\n expectValue(undefined, { propertyName: \"intProp\" }, \"0xbaadf00d\");\n });\n\n it(\"returns undefined if the host element is not of the specified class or a subclass thereof\", () => {\n expectValue(undefined, { propertyName: \"origin\" }, { schemaName: \"BisCore\", className: \"GeometricElement2d\", elementId: sourceElementId });\n });\n\n it(\"returns undefined if an access string is specified for a non-object property\", () => {\n expectValue(undefined, { propertyName: \"intProp\", accessors: [\"property\"] }, sourceElementId);\n });\n\n it(\"returns undefined if the specified property does not exist\", () => {\n expectValue(undefined, { propertyName: \"nonExistentProperty\" }, sourceElementId);\n });\n\n it(\"returns undefined if the specified property is null\", () => {\n expectValue(undefined, { propertyName: \"maybeNull\" }, sourceElementId);\n });\n\n it(\"returns undefined if an array index is specified for a non-array property\", () => {\n expectValue(undefined, { propertyName: \"intProp\", accessors: [0] }, sourceElementId);\n });\n\n it(\"returns undefined if an array index is out of bounds\", () => {\n for (const index of [3, 4, -4, -5]) {\n expectValue(undefined, { propertyName: \"strings\", accessors: [index] }, sourceElementId);\n }\n });\n\n it(\"returns undefined for a non-primitive value\", () => {\n expectValue(undefined, { propertyName: \"strings\" }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStruct\" }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStruct\", accessors: [\"innerStruct\"] }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStructs\" }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0] }, sourceElementId);\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\"] }, sourceElementId);\n });\n\n it(\"returns arbitrarily-nested properties of structs and struct arrays\", () => {\n expectValue(false, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] }, sourceElementId);\n for (const index of [0, 1, 2]) {\n expectValue(index + 1, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", index] },sourceElementId);\n expectValue(3 - index, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", -1 - index] },sourceElementId);\n }\n\n expectValue(9, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\", \"doubles\", 1] }, sourceElementId);\n expectValue(false, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", -1, \"bool\"] }, sourceElementId);\n expectValue(5, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", 0, \"doubles\", 0] }, sourceElementId);\n });\n\n it(\"returns the value of a property of an aspect\", () => {\n expect(imodel.elements.getAspects(sourceElementId, \"Fields:TestAspect\").length).to.equal(1);\n expectValue(999, { propertyName: \"aspectProp\" }, { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestAspect\" });\n });\n\n it(\"should fail to evaluate if prop type does not match\", () => {\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"string\", accessors: [0] },\n cachedContent: \"oldValue\",\n formatOptions: {\n case: \"upper\",\n prefix: \"Value: \",\n suffix: \"!\"\n }\n });\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n\n const updated = updateField(fieldRun, context);\n\n expect(updated).to.be.true;\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\n });\n\n function getPropertyType(propertyHost: FieldPropertyHost, propertyPath: string | FieldPropertyPath): FieldPropertyType | undefined {\n if (typeof propertyPath === \"string\") {\n propertyPath = { propertyName: propertyPath };\n }\n\n return evaluateField(propertyPath, propertyHost)?.type;\n }\n\n it(\"deduces type for primitive properties\", () => {\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\n expect(getPropertyType(propertyHost, \"intProp\")).to.equal(\"string\");\n expect(getPropertyType(propertyHost, \"point\")).to.equal(\"coordinate\");\n expect(getPropertyType(propertyHost, { propertyName: \"strings\", accessors: [0] })).to.equal(\"string\");\n expect(getPropertyType(propertyHost, \"intEnum\")).to.equal(\"int-enum\");\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", 0] })).to.equal(\"quantity\");\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] })).to.equal(\"boolean\");\n\n propertyHost.schemaName = \"BisCore\";\n propertyHost.className = \"GeometricElement3d\";\n expect(getPropertyType(propertyHost, \"LastMod\")).to.equal(\"datetime\");\n expect(getPropertyType(propertyHost, \"FederationGuid\")).to.equal(\"string\");\n });\n\n it(\"returns undefined for non-primitive properties\", () => {\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\n expect(getPropertyType(propertyHost, \"outerStruct\")).to.equal(undefined);\n expect(getPropertyType(propertyHost, \"outerStructs\")).to.equal(undefined);\n });\n\n it(\"returns undefined for invalid property paths\", () => {\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\n expect(getPropertyType(propertyHost, \"unknownPropertyName\")).to.be.undefined;\n });\n\n it(\"should return undefined for unsupported primitive types\", () => {\n const host = { elementId: sourceElementId, schemaName: \"BisCore\", className: \"GeometricElement3d\" };\n expect(getPropertyType(host, \"GeometryStream\")).to.be.undefined;\n });\n });\n\n describe(\"updateFields\", () => {\n it(\"recomputes cached content\", () => {\n const textBlock = TextBlock.create();\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"intProp\" },\n cachedContent: \"oldValue\",\n });\n\n textBlock.appendRun(fieldRun);\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n const updatedCount = updateFields(textBlock, context);\n\n expect(updatedCount).to.equal(1);\n expect(fieldRun.cachedContent).to.equal(\"100\"); // `intProp` value from the test element\n });\n\n it(\"does not update a field if recomputed content matches cached content\", () => {\n const textBlock = TextBlock.create();\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"intProp\" },\n cachedContent: \"100\",\n });\n\n textBlock.appendRun(fieldRun);\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n const updatedCount = updateFields(textBlock, context);\n\n expect(updatedCount).to.equal(0);\n expect(fieldRun.cachedContent).to.equal(\"100\");\n });\n\n it(\"returns the number of fields updated\", () => {\n const textBlock = TextBlock.create();\n const fieldRun1 = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"intProp\" },\n cachedContent: \"100\",\n });\n\n const fieldRun2 = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"strings\", accessors: [0] },\n cachedContent: \"oldValue\",\n });\n\n textBlock.appendRun(fieldRun1);\n textBlock.appendRun(fieldRun2);\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n const updatedCount = updateFields(textBlock, context);\n\n expect(updatedCount).to.equal(1);\n expect(fieldRun1.cachedContent).to.equal(\"100\");\n expect(fieldRun2.cachedContent).to.equal(\"a\");\n });\n });\n\n function createAnnotationElement(textBlock: TextBlock | undefined): TextAnnotation3d {\n const elem = TextAnnotation3d.fromJSON({\n model,\n category,\n code: Code.createEmpty(),\n placement: {\n origin: { x: 0, y: 0, z: 0 },\n angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\n },\n classFullName: TextAnnotation3d.classFullName,\n defaultTextStyle: new TextAnnotationUsesTextStyleByDefault(\"0x123\").toJSON(),\n }, imodel);\n\n if (textBlock) {\n const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });\n elem.setAnnotation(annotation);\n }\n\n return elem;\n }\n\n function insertAnnotationElement(textBlock: TextBlock | undefined): Id64String {\n const elem = createAnnotationElement(textBlock);\n return elem.insert();\n }\n\n describe(\"ElementDrivesTextAnnotation\", () => {\n function expectNumRelationships(expected: number, targetId?: Id64String): void {\n const where = targetId ? ` WHERE TargetECInstanceId=${targetId}` : \"\";\n const ecsql = `SELECT COUNT(*) FROM BisCore.ElementDrivesTextAnnotation ${where}`;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n imodel.withPreparedStatement(ecsql, (stmt) => {\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);\n expect(stmt.getValue(0).getInteger()).to.equal(expected);\n });\n }\n\n it(\"can be inserted\", () => {\n expectNumRelationships(0);\n\n const targetId = insertAnnotationElement(undefined);\n expect(targetId).not.to.equal(Id64.invalid);\n\n const target = imodel.elements.getElement(targetId);\n expect(target.classFullName).to.equal(\"BisCore:TextAnnotation3d\");\n expect(target).instanceof(TextAnnotation3d);\n\n const targetAnno = imodel.elements.getElement<TextAnnotation3d>(targetId);\n expect(targetAnno).instanceof(TextAnnotation3d);\n\n const rel = ElementDrivesTextAnnotation.create(imodel, sourceElementId, targetId);\n const relId = rel.insert();\n expect(relId).not.to.equal(Id64.invalid);\n\n expectNumRelationships(1);\n\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementDrivesTextAnnotation\", relId);\n expect(relationship.sourceId).to.equal(sourceElementId);\n expect(relationship.targetId).to.equal(targetId);\n });\n\n function createField(propertyHost: Id64String | FieldPropertyHost, cachedContent: string, propertyName = \"intProp\", accessors?: Array<string | number>): FieldRun {\n if (typeof propertyHost === \"string\") {\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\n }\n\n return FieldRun.create({\n styleOverrides: { font: { name: \"Karla\" } },\n propertyHost,\n cachedContent,\n propertyPath: { propertyName, accessors },\n });\n }\n\n describe(\"updateFieldDependencies\", () => {\n it(\"creates exactly one relationship for each unique source element on insert and update\", () => {\n const source1 = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(source1, \"1\"));\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n expectNumRelationships(1, targetId);\n\n const source2 = insertTestElement();\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n const anno = target.getAnnotation()!;\n anno.textBlock.appendRun(createField(source2, \"2a\"));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(2, targetId);\n\n anno.textBlock.appendRun(createField(source2, \"2b\"));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(2, targetId);\n\n const source3 = insertTestElement();\n anno.textBlock.appendRun(createField(source3, \"3\"));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(3, targetId);\n });\n\n it(\"deletes stale relationships\", () => {\n const sourceA = insertTestElement();\n const sourceB = insertTestElement();\n\n const block = TextBlock.create();\n block.appendRun(createField(sourceA, \"A\"));\n block.appendRun(createField(sourceB, \"B\"));\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n expectNumRelationships(2, targetId);\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\n\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n const anno = target.getAnnotation()!;\n\n // Remove the sourceA FieldRun from the first paragraph.\n const p1 = anno.textBlock.children[0];\n p1.children.shift();\n\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(1, targetId);\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\n\n anno.textBlock.children.length = 0;\n anno.textBlock.appendRun(createField(sourceA, \"A2\"));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(1, targetId);\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\n\n anno.textBlock.children.length = 0;\n anno.textBlock.appendRun(TextRun.create({\n styleOverrides: { font: { name: \"Karla\" } },\n content: \"not a field\",\n }));\n target.setAnnotation(anno);\n target.update();\n imodel.saveChanges();\n\n expectNumRelationships(0, targetId);\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\n });\n\n it(\"ignores invalid source element Ids\", () => {\n const source = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(Id64.invalid, \"invalid\"));\n block.appendRun(createField(\"0xbaadf00d\", \"non-existent\"));\n block.appendRun(createField(source, \"valid\"));\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n expectNumRelationships(1, targetId);\n });\n });\n\n function expectText(expected: string, elemId: Id64String, db?: StandaloneDb): void {\n db = db ?? imodel;\n const elem = db.elements.getElement<TextAnnotation3d>(elemId);\n const anno = elem.getAnnotation()!;\n const actual = anno.textBlock.stringify();\n expect(actual).to.equal(expected);\n }\n\n it(\"evaluates cachedContent when annotation element is inserted\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(sourceId, \"initial cached content\"));\n expect(block.stringify()).to.equal(\"initial cached content\");\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n expect(target.getAnnotation()!.textBlock.stringify()).to.equal(\"100\");\n });\n\n it(\"updates fields when source element is modified or deleted\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(sourceId, \"old value\"));;\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n expect(target.getAnnotation()).not.to.be.undefined;\n\n expectText(\"100\", targetId);\n\n let source = imodel.elements.getElement<TestElement>(sourceId);\n source.intProp = 50;\n source.update();\n\n expectText(\"100\", targetId);\n\n imodel.saveChanges();\n\n source = imodel.elements.getElement<TestElement>(sourceId);\n expect(source.intProp).to.equal(50);\n\n expectText(\"50\", targetId);\n\n imodel.elements.deleteElement(sourceId);\n expectText(\"50\", targetId);\n\n imodel.saveChanges();\n expectText(FieldRun.invalidContentIndicator, targetId);\n });\n\n it(\"updates fields when source element aspect is modified, deleted, or recreated\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField({ elementId: sourceId, schemaName: \"Fields\", className: \"TestAspect\" }, \"\", \"aspectProp\"));\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n expectText(\"999\", targetId);\n\n const aspects = imodel.elements.getAspects(sourceId, \"Fields:TestAspect\");\n expect(aspects.length).to.equal(1);\n const aspect = aspects[0] as TestAspect;\n expect(aspect.aspectProp).to.equal(999);\n\n aspect.aspectProp = 12345;\n imodel.elements.updateAspect(aspect.toJSON());\n imodel.saveChanges();\n expectText(\"12345\", targetId);\n\n imodel.elements.deleteAspect([aspect.id]);\n imodel.saveChanges();\n expectText(FieldRun.invalidContentIndicator, targetId);\n\n const newAspect: TestAspectProps = {\n element: new ElementOwnsUniqueAspect(sourceId),\n classFullName: TestAspect.classFullName,\n aspectProp: 42,\n };\n imodel.elements.insertAspect(newAspect);\n imodel.saveChanges();\n expectText(\"42\", targetId);\n });\n\n it(\"updates only fields for specific modified element\", () => {\n const sourceA = insertTestElement();\n const sourceB = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(sourceA, \"A\"));\n block.appendRun(createField(sourceB, \"B\"));\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n expectText(\"100100\", targetId);\n\n const sourceElem = imodel.elements.getElement<TestElement>(sourceB);\n sourceElem.intProp = 123;\n sourceElem.update();\n imodel.saveChanges();\n\n expectText(\"100123\", targetId);\n });\n\n it(\"supports complex property paths\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField(sourceId, \"\", \"outerStruct\", [\"innerStructs\", 1, \"doubles\", -2]));\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n expectText(\"2\", targetId);\n\n const source = imodel.elements.getElement<TestElement>(sourceId);\n source.outerStruct.innerStructs[1].doubles[3] = 12.5;\n source.update();\n imodel.saveChanges();\n expectText(\"12.5\", targetId);\n });\n\n it(\"updates EC view fields when the element changes if the EC view queries the element directly\", () => {\n const sourceId = insertTestElement();\n const block = TextBlock.create();\n block.appendRun(createField({\n elementId: sourceId, schemaName: \"Fields\", className: \"TestElementStringProp\",\n }, \"cached-content\", \"StringProp\"));\n\n const targetId = insertAnnotationElement(block);\n imodel.saveChanges();\n\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\n expect(target.getAnnotation()).not.to.be.undefined;\n\n expectText(\"abc\", targetId);\n\n let source = imodel.elements.getElement<TestElement>(sourceId);\n source.jsonProperties.stringProp = \"zyx\";\n source.update();\n\n expectText(\"abc\", targetId);\n\n imodel.saveChanges();\n expectText(\"zyx\", targetId);\n\n source = imodel.elements.getElement<TestElement>(sourceId);\n expect(source.jsonProperties.stringProp).to.equal(\"zyx\");\n\n expectText(\"zyx\", targetId);\n\n imodel.elements.deleteElement(sourceId);\n expectText(\"zyx\", targetId);\n\n imodel.saveChanges();\n expectText(FieldRun.invalidContentIndicator, targetId);\n });\n\n describe(\"remapFields\", () => {\n let dstIModel: StandaloneDb;\n let dstModel: Id64String;\n let dstCategory: Id64String;\n let dstSourceElementId: Id64String;\n\n before(async () => {\n const path = IModelTestUtils.prepareOutputFile(\"RemapFields\", `dst.bim`);\n dstIModel = StandaloneDb.createEmpty(path, { rootSubject: { name: `RemapFields-dst` }, allowEdit: JSON.stringify({ txns: true })});\n await registerTestSchema(dstIModel);\n\n // Insert additional unused elements to ensure element Ids differ between src and dst iModels\n for (let i = 0; i < 3; i++) {\n IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\n }\n\n const modelAndElement = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\n expect(modelAndElement[0]).to.equal(modelAndElement[1]);\n\n dstModel = modelAndElement[1];\n dstCategory = SpatialCategory.insert(dstIModel, StandaloneDb.dictionaryId, `dstCat`, new SubCategoryAppearance());\n dstSourceElementId = createTestElement(dstIModel, dstModel, dstCategory, {\n intProp: 200,\n point: { x: -1, y: -2, z: -3 },\n strings: [\"x\", \"y\", \"z\"],\n intEnum: 2,\n }, 1234);\n\n await dstIModel.fonts.embedFontFile({\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\n });\n\n expect(dstCategory).not.to.equal(category);\n expect(dstModel).not.to.equal(model);\n expect(dstSourceElementId).not.to.equal(sourceElementId);\n });\n\n after(() => {\n dstIModel.close();\n });\n\n function getTextBlockJson(): TextBlockProps {\n return {\n children: [{\n children: [{\n type: \"field\",\n propertyHost: {\n elementId: sourceElementId,\n schemaName: \"Fields\",\n className: \"TestElement\",\n },\n propertyPath: { propertyName: \"intProp\" },\n cachedContent: \"intProp\",\n }, {\n type: \"field\",\n propertyHost: {\n elementId: category,\n schemaName: \"BisCore\",\n className: \"Element\",\n },\n propertyPath: { propertyName: \"CodeValue\" },\n cachedContent: \"CodeValue\"\n }],\n }],\n };\n }\n\n function expectHostIds(elem: TextAnnotation3d, host1: Id64String, host2: Id64String): void {\n const anno = elem.getAnnotation()!;\n expect(anno.textBlock.children.length).to.equal(1);\n const para = anno.textBlock.children[0];\n expect(para.children.length).to.equal(2);\n expect(para.children.every((x) => x.type === \"field\"));\n const field1 = para.children[0] as FieldRun;\n expect(field1.propertyHost.elementId).to.equal(host1);\n const field2 = para.children[1] as FieldRun;\n expect(field2.propertyHost.elementId).to.equal(host2);\n }\n\n it(\"remaps field hosts\", () => {\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\n expectHostIds(elem, sourceElementId, category);\n\n const context = new IModelElementCloneContext(imodel, dstIModel);\n context.remapElement(sourceElementId, dstSourceElementId);\n context.remapElement(category, dstCategory);\n\n ElementDrivesTextAnnotation.remapFields(elem, context);\n expectHostIds(elem, dstSourceElementId, dstCategory);\n });\n\n it(\"invalidates field host if source element not remapped\", () => {\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\n expectHostIds(elem, sourceElementId, category);\n\n const context = new IModelElementCloneContext(imodel, dstIModel);\n\n ElementDrivesTextAnnotation.remapFields(elem, context);\n expectHostIds(elem, Id64.invalid, Id64.invalid);\n });\n });\n });\n\n describe(\"Format Validation\", () => {\n it(\"validates formatting options for string property type\", () => {\n // Create a FieldRun with string property type and some format options\n const fieldRun = FieldRun.create({\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\n propertyPath: { propertyName: \"strings\", accessors: [0] },\n cachedContent: \"oldValue\",\n formatOptions: {\n case: \"upper\",\n prefix: \"Value: \",\n suffix: \"!\"\n }\n });\n\n // Context returns a string value for the property\n const context = {\n hostElementId: sourceElementId,\n getProperty: () => { return { value: \"abc\", type: \"string\" as const } },\n };\n\n // Update the field and check the result\n const updated = updateField(fieldRun, context);\n\n // The formatted value should be uppercased and have prefix/suffix applied\n expect(updated).to.be.true;\n expect(fieldRun.cachedContent).to.equal(\"Value: ABC!\");\n });\n\n it(\"validates formatting options for datetime objects\", function () {\n if (!isIntlSupported()) {\n this.skip();\n }\n\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\n const fieldRun = FieldRun.create({\n propertyHost,\n propertyPath: { propertyName: \"datetime\"},\n cachedContent: \"oldval\",\n formatOptions: {\n dateTime: {\n formatOptions:{\n month: \"short\",\n day: \"2-digit\",\n year: \"numeric\",\n timeZone: \"UTC\"\n },\n locale: \"en-US\",\n },\n },\n });\n\n const context = createUpdateContext(sourceElementId, imodel, false);\n const updated = updateField(fieldRun, context);\n\n expect(updated).to.be.true;\n expect(fieldRun.cachedContent).to.equal(\"Aug 28, 2025\");\n });\n });\n});\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { expect } from "chai";
|
|
6
|
-
import { ColorDef, GeometryParams, LineBreakRun, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
6
|
+
import { ColorDef, GeometryParams, LineBreakRun, terminatorShapes, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
7
7
|
import { LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from "@itwin/core-geometry";
|
|
8
8
|
import { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from "../../core-backend";
|
|
9
9
|
import { Id64 } from "@itwin/core-bentley";
|
|
@@ -142,6 +142,7 @@ describe("LeaderGeometry", () => {
|
|
|
142
142
|
wantElbow: true,
|
|
143
143
|
elbowLength: 5,
|
|
144
144
|
color: ColorDef.red.toJSON(),
|
|
145
|
+
terminatorShape: terminatorShapes[0],
|
|
145
146
|
terminatorHeightFactor: 2,
|
|
146
147
|
terminatorWidthFactor: 2,
|
|
147
148
|
}
|
|
@@ -163,7 +164,7 @@ describe("LeaderGeometry", () => {
|
|
|
163
164
|
const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;
|
|
164
165
|
const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;
|
|
165
166
|
// terminator length is calculated based on the terminator width and height factors.
|
|
166
|
-
const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + terminatorHeight * terminatorHeight);
|
|
167
|
+
const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + ((terminatorHeight / 2) * (terminatorHeight / 2)));
|
|
167
168
|
expect(terminatorLength).to.be.closeTo(expectedTerminatorLength, 0.01);
|
|
168
169
|
});
|
|
169
170
|
it("should apply elbow length overrides", () => {
|
|
@@ -175,6 +176,51 @@ describe("LeaderGeometry", () => {
|
|
|
175
176
|
const elbowLength = elbowLine.curveLength();
|
|
176
177
|
expect(elbowLength).to.be.closeTo(leaders[0].styleOverrides?.leader?.elbowLength ?? 1, 0.01);
|
|
177
178
|
});
|
|
179
|
+
it("should apply terminator shape overrides", () => {
|
|
180
|
+
const textHeight = 1;
|
|
181
|
+
const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;
|
|
182
|
+
const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;
|
|
183
|
+
let firstLeaderLineLengthBeforeTruncation;
|
|
184
|
+
terminatorShapes.forEach((shape) => {
|
|
185
|
+
it(`Terminator shape: ${shape}`, () => {
|
|
186
|
+
leaders[0].styleOverrides = { ...leaders[0].styleOverrides, leader: { terminatorShape: shape } };
|
|
187
|
+
const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
188
|
+
expect(result).to.be.true;
|
|
189
|
+
if (shape === "none") {
|
|
190
|
+
expect(builder.geometries.length).to.equal(1); // Only leader line should be present with no terminators
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
let terminatorGeometry = builder.geometries[1];
|
|
194
|
+
if (shape.includes("Filled")) {
|
|
195
|
+
expect(builder.geometries.length).to.equal(3); // One entry for geometry query and another for geometryParams for fill
|
|
196
|
+
terminatorGeometry = builder.geometries[2];
|
|
197
|
+
}
|
|
198
|
+
if (shape.includes("circle")) {
|
|
199
|
+
// expect(terminatorGeometry).to.be.instanceOf(Arc3d);
|
|
200
|
+
expect(terminatorGeometry.circularRadius()).to.equal(terminatorHeight / 2);
|
|
201
|
+
}
|
|
202
|
+
if (shape === "slash") {
|
|
203
|
+
expect(terminatorGeometry).to.be.instanceOf(LineSegment3d);
|
|
204
|
+
terminatorGeometry = terminatorGeometry;
|
|
205
|
+
expect(terminatorGeometry.curveLength()).to.equal(terminatorHeight);
|
|
206
|
+
}
|
|
207
|
+
if (shape === "closedArrow") {
|
|
208
|
+
// The leaderLine is truncated to accommodate the closed and hollow shape of the terminator
|
|
209
|
+
const leaderLine = builder.geometries[0];
|
|
210
|
+
const firstLeaderLine = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);
|
|
211
|
+
const firstLeaderLineLength = firstLeaderLine.curveLength();
|
|
212
|
+
expect(firstLeaderLineLength).to.be.closeTo(firstLeaderLineLengthBeforeTruncation - terminatorWidth, 0.01);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// keep record of first leader line length before truncation for closedArrow test
|
|
216
|
+
const leaderLine = builder.geometries[0];
|
|
217
|
+
const firstLeaderLineBeforeTruncation = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);
|
|
218
|
+
firstLeaderLineLengthBeforeTruncation = firstLeaderLineBeforeTruncation.curveLength();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
});
|
|
178
224
|
});
|
|
179
225
|
});
|
|
180
226
|
describe("computeElbowDirection", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LeaderGeometry.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/LeaderGeometry.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { expect } from \"chai\";\nimport { ColorDef, GeometryParams, LineBreakRun, TextAnnotation, TextAnnotationLeader, TextBlock, TextFrameStyleProps, TextRun, TextStyleSettings } from \"@itwin/core-common\";\nimport { LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from \"@itwin/core-geometry\";\nimport { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from \"../../core-backend\";\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\nimport { doLayout, MockBuilder } from \"../AnnotationTestUtils\";\n\ndescribe(\"LeaderGeometry\", () => {\n let builder: MockBuilder;\n let defaultParams: GeometryParams;\n\n const textBlock = TextBlock.create({ styleOverrides: { font: { name: \"Arial\" }, color: ColorDef.black.toJSON(), leader: {wantElbow: false} } });\n textBlock.appendRun(TextRun.create({ content: \"Hello\", styleOverrides: { font: { name: \"Arial\" } } }));\n textBlock.appendRun(LineBreakRun.create({\n styleOverrides: { font: { name: \"Arial\" } },\n }));\n textBlock.appendRun(TextRun.create({ content: \"World\", styleOverrides: { font: { name: \"Arial\" } } }));\n\n const frame: TextFrameStyleProps = { borderWeight: 1, shape: \"rectangle\" };\n\n const annotation = TextAnnotation.fromJSON({\n textBlock: textBlock.toJSON(),\n anchor: { horizontal: \"left\", vertical: \"top\" },\n orientation: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\n offset: { x: 0, y: 0 },\n });\n\n const findTextStyle = (id: Id64String) => TextStyleSettings.fromJSON(id === \"0x34\" ? { lineSpacingFactor: 12, font: { name: \"block\" }, frame } : { lineSpacingFactor: 99, font: { name: \"run\" }, frame });\n const textStyleResolver = new TextStyleResolver({\n textBlock,\n textStyleId: \"0x34\",\n iModel: {} as any,\n findTextStyle,\n });\n const layout = doLayout(textBlock, {\n textStyleId: \"0x34\",\n findTextStyle,\n findFontId: () => 0,\n });\n const scaleFactor = 1;\n\n\n const range = Range2d.fromJSON(layout.range);\n const transform = annotation.computeTransform(range);\n const frameCurve = computeFrame({ frame: frame.shape === \"none\" ? \"rectangle\" : (frame.shape ?? \"rectangle\"), range: layout.range, transform });\n\n beforeEach(() => {\n builder = new MockBuilder();\n defaultParams = new GeometryParams(Id64.invalid);\n });\n\n describe(\"appendLeaderToBuilder\", () => {\n it(\"should append a leader to the builder\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"Nearest\" }\n }\n ]\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const params = builder.params[builder.params.length - 1];\n expect(builder.params.length).to.be.equal(1);\n expect(params.lineColor).to.be.equal(ColorDef.black); // textBlock color\n expect(builder.geometries.length).to.be.equal(2); // One LineString3d for leadersLines and one for terminators\n for (const geometryEntry of builder.geometries) {\n expect(geometryEntry).to.be.instanceOf(LineString3d);\n }\n });\n\n it(\"should append multiple leaders to the builder\", () => {\n const leaders: TextAnnotationLeader[] = [{ startPoint: Point3d.create(20, 20, 0), attachment: { mode: \"Nearest\" } },\n { startPoint: Point3d.create(10, 0, 0), attachment: { mode: \"Nearest\" } }];\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n expect(builder.params.length).to.be.equal(2); // One for each leader\n expect(builder.geometries.length).to.be.equal(4); // Two LineString3d for leadersSegments and two for terminators\n for (const geometryEntry of builder.geometries) {\n expect(geometryEntry).to.be.instanceOf(LineString3d);\n }\n });\n\n it(\"should have intermediate points in geometry\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"Nearest\" },\n intermediatePoints: [Point3d.create(15, 15, 0), Point3d.create(20, 20, 0)]\n }\n ];\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const geometries = builder.geometries;\n const leaderLines = geometries[0] as LineString3d;\n expect(leaderLines.points.length).to.be.equal(4); // start + 2 intermediate + end\n });\n\n it(\"should have elbow in the geometry\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\n styleOverrides: {\n leader: {\n wantElbow: true,\n elbowLength: 5\n }\n }\n }\n ];\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const geometries = builder.geometries;\n const leaderLines = geometries[0] as LineString3d;\n expect(leaderLines.points.length).to.be.equal(3); // start + elbowPoint + end\n });\n\n describe(\"should return correct geometry for different attachment modes\", () => {\n const leaders: TextAnnotationLeader[] = [{\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\n }, {\n startPoint: Point3d.create(20, 20, 0),\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0.5 }\n }, {\n startPoint: Point3d.create(30, 30, 0),\n attachment: { mode: \"Nearest\" }\n }]\n\n for (const leader of leaders) {\n builder = new MockBuilder();\n it(`${leader.attachment.mode}`, () => {\n const attachmentPoint = computeLeaderAttachmentPoint(leader, frameCurve, layout, transform);\n if (!attachmentPoint) {\n expect.fail(\"Attachment point should not be undefined\");\n }\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const leaderLines = builder.geometries[0] as LineString3d;\n // The last point in the geometry is the point on frame where leader is supposed to be attached.\n expect(leaderLines.points[leaderLines.points.length - 1].isAlmostEqual(attachmentPoint)).to.be.true;\n })\n }\n })\n describe(\"should return correct geometry for different styleOverrides\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\n styleOverrides: {\n leader: {\n wantElbow: true,\n elbowLength: 5,\n color: ColorDef.red.toJSON(),\n terminatorHeightFactor: 2,\n terminatorWidthFactor: 2,\n }\n }\n }\n ];\n\n it(\"should apply color overrides\", () => {\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const params = builder.params[builder.params.length - 1];\n expect(params.lineColor).to.equal(ColorDef.red);\n });\n\n it(\"should apply terminator size overrides\", () => {\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const terminatorLines = builder.geometries[1] as LineString3d;\n const terminatorLength = LineSegment3d.create(terminatorLines.points[0], terminatorLines.points[1]).curveLength();\n const textHeight = 1;\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\n // terminator length is calculated based on the terminator width and height factors.\n const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + terminatorHeight * terminatorHeight);\n expect(terminatorLength).to.be.closeTo(expectedTerminatorLength, 0.01);\n });\n\n it(\"should apply elbow length overrides\", () => {\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const leaderLines = builder.geometries[0] as LineString3d;\n // When elbow exists, the last two points in the leaderLines should form the elbow\n const elbowLine = LineSegment3d.create(leaderLines.points[leaderLines.points.length - 1], leaderLines.points[leaderLines.points.length - 2]);\n const elbowLength = elbowLine.curveLength();\n expect(elbowLength).to.be.closeTo(leaders[0].styleOverrides?.leader?.elbowLength ?? 1, 0.01);\n });\n });\n });\n\n describe(\"computeElbowDirection\", () => {\n it(\"should return elbow direction\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\n styleOverrides: {\n leader: {\n wantElbow: true,\n elbowLength: 5\n }\n }\n }\n ];\n\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n if (attachmentPoint) {\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\n expect(elbowDirection).to.exist;\n }\n });\n\n it(\"should return undefined if elbow is tangential\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"Nearest\" },\n styleOverrides: {\n leader: {\n wantElbow: true,\n elbowLength: 5\n }\n }\n }\n ];\n\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n if (attachmentPoint) {\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\n expect(elbowDirection).to.be.undefined;\n }\n });\n })\n\n describe(\"computeLeaderAttachmentPoint\", () => {\n it(\"should return correct attachmentPoint for 'Nearest' mode\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(-20, 0, 0),\n attachment: { mode: \"Nearest\" }\n }\n ];\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n expect(attachmentPoint).to.exist;\n expect(attachmentPoint!.isAlmostEqual(Point3d.create(0, 0, 0))).to.be.true;\n });\n\n it(\"should return correct attachmentPoint for 'Keypoint' mode\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(-20, 0, 0),\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0 }\n }\n ];\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n expect(attachmentPoint).to.exist;\n expect(attachmentPoint?.y).to.be.equal(range.low.y); // expected to be at the bottom of the TextBlock\n });\n\n it(\"should return correct attachmentPoint for 'TextPoint' mode\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(-20, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\n }\n ];\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n expect(attachmentPoint).to.exist;\n const topY = range.high.y;\n const middleY = (range.low.y + range.high.y) / 2;\n expect(attachmentPoint!.y).to.be.within(middleY, topY); // expected to be in the upper half of the TextBlock\n });\n })\n\n})\n"]}
|
|
1
|
+
{"version":3,"file":"LeaderGeometry.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/LeaderGeometry.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { expect } from \"chai\";\nimport { ColorDef, GeometryParams, LineBreakRun, TerminatorShape, terminatorShapes, TextAnnotation, TextAnnotationLeader, TextBlock, TextFrameStyleProps, TextRun, TextStyleSettings } from \"@itwin/core-common\";\nimport { Arc3d, LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from \"@itwin/core-geometry\";\nimport { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from \"../../core-backend\";\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\nimport { doLayout, MockBuilder } from \"../AnnotationTestUtils\";\n\ndescribe(\"LeaderGeometry\", () => {\n let builder: MockBuilder;\n let defaultParams: GeometryParams;\n\n const textBlock = TextBlock.create({ styleOverrides: { font: { name: \"Arial\" }, color: ColorDef.black.toJSON(), leader: { wantElbow: false } } });\n textBlock.appendRun(TextRun.create({ content: \"Hello\", styleOverrides: { font: { name: \"Arial\" } } }));\n textBlock.appendRun(LineBreakRun.create({\n styleOverrides: { font: { name: \"Arial\" } },\n }));\n textBlock.appendRun(TextRun.create({ content: \"World\", styleOverrides: { font: { name: \"Arial\" } } }));\n\n const frame: TextFrameStyleProps = { borderWeight: 1, shape: \"rectangle\" };\n\n const annotation = TextAnnotation.fromJSON({\n textBlock: textBlock.toJSON(),\n anchor: { horizontal: \"left\", vertical: \"top\" },\n orientation: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\n offset: { x: 0, y: 0 },\n });\n\n const findTextStyle = (id: Id64String) => TextStyleSettings.fromJSON(id === \"0x34\" ? { lineSpacingFactor: 12, font: { name: \"block\" }, frame } : { lineSpacingFactor: 99, font: { name: \"run\" }, frame });\n const textStyleResolver = new TextStyleResolver({\n textBlock,\n textStyleId: \"0x34\",\n iModel: {} as any,\n findTextStyle,\n });\n const layout = doLayout(textBlock, {\n textStyleId: \"0x34\",\n findTextStyle,\n findFontId: () => 0,\n });\n const scaleFactor = 1;\n\n\n const range = Range2d.fromJSON(layout.range);\n const transform = annotation.computeTransform(range);\n const frameCurve = computeFrame({ frame: frame.shape === \"none\" ? \"rectangle\" : (frame.shape ?? \"rectangle\"), range: layout.range, transform });\n\n beforeEach(() => {\n builder = new MockBuilder();\n defaultParams = new GeometryParams(Id64.invalid);\n });\n\n describe(\"appendLeaderToBuilder\", () => {\n it(\"should append a leader to the builder\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"Nearest\" }\n }\n ]\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const params = builder.params[builder.params.length - 1];\n expect(builder.params.length).to.be.equal(1);\n expect(params.lineColor).to.be.equal(ColorDef.black); // textBlock color\n expect(builder.geometries.length).to.be.equal(2); // One LineString3d for leadersLines and one for terminators\n for (const geometryEntry of builder.geometries) {\n expect(geometryEntry).to.be.instanceOf(LineString3d);\n }\n });\n\n it(\"should append multiple leaders to the builder\", () => {\n const leaders: TextAnnotationLeader[] = [{ startPoint: Point3d.create(20, 20, 0), attachment: { mode: \"Nearest\" } },\n { startPoint: Point3d.create(10, 0, 0), attachment: { mode: \"Nearest\" } }];\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n expect(builder.params.length).to.be.equal(2); // One for each leader\n expect(builder.geometries.length).to.be.equal(4); // Two LineString3d for leadersSegments and two for terminators\n for (const geometryEntry of builder.geometries) {\n expect(geometryEntry).to.be.instanceOf(LineString3d);\n }\n });\n\n it(\"should have intermediate points in geometry\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"Nearest\" },\n intermediatePoints: [Point3d.create(15, 15, 0), Point3d.create(20, 20, 0)]\n }\n ];\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const geometries = builder.geometries;\n const leaderLines = geometries[0] as LineString3d;\n expect(leaderLines.points.length).to.be.equal(4); // start + 2 intermediate + end\n });\n\n it(\"should have elbow in the geometry\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\n styleOverrides: {\n leader: {\n wantElbow: true,\n elbowLength: 5\n }\n }\n }\n ];\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const geometries = builder.geometries;\n const leaderLines = geometries[0] as LineString3d;\n expect(leaderLines.points.length).to.be.equal(3); // start + elbowPoint + end\n });\n\n describe(\"should return correct geometry for different attachment modes\", () => {\n const leaders: TextAnnotationLeader[] = [{\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\n }, {\n startPoint: Point3d.create(20, 20, 0),\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0.5 }\n }, {\n startPoint: Point3d.create(30, 30, 0),\n attachment: { mode: \"Nearest\" }\n }]\n\n for (const leader of leaders) {\n builder = new MockBuilder();\n it(`${leader.attachment.mode}`, () => {\n const attachmentPoint = computeLeaderAttachmentPoint(leader, frameCurve, layout, transform);\n if (!attachmentPoint) {\n expect.fail(\"Attachment point should not be undefined\");\n }\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const leaderLines = builder.geometries[0] as LineString3d;\n // The last point in the geometry is the point on frame where leader is supposed to be attached.\n expect(leaderLines.points[leaderLines.points.length - 1].isAlmostEqual(attachmentPoint)).to.be.true;\n })\n }\n })\n describe(\"should return correct geometry for different styleOverrides\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\n styleOverrides: {\n leader: {\n wantElbow: true,\n elbowLength: 5,\n color: ColorDef.red.toJSON(),\n terminatorShape: terminatorShapes[0],\n terminatorHeightFactor: 2,\n terminatorWidthFactor: 2,\n }\n }\n }\n ];\n\n it(\"should apply color overrides\", () => {\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const params = builder.params[builder.params.length - 1];\n expect(params.lineColor).to.equal(ColorDef.red);\n });\n\n it(\"should apply terminator size overrides\", () => {\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const terminatorLines = builder.geometries[1] as LineString3d;\n const terminatorLength = LineSegment3d.create(terminatorLines.points[0], terminatorLines.points[1]).curveLength();\n const textHeight = 1;\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\n // terminator length is calculated based on the terminator width and height factors.\n const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + ((terminatorHeight / 2) * (terminatorHeight / 2)));\n expect(terminatorLength).to.be.closeTo(expectedTerminatorLength, 0.01);\n });\n\n it(\"should apply elbow length overrides\", () => {\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n const leaderLines = builder.geometries[0] as LineString3d;\n // When elbow exists, the last two points in the leaderLines should form the elbow\n const elbowLine = LineSegment3d.create(leaderLines.points[leaderLines.points.length - 1], leaderLines.points[leaderLines.points.length - 2]);\n const elbowLength = elbowLine.curveLength();\n expect(elbowLength).to.be.closeTo(leaders[0].styleOverrides?.leader?.elbowLength ?? 1, 0.01);\n });\n\n it(\"should apply terminator shape overrides\", () => {\n const textHeight = 1;\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\n let firstLeaderLineLengthBeforeTruncation: number;\n terminatorShapes.forEach((shape: TerminatorShape) => {\n it(`Terminator shape: ${shape}`, () => {\n leaders[0].styleOverrides = { ...leaders[0].styleOverrides, leader: { terminatorShape: shape } };\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\n expect(result).to.be.true;\n if (shape === \"none\") {\n expect(builder.geometries.length).to.equal(1); // Only leader line should be present with no terminators\n } else {\n let terminatorGeometry = builder.geometries[1];\n if (shape.includes(\"Filled\")) {\n expect(builder.geometries.length).to.equal(3) // One entry for geometry query and another for geometryParams for fill\n terminatorGeometry = builder.geometries[2];\n }\n if (shape.includes(\"circle\")) {\n // expect(terminatorGeometry).to.be.instanceOf(Arc3d);\n expect((terminatorGeometry as Arc3d).circularRadius()).to.equal(terminatorHeight / 2)\n }\n\n if (shape === \"slash\") {\n expect(terminatorGeometry).to.be.instanceOf(LineSegment3d);\n terminatorGeometry = terminatorGeometry as LineSegment3d;\n expect(terminatorGeometry.curveLength()).to.equal(terminatorHeight);\n }\n\n if (shape === \"closedArrow\") {\n // The leaderLine is truncated to accommodate the closed and hollow shape of the terminator\n const leaderLine = builder.geometries[0] as LineString3d;\n const firstLeaderLine = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\n const firstLeaderLineLength = firstLeaderLine.curveLength();\n expect(firstLeaderLineLength).to.be.closeTo(firstLeaderLineLengthBeforeTruncation - terminatorWidth, 0.01);\n } else {\n // keep record of first leader line length before truncation for closedArrow test\n const leaderLine = builder.geometries[0] as LineString3d;\n const firstLeaderLineBeforeTruncation = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\n firstLeaderLineLengthBeforeTruncation = firstLeaderLineBeforeTruncation.curveLength();\n }\n }\n\n });\n\n });\n });\n\n });\n });\n\n describe(\"computeElbowDirection\", () => {\n it(\"should return elbow direction\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\n styleOverrides: {\n leader: {\n wantElbow: true,\n elbowLength: 5\n }\n }\n }\n ];\n\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n if (attachmentPoint) {\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\n expect(elbowDirection).to.exist;\n }\n });\n\n it(\"should return undefined if elbow is tangential\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(10, 0, 0),\n attachment: { mode: \"Nearest\" },\n styleOverrides: {\n leader: {\n wantElbow: true,\n elbowLength: 5\n }\n }\n }\n ];\n\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n if (attachmentPoint) {\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\n expect(elbowDirection).to.be.undefined;\n }\n });\n })\n\n describe(\"computeLeaderAttachmentPoint\", () => {\n it(\"should return correct attachmentPoint for 'Nearest' mode\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(-20, 0, 0),\n attachment: { mode: \"Nearest\" }\n }\n ];\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n expect(attachmentPoint).to.exist;\n expect(attachmentPoint!.isAlmostEqual(Point3d.create(0, 0, 0))).to.be.true;\n });\n\n it(\"should return correct attachmentPoint for 'Keypoint' mode\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(-20, 0, 0),\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0 }\n }\n ];\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n expect(attachmentPoint).to.exist;\n expect(attachmentPoint?.y).to.be.equal(range.low.y); // expected to be at the bottom of the TextBlock\n });\n\n it(\"should return correct attachmentPoint for 'TextPoint' mode\", () => {\n const leaders: TextAnnotationLeader[] = [\n {\n startPoint: Point3d.create(-20, 0, 0),\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\n }\n ];\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\n expect(attachmentPoint).to.exist;\n const topY = range.high.y;\n const middleY = (range.low.y + range.high.y) / 2;\n expect(attachmentPoint!.y).to.be.within(middleY, topY); // expected to be in the upper half of the TextBlock\n });\n })\n\n})\n"]}
|