@itwin/core-backend 5.3.0-dev.2 → 5.3.0-dev.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/lib/cjs/IModelDb.js +1 -1
  2. package/lib/cjs/IModelDb.js.map +1 -1
  3. package/lib/cjs/annotations/FrameGeometry.js +6 -6
  4. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  5. package/lib/cjs/annotations/LeaderGeometry.js +4 -4
  6. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  7. package/lib/cjs/annotations/TextAnnotationElement.d.ts +101 -20
  8. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  9. package/lib/cjs/annotations/TextAnnotationElement.js +202 -64
  10. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  11. package/lib/cjs/annotations/TextBlockGeometry.js +3 -3
  12. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  13. package/lib/cjs/annotations/TextBlockLayout.d.ts +2 -2
  14. package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
  15. package/lib/cjs/annotations/TextBlockLayout.js +52 -25
  16. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  17. package/lib/esm/IModelDb.js +1 -1
  18. package/lib/esm/IModelDb.js.map +1 -1
  19. package/lib/esm/annotations/FrameGeometry.js +6 -6
  20. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  21. package/lib/esm/annotations/LeaderGeometry.js +4 -4
  22. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  23. package/lib/esm/annotations/TextAnnotationElement.d.ts +101 -20
  24. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  25. package/lib/esm/annotations/TextAnnotationElement.js +201 -63
  26. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  27. package/lib/esm/annotations/TextBlockGeometry.js +3 -3
  28. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  29. package/lib/esm/annotations/TextBlockLayout.d.ts +2 -2
  30. package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
  31. package/lib/esm/annotations/TextBlockLayout.js +52 -25
  32. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  33. package/lib/esm/test/AnnotationTestUtils.js +1 -1
  34. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  35. package/lib/esm/test/annotations/Fields.test.js +2 -2
  36. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  37. package/lib/esm/test/annotations/FrameGeometry.test.js +4 -4
  38. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  39. package/lib/esm/test/annotations/LeaderGeometry.test.js +8 -8
  40. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  41. package/lib/esm/test/annotations/TextAnnotation.test.js +130 -35
  42. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  43. package/lib/esm/test/annotations/TextBlock.test.js +218 -151
  44. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  45. 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, 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, 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\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(): 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 };\n\n const id = imodel.elements.insertElement(props);\n\n const aspectProps: TestAspectProps = {\n classFullName: TestAspect.classFullName,\n aspectProp: 999,\n element: new ElementOwnsUniqueAspect(id),\n };\n imodel.elements.insertAspect(aspectProps);\n\n imodel.saveChanges();\n return id;\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 insertAnnotationElement(textBlock: TextBlock | undefined): Id64String {\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.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: { fontName: \"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: { fontName: \"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): void {\n const elem = imodel.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\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, 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, 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\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(): 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 };\n\n const id = imodel.elements.insertElement(props);\n\n const aspectProps: TestAspectProps = {\n classFullName: TestAspect.classFullName,\n aspectProp: 999,\n element: new ElementOwnsUniqueAspect(id),\n };\n imodel.elements.insertAspect(aspectProps);\n\n imodel.saveChanges();\n return id;\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 insertAnnotationElement(textBlock: TextBlock | undefined): Id64String {\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.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): void {\n const elem = imodel.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\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"]}
@@ -24,7 +24,7 @@ describe("FrameGeometry", () => {
24
24
  const builder = new MockBuilder();
25
25
  expect(appendFrameToBuilder(builder, { shape: undefined }, defaultRange, defaultTransform, defaultParams)).to.be.false;
26
26
  expect(appendFrameToBuilder(builder, { shape: "none" }, defaultRange, defaultTransform, defaultParams)).to.be.false;
27
- expect(appendFrameToBuilder(builder, { shape: "none", fill: ColorDef.green.toJSON() }, defaultRange, defaultTransform, defaultParams)).to.be.false;
27
+ expect(appendFrameToBuilder(builder, { shape: "none", fillColor: ColorDef.green.toJSON() }, defaultRange, defaultTransform, defaultParams)).to.be.false;
28
28
  });
29
29
  it("should append only a frame", () => {
30
30
  const builder = new MockBuilder();
@@ -35,7 +35,7 @@ describe("FrameGeometry", () => {
35
35
  });
36
36
  it("should append a frame and fill", () => {
37
37
  const builder = new MockBuilder();
38
- const frame = { shape: "rectangle", fill: ColorDef.green.toJSON() };
38
+ const frame = { shape: "rectangle", fillColor: ColorDef.green.toJSON() };
39
39
  const result = appendFrameToBuilder(builder, frame, defaultRange, defaultTransform, defaultParams);
40
40
  expect(result).to.be.true;
41
41
  expect(builder.geometries.length).to.be.equal(2);
@@ -44,8 +44,8 @@ describe("FrameGeometry", () => {
44
44
  const builder = new MockBuilder();
45
45
  const frame = {
46
46
  shape: "rectangle",
47
- fill: ColorDef.blue.toJSON(),
48
- border: ColorDef.red.toJSON(),
47
+ fillColor: ColorDef.blue.toJSON(),
48
+ borderColor: ColorDef.red.toJSON(),
49
49
  borderWeight: 3,
50
50
  };
51
51
  appendFrameToBuilder(builder, frame, defaultRange, defaultTransform, defaultParams);
@@ -1 +1 @@
1
- {"version":3,"file":"FrameGeometry.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/FrameGeometry.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAkB,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,yBAAyB,EAAuB,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,SAAS,YAAY,CAAC,UAA4B;IAChD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACzC,8FAA8F;QAC9F,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE3F,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;IACpD,MAAM,aAAa,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEvD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YACvH,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YACpH,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACrJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,GAAwB,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;YACnG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,GAAwB,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACzF,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;YACnG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,GAAwB;gBACjC,KAAK,EAAE,WAAW;gBAClB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC5B,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;gBAC7B,YAAY,EAAE,CAAC;aAChB,CAAC;YACF,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;YACpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IAEL,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;QAC3E,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAC/F,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;gBAEvB,MAAM,eAAe,GAAG,KAAK,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAEtE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/B,qFAAqF;oBACrF,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;oBACrF,MAAM,CAAC,iBAAiB,EAAE,eAAe,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,8BAA8B,CAAC,MAAM,EAAE,MAAM,CAAE,CAAC,CAAC,wEAAwE;YAErJ,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpF,MAAM,cAAc,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAExG,MAAM,OAAO,GAAG,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAE,CAAC,CAAC,wEAAwE;gBACrI,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,2BAA2B,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAClH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","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 { CurvePrimitive, Geometry, Point3d, Range2d, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport { ColorDef, GeometryParams, textAnnotationFrameShapes, TextFrameStyleProps } from \"@itwin/core-common\";\nimport { appendFrameToBuilder, computeFrame } from \"../../annotations/FrameGeometry\";\nimport { Id64 } from \"@itwin/core-bentley\";\nimport { MockBuilder } from \"../AnnotationTestUtils\";\n\nfunction isContinuous(geometries: CurvePrimitive[]): boolean {\n return geometries.every((current, index) => {\n // If the index is 0, get the last geometry in the list to see if they connect and form a loop\n const previous = (index === 0) ? geometries[geometries.length - 1] : geometries[index - 1];\n\n return previous.endPoint().isAlmostEqual(current.startPoint(), Geometry.smallMetricDistance);\n });\n}\n\ndescribe(\"FrameGeometry\", () => {\n const defaultRange = Range2d.createXYXY(0, 0, 10, 20);\n const defaultTransform = Transform.createIdentity();\n const defaultParams = new GeometryParams(Id64.invalid);\n\n describe(\"appendFrameToBuilder\", () => {\n it(\"should not append frame if shape is undefined or 'none'\", () => {\n const builder = new MockBuilder();\n expect(appendFrameToBuilder(builder, { shape: undefined }, defaultRange, defaultTransform, defaultParams)).to.be.false;\n expect(appendFrameToBuilder(builder, { shape: \"none\" }, defaultRange, defaultTransform, defaultParams)).to.be.false;\n expect(appendFrameToBuilder(builder, { shape: \"none\", fill: ColorDef.green.toJSON() }, defaultRange, defaultTransform, defaultParams)).to.be.false;\n });\n\n it(\"should append only a frame\", () => {\n const builder = new MockBuilder();\n const frame: TextFrameStyleProps = { shape: \"rectangle\" };\n const result = appendFrameToBuilder(builder, frame, defaultRange, defaultTransform, defaultParams);\n expect(result).to.be.true;\n expect(builder.geometries.length).to.be.equal(1);\n });\n\n it(\"should append a frame and fill\", () => {\n const builder = new MockBuilder();\n const frame: TextFrameStyleProps = { shape: \"rectangle\", fill: ColorDef.green.toJSON() };\n const result = appendFrameToBuilder(builder, frame, defaultRange, defaultTransform, defaultParams);\n expect(result).to.be.true;\n expect(builder.geometries.length).to.be.equal(2);\n });\n\n it(\"should set fill and border colors from frame\", () => {\n const builder = new MockBuilder();\n const frame: TextFrameStyleProps = {\n shape: \"rectangle\",\n fill: ColorDef.blue.toJSON(),\n border: ColorDef.red.toJSON(),\n borderWeight: 3,\n };\n appendFrameToBuilder(builder, frame, defaultRange, defaultTransform, defaultParams);\n const params = builder.params[builder.params.length - 1];\n expect(params.fillColor?.tbgr).to.equal(ColorDef.blue.tbgr);\n expect(params.lineColor?.tbgr).to.equal(ColorDef.red.tbgr);\n expect(params.weight).to.equal(3);\n });\n\n });\n describe(\"computeGeometry\", () => {\n const shapes = textAnnotationFrameShapes.filter(shape => shape !== \"none\");\n it(\"should compute different frame shapes and they should be continuous\", () => {\n for (const shape of shapes) {\n const frame = computeFrame({ frame: shape, range: defaultRange, transform: defaultTransform });\n expect(frame).to.exist;\n\n const curvePrimitives = frame.collectCurvePrimitives(undefined, true);\n\n if (curvePrimitives.length > 1) {\n // The start point of a given segment should be the end point of the previous segment\n const isContinuousShape = isContinuous(frame.collectCurvePrimitives(undefined, true))\n expect(isContinuousShape, `Frame shape ${shape} should be continuous`).to.be.true;\n }\n }\n });\n\n it(\"should apply transform\", () => {\n const origin = Point3d.create(5, 6, 7);\n const vector = Vector3d.create(1, 2, 3);\n vector.tryNormalizeInPlace();\n const transform = Transform.createRigidFromOriginAndVector(origin, vector)!; // This transform is something I made up for this test. It should exist.\n\n for (const shape of shapes) {\n const rotatedFrame = computeFrame({ frame: shape, range: defaultRange, transform });\n const unRotatedFrame = computeFrame({ frame: shape, range: defaultRange, transform: defaultTransform });\n\n const control = unRotatedFrame.cloneTransformed(transform)!; // This transform is something I made up for this test. It should exist.\n expect(rotatedFrame.isAlmostEqual(control), `Rotated frame for shape ${shape} should match control`).to.be.true;\n }\n });\n });\n});"]}
1
+ {"version":3,"file":"FrameGeometry.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/FrameGeometry.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 { CurvePrimitive, Geometry, Point3d, Range2d, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport { ColorDef, GeometryParams, textAnnotationFrameShapes, TextFrameStyleProps } from \"@itwin/core-common\";\nimport { appendFrameToBuilder, computeFrame } from \"../../annotations/FrameGeometry\";\nimport { Id64 } from \"@itwin/core-bentley\";\nimport { MockBuilder } from \"../AnnotationTestUtils\";\n\nfunction isContinuous(geometries: CurvePrimitive[]): boolean {\n return geometries.every((current, index) => {\n // If the index is 0, get the last geometry in the list to see if they connect and form a loop\n const previous = (index === 0) ? geometries[geometries.length - 1] : geometries[index - 1];\n\n return previous.endPoint().isAlmostEqual(current.startPoint(), Geometry.smallMetricDistance);\n });\n}\n\ndescribe(\"FrameGeometry\", () => {\n const defaultRange = Range2d.createXYXY(0, 0, 10, 20);\n const defaultTransform = Transform.createIdentity();\n const defaultParams = new GeometryParams(Id64.invalid);\n\n describe(\"appendFrameToBuilder\", () => {\n it(\"should not append frame if shape is undefined or 'none'\", () => {\n const builder = new MockBuilder();\n expect(appendFrameToBuilder(builder, { shape: undefined }, defaultRange, defaultTransform, defaultParams)).to.be.false;\n expect(appendFrameToBuilder(builder, { shape: \"none\" }, defaultRange, defaultTransform, defaultParams)).to.be.false;\n expect(appendFrameToBuilder(builder, { shape: \"none\", fillColor: ColorDef.green.toJSON() }, defaultRange, defaultTransform, defaultParams)).to.be.false;\n });\n\n it(\"should append only a frame\", () => {\n const builder = new MockBuilder();\n const frame: TextFrameStyleProps = { shape: \"rectangle\" };\n const result = appendFrameToBuilder(builder, frame, defaultRange, defaultTransform, defaultParams);\n expect(result).to.be.true;\n expect(builder.geometries.length).to.be.equal(1);\n });\n\n it(\"should append a frame and fill\", () => {\n const builder = new MockBuilder();\n const frame: TextFrameStyleProps = { shape: \"rectangle\", fillColor: ColorDef.green.toJSON() };\n const result = appendFrameToBuilder(builder, frame, defaultRange, defaultTransform, defaultParams);\n expect(result).to.be.true;\n expect(builder.geometries.length).to.be.equal(2);\n });\n\n it(\"should set fill and border colors from frame\", () => {\n const builder = new MockBuilder();\n const frame: TextFrameStyleProps = {\n shape: \"rectangle\",\n fillColor: ColorDef.blue.toJSON(),\n borderColor: ColorDef.red.toJSON(),\n borderWeight: 3,\n };\n appendFrameToBuilder(builder, frame, defaultRange, defaultTransform, defaultParams);\n const params = builder.params[builder.params.length - 1];\n expect(params.fillColor?.tbgr).to.equal(ColorDef.blue.tbgr);\n expect(params.lineColor?.tbgr).to.equal(ColorDef.red.tbgr);\n expect(params.weight).to.equal(3);\n });\n\n });\n describe(\"computeGeometry\", () => {\n const shapes = textAnnotationFrameShapes.filter(shape => shape !== \"none\");\n it(\"should compute different frame shapes and they should be continuous\", () => {\n for (const shape of shapes) {\n const frame = computeFrame({ frame: shape, range: defaultRange, transform: defaultTransform });\n expect(frame).to.exist;\n\n const curvePrimitives = frame.collectCurvePrimitives(undefined, true);\n\n if (curvePrimitives.length > 1) {\n // The start point of a given segment should be the end point of the previous segment\n const isContinuousShape = isContinuous(frame.collectCurvePrimitives(undefined, true))\n expect(isContinuousShape, `Frame shape ${shape} should be continuous`).to.be.true;\n }\n }\n });\n\n it(\"should apply transform\", () => {\n const origin = Point3d.create(5, 6, 7);\n const vector = Vector3d.create(1, 2, 3);\n vector.tryNormalizeInPlace();\n const transform = Transform.createRigidFromOriginAndVector(origin, vector)!; // This transform is something I made up for this test. It should exist.\n\n for (const shape of shapes) {\n const rotatedFrame = computeFrame({ frame: shape, range: defaultRange, transform });\n const unRotatedFrame = computeFrame({ frame: shape, range: defaultRange, transform: defaultTransform });\n\n const control = unRotatedFrame.cloneTransformed(transform)!; // This transform is something I made up for this test. It should exist.\n expect(rotatedFrame.isAlmostEqual(control), `Rotated frame for shape ${shape} should match control`).to.be.true;\n }\n });\n });\n});"]}
@@ -11,12 +11,12 @@ import { doLayout, MockBuilder } from "../AnnotationTestUtils";
11
11
  describe("LeaderGeometry", () => {
12
12
  let builder;
13
13
  let defaultParams;
14
- const textBlock = TextBlock.create({ styleOverrides: { fontName: "Arial", color: ColorDef.black.toJSON(), leader: { wantElbow: false } } });
15
- textBlock.appendRun(TextRun.create({ content: "Hello", styleOverrides: { fontName: "Arial" } }));
14
+ const textBlock = TextBlock.create({ styleOverrides: { font: { name: "Arial" }, color: ColorDef.black.toJSON(), leader: { wantElbow: false } } });
15
+ textBlock.appendRun(TextRun.create({ content: "Hello", styleOverrides: { font: { name: "Arial" } } }));
16
16
  textBlock.appendRun(LineBreakRun.create({
17
- styleOverrides: { fontName: "Arial" },
17
+ styleOverrides: { font: { name: "Arial" } },
18
18
  }));
19
- textBlock.appendRun(TextRun.create({ content: "World", styleOverrides: { fontName: "Arial" } }));
19
+ textBlock.appendRun(TextRun.create({ content: "World", styleOverrides: { font: { name: "Arial" } } }));
20
20
  const frame = { borderWeight: 1, shape: "rectangle" };
21
21
  const annotation = TextAnnotation.fromJSON({
22
22
  textBlock: textBlock.toJSON(),
@@ -24,7 +24,7 @@ describe("LeaderGeometry", () => {
24
24
  orientation: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),
25
25
  offset: { x: 0, y: 0 },
26
26
  });
27
- const findTextStyle = (id) => TextStyleSettings.fromJSON(id === "0x34" ? { lineSpacingFactor: 12, fontName: "block", frame } : { lineSpacingFactor: 99, fontName: "run", frame });
27
+ const findTextStyle = (id) => TextStyleSettings.fromJSON(id === "0x34" ? { lineSpacingFactor: 12, font: { name: "block" }, frame } : { lineSpacingFactor: 99, font: { name: "run" }, frame });
28
28
  const textStyleResolver = new TextStyleResolver({
29
29
  textBlock,
30
30
  textStyleId: "0x34",
@@ -159,9 +159,9 @@ describe("LeaderGeometry", () => {
159
159
  expect(result).to.be.true;
160
160
  const terminatorLines = builder.geometries[1];
161
161
  const terminatorLength = LineSegment3d.create(terminatorLines.points[0], terminatorLines.points[1]).curveLength();
162
- const lineHeight = 1;
163
- const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * lineHeight;
164
- const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * lineHeight;
162
+ const textHeight = 1;
163
+ const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;
164
+ const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;
165
165
  // terminator length is calculated based on the terminator width and height factors.
166
166
  const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + terminatorHeight * terminatorHeight);
167
167
  expect(terminatorLength).to.be.closeTo(expectedTerminatorLength, 0.01);
@@ -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: { fontName: \"Arial\", color: ColorDef.black.toJSON(), leader: {wantElbow: false} } });\n textBlock.appendRun(TextRun.create({ content: \"Hello\", styleOverrides: { fontName: \"Arial\" } }));\n textBlock.appendRun(LineBreakRun.create({\n styleOverrides: { fontName: \"Arial\" },\n }));\n textBlock.appendRun(TextRun.create({ content: \"World\", styleOverrides: { fontName: \"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, fontName: \"block\", frame } : { lineSpacingFactor: 99, fontName: \"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 lineHeight = 1;\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * lineHeight;\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * lineHeight;\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, 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"]}