@itwin/core-backend 5.5.0-dev.1 → 5.5.0-dev.10

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 (60) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  3. package/lib/cjs/ChangesetECAdaptor.js +0 -2
  4. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  5. package/lib/cjs/IModelDb.d.ts +11 -2
  6. package/lib/cjs/IModelDb.d.ts.map +1 -1
  7. package/lib/cjs/IModelDb.js +20 -15
  8. package/lib/cjs/IModelDb.js.map +1 -1
  9. package/lib/cjs/TxnManager.d.ts.map +1 -1
  10. package/lib/cjs/TxnManager.js +2 -1
  11. package/lib/cjs/TxnManager.js.map +1 -1
  12. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  13. package/lib/esm/ChangesetECAdaptor.js +0 -2
  14. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  15. package/lib/esm/IModelDb.d.ts +11 -2
  16. package/lib/esm/IModelDb.d.ts.map +1 -1
  17. package/lib/esm/IModelDb.js +20 -15
  18. package/lib/esm/IModelDb.js.map +1 -1
  19. package/lib/esm/TxnManager.d.ts.map +1 -1
  20. package/lib/esm/TxnManager.js +2 -1
  21. package/lib/esm/TxnManager.js.map +1 -1
  22. package/lib/esm/test/annotations/Fields.test.js +2 -2
  23. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  24. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js +5 -5
  25. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  26. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +39 -0
  27. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  28. package/lib/esm/test/imodel/IModel.test.js +31 -2
  29. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  30. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js +432 -198
  31. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  32. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js +272 -190
  33. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  34. package/lib/esm/test/incrementalSchemaLocater/TestContext.d.ts +27 -0
  35. package/lib/esm/test/incrementalSchemaLocater/TestContext.d.ts.map +1 -0
  36. package/lib/esm/test/incrementalSchemaLocater/TestContext.js +136 -0
  37. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -0
  38. package/lib/esm/test/standalone/ChangesetReader.test.js +222 -3
  39. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  40. package/lib/esm/test/standalone/RenderTimeline.test.js +1 -1
  41. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  42. package/lib/esm/test/standalone/StandaloneDb.test.d.ts +2 -0
  43. package/lib/esm/test/standalone/StandaloneDb.test.d.ts.map +1 -0
  44. package/lib/esm/test/standalone/StandaloneDb.test.js +103 -0
  45. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -0
  46. package/lib/esm/test/standalone/TxnManager.test.js +43 -0
  47. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  48. package/package.json +13 -13
  49. package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.d.ts +0 -11
  50. package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.d.ts.map +0 -1
  51. package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js +0 -36
  52. package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js.map +0 -1
  53. package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.d.ts +0 -20
  54. package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.d.ts.map +0 -1
  55. package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js +0 -126
  56. package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js.map +0 -1
  57. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts +0 -24
  58. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts.map +0 -1
  59. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js +0 -67
  60. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Fields.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/Fields.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { expect } from \"chai\";\r\nimport { Code, ElementAspectProps, FieldPropertyHost, FieldPropertyPath, FieldPropertyType, FieldRun, FieldValue, PhysicalElementProps, SubCategoryAppearance, TextAnnotation, TextBlock, TextBlockProps, TextRun } from \"@itwin/core-common\";\r\nimport { IModelDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { createUpdateContext, updateField, updateFields } from \"../../internal/annotations/fields\";\r\nimport { DbResult, Id64, Id64String, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { SpatialCategory } from \"../../Category\";\r\nimport { Point3d, XYAndZ, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { Schema, Schemas } from \"../../Schema\";\r\nimport { ClassRegistry } from \"../../ClassRegistry\";\r\nimport { PhysicalElement } from \"../../Element\";\r\nimport { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, IModelElementCloneContext, TextAnnotation3d } from \"../../core-backend\";\r\nimport { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault } from \"../../annotations/ElementDrivesTextAnnotation\";\r\n\r\nfunction isIntlSupported(): boolean {\r\n // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile\r\n // users are not expected to do any editing, but long term we will attempt to find a better\r\n // solution.\r\n return !ProcessDetector.isMobileAppBackend;\r\n}\r\n\r\nfunction createTestElement(imodel: StandaloneDb, model: Id64String, category: Id64String, overrides?: Partial<TestElementProps>, aspectProp = 999): Id64String {\r\n const props: TestElementProps = {\r\n classFullName: \"Fields:TestElement\",\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n intProp: 100,\r\n point: { x: 1, y: 2, z: 3 },\r\n strings: [\"a\", \"b\", `\"name\": \"c\"`],\r\n datetime: new Date(\"2025-08-28T13:45:30.123Z\"),\r\n intEnum: 1,\r\n outerStruct: {\r\n innerStruct: { bool: false, doubles: [1, 2, 3] },\r\n innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],\r\n },\r\n outerStructs: [{\r\n innerStruct: { bool: true, doubles: [10, 9] },\r\n innerStructs: [{ bool: false, doubles: [5] }],\r\n }],\r\n placement: {\r\n origin: new Point3d(1, 2, 0),\r\n angles: new YawPitchRollAngles(),\r\n },\r\n jsonProperties: {\r\n stringProp: \"abc\",\r\n ints: [10, 11, 12, 13],\r\n bool: true,\r\n zoo: {\r\n address: {\r\n zipcode: 12345,\r\n },\r\n birds: [\r\n { name: \"duck\", sound: \"quack\" },\r\n { name: \"hawk\", sound: \"scree!\" },\r\n ],\r\n },\r\n },\r\n ...overrides,\r\n };\r\n\r\n const id = imodel.elements.insertElement(props);\r\n\r\n const aspectProps: TestAspectProps = {\r\n classFullName: TestAspect.classFullName,\r\n aspectProp,\r\n element: new ElementOwnsUniqueAspect(id),\r\n };\r\n imodel.elements.insertAspect(aspectProps);\r\n\r\n imodel.saveChanges();\r\n return id;\r\n}\r\n\r\ndescribe(\"updateField\", () => {\r\n const mockElementId = \"0x1\";\r\n const mockPath: FieldPropertyPath = {\r\n propertyName: \"mockProperty\",\r\n accessors: [0, \"nestedProperty\"],\r\n };\r\n const mockCachedContent = \"cachedContent\";\r\n const mockUpdatedContent = \"updatedContent\";\r\n\r\n const createMockContext = (elementId: string, propertyValue?: string) => ({\r\n hostElementId: elementId,\r\n getProperty: (field: FieldRun): FieldValue | undefined => {\r\n const propertyPath = field.propertyPath;\r\n if (\r\n propertyPath.propertyName === \"mockProperty\" &&\r\n propertyPath.accessors?.[0] === 0 &&\r\n propertyPath.accessors?.[1] === \"nestedProperty\" &&\r\n propertyValue !== undefined\r\n ) {\r\n return { value: propertyValue, type: \"string\" };\r\n }\r\n return undefined;\r\n },\r\n });\r\n\r\n it(\"does nothing if hostElementId does not match\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(\"0x2\", mockUpdatedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.false;\r\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\r\n });\r\n\r\n it(\"produces invalid content indicator if property value is undefined\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n\r\n it(\"returns false if cached content matches new content\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId, mockCachedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.false;\r\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\r\n });\r\n\r\n it(\"returns true and updates cached content if new content is different\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId, mockUpdatedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(mockUpdatedContent);\r\n });\r\n\r\n it(\"resolves to invalid content indicator if an exception occurs\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = {\r\n hostElementId: mockElementId,\r\n getProperty: () => {\r\n throw new Error(\"Test exception\");\r\n },\r\n };\r\n\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n});\r\n\r\nconst fieldsSchemaXml = `\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ECSchema schemaName=\"Fields\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.04\" alias=\"bis\"/>\r\n <ECSchemaReference name='ECDbMap' version='02.00.04' alias='ecdbmap' />\r\n\r\n <ECEnumeration typeName=\"IntEnum\" backingTypeName=\"int\">\r\n <ECEnumerator name=\"one\" displayLabel=\"One\" value=\"1\" />\r\n <ECEnumerator name=\"two\" displayLabel=\"Two\" value=\"2\"/>\r\n </ECEnumeration>\r\n\r\n <ECStructClass typeName=\"InnerStruct\" modifier=\"None\">\r\n <ECProperty propertyName=\"bool\" typeName=\"boolean\"/>\r\n <ECArrayProperty propertyName=\"doubles\" typeName=\"double\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n </ECStructClass>\r\n\r\n <ECStructClass typeName=\"OuterStruct\" modifier=\"None\">\r\n <ECStructProperty propertyName=\"innerStruct\" typeName=\"InnerStruct\"/>\r\n <ECStructArrayProperty propertyName=\"innerStructs\" typeName=\"InnerStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n </ECStructClass>\r\n\r\n <ECEntityClass typeName=\"TestElement\" modifier=\"None\">\r\n <BaseClass>bis:PhysicalElement</BaseClass>\r\n <ECProperty propertyName=\"intProp\" typeName=\"int\"/>\r\n <ECProperty propertyName=\"point\" typeName=\"point3d\"/>\r\n <ECProperty propertyName=\"maybeNull\" typeName=\"int\"/>\r\n <ECProperty propertyName=\"datetime\" typeName=\"dateTime\"/>\r\n <ECArrayProperty propertyName=\"strings\" typeName=\"string\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n <ECStructProperty propertyName=\"outerStruct\" typeName=\"OuterStruct\"/>\r\n <ECStructArrayProperty propertyName=\"outerStructs\" typeName=\"OuterStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n <ECProperty propertyName=\"intEnum\" typeName=\"IntEnum\"/>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"TestAspect\" modifier=\"None\">\r\n <BaseClass>bis:ElementUniqueAspect</BaseClass>\r\n <ECProperty propertyName=\"aspectProp\" typeName=\"int\"/>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"TestElementStringProp\" modifier=\"Abstract\">\r\n <ECCustomAttributes>\r\n <QueryView xmlns=\"ECDbMap.02.00.04\">\r\n <Query>\r\n SELECT\r\n jo.ECInstanceId,\r\n ec_classid('Fields', 'TestElementStringProp') [ECClassId],\r\n json_extract(jo.jsonProperties, '$.stringProp') [StringProp]\r\n FROM Fields.TestElement jo\r\n </Query>\r\n </QueryView>\r\n </ECCustomAttributes>\r\n <ECProperty propertyName=\"StringProp\" typeName=\"string\" />\r\n </ECEntityClass>\r\n</ECSchema>\r\n`;\r\n\r\ninterface InnerStruct {\r\n bool: boolean;\r\n doubles: number[];\r\n}\r\n\r\ninterface OuterStruct {\r\n innerStruct: InnerStruct;\r\n innerStructs: InnerStruct[];\r\n}\r\n\r\ninterface TestElementProps extends PhysicalElementProps {\r\n intProp: number;\r\n point: XYAndZ;\r\n maybeNull?: number;\r\n strings: string[];\r\n datetime: Date;\r\n outerStruct: OuterStruct;\r\n outerStructs: OuterStruct[];\r\n intEnum?: number;\r\n}\r\n\r\nclass TestElement extends PhysicalElement {\r\n public static override get className() { return \"TestElement\"; }\r\n declare public intProp: number;\r\n declare public point: XYAndZ;\r\n declare public maybeNull?: number;\r\n declare public strings: string[];\r\n declare public datetime: Date;\r\n declare public outerStruct: OuterStruct;\r\n declare public outerStructs: OuterStruct[];\r\n}\r\n\r\nclass TestAspect extends ElementUniqueAspect {\r\n public static override get className() { return \"TestAspect\"; }\r\n\r\n declare public aspectProp: number;\r\n}\r\n\r\ninterface TestAspectProps extends ElementAspectProps {\r\n aspectProp: number;\r\n}\r\n\r\nclass FieldsSchema extends Schema {\r\n public static override get schemaName() { return \"Fields\"; }\r\n}\r\n\r\nasync function registerTestSchema(iModel: IModelDb): Promise<void> {\r\n if (!Schemas.getRegisteredSchema(\"Fields\")) {\r\n Schemas.registerSchema(FieldsSchema);\r\n ClassRegistry.register(TestElement, FieldsSchema);\r\n ClassRegistry.register(TestAspect, FieldsSchema);\r\n }\r\n\r\n await iModel.importSchemaStrings([fieldsSchemaXml]);\r\n iModel.saveChanges();\r\n}\r\n\r\ndescribe(\"Field evaluation\", () => {\r\n let imodel: StandaloneDb;\r\n let model: Id64String;\r\n let category: Id64String;\r\n let sourceElementId: Id64String;\r\n\r\n before(async () => {\r\n const iModelPath = IModelTestUtils.prepareOutputFile(\"UpdateFieldsContext\", \"test.bim\");\r\n imodel = StandaloneDb.createEmpty(iModelPath, { rootSubject: { name: \"UpdateFieldsContext\" }, allowEdit: JSON.stringify({ txns: true } )});\r\n\r\n await registerTestSchema(imodel);\r\n\r\n model = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), true)[1];\r\n category = SpatialCategory.insert(imodel, StandaloneDb.dictionaryId, \"UpdateFieldsContextCategory\", new SubCategoryAppearance());\r\n sourceElementId = insertTestElement();\r\n\r\n await imodel.fonts.embedFontFile({\r\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\r\n });\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n function insertTestElement(overrides?: Partial<TestElementProps>, aspectProp?: number): Id64String {\r\n return createTestElement(imodel, model, category, overrides, aspectProp);\r\n }\r\n\r\n function evaluateField(propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): FieldValue | undefined {\r\n if (typeof propertyHost === \"string\") {\r\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\r\n }\r\n\r\n const field = FieldRun.create({\r\n propertyPath,\r\n propertyHost,\r\n });\r\n\r\n const context = createUpdateContext(propertyHost.elementId, imodel, deletedDependency);\r\n return context.getProperty(field);\r\n }\r\n\r\n describe(\"getProperty\", () => {\r\n function expectValue(expected: any, propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): void {\r\n expect(evaluateField(propertyPath, propertyHost, deletedDependency)?.value).to.deep.equal(expected);\r\n }\r\n\r\n it(\"returns a primitive property value\", () => {\r\n expectValue(100, { propertyName: \"intProp\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns an integer enum property value\", () => {\r\n expectValue(1, { propertyName: \"intEnum\" }, sourceElementId);\r\n });\r\n\r\n it(\"treats points as primitive values\", () => {\r\n expectValue({ x: 1, y: 2, z: 3 }, { propertyName: \"point\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"point\", accessors: [\"x\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns a primitive array value\", () => {\r\n expectValue(\"a\", { propertyName: \"strings\", accessors: [0] }, sourceElementId);\r\n expectValue(\"b\", { propertyName: \"strings\", accessors: [1] }, sourceElementId);\r\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [2] }, sourceElementId);\r\n });\r\n\r\n it(\"supports negative array indices\", () => {\r\n expectValue(\"a\", { propertyName: \"strings\", accessors: [-3] }, sourceElementId);\r\n expectValue(\"b\", { propertyName: \"strings\", accessors: [-2] }, sourceElementId);\r\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [-1] }, sourceElementId);\r\n });\r\n\r\n it(\"supports properties of EC views\", () => {\r\n expectValue(\"abc\", { propertyName: \"stringProp\" }, { schemaName: \"Fields\", className: \"TestElementStringProp\", elementId: sourceElementId });\r\n });\r\n\r\n it(\"returns undefined if the dependency was deleted\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\" }, sourceElementId, true);\r\n });\r\n\r\n it(\"returns undefined if the host element does not exist\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\" }, \"0xbaadf00d\");\r\n });\r\n\r\n it(\"returns undefined if the host element is not of the specified class or a subclass thereof\", () => {\r\n expectValue(undefined, { propertyName: \"origin\" }, { schemaName: \"BisCore\", className: \"GeometricElement2d\", elementId: sourceElementId });\r\n });\r\n\r\n it(\"returns undefined if an access string is specified for a non-object property\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\", accessors: [\"property\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the specified property does not exist\", () => {\r\n expectValue(undefined, { propertyName: \"nonExistentProperty\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the specified property is null\", () => {\r\n expectValue(undefined, { propertyName: \"maybeNull\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if an array index is specified for a non-array property\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\", accessors: [0] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if an array index is out of bounds\", () => {\r\n for (const index of [3, 4, -4, -5]) {\r\n expectValue(undefined, { propertyName: \"strings\", accessors: [index] }, sourceElementId);\r\n }\r\n });\r\n\r\n it(\"returns undefined for a non-primitive value\", () => {\r\n expectValue(undefined, { propertyName: \"strings\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStruct\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStruct\", accessors: [\"innerStruct\"] }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0] }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns arbitrarily-nested properties of structs and struct arrays\", () => {\r\n expectValue(false, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] }, sourceElementId);\r\n for (const index of [0, 1, 2]) {\r\n expectValue(index + 1, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", index] },sourceElementId);\r\n expectValue(3 - index, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", -1 - index] },sourceElementId);\r\n }\r\n\r\n expectValue(9, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\", \"doubles\", 1] }, sourceElementId);\r\n expectValue(false, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", -1, \"bool\"] }, sourceElementId);\r\n expectValue(5, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", 0, \"doubles\", 0] }, sourceElementId);\r\n });\r\n\r\n it(\"returns the value of a property of an aspect\", () => {\r\n expect(imodel.elements.getAspects(sourceElementId, \"Fields:TestAspect\").length).to.equal(1);\r\n expectValue(999, { propertyName: \"aspectProp\" }, { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestAspect\" });\r\n });\r\n\r\n it(\"should fail to evaluate if prop type does not match\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"string\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n formatOptions: {\r\n case: \"upper\",\r\n prefix: \"Value: \",\r\n suffix: \"!\"\r\n }\r\n });\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n\r\n const updated = updateField(fieldRun, context);\r\n\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n\r\n function getPropertyType(propertyHost: FieldPropertyHost, propertyPath: string | FieldPropertyPath): FieldPropertyType | undefined {\r\n if (typeof propertyPath === \"string\") {\r\n propertyPath = { propertyName: propertyPath };\r\n }\r\n\r\n return evaluateField(propertyPath, propertyHost)?.type;\r\n }\r\n\r\n it(\"deduces type for primitive properties\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"intProp\")).to.equal(\"string\");\r\n expect(getPropertyType(propertyHost, \"point\")).to.equal(\"coordinate\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"strings\", accessors: [0] })).to.equal(\"string\");\r\n expect(getPropertyType(propertyHost, \"intEnum\")).to.equal(\"int-enum\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", 0] })).to.equal(\"quantity\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] })).to.equal(\"boolean\");\r\n\r\n propertyHost.schemaName = \"BisCore\";\r\n propertyHost.className = \"GeometricElement3d\";\r\n expect(getPropertyType(propertyHost, \"LastMod\")).to.equal(\"datetime\");\r\n expect(getPropertyType(propertyHost, \"FederationGuid\")).to.equal(\"string\");\r\n });\r\n\r\n it(\"returns undefined for non-primitive properties\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"outerStruct\")).to.equal(undefined);\r\n expect(getPropertyType(propertyHost, \"outerStructs\")).to.equal(undefined);\r\n });\r\n\r\n it(\"returns undefined for invalid property paths\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"unknownPropertyName\")).to.be.undefined;\r\n });\r\n\r\n it(\"should return undefined for unsupported primitive types\", () => {\r\n const host = { elementId: sourceElementId, schemaName: \"BisCore\", className: \"GeometricElement3d\" };\r\n expect(getPropertyType(host, \"GeometryStream\")).to.be.undefined;\r\n });\r\n });\r\n\r\n describe(\"updateFields\", () => {\r\n it(\"recomputes cached content\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"oldValue\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(1);\r\n expect(fieldRun.cachedContent).to.equal(\"100\"); // `intProp` value from the test element\r\n });\r\n\r\n it(\"does not update a field if recomputed content matches cached content\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"100\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(0);\r\n expect(fieldRun.cachedContent).to.equal(\"100\");\r\n });\r\n\r\n it(\"returns the number of fields updated\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun1 = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"100\",\r\n });\r\n\r\n const fieldRun2 = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"strings\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun1);\r\n textBlock.appendRun(fieldRun2);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(1);\r\n expect(fieldRun1.cachedContent).to.equal(\"100\");\r\n expect(fieldRun2.cachedContent).to.equal(\"a\");\r\n });\r\n });\r\n\r\n function createAnnotationElement(textBlock: TextBlock | undefined): TextAnnotation3d {\r\n const elem = TextAnnotation3d.fromJSON({\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n placement: {\r\n origin: { x: 0, y: 0, z: 0 },\r\n angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\r\n },\r\n classFullName: TextAnnotation3d.classFullName,\r\n defaultTextStyle: new TextAnnotationUsesTextStyleByDefault(\"0x123\").toJSON(),\r\n }, imodel);\r\n\r\n if (textBlock) {\r\n const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });\r\n elem.setAnnotation(annotation);\r\n }\r\n\r\n return elem;\r\n }\r\n\r\n function insertAnnotationElement(textBlock: TextBlock | undefined): Id64String {\r\n const elem = createAnnotationElement(textBlock);\r\n return elem.insert();\r\n }\r\n\r\n describe(\"ElementDrivesTextAnnotation\", () => {\r\n function expectNumRelationships(expected: number, targetId?: Id64String): void {\r\n const where = targetId ? ` WHERE TargetECInstanceId=${targetId}` : \"\";\r\n const ecsql = `SELECT COUNT(*) FROM BisCore.ElementDrivesTextAnnotation ${where}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel.withPreparedStatement(ecsql, (stmt) => {\r\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);\r\n expect(stmt.getValue(0).getInteger()).to.equal(expected);\r\n });\r\n }\r\n\r\n it(\"can be inserted\", () => {\r\n expectNumRelationships(0);\r\n\r\n const targetId = insertAnnotationElement(undefined);\r\n expect(targetId).not.to.equal(Id64.invalid);\r\n\r\n const target = imodel.elements.getElement(targetId);\r\n expect(target.classFullName).to.equal(\"BisCore:TextAnnotation3d\");\r\n expect(target).instanceof(TextAnnotation3d);\r\n\r\n const targetAnno = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(targetAnno).instanceof(TextAnnotation3d);\r\n\r\n const rel = ElementDrivesTextAnnotation.create(imodel, sourceElementId, targetId);\r\n const relId = rel.insert();\r\n expect(relId).not.to.equal(Id64.invalid);\r\n\r\n expectNumRelationships(1);\r\n\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementDrivesTextAnnotation\", relId);\r\n expect(relationship.sourceId).to.equal(sourceElementId);\r\n expect(relationship.targetId).to.equal(targetId);\r\n });\r\n\r\n function createField(propertyHost: Id64String | FieldPropertyHost, cachedContent: string, propertyName = \"intProp\", accessors?: Array<string | number>): FieldRun {\r\n if (typeof propertyHost === \"string\") {\r\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\r\n }\r\n\r\n return FieldRun.create({\r\n styleOverrides: { font: { name: \"Karla\" } },\r\n propertyHost,\r\n cachedContent,\r\n propertyPath: { propertyName, accessors },\r\n });\r\n }\r\n\r\n describe(\"updateFieldDependencies\", () => {\r\n it(\"creates exactly one relationship for each unique source element on insert and update\", () => {\r\n const source1 = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(source1, \"1\"));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n\r\n const source2 = insertTestElement();\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n const anno = target.getAnnotation()!;\r\n anno.textBlock.appendRun(createField(source2, \"2a\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n\r\n anno.textBlock.appendRun(createField(source2, \"2b\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n\r\n const source3 = insertTestElement();\r\n anno.textBlock.appendRun(createField(source3, \"3\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(3, targetId);\r\n });\r\n\r\n it(\"deletes stale relationships\", () => {\r\n const sourceA = insertTestElement();\r\n const sourceB = insertTestElement();\r\n\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceA, \"A\"));\r\n block.appendRun(createField(sourceB, \"B\"));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n const anno = target.getAnnotation()!;\r\n\r\n // Remove the sourceA FieldRun from the first paragraph.\r\n const p1 = anno.textBlock.children[0];\r\n p1.children.shift();\r\n\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\r\n\r\n anno.textBlock.children.length = 0;\r\n anno.textBlock.appendRun(createField(sourceA, \"A2\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\r\n\r\n anno.textBlock.children.length = 0;\r\n anno.textBlock.appendRun(TextRun.create({\r\n styleOverrides: { font: { name: \"Karla\" } },\r\n content: \"not a field\",\r\n }));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(0, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\r\n });\r\n\r\n it(\"ignores invalid source element Ids\", () => {\r\n const source = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(Id64.invalid, \"invalid\"));\r\n block.appendRun(createField(\"0xbaadf00d\", \"non-existent\"));\r\n block.appendRun(createField(source, \"valid\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectNumRelationships(1, targetId);\r\n });\r\n });\r\n\r\n function expectText(expected: string, elemId: Id64String, db?: StandaloneDb): void {\r\n db = db ?? imodel;\r\n const elem = db.elements.getElement<TextAnnotation3d>(elemId);\r\n const anno = elem.getAnnotation()!;\r\n const actual = anno.textBlock.stringify();\r\n expect(actual).to.equal(expected);\r\n }\r\n\r\n it(\"evaluates cachedContent when annotation element is inserted\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"initial cached content\"));\r\n expect(block.stringify()).to.equal(\"initial cached content\");\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()!.textBlock.stringify()).to.equal(\"100\");\r\n });\r\n\r\n it(\"updates fields when source element is modified or deleted\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"old value\"));;\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()).not.to.be.undefined;\r\n\r\n expectText(\"100\", targetId);\r\n\r\n let source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.intProp = 50;\r\n source.update();\r\n\r\n expectText(\"100\", targetId);\r\n\r\n imodel.saveChanges();\r\n\r\n source = imodel.elements.getElement<TestElement>(sourceId);\r\n expect(source.intProp).to.equal(50);\r\n\r\n expectText(\"50\", targetId);\r\n\r\n imodel.elements.deleteElement(sourceId);\r\n expectText(\"50\", targetId);\r\n\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n });\r\n\r\n it(\"updates fields when source element aspect is modified, deleted, or recreated\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField({ elementId: sourceId, schemaName: \"Fields\", className: \"TestAspect\" }, \"\", \"aspectProp\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"999\", targetId);\r\n\r\n const aspects = imodel.elements.getAspects(sourceId, \"Fields:TestAspect\");\r\n expect(aspects.length).to.equal(1);\r\n const aspect = aspects[0] as TestAspect;\r\n expect(aspect.aspectProp).to.equal(999);\r\n\r\n aspect.aspectProp = 12345;\r\n imodel.elements.updateAspect(aspect.toJSON());\r\n imodel.saveChanges();\r\n expectText(\"12345\", targetId);\r\n\r\n imodel.elements.deleteAspect([aspect.id]);\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n\r\n const newAspect: TestAspectProps = {\r\n element: new ElementOwnsUniqueAspect(sourceId),\r\n classFullName: TestAspect.classFullName,\r\n aspectProp: 42,\r\n };\r\n imodel.elements.insertAspect(newAspect);\r\n imodel.saveChanges();\r\n expectText(\"42\", targetId);\r\n });\r\n\r\n it(\"updates only fields for specific modified element\", () => {\r\n const sourceA = insertTestElement();\r\n const sourceB = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceA, \"A\"));\r\n block.appendRun(createField(sourceB, \"B\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"100100\", targetId);\r\n\r\n const sourceElem = imodel.elements.getElement<TestElement>(sourceB);\r\n sourceElem.intProp = 123;\r\n sourceElem.update();\r\n imodel.saveChanges();\r\n\r\n expectText(\"100123\", targetId);\r\n });\r\n\r\n it(\"supports complex property paths\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"\", \"outerStruct\", [\"innerStructs\", 1, \"doubles\", -2]));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"2\", targetId);\r\n\r\n const source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.outerStruct.innerStructs[1].doubles[3] = 12.5;\r\n source.update();\r\n imodel.saveChanges();\r\n expectText(\"12.5\", targetId);\r\n });\r\n\r\n it(\"updates EC view fields when the element changes if the EC view queries the element directly\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField({\r\n elementId: sourceId, schemaName: \"Fields\", className: \"TestElementStringProp\",\r\n }, \"cached-content\", \"StringProp\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()).not.to.be.undefined;\r\n\r\n expectText(\"abc\", targetId);\r\n\r\n let source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.jsonProperties.stringProp = \"zyx\";\r\n source.update();\r\n\r\n expectText(\"abc\", targetId);\r\n\r\n imodel.saveChanges();\r\n expectText(\"zyx\", targetId);\r\n\r\n source = imodel.elements.getElement<TestElement>(sourceId);\r\n expect(source.jsonProperties.stringProp).to.equal(\"zyx\");\r\n\r\n expectText(\"zyx\", targetId);\r\n\r\n imodel.elements.deleteElement(sourceId);\r\n expectText(\"zyx\", targetId);\r\n\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n });\r\n\r\n describe(\"remapFields\", () => {\r\n let dstIModel: StandaloneDb;\r\n let dstModel: Id64String;\r\n let dstCategory: Id64String;\r\n let dstSourceElementId: Id64String;\r\n\r\n before(async () => {\r\n const path = IModelTestUtils.prepareOutputFile(\"RemapFields\", `dst.bim`);\r\n dstIModel = StandaloneDb.createEmpty(path, { rootSubject: { name: `RemapFields-dst` }, allowEdit: JSON.stringify({ txns: true })});\r\n await registerTestSchema(dstIModel);\r\n\r\n // Insert additional unused elements to ensure element Ids differ between src and dst iModels\r\n for (let i = 0; i < 3; i++) {\r\n IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\r\n }\r\n\r\n const modelAndElement = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\r\n expect(modelAndElement[0]).to.equal(modelAndElement[1]);\r\n\r\n dstModel = modelAndElement[1];\r\n dstCategory = SpatialCategory.insert(dstIModel, StandaloneDb.dictionaryId, `dstCat`, new SubCategoryAppearance());\r\n dstSourceElementId = createTestElement(dstIModel, dstModel, dstCategory, {\r\n intProp: 200,\r\n point: { x: -1, y: -2, z: -3 },\r\n strings: [\"x\", \"y\", \"z\"],\r\n intEnum: 2,\r\n }, 1234);\r\n\r\n await dstIModel.fonts.embedFontFile({\r\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\r\n });\r\n\r\n expect(dstCategory).not.to.equal(category);\r\n expect(dstModel).not.to.equal(model);\r\n expect(dstSourceElementId).not.to.equal(sourceElementId);\r\n });\r\n\r\n after(() => {\r\n dstIModel.close();\r\n });\r\n\r\n function getTextBlockJson(): TextBlockProps {\r\n return {\r\n children: [{\r\n children: [{\r\n type: \"field\",\r\n propertyHost: {\r\n elementId: sourceElementId,\r\n schemaName: \"Fields\",\r\n className: \"TestElement\",\r\n },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"intProp\",\r\n }, {\r\n type: \"field\",\r\n propertyHost: {\r\n elementId: category,\r\n schemaName: \"BisCore\",\r\n className: \"Element\",\r\n },\r\n propertyPath: { propertyName: \"CodeValue\" },\r\n cachedContent: \"CodeValue\"\r\n }],\r\n }],\r\n };\r\n }\r\n\r\n function expectHostIds(elem: TextAnnotation3d, host1: Id64String, host2: Id64String): void {\r\n const anno = elem.getAnnotation()!;\r\n expect(anno.textBlock.children.length).to.equal(1);\r\n const para = anno.textBlock.children[0];\r\n expect(para.children.length).to.equal(2);\r\n expect(para.children.every((x) => x.type === \"field\"));\r\n const field1 = para.children[0] as FieldRun;\r\n expect(field1.propertyHost.elementId).to.equal(host1);\r\n const field2 = para.children[1] as FieldRun;\r\n expect(field2.propertyHost.elementId).to.equal(host2);\r\n }\r\n\r\n it(\"remaps field hosts\", () => {\r\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\r\n expectHostIds(elem, sourceElementId, category);\r\n\r\n const context = new IModelElementCloneContext(imodel, dstIModel);\r\n context.remapElement(sourceElementId, dstSourceElementId);\r\n context.remapElement(category, dstCategory);\r\n\r\n ElementDrivesTextAnnotation.remapFields(elem, context);\r\n expectHostIds(elem, dstSourceElementId, dstCategory);\r\n });\r\n\r\n it(\"invalidates field host if source element not remapped\", () => {\r\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\r\n expectHostIds(elem, sourceElementId, category);\r\n\r\n const context = new IModelElementCloneContext(imodel, dstIModel);\r\n\r\n ElementDrivesTextAnnotation.remapFields(elem, context);\r\n expectHostIds(elem, Id64.invalid, Id64.invalid);\r\n });\r\n });\r\n });\r\n\r\n describe(\"Format Validation\", () => {\r\n it(\"validates formatting options for string property type\", () => {\r\n // Create a FieldRun with string property type and some format options\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"strings\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n formatOptions: {\r\n case: \"upper\",\r\n prefix: \"Value: \",\r\n suffix: \"!\"\r\n }\r\n });\r\n\r\n // Context returns a string value for the property\r\n const context = {\r\n hostElementId: sourceElementId,\r\n getProperty: () => { return { value: \"abc\", type: \"string\" as const } },\r\n };\r\n\r\n // Update the field and check the result\r\n const updated = updateField(fieldRun, context);\r\n\r\n // The formatted value should be uppercased and have prefix/suffix applied\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(\"Value: ABC!\");\r\n });\r\n\r\n it(\"validates formatting options for datetime objects\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n const fieldRun = FieldRun.create({\r\n propertyHost,\r\n propertyPath: { propertyName: \"datetime\"},\r\n cachedContent: \"oldval\",\r\n formatOptions: {\r\n dateTime: {\r\n formatOptions:{\r\n month: \"short\",\r\n day: \"2-digit\",\r\n year: \"numeric\",\r\n timeZone: \"UTC\"\r\n },\r\n locale: \"en-US\",\r\n },\r\n },\r\n });\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updated = updateField(fieldRun, context);\r\n\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(\"Aug 28, 2025\");\r\n });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"Fields.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/Fields.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { expect } from \"chai\";\r\nimport { Code, ElementAspectProps, FieldPropertyHost, FieldPropertyPath, FieldPropertyType, FieldRun, FieldValue, PhysicalElementProps, SubCategoryAppearance, TextAnnotation, TextBlock, TextBlockProps, TextRun } from \"@itwin/core-common\";\r\nimport { IModelDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { createUpdateContext, updateField, updateFields } from \"../../internal/annotations/fields\";\r\nimport { DbResult, Id64, Id64String, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { SpatialCategory } from \"../../Category\";\r\nimport { Point3d, XYAndZ, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { Schema, Schemas } from \"../../Schema\";\r\nimport { ClassRegistry } from \"../../ClassRegistry\";\r\nimport { PhysicalElement } from \"../../Element\";\r\nimport { ElementOwnsUniqueAspect, ElementUniqueAspect, FontFile, IModelElementCloneContext, TextAnnotation3d } from \"../../core-backend\";\r\nimport { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault } from \"../../annotations/ElementDrivesTextAnnotation\";\r\n\r\nfunction isIntlSupported(): boolean {\r\n // Node in the mobile add-on does not include Intl, so this test fails. Right now, mobile\r\n // users are not expected to do any editing, but long term we will attempt to find a better\r\n // solution.\r\n return !ProcessDetector.isMobileAppBackend;\r\n}\r\n\r\nfunction createTestElement(imodel: StandaloneDb, model: Id64String, category: Id64String, overrides?: Partial<TestElementProps>, aspectProp = 999): Id64String {\r\n const props: TestElementProps = {\r\n classFullName: \"Fields:TestElement\",\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n intProp: 100,\r\n point: { x: 1, y: 2, z: 3 },\r\n strings: [\"a\", \"b\", `\"name\": \"c\"`],\r\n datetime: new Date(\"2025-08-28T13:45:30.123Z\"),\r\n intEnum: 1,\r\n outerStruct: {\r\n innerStruct: { bool: false, doubles: [1, 2, 3] },\r\n innerStructs: [{ bool: true, doubles: [] }, { bool: false, doubles: [5, 4, 3, 2, 1] }],\r\n },\r\n outerStructs: [{\r\n innerStruct: { bool: true, doubles: [10, 9] },\r\n innerStructs: [{ bool: false, doubles: [5] }],\r\n }],\r\n placement: {\r\n origin: new Point3d(1, 2, 0),\r\n angles: new YawPitchRollAngles(),\r\n },\r\n jsonProperties: {\r\n stringProp: \"abc\",\r\n ints: [10, 11, 12, 13],\r\n bool: true,\r\n zoo: {\r\n address: {\r\n zipcode: 12345,\r\n },\r\n birds: [\r\n { name: \"duck\", sound: \"quack\" },\r\n { name: \"hawk\", sound: \"scree!\" },\r\n ],\r\n },\r\n },\r\n ...overrides,\r\n };\r\n\r\n const id = imodel.elements.insertElement(props);\r\n\r\n const aspectProps: TestAspectProps = {\r\n classFullName: TestAspect.classFullName,\r\n aspectProp,\r\n element: new ElementOwnsUniqueAspect(id),\r\n };\r\n imodel.elements.insertAspect(aspectProps);\r\n\r\n imodel.saveChanges();\r\n return id;\r\n}\r\n\r\ndescribe(\"updateField\", () => {\r\n const mockElementId = \"0x1\";\r\n const mockPath: FieldPropertyPath = {\r\n propertyName: \"mockProperty\",\r\n accessors: [0, \"nestedProperty\"],\r\n };\r\n const mockCachedContent = \"cachedContent\";\r\n const mockUpdatedContent = \"updatedContent\";\r\n\r\n const createMockContext = (elementId: string, propertyValue?: string) => ({\r\n hostElementId: elementId,\r\n getProperty: (field: FieldRun): FieldValue | undefined => {\r\n const propertyPath = field.propertyPath;\r\n if (\r\n propertyPath.propertyName === \"mockProperty\" &&\r\n propertyPath.accessors?.[0] === 0 &&\r\n propertyPath.accessors?.[1] === \"nestedProperty\" &&\r\n propertyValue !== undefined\r\n ) {\r\n return { value: propertyValue, type: \"string\" };\r\n }\r\n return undefined;\r\n },\r\n });\r\n\r\n it(\"does nothing if hostElementId does not match\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(\"0x2\", mockUpdatedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.false;\r\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\r\n });\r\n\r\n it(\"produces invalid content indicator if property value is undefined\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n\r\n it(\"returns false if cached content matches new content\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId, mockCachedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.false;\r\n expect(fieldRun.cachedContent).to.equal(mockCachedContent);\r\n });\r\n\r\n it(\"returns true and updates cached content if new content is different\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = createMockContext(mockElementId, mockUpdatedContent);\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(mockUpdatedContent);\r\n });\r\n\r\n it(\"resolves to invalid content indicator if an exception occurs\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: mockElementId, schemaName: \"TestSchema\", className: \"TestClass\" },\r\n propertyPath: mockPath,\r\n cachedContent: mockCachedContent,\r\n });\r\n\r\n const context = {\r\n hostElementId: mockElementId,\r\n getProperty: () => {\r\n throw new Error(\"Test exception\");\r\n },\r\n };\r\n\r\n const result = updateField(fieldRun, context);\r\n\r\n expect(result).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n});\r\n\r\nconst fieldsSchemaXml = `\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ECSchema schemaName=\"Fields\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.04\" alias=\"bis\"/>\r\n <ECSchemaReference name='ECDbMap' version='02.00.04' alias='ecdbmap' />\r\n\r\n <ECEnumeration typeName=\"IntEnum\" backingTypeName=\"int\">\r\n <ECEnumerator name=\"one\" displayLabel=\"One\" value=\"1\" />\r\n <ECEnumerator name=\"two\" displayLabel=\"Two\" value=\"2\"/>\r\n </ECEnumeration>\r\n\r\n <ECStructClass typeName=\"InnerStruct\" modifier=\"None\">\r\n <ECProperty propertyName=\"bool\" typeName=\"boolean\"/>\r\n <ECArrayProperty propertyName=\"doubles\" typeName=\"double\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n </ECStructClass>\r\n\r\n <ECStructClass typeName=\"OuterStruct\" modifier=\"None\">\r\n <ECStructProperty propertyName=\"innerStruct\" typeName=\"InnerStruct\"/>\r\n <ECStructArrayProperty propertyName=\"innerStructs\" typeName=\"InnerStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n </ECStructClass>\r\n\r\n <ECEntityClass typeName=\"TestElement\" modifier=\"None\">\r\n <BaseClass>bis:PhysicalElement</BaseClass>\r\n <ECProperty propertyName=\"intProp\" typeName=\"int\"/>\r\n <ECProperty propertyName=\"point\" typeName=\"point3d\"/>\r\n <ECProperty propertyName=\"maybeNull\" typeName=\"int\"/>\r\n <ECProperty propertyName=\"datetime\" typeName=\"dateTime\"/>\r\n <ECArrayProperty propertyName=\"strings\" typeName=\"string\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n <ECStructProperty propertyName=\"outerStruct\" typeName=\"OuterStruct\"/>\r\n <ECStructArrayProperty propertyName=\"outerStructs\" typeName=\"OuterStruct\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\r\n <ECProperty propertyName=\"intEnum\" typeName=\"IntEnum\"/>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"TestAspect\" modifier=\"None\">\r\n <BaseClass>bis:ElementUniqueAspect</BaseClass>\r\n <ECProperty propertyName=\"aspectProp\" typeName=\"int\"/>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"TestElementStringProp\" modifier=\"Abstract\">\r\n <ECCustomAttributes>\r\n <QueryView xmlns=\"ECDbMap.02.00.04\">\r\n <Query>\r\n SELECT\r\n jo.ECInstanceId,\r\n ec_classid('Fields', 'TestElementStringProp') [ECClassId],\r\n json_extract(jo.jsonProperties, '$.stringProp') [StringProp]\r\n FROM Fields.TestElement jo\r\n </Query>\r\n </QueryView>\r\n </ECCustomAttributes>\r\n <ECProperty propertyName=\"StringProp\" typeName=\"string\" />\r\n </ECEntityClass>\r\n</ECSchema>\r\n`;\r\n\r\ninterface InnerStruct {\r\n bool: boolean;\r\n doubles: number[];\r\n}\r\n\r\ninterface OuterStruct {\r\n innerStruct: InnerStruct;\r\n innerStructs: InnerStruct[];\r\n}\r\n\r\ninterface TestElementProps extends PhysicalElementProps {\r\n intProp: number;\r\n point: XYAndZ;\r\n maybeNull?: number;\r\n strings: string[];\r\n datetime: Date;\r\n outerStruct: OuterStruct;\r\n outerStructs: OuterStruct[];\r\n intEnum?: number;\r\n}\r\n\r\nclass TestElement extends PhysicalElement {\r\n public static override get className() { return \"TestElement\"; }\r\n declare public intProp: number;\r\n declare public point: XYAndZ;\r\n declare public maybeNull?: number;\r\n declare public strings: string[];\r\n declare public datetime: Date;\r\n declare public outerStruct: OuterStruct;\r\n declare public outerStructs: OuterStruct[];\r\n}\r\n\r\nclass TestAspect extends ElementUniqueAspect {\r\n public static override get className() { return \"TestAspect\"; }\r\n\r\n declare public aspectProp: number;\r\n}\r\n\r\ninterface TestAspectProps extends ElementAspectProps {\r\n aspectProp: number;\r\n}\r\n\r\nclass FieldsSchema extends Schema {\r\n public static override get schemaName() { return \"Fields\"; }\r\n}\r\n\r\nasync function registerTestSchema(iModel: IModelDb): Promise<void> {\r\n if (!Schemas.getRegisteredSchema(\"Fields\")) {\r\n Schemas.registerSchema(FieldsSchema);\r\n ClassRegistry.register(TestElement, FieldsSchema);\r\n ClassRegistry.register(TestAspect, FieldsSchema);\r\n }\r\n\r\n await iModel.importSchemaStrings([fieldsSchemaXml]);\r\n iModel.saveChanges();\r\n}\r\n\r\ndescribe(\"Field evaluation\", () => {\r\n let imodel: StandaloneDb;\r\n let model: Id64String;\r\n let category: Id64String;\r\n let sourceElementId: Id64String;\r\n\r\n before(async () => {\r\n const iModelPath = IModelTestUtils.prepareOutputFile(\"UpdateFieldsContext\", \"test.bim\");\r\n imodel = StandaloneDb.createEmpty(iModelPath, { rootSubject: { name: \"UpdateFieldsContext\" }, enableTransactions: true });\r\n\r\n await registerTestSchema(imodel);\r\n\r\n model = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(imodel, Code.createEmpty(), true)[1];\r\n category = SpatialCategory.insert(imodel, StandaloneDb.dictionaryId, \"UpdateFieldsContextCategory\", new SubCategoryAppearance());\r\n sourceElementId = insertTestElement();\r\n\r\n await imodel.fonts.embedFontFile({\r\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\r\n });\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n function insertTestElement(overrides?: Partial<TestElementProps>, aspectProp?: number): Id64String {\r\n return createTestElement(imodel, model, category, overrides, aspectProp);\r\n }\r\n\r\n function evaluateField(propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): FieldValue | undefined {\r\n if (typeof propertyHost === \"string\") {\r\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\r\n }\r\n\r\n const field = FieldRun.create({\r\n propertyPath,\r\n propertyHost,\r\n });\r\n\r\n const context = createUpdateContext(propertyHost.elementId, imodel, deletedDependency);\r\n return context.getProperty(field);\r\n }\r\n\r\n describe(\"getProperty\", () => {\r\n function expectValue(expected: any, propertyPath: FieldPropertyPath, propertyHost: FieldPropertyHost | Id64String, deletedDependency = false): void {\r\n expect(evaluateField(propertyPath, propertyHost, deletedDependency)?.value).to.deep.equal(expected);\r\n }\r\n\r\n it(\"returns a primitive property value\", () => {\r\n expectValue(100, { propertyName: \"intProp\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns an integer enum property value\", () => {\r\n expectValue(1, { propertyName: \"intEnum\" }, sourceElementId);\r\n });\r\n\r\n it(\"treats points as primitive values\", () => {\r\n expectValue({ x: 1, y: 2, z: 3 }, { propertyName: \"point\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"point\", accessors: [\"x\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns a primitive array value\", () => {\r\n expectValue(\"a\", { propertyName: \"strings\", accessors: [0] }, sourceElementId);\r\n expectValue(\"b\", { propertyName: \"strings\", accessors: [1] }, sourceElementId);\r\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [2] }, sourceElementId);\r\n });\r\n\r\n it(\"supports negative array indices\", () => {\r\n expectValue(\"a\", { propertyName: \"strings\", accessors: [-3] }, sourceElementId);\r\n expectValue(\"b\", { propertyName: \"strings\", accessors: [-2] }, sourceElementId);\r\n expectValue(`\"name\": \"c\"`, { propertyName: \"strings\", accessors: [-1] }, sourceElementId);\r\n });\r\n\r\n it(\"supports properties of EC views\", () => {\r\n expectValue(\"abc\", { propertyName: \"stringProp\" }, { schemaName: \"Fields\", className: \"TestElementStringProp\", elementId: sourceElementId });\r\n });\r\n\r\n it(\"returns undefined if the dependency was deleted\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\" }, sourceElementId, true);\r\n });\r\n\r\n it(\"returns undefined if the host element does not exist\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\" }, \"0xbaadf00d\");\r\n });\r\n\r\n it(\"returns undefined if the host element is not of the specified class or a subclass thereof\", () => {\r\n expectValue(undefined, { propertyName: \"origin\" }, { schemaName: \"BisCore\", className: \"GeometricElement2d\", elementId: sourceElementId });\r\n });\r\n\r\n it(\"returns undefined if an access string is specified for a non-object property\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\", accessors: [\"property\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the specified property does not exist\", () => {\r\n expectValue(undefined, { propertyName: \"nonExistentProperty\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if the specified property is null\", () => {\r\n expectValue(undefined, { propertyName: \"maybeNull\" }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if an array index is specified for a non-array property\", () => {\r\n expectValue(undefined, { propertyName: \"intProp\", accessors: [0] }, sourceElementId);\r\n });\r\n\r\n it(\"returns undefined if an array index is out of bounds\", () => {\r\n for (const index of [3, 4, -4, -5]) {\r\n expectValue(undefined, { propertyName: \"strings\", accessors: [index] }, sourceElementId);\r\n }\r\n });\r\n\r\n it(\"returns undefined for a non-primitive value\", () => {\r\n expectValue(undefined, { propertyName: \"strings\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStruct\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStruct\", accessors: [\"innerStruct\"] }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\" }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0] }, sourceElementId);\r\n expectValue(undefined, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\"] }, sourceElementId);\r\n });\r\n\r\n it(\"returns arbitrarily-nested properties of structs and struct arrays\", () => {\r\n expectValue(false, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] }, sourceElementId);\r\n for (const index of [0, 1, 2]) {\r\n expectValue(index + 1, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", index] }, sourceElementId);\r\n expectValue(3 - index, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", -1 - index] }, sourceElementId);\r\n }\r\n\r\n expectValue(9, { propertyName: \"outerStructs\", accessors: [0, \"innerStruct\", \"doubles\", 1] }, sourceElementId);\r\n expectValue(false, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", -1, \"bool\"] }, sourceElementId);\r\n expectValue(5, { propertyName: \"outerStructs\", accessors: [0, \"innerStructs\", 0, \"doubles\", 0] }, sourceElementId);\r\n });\r\n\r\n it(\"returns the value of a property of an aspect\", () => {\r\n expect(imodel.elements.getAspects(sourceElementId, \"Fields:TestAspect\").length).to.equal(1);\r\n expectValue(999, { propertyName: \"aspectProp\" }, { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestAspect\" });\r\n });\r\n\r\n it(\"should fail to evaluate if prop type does not match\", () => {\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"string\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n formatOptions: {\r\n case: \"upper\",\r\n prefix: \"Value: \",\r\n suffix: \"!\"\r\n }\r\n });\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n\r\n const updated = updateField(fieldRun, context);\r\n\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(FieldRun.invalidContentIndicator);\r\n });\r\n\r\n function getPropertyType(propertyHost: FieldPropertyHost, propertyPath: string | FieldPropertyPath): FieldPropertyType | undefined {\r\n if (typeof propertyPath === \"string\") {\r\n propertyPath = { propertyName: propertyPath };\r\n }\r\n\r\n return evaluateField(propertyPath, propertyHost)?.type;\r\n }\r\n\r\n it(\"deduces type for primitive properties\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"intProp\")).to.equal(\"string\");\r\n expect(getPropertyType(propertyHost, \"point\")).to.equal(\"coordinate\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"strings\", accessors: [0] })).to.equal(\"string\");\r\n expect(getPropertyType(propertyHost, \"intEnum\")).to.equal(\"int-enum\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"doubles\", 0] })).to.equal(\"quantity\");\r\n expect(getPropertyType(propertyHost, { propertyName: \"outerStruct\", accessors: [\"innerStruct\", \"bool\"] })).to.equal(\"boolean\");\r\n\r\n propertyHost.schemaName = \"BisCore\";\r\n propertyHost.className = \"GeometricElement3d\";\r\n expect(getPropertyType(propertyHost, \"LastMod\")).to.equal(\"datetime\");\r\n expect(getPropertyType(propertyHost, \"FederationGuid\")).to.equal(\"string\");\r\n });\r\n\r\n it(\"returns undefined for non-primitive properties\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"outerStruct\")).to.equal(undefined);\r\n expect(getPropertyType(propertyHost, \"outerStructs\")).to.equal(undefined);\r\n });\r\n\r\n it(\"returns undefined for invalid property paths\", () => {\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n expect(getPropertyType(propertyHost, \"unknownPropertyName\")).to.be.undefined;\r\n });\r\n\r\n it(\"should return undefined for unsupported primitive types\", () => {\r\n const host = { elementId: sourceElementId, schemaName: \"BisCore\", className: \"GeometricElement3d\" };\r\n expect(getPropertyType(host, \"GeometryStream\")).to.be.undefined;\r\n });\r\n });\r\n\r\n describe(\"updateFields\", () => {\r\n it(\"recomputes cached content\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"oldValue\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(1);\r\n expect(fieldRun.cachedContent).to.equal(\"100\"); // `intProp` value from the test element\r\n });\r\n\r\n it(\"does not update a field if recomputed content matches cached content\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"100\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(0);\r\n expect(fieldRun.cachedContent).to.equal(\"100\");\r\n });\r\n\r\n it(\"returns the number of fields updated\", () => {\r\n const textBlock = TextBlock.create();\r\n const fieldRun1 = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"100\",\r\n });\r\n\r\n const fieldRun2 = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"strings\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n });\r\n\r\n textBlock.appendRun(fieldRun1);\r\n textBlock.appendRun(fieldRun2);\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updatedCount = updateFields(textBlock, context);\r\n\r\n expect(updatedCount).to.equal(1);\r\n expect(fieldRun1.cachedContent).to.equal(\"100\");\r\n expect(fieldRun2.cachedContent).to.equal(\"a\");\r\n });\r\n });\r\n\r\n function createAnnotationElement(textBlock: TextBlock | undefined): TextAnnotation3d {\r\n const elem = TextAnnotation3d.fromJSON({\r\n model,\r\n category,\r\n code: Code.createEmpty(),\r\n placement: {\r\n origin: { x: 0, y: 0, z: 0 },\r\n angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\r\n },\r\n classFullName: TextAnnotation3d.classFullName,\r\n defaultTextStyle: new TextAnnotationUsesTextStyleByDefault(\"0x123\").toJSON(),\r\n }, imodel);\r\n\r\n if (textBlock) {\r\n const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });\r\n elem.setAnnotation(annotation);\r\n }\r\n\r\n return elem;\r\n }\r\n\r\n function insertAnnotationElement(textBlock: TextBlock | undefined): Id64String {\r\n const elem = createAnnotationElement(textBlock);\r\n return elem.insert();\r\n }\r\n\r\n describe(\"ElementDrivesTextAnnotation\", () => {\r\n function expectNumRelationships(expected: number, targetId?: Id64String): void {\r\n const where = targetId ? ` WHERE TargetECInstanceId=${targetId}` : \"\";\r\n const ecsql = `SELECT COUNT(*) FROM BisCore.ElementDrivesTextAnnotation ${where}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel.withPreparedStatement(ecsql, (stmt) => {\r\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);\r\n expect(stmt.getValue(0).getInteger()).to.equal(expected);\r\n });\r\n }\r\n\r\n it(\"can be inserted\", () => {\r\n expectNumRelationships(0);\r\n\r\n const targetId = insertAnnotationElement(undefined);\r\n expect(targetId).not.to.equal(Id64.invalid);\r\n\r\n const target = imodel.elements.getElement(targetId);\r\n expect(target.classFullName).to.equal(\"BisCore:TextAnnotation3d\");\r\n expect(target).instanceof(TextAnnotation3d);\r\n\r\n const targetAnno = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(targetAnno).instanceof(TextAnnotation3d);\r\n\r\n const rel = ElementDrivesTextAnnotation.create(imodel, sourceElementId, targetId);\r\n const relId = rel.insert();\r\n expect(relId).not.to.equal(Id64.invalid);\r\n\r\n expectNumRelationships(1);\r\n\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementDrivesTextAnnotation\", relId);\r\n expect(relationship.sourceId).to.equal(sourceElementId);\r\n expect(relationship.targetId).to.equal(targetId);\r\n });\r\n\r\n function createField(propertyHost: Id64String | FieldPropertyHost, cachedContent: string, propertyName = \"intProp\", accessors?: Array<string | number>): FieldRun {\r\n if (typeof propertyHost === \"string\") {\r\n propertyHost = { schemaName: \"Fields\", className: \"TestElement\", elementId: propertyHost };\r\n }\r\n\r\n return FieldRun.create({\r\n styleOverrides: { font: { name: \"Karla\" } },\r\n propertyHost,\r\n cachedContent,\r\n propertyPath: { propertyName, accessors },\r\n });\r\n }\r\n\r\n describe(\"updateFieldDependencies\", () => {\r\n it(\"creates exactly one relationship for each unique source element on insert and update\", () => {\r\n const source1 = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(source1, \"1\"));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n\r\n const source2 = insertTestElement();\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n const anno = target.getAnnotation()!;\r\n anno.textBlock.appendRun(createField(source2, \"2a\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n\r\n anno.textBlock.appendRun(createField(source2, \"2b\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n\r\n const source3 = insertTestElement();\r\n anno.textBlock.appendRun(createField(source3, \"3\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(3, targetId);\r\n });\r\n\r\n it(\"deletes stale relationships\", () => {\r\n const sourceA = insertTestElement();\r\n const sourceB = insertTestElement();\r\n\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceA, \"A\"));\r\n block.appendRun(createField(sourceB, \"B\"));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(2, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n const anno = target.getAnnotation()!;\r\n\r\n // Remove the sourceA FieldRun from the first paragraph.\r\n const p1 = anno.textBlock.children[0];\r\n p1.children.shift();\r\n\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).not.to.be.undefined;\r\n\r\n anno.textBlock.children.length = 0;\r\n anno.textBlock.appendRun(createField(sourceA, \"A2\"));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(1, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).not.to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\r\n\r\n anno.textBlock.children.length = 0;\r\n anno.textBlock.appendRun(TextRun.create({\r\n styleOverrides: { font: { name: \"Karla\" } },\r\n content: \"not a field\",\r\n }));\r\n target.setAnnotation(anno);\r\n target.update();\r\n imodel.saveChanges();\r\n\r\n expectNumRelationships(0, targetId);\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceA })).to.be.undefined;\r\n expect(imodel.relationships.tryGetInstance(ElementDrivesTextAnnotation.classFullName, { targetId, sourceId: sourceB })).to.be.undefined;\r\n });\r\n\r\n it(\"ignores invalid source element Ids\", () => {\r\n const source = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(Id64.invalid, \"invalid\"));\r\n block.appendRun(createField(\"0xbaadf00d\", \"non-existent\"));\r\n block.appendRun(createField(source, \"valid\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectNumRelationships(1, targetId);\r\n });\r\n });\r\n\r\n function expectText(expected: string, elemId: Id64String, db?: StandaloneDb): void {\r\n db = db ?? imodel;\r\n const elem = db.elements.getElement<TextAnnotation3d>(elemId);\r\n const anno = elem.getAnnotation()!;\r\n const actual = anno.textBlock.stringify();\r\n expect(actual).to.equal(expected);\r\n }\r\n\r\n it(\"evaluates cachedContent when annotation element is inserted\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"initial cached content\"));\r\n expect(block.stringify()).to.equal(\"initial cached content\");\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()!.textBlock.stringify()).to.equal(\"100\");\r\n });\r\n\r\n it(\"updates fields when source element is modified or deleted\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"old value\"));;\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()).not.to.be.undefined;\r\n\r\n expectText(\"100\", targetId);\r\n\r\n let source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.intProp = 50;\r\n source.update();\r\n\r\n expectText(\"100\", targetId);\r\n\r\n imodel.saveChanges();\r\n\r\n source = imodel.elements.getElement<TestElement>(sourceId);\r\n expect(source.intProp).to.equal(50);\r\n\r\n expectText(\"50\", targetId);\r\n\r\n imodel.elements.deleteElement(sourceId);\r\n expectText(\"50\", targetId);\r\n\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n });\r\n\r\n it(\"updates fields when source element aspect is modified, deleted, or recreated\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField({ elementId: sourceId, schemaName: \"Fields\", className: \"TestAspect\" }, \"\", \"aspectProp\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"999\", targetId);\r\n\r\n const aspects = imodel.elements.getAspects(sourceId, \"Fields:TestAspect\");\r\n expect(aspects.length).to.equal(1);\r\n const aspect = aspects[0] as TestAspect;\r\n expect(aspect.aspectProp).to.equal(999);\r\n\r\n aspect.aspectProp = 12345;\r\n imodel.elements.updateAspect(aspect.toJSON());\r\n imodel.saveChanges();\r\n expectText(\"12345\", targetId);\r\n\r\n imodel.elements.deleteAspect([aspect.id]);\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n\r\n const newAspect: TestAspectProps = {\r\n element: new ElementOwnsUniqueAspect(sourceId),\r\n classFullName: TestAspect.classFullName,\r\n aspectProp: 42,\r\n };\r\n imodel.elements.insertAspect(newAspect);\r\n imodel.saveChanges();\r\n expectText(\"42\", targetId);\r\n });\r\n\r\n it(\"updates only fields for specific modified element\", () => {\r\n const sourceA = insertTestElement();\r\n const sourceB = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceA, \"A\"));\r\n block.appendRun(createField(sourceB, \"B\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"100100\", targetId);\r\n\r\n const sourceElem = imodel.elements.getElement<TestElement>(sourceB);\r\n sourceElem.intProp = 123;\r\n sourceElem.update();\r\n imodel.saveChanges();\r\n\r\n expectText(\"100123\", targetId);\r\n });\r\n\r\n it(\"supports complex property paths\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField(sourceId, \"\", \"outerStruct\", [\"innerStructs\", 1, \"doubles\", -2]));\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n expectText(\"2\", targetId);\r\n\r\n const source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.outerStruct.innerStructs[1].doubles[3] = 12.5;\r\n source.update();\r\n imodel.saveChanges();\r\n expectText(\"12.5\", targetId);\r\n });\r\n\r\n it(\"updates EC view fields when the element changes if the EC view queries the element directly\", () => {\r\n const sourceId = insertTestElement();\r\n const block = TextBlock.create();\r\n block.appendRun(createField({\r\n elementId: sourceId, schemaName: \"Fields\", className: \"TestElementStringProp\",\r\n }, \"cached-content\", \"StringProp\"));\r\n\r\n const targetId = insertAnnotationElement(block);\r\n imodel.saveChanges();\r\n\r\n const target = imodel.elements.getElement<TextAnnotation3d>(targetId);\r\n expect(target.getAnnotation()).not.to.be.undefined;\r\n\r\n expectText(\"abc\", targetId);\r\n\r\n let source = imodel.elements.getElement<TestElement>(sourceId);\r\n source.jsonProperties.stringProp = \"zyx\";\r\n source.update();\r\n\r\n expectText(\"abc\", targetId);\r\n\r\n imodel.saveChanges();\r\n expectText(\"zyx\", targetId);\r\n\r\n source = imodel.elements.getElement<TestElement>(sourceId);\r\n expect(source.jsonProperties.stringProp).to.equal(\"zyx\");\r\n\r\n expectText(\"zyx\", targetId);\r\n\r\n imodel.elements.deleteElement(sourceId);\r\n expectText(\"zyx\", targetId);\r\n\r\n imodel.saveChanges();\r\n expectText(FieldRun.invalidContentIndicator, targetId);\r\n });\r\n\r\n describe(\"remapFields\", () => {\r\n let dstIModel: StandaloneDb;\r\n let dstModel: Id64String;\r\n let dstCategory: Id64String;\r\n let dstSourceElementId: Id64String;\r\n\r\n before(async () => {\r\n const path = IModelTestUtils.prepareOutputFile(\"RemapFields\", `dst.bim`);\r\n dstIModel = StandaloneDb.createEmpty(path, { rootSubject: { name: `RemapFields-dst` }, enableTransactions: true });\r\n await registerTestSchema(dstIModel);\r\n\r\n // Insert additional unused elements to ensure element Ids differ between src and dst iModels\r\n for (let i = 0; i < 3; i++) {\r\n IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\r\n }\r\n\r\n const modelAndElement = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(dstIModel, Code.createEmpty(), true);\r\n expect(modelAndElement[0]).to.equal(modelAndElement[1]);\r\n\r\n dstModel = modelAndElement[1];\r\n dstCategory = SpatialCategory.insert(dstIModel, StandaloneDb.dictionaryId, `dstCat`, new SubCategoryAppearance());\r\n dstSourceElementId = createTestElement(dstIModel, dstModel, dstCategory, {\r\n intProp: 200,\r\n point: { x: -1, y: -2, z: -3 },\r\n strings: [\"x\", \"y\", \"z\"],\r\n intEnum: 2,\r\n }, 1234);\r\n\r\n await dstIModel.fonts.embedFontFile({\r\n file: FontFile.createFromTrueTypeFileName(IModelTestUtils.resolveFontFile(\"Karla-Regular.ttf\"))\r\n });\r\n\r\n expect(dstCategory).not.to.equal(category);\r\n expect(dstModel).not.to.equal(model);\r\n expect(dstSourceElementId).not.to.equal(sourceElementId);\r\n });\r\n\r\n after(() => {\r\n dstIModel.close();\r\n });\r\n\r\n function getTextBlockJson(): TextBlockProps {\r\n return {\r\n children: [{\r\n children: [{\r\n type: \"field\",\r\n propertyHost: {\r\n elementId: sourceElementId,\r\n schemaName: \"Fields\",\r\n className: \"TestElement\",\r\n },\r\n propertyPath: { propertyName: \"intProp\" },\r\n cachedContent: \"intProp\",\r\n }, {\r\n type: \"field\",\r\n propertyHost: {\r\n elementId: category,\r\n schemaName: \"BisCore\",\r\n className: \"Element\",\r\n },\r\n propertyPath: { propertyName: \"CodeValue\" },\r\n cachedContent: \"CodeValue\"\r\n }],\r\n }],\r\n };\r\n }\r\n\r\n function expectHostIds(elem: TextAnnotation3d, host1: Id64String, host2: Id64String): void {\r\n const anno = elem.getAnnotation()!;\r\n expect(anno.textBlock.children.length).to.equal(1);\r\n const para = anno.textBlock.children[0];\r\n expect(para.children.length).to.equal(2);\r\n expect(para.children.every((x) => x.type === \"field\"));\r\n const field1 = para.children[0] as FieldRun;\r\n expect(field1.propertyHost.elementId).to.equal(host1);\r\n const field2 = para.children[1] as FieldRun;\r\n expect(field2.propertyHost.elementId).to.equal(host2);\r\n }\r\n\r\n it(\"remaps field hosts\", () => {\r\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\r\n expectHostIds(elem, sourceElementId, category);\r\n\r\n const context = new IModelElementCloneContext(imodel, dstIModel);\r\n context.remapElement(sourceElementId, dstSourceElementId);\r\n context.remapElement(category, dstCategory);\r\n\r\n ElementDrivesTextAnnotation.remapFields(elem, context);\r\n expectHostIds(elem, dstSourceElementId, dstCategory);\r\n });\r\n\r\n it(\"invalidates field host if source element not remapped\", () => {\r\n const elem = createAnnotationElement(TextBlock.create(getTextBlockJson()));\r\n expectHostIds(elem, sourceElementId, category);\r\n\r\n const context = new IModelElementCloneContext(imodel, dstIModel);\r\n\r\n ElementDrivesTextAnnotation.remapFields(elem, context);\r\n expectHostIds(elem, Id64.invalid, Id64.invalid);\r\n });\r\n });\r\n });\r\n\r\n describe(\"Format Validation\", () => {\r\n it(\"validates formatting options for string property type\", () => {\r\n // Create a FieldRun with string property type and some format options\r\n const fieldRun = FieldRun.create({\r\n propertyHost: { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" },\r\n propertyPath: { propertyName: \"strings\", accessors: [0] },\r\n cachedContent: \"oldValue\",\r\n formatOptions: {\r\n case: \"upper\",\r\n prefix: \"Value: \",\r\n suffix: \"!\"\r\n }\r\n });\r\n\r\n // Context returns a string value for the property\r\n const context = {\r\n hostElementId: sourceElementId,\r\n getProperty: () => { return { value: \"abc\", type: \"string\" as const } },\r\n };\r\n\r\n // Update the field and check the result\r\n const updated = updateField(fieldRun, context);\r\n\r\n // The formatted value should be uppercased and have prefix/suffix applied\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(\"Value: ABC!\");\r\n });\r\n\r\n it(\"validates formatting options for datetime objects\", function () {\r\n if (!isIntlSupported()) {\r\n this.skip();\r\n }\r\n\r\n const propertyHost = { elementId: sourceElementId, schemaName: \"Fields\", className: \"TestElement\" };\r\n const fieldRun = FieldRun.create({\r\n propertyHost,\r\n propertyPath: { propertyName: \"datetime\" },\r\n cachedContent: \"oldval\",\r\n formatOptions: {\r\n dateTime: {\r\n formatOptions: {\r\n month: \"short\",\r\n day: \"2-digit\",\r\n year: \"numeric\",\r\n timeZone: \"UTC\"\r\n },\r\n locale: \"en-US\",\r\n },\r\n },\r\n });\r\n\r\n const context = createUpdateContext(sourceElementId, imodel, false);\r\n const updated = updateField(fieldRun, context);\r\n\r\n expect(updated).to.be.true;\r\n expect(fieldRun.cachedContent).to.equal(\"Aug 28, 2025\");\r\n });\r\n });\r\n});\r\n"]}
@@ -29,7 +29,7 @@ export default {
29
29
  "schemaItemType": "Phenomenon",
30
30
  "label": "Test",
31
31
  "description": "Phenomenon Test",
32
- "definition": "TEST"
32
+ "definition": "u:NUMBER"
33
33
  }
34
34
  },
35
35
  {
@@ -93,7 +93,7 @@ export default {
93
93
  "description": "Unit Test1",
94
94
  "phenomenon": "SimpleSchema.Phenomenon_Test",
95
95
  "unitSystem": "SimpleSchema.UnitSystem_Test",
96
- "definition": "TEST1",
96
+ "definition": "u:ONE",
97
97
  "numerator": 10.0
98
98
  }
99
99
  },
@@ -105,7 +105,7 @@ export default {
105
105
  "description": "Unit Test2",
106
106
  "phenomenon": "Units.TEMPERATURE",
107
107
  "unitSystem": "Units.USCUSTOM",
108
- "definition": "TEST2",
108
+ "definition": "u:ONE",
109
109
  "numerator": 5.0,
110
110
  "denominator": 3.0,
111
111
  "offset": 0.01325
@@ -138,7 +138,7 @@ export default {
138
138
  "label": "Test1",
139
139
  "description": "Constant Test1",
140
140
  "phenomenon": "SimpleSchema.Phenomenon_Test",
141
- "definition": "TEST1",
141
+ "definition": "Unit_Test1",
142
142
  "numerator": 1.0e3
143
143
  }
144
144
  },
@@ -149,7 +149,7 @@ export default {
149
149
  "label": "Test2",
150
150
  "description": "Constant Test2",
151
151
  "phenomenon": "Units.ANGLE",
152
- "definition": "TEST2",
152
+ "definition": "Unit_Test2",
153
153
  "numerator": 180.0,
154
154
  "denominator": 0.5
155
155
  }