@itwin/core-backend 5.5.0-dev.1 → 5.5.0-dev.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +0 -2
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +15 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +17 -15
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +2 -1
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +7 -2
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +0 -2
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +15 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +17 -15
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +2 -1
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +7 -2
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +2 -2
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js +5 -5
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +43 -0
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +43 -0
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +31 -2
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js +432 -198
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js +272 -190
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.d.ts +27 -0
- package/lib/esm/test/incrementalSchemaLocater/TestContext.d.ts.map +1 -0
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js +136 -0
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -0
- package/lib/esm/test/standalone/ChangesetReader.test.js +222 -3
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/StandaloneDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/StandaloneDb.test.js +103 -0
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -0
- package/lib/esm/test/standalone/TxnManager.test.js +43 -0
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +13 -13
- package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.d.ts +0 -11
- package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.d.ts.map +0 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js +0 -36
- package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js.map +0 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.d.ts +0 -20
- package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.d.ts.map +0 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js +0 -126
- package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js.map +0 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts +0 -24
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts.map +0 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js +0 -67
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModel.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModel.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert, expect } from \"chai\";\r\nimport * as path from \"path\";\r\nimport * as semver from \"semver\";\r\nimport * as sinon from \"sinon\";\r\nimport { DbResult, Guid, GuidString, Id64, Id64String, IModelStatus, Logger, OpenMode, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport {\r\n AxisAlignedBox3d, BisCodeSpec, BriefcaseIdValue, ChangesetIdWithIndex, Code, CodeScopeSpec, CodeSpec, ColorByName, ColorDef, DefinitionElementProps,\r\n DisplayStyleProps, DisplayStyleSettings, DisplayStyleSettingsProps, EcefLocation, ElementProps, EntityProps, FilePropertyProps,\r\n FontMap, FontType, GeoCoordinatesRequestProps, GeoCoordStatus, GeographicCRS, GeographicCRSProps, GeometricElementProps, GeometryParams, GeometryStreamBuilder,\r\n ImageSourceFormat, IModel, IModelCoordinatesRequestProps, IModelError, LightLocationProps, MapImageryProps, PhysicalElementProps,\r\n PointWithStatus, QueryBinder, RelatedElement, RelationshipProps, RenderMode, SchemaState, SpatialViewDefinitionProps, SubCategoryAppearance, SubjectProps, TextureMapping,\r\n TextureMapProps, TextureMapUnits, TypeDefinitionElementProps, ViewDefinitionProps, ViewFlagProps, ViewFlags,\r\n} from \"@itwin/core-common\";\r\nimport {\r\n Geometry, GeometryQuery, LineString3d, Loop, Matrix4d, Point3d, PolyfaceBuilder, Range3d, StrokeOptions, Transform, XYZProps, YawPitchRollAngles,\r\n} from \"@itwin/core-geometry\";\r\nimport { V2CheckpointAccessProps } from \"../../BackendHubAccess\";\r\nimport { V2CheckpointManager } from \"../../CheckpointManager\";\r\nimport {\r\n _nativeDb, BisCoreSchema, Category, ClassRegistry, DefinitionContainer, DefinitionGroup, DefinitionGroupGroupsDefinitions,\r\n DefinitionModel, DefinitionPartition, DictionaryModel, DisplayStyle3d, DisplayStyleCreationOptions, DocumentPartition, DrawingGraphic, ECSqlStatement,\r\n Element, ElementDrivesElement, ElementGroupsMembers, ElementGroupsMembersProps, ElementOwnsChildElements, Entity, GenericGraphicalType2d, GeometricElement2d, GeometricElement3d,\r\n GeometricModel, GroupInformationPartition, IModelDb, IModelHost, IModelJsFs, InformationPartitionElement, InformationRecordElement, LightLocation,\r\n LinkPartition, Model, PhysicalElement, PhysicalModel, PhysicalObject, PhysicalPartition, RenderMaterialElement, RenderMaterialElementParams, SnapshotDb, SpatialCategory,\r\n SqliteStatement, SqliteValue, SqliteValueType, StandaloneDb, SubCategory, Subject, Texture, ViewDefinition,\r\n} from \"../../core-backend\";\r\nimport { BriefcaseDb, SnapshotDbOpenArgs } from \"../../IModelDb\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { DisableNativeAssertions } from \"../TestUtils\";\r\nimport { samplePngTexture } from \"../imageData\";\r\nimport { performance } from \"perf_hooks\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\nimport { CustomAttributeClass, ECVersion, EntityClass, PrimitiveArrayProperty, PrimitiveOrEnumPropertyBase, PropertyType, propertyTypeToString, SchemaItemType } from \"@itwin/ecschema-metadata\";\r\n// spell-checker: disable\r\n\r\nasync function getIModelError<T>(promise: Promise<T>): Promise<IModelError | undefined> {\r\n try {\r\n await promise;\r\n return undefined;\r\n } catch (err) {\r\n return err instanceof IModelError ? err : undefined;\r\n }\r\n}\r\n\r\nfunction expectIModelError(expectedErrorNumber: IModelStatus | DbResult, error: IModelError | undefined): void {\r\n expect(error).not.to.be.undefined;\r\n expect(error).instanceof(IModelError);\r\n expect(error!.errorNumber).to.equal(expectedErrorNumber);\r\n}\r\n\r\nasync function generateTestSnapshot(targetFileName: string, seedAssetName: string): Promise<SnapshotDb> {\r\n const seedFile = IModelTestUtils.resolveAssetFile(seedAssetName);\r\n const snapshotFile = IModelTestUtils.prepareOutputFile(\"IModel\", targetFileName);\r\n const imodel = IModelTestUtils.createSnapshotFromSeed(snapshotFile, seedFile);\r\n const schemaPathname = path.join(KnownTestLocations.assetsDir, \"TestBim.ecschema.xml\");\r\n await imodel.importSchemas([schemaPathname]); // will throw an exception if import fails\r\n imodel.saveChanges();\r\n return imodel;\r\n}\r\n\r\ndescribe(\"iModel\", () => {\r\n //TODO: These imodels are used and modified across multiple tests. This is not a good practice and should be refactored.\r\n let imodel1: SnapshotDb;\r\n let imodel2: SnapshotDb;\r\n let imodel3: SnapshotDb;\r\n let imodel4: SnapshotDb;\r\n let imodel5: SnapshotDb;\r\n let originalEnv: any;\r\n\r\n before(async () => {\r\n originalEnv = { ...process.env };\r\n\r\n IModelTestUtils.registerTestBimSchema();\r\n imodel1 = await generateTestSnapshot(\"test.bim\", \"test.bim\");\r\n imodel2 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile(\"IModel\", \"CompatibilityTestSeed.bim\"), IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\"));\r\n imodel3 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\"));\r\n imodel4 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile(\"IModel\", \"GetSetAutoHandledArrayProperties.bim\"), IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledArrayProperties.bim\"));\r\n imodel5 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile(\"IModel\", \"mirukuru.ibim\"), IModelTestUtils.resolveAssetFile(\"mirukuru.ibim\"));\r\n });\r\n\r\n after(() => {\r\n process.env = originalEnv;\r\n imodel1.close();\r\n imodel2.close();\r\n imodel3.close();\r\n imodel4.close();\r\n imodel5.close();\r\n });\r\n\r\n afterEach(() => {\r\n sinon.restore();\r\n });\r\n\r\n /** Roundtrip the entity through a json string and back to a new entity. */\r\n const roundtripThroughJson = (entity1: Entity): Entity => {\r\n const string1 = JSON.stringify(entity1);\r\n const props1 = JSON.parse(string1) as EntityProps;\r\n const entity2 = new (entity1.constructor as any)(props1, entity1.iModel); // create a new entity from the EntityProps\r\n const string2 = JSON.stringify(entity2);\r\n assert.equal(string1, string2);\r\n return entity2;\r\n };\r\n\r\n it(\"should be able to get properties of an iIModel\", () => {\r\n expect(imodel1.name).equals(\"TBD\"); // That's the name of the root subject!\r\n const extents: AxisAlignedBox3d = imodel1.projectExtents;\r\n assert(!extents.isNull);\r\n\r\n // make sure we can construct a new element even if we haven't loaded its metadata (will be loaded in ctor)\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.isUndefined(imodel1.classMetaDataRegistry.find(\"biscore:lightlocation\"));\r\n const e1 = imodel1.constructEntity<LightLocation, LightLocationProps>({ category: \"0x11\", classFullName: \"BisCore:LightLocation\", model: \"0x01\", code: Code.createEmpty() });\r\n assert.isDefined(e1);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.isDefined(imodel1.classMetaDataRegistry.find(\"biscore:lightlocation\")); // should have been loaded in ctor\r\n });\r\n\r\n it(\"should use schema to look up classes by name\", () => {\r\n const elementClass = ClassRegistry.findRegisteredClass(Element.classFullName);\r\n const categoryClass = ClassRegistry.findRegisteredClass(Category.classFullName);\r\n assert.isDefined(elementClass);\r\n assert.isDefined(categoryClass);\r\n assert.equal(elementClass!.schema, BisCoreSchema);\r\n assert.equal(categoryClass!.schema, BisCoreSchema);\r\n assert.equal(elementClass!.className, \"Element\");\r\n assert.equal(categoryClass!.className, \"Category\");\r\n });\r\n\r\n it(\"Fonts\", () => {\r\n const dbFonts = imodel1.fonts;\r\n expect(Array.from(dbFonts.queryMappedFamilies({ includeNonEmbedded: true })).length).to.equal(4);\r\n expect(dbFonts.findDescriptor(1)).to.deep.equal({ name: \"Arial\", type: FontType.TrueType });\r\n expect(dbFonts.findId({ name: \"Arial\" })).to.equal(1);\r\n expect(dbFonts.findId({ name: \"arial\" })).to.equal(1);\r\n\r\n expect(dbFonts.findDescriptor(2)).to.deep.equal({ name: \"Font0\", type: FontType.Rsc });\r\n expect(dbFonts.findId({ name: \"Font0\" })).to.equal(2);\r\n expect(dbFonts.findId({ name: \"fOnt0\" })).to.equal(2);\r\n\r\n expect(dbFonts.findDescriptor(3)).to.deep.equal({ name: \"ShxFont0\", type: FontType.Shx });\r\n expect(dbFonts.findId({ name: \"ShxFont0\" })).to.equal(3);\r\n expect(dbFonts.findId({ name: \"shxfont0\" })).to.equal(3);\r\n\r\n expect(dbFonts.findDescriptor(4)).to.deep.equal({ name: \"Calibri\", type: FontType.TrueType });\r\n expect(dbFonts.findId({ name: \"Calibri\" })).to.equal(4);\r\n expect(dbFonts.findId({ name: \"cAlIbRi\" })).to.equal(4);\r\n\r\n expect(dbFonts.findId({ name: \"notfound\" })).to.be.undefined;\r\n\r\n const fonts1 = imodel1.fontMap; // eslint-disable-line @typescript-eslint/no-deprecated\r\n assert.equal(fonts1.fonts.size, 4, \"font map size should be 4\");\r\n assert.equal(FontType.TrueType, fonts1.getFont(1)!.type, \"get font 1 type is TrueType\");\r\n assert.equal(\"Arial\", fonts1.getFont(1)!.name, \"get Font 1 name\");\r\n assert.equal(1, fonts1.getFont(\"Arial\")!.id, \"get Font 1, by name\");\r\n assert.equal(1, fonts1.getFont(\"arial\")!.id, \"get Font 1, by name case insensitive\");\r\n\r\n assert.equal(FontType.Rsc, fonts1.getFont(2)!.type, \"get font 2 type is Rsc\");\r\n assert.equal(\"Font0\", fonts1.getFont(2)!.name, \"get Font 2 name\");\r\n assert.equal(2, fonts1.getFont(\"Font0\")!.id, \"get Font 2, by name\");\r\n assert.equal(2, fonts1.getFont(\"fOnt0\")!.id, \"get Font 2, by name case insensitive\");\r\n\r\n assert.equal(FontType.Shx, fonts1.getFont(3)!.type, \"get font 1 type is Shx\");\r\n assert.equal(\"ShxFont0\", fonts1.getFont(3)!.name, \"get Font 3 name\");\r\n assert.equal(3, fonts1.getFont(\"ShxFont0\")!.id, \"get Font 3, by name\");\r\n assert.equal(3, fonts1.getFont(\"shxfont0\")!.id, \"get Font 3, by name case insensitive\");\r\n\r\n assert.equal(FontType.TrueType, fonts1.getFont(4)!.type, \"get font 4 type is TrueType\");\r\n assert.equal(\"Calibri\", fonts1.getFont(4)!.name, \"get Font 4 name\");\r\n assert.equal(4, fonts1.getFont(\"Calibri\")!.id, \"get Font 4, by name\");\r\n assert.equal(4, fonts1.getFont(\"cAlIbRi\")!.id, \"get Font 4, by name case insensitive\");\r\n\r\n assert.isUndefined(fonts1.getFont(\"notfound\"), \"attempt lookup of a font that should not be found\");\r\n\r\n assert.deepEqual(new FontMap(fonts1.toJSON()), fonts1, \"toJSON on FontMap\"); // eslint-disable-line @typescript-eslint/no-deprecated\r\n });\r\n\r\n it(\"should load a known element by Id from an existing iModel\", () => {\r\n assert.exists(imodel1.elements);\r\n const code1 = new Code({ spec: \"0x10\", scope: \"0x11\", value: \"RF1.dgn\" });\r\n const el = imodel1.elements.getElement(code1);\r\n assert.exists(el);\r\n const el2ById = imodel1.elements.getElement(\"0x34\");\r\n assert.exists(el2ById);\r\n const badCode = new Code({ spec: \"0x10\", scope: \"0x11\", value: \"RF1_does_not_exist.dgn\" });\r\n\r\n try {\r\n imodel1.elements.getElement(badCode); // throws Error\r\n assert.fail(); // this line should be skipped\r\n } catch (error: any) {\r\n assert.instanceOf(error, Error);\r\n assert.instanceOf(error, IModelError);\r\n assert.equal(error.errorNumber, IModelStatus.NotFound);\r\n }\r\n\r\n const element1 = imodel1.elements.tryGetElement(code1);\r\n const element2 = imodel1.elements.tryGetElement(\"0x34\");\r\n const element3 = imodel1.elements.tryGetElement(badCode);\r\n assert.isDefined(element1);\r\n assert.isDefined(element2);\r\n assert.isUndefined(element3);\r\n const elementProps1 = imodel1.elements.tryGetElementProps(code1);\r\n const elementProps2 = imodel1.elements.tryGetElementProps(\"0x34\");\r\n const elementProps3 = imodel1.elements.tryGetElementProps(badCode);\r\n assert.isDefined(elementProps1);\r\n assert.isDefined(elementProps2);\r\n assert.isUndefined(elementProps3);\r\n\r\n const model1 = imodel1.models.tryGetModel(IModel.dictionaryId);\r\n const modelProps1 = imodel1.models.tryGetModelProps(IModel.dictionaryId);\r\n const subModel1 = imodel1.models.tryGetSubModel(IModel.dictionaryId);\r\n assert.isDefined(model1);\r\n assert.isDefined(modelProps1);\r\n assert.isDefined(subModel1);\r\n const badModel1 = imodel1.models.tryGetModel(Id64.fromUint32Pair(999, 999));\r\n const badModelProps1 = imodel1.models.tryGetModelProps(Id64.fromUint32Pair(999, 999));\r\n const badSubModel1 = imodel1.models.tryGetSubModel(IModel.rootSubjectId);\r\n const badSubModel2 = imodel1.models.tryGetSubModel(badCode);\r\n assert.isUndefined(badModel1);\r\n assert.isUndefined(badModelProps1);\r\n assert.isUndefined(badSubModel1);\r\n assert.isUndefined(badSubModel2);\r\n\r\n const subCat = imodel1.elements.getElement(\"0x2e\");\r\n assert.isTrue(subCat instanceof SubCategory);\r\n if (subCat instanceof SubCategory) {\r\n assert.isTrue(subCat.appearance.color.tbgr === 16777215);\r\n assert.isTrue(subCat.appearance.weight === 2);\r\n assert.equal(Id64.getLocalId(subCat.id), 46);\r\n assert.equal(Id64.getBriefcaseId(subCat.id), 0);\r\n assert.equal(Id64.getLocalId(subCat.code.spec), 30);\r\n assert.equal(Id64.getBriefcaseId(subCat.code.spec), 0);\r\n assert.isTrue(subCat.code.scope === \"0x2d\");\r\n assert.isTrue(subCat.code.value === \"A-Z013-G-Legn\");\r\n roundtripThroughJson(subCat);\r\n }\r\n\r\n /// Get the parent Category of the subcategory.\r\n const cat = imodel1.elements.getElement((subCat as SubCategory).getCategoryId());\r\n assert.isTrue(cat instanceof Category);\r\n if (cat instanceof Category) {\r\n assert.equal(Id64.getLocalId(cat.id), 45);\r\n assert.equal(Id64.getBriefcaseId(cat.id), 0);\r\n assert.isTrue(cat.description === \"Legends, symbols keys\");\r\n assert.equal(Id64.getLocalId(cat.code.spec), 22);\r\n assert.equal(Id64.getBriefcaseId(cat.code.spec), 0);\r\n assert.isTrue(cat.code.value === \"A-Z013-G-Legn\");\r\n roundtripThroughJson(cat);\r\n }\r\n\r\n const phys = imodel1.elements.getElement(\"0x38\");\r\n assert.isTrue(phys instanceof GeometricElement3d);\r\n\r\n const locateMsg = phys.getToolTipMessage();\r\n assert.isDefined(locateMsg);\r\n\r\n const a2 = imodel2.elements.getElement(\"0x1d\");\r\n assert.exists(a2);\r\n expect(a2.federationGuid).equal(\"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n const el3 = imodel2.elements.getElement(a2.federationGuid!);\r\n assert.exists(el3);\r\n assert.notEqual(a2, el3);\r\n assert.equal(a2.id, el3.id);\r\n roundtripThroughJson(el3);\r\n\r\n const newEl = el3.toJSON();\r\n newEl.federationGuid = undefined;\r\n newEl.code = { scope: \"bad scope\", spec: \"0x10\", value: \"new code\" };\r\n expect(() => imodel2.elements.insertElement(newEl)).throws(\"invalid code scope\").to.have.property(\"metadata\");\r\n newEl.code.scope = \"0x34322\"; // valid id, but element doesn't exist\r\n expect(() => imodel2.elements.insertElement(newEl)).throws(\"invalid code scope\").to.have.property(\"metadata\");\r\n\r\n newEl.code.scope = el3.federationGuid!;\r\n const newId = imodel2.elements.insertElement(newEl); // code scope from FederationGuid should get converted to ElementId\r\n const a4 = imodel2.elements.getElementProps(newId);\r\n expect(a4.code.scope).equal(el3.id);\r\n\r\n a4.code.scope = \"0x13343\";\r\n expect(() => imodel2.elements.updateElement(a4)).throws(\"invalid code scope\").to.have.property(\"metadata\");\r\n\r\n a4.code.scope = \"0x1\";\r\n imodel2.elements.updateElement(a4); // should change the code scope to new element\r\n let a5 = imodel2.elements.getElementProps(newId);\r\n expect(a5.code.scope).equal(\"0x1\");\r\n\r\n // only pass minimum, but expect model and classFullName to be added.\r\n const newProps = { id: a4.id, code: a4.code, classFullName: undefined, model: undefined };\r\n newProps.code.scope = el3.federationGuid!; // should convert FederationGuid to ElementId\r\n imodel2.elements.updateElement(newProps);\r\n expect(newProps.classFullName).eq(a4.classFullName);\r\n expect(newProps.model).eq(a4.model);\r\n\r\n a5 = imodel2.elements.getElementProps(newId);\r\n expect(a5.code.scope).equal(el3.id);\r\n });\r\n\r\n it(\"should optionally detect class mismatches\", () => {\r\n // tryGetElement\r\n const subjectUnvalidated = imodel1.elements.tryGetElement<Subject>(IModel.rootSubjectId);\r\n assert.isDefined(subjectUnvalidated);\r\n const subjectValidated = imodel1.elements.tryGetElement<Subject>(IModel.rootSubjectId, Subject);\r\n assert.isDefined(subjectValidated);\r\n const physicalElementUnvalidated = imodel1.elements.tryGetElement<PhysicalElement>(IModel.rootSubjectId);\r\n assert.isDefined(physicalElementUnvalidated); // wrong type, but class to validate was not passed\r\n const physicalElementValidated = imodel1.elements.tryGetElement<PhysicalElement>(IModel.rootSubjectId, PhysicalElement); // abstract class\r\n assert.isUndefined(physicalElementValidated); // wrong type\r\n const physicalObjectUnvalidated = imodel1.elements.tryGetElement<PhysicalObject>(IModel.rootSubjectId);\r\n assert.isDefined(physicalObjectUnvalidated); // wrong type, but class to validate was not passed\r\n const physicalObjectValidated = imodel1.elements.tryGetElement<PhysicalObject>(IModel.rootSubjectId, PhysicalObject); // concrete class\r\n assert.isUndefined(physicalObjectValidated); // wrong type\r\n // tryGetModel\r\n const dictionaryUnvalidated = imodel1.models.tryGetModel<DictionaryModel>(IModel.dictionaryId);\r\n assert.isDefined(dictionaryUnvalidated);\r\n const dictionaryValidated = imodel1.models.tryGetModel<DictionaryModel>(IModel.dictionaryId, DictionaryModel);\r\n assert.isDefined(dictionaryValidated);\r\n const geometricModelUnvalidated = imodel1.models.tryGetModel<GeometricModel>(IModel.dictionaryId);\r\n assert.isDefined(geometricModelUnvalidated); // wrong type, but class to validate was not passed\r\n const geometricModelValidated = imodel1.models.tryGetModel<GeometricModel>(IModel.dictionaryId, GeometricModel); // abstract class\r\n assert.isUndefined(geometricModelValidated); // wrong type\r\n const physicalModelUnvalidated = imodel1.models.tryGetModel<PhysicalModel>(IModel.dictionaryId);\r\n assert.isDefined(physicalModelUnvalidated); // wrong type, but class to validate was not passed\r\n const physicalModelValidated = imodel1.models.tryGetModel<PhysicalModel>(IModel.dictionaryId, PhysicalModel); // concrete class\r\n assert.isUndefined(physicalModelValidated); // wrong type\r\n // tryGetSubModel\r\n const dictionarySubUnvalidated = imodel1.models.tryGetSubModel<DictionaryModel>(IModel.dictionaryId);\r\n assert.isDefined(dictionarySubUnvalidated);\r\n const dictionarySubValidated = imodel1.models.tryGetSubModel<DictionaryModel>(IModel.dictionaryId, DictionaryModel);\r\n assert.isDefined(dictionarySubValidated);\r\n const geometricSubModelUnvalidated = imodel1.models.tryGetSubModel<GeometricModel>(IModel.dictionaryId);\r\n assert.isDefined(geometricSubModelUnvalidated); // wrong type, but class to validate was not passed\r\n const geometricSubModelValidated = imodel1.models.tryGetSubModel<GeometricModel>(IModel.dictionaryId, GeometricModel); // abstract class\r\n assert.isUndefined(geometricSubModelValidated); // wrong type\r\n const physicalSubModelUnvalidated = imodel1.models.tryGetSubModel<PhysicalModel>(IModel.dictionaryId);\r\n assert.isDefined(physicalSubModelUnvalidated); // wrong type, but class to validate was not passed\r\n const physicalSubModelValidated = imodel1.models.tryGetSubModel<PhysicalModel>(IModel.dictionaryId, PhysicalModel); // concrete class\r\n assert.isUndefined(physicalSubModelValidated); // wrong type\r\n });\r\n\r\n it(\"should create elements\", () => {\r\n const seedElement = imodel2.elements.getElement<GeometricElement3d>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n for (let i = 0; i < 25; i++) {\r\n const elementProps: GeometricElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: seedElement.model,\r\n category: seedElement.category,\r\n code: Code.createEmpty(),\r\n federationGuid: Guid.createValue(),\r\n userLabel: `UserLabel-${i}`,\r\n };\r\n\r\n const element: Element = imodel2.elements.createElement(elementProps);\r\n element.setUserProperties(\"performanceTest\", { s: `String-${i}`, n: i });\r\n\r\n const elementId = imodel2.elements.insertElement(element.toJSON());\r\n assert.isTrue(Id64.isValidId64(elementId));\r\n }\r\n });\r\n\r\n it(\"should insert a RenderMaterial\", () => {\r\n const model = imodel2.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n expect(model).not.to.be.undefined;\r\n\r\n const testMaterialName = \"test material name\";\r\n const testPaletteName = \"test palette name\";\r\n const testDescription = \"test description\";\r\n const color = [0.3, 0.7, 0.8];\r\n const specularColor = [0.1, 1, 0];\r\n const finish = 0.4;\r\n const transmit = 0.1;\r\n const diffuse = 0.24;\r\n const specular = 0.9;\r\n const reflect = 0.3;\r\n const reflectColor = [1, 0, 0.5];\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n const textureMapProps: TextureMapProps = {\r\n pattern_angle: 3.0,\r\n pattern_u_flip: false,\r\n pattern_flip: false,\r\n pattern_scale: [1.0, 1.0],\r\n pattern_offset: [0.0, 0.0],\r\n pattern_scalemode: TextureMapUnits.Inches,\r\n pattern_mapping: TextureMapping.Mode.Planar,\r\n pattern_weight: 0.5,\r\n TextureId: \"test_textureid\",\r\n };\r\n\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n const renderMaterialParams: RenderMaterialElementParams = {\r\n paletteName: testPaletteName,\r\n description: testDescription,\r\n color,\r\n specularColor,\r\n finish,\r\n transmit,\r\n diffuse,\r\n specular,\r\n reflect,\r\n reflectColor,\r\n patternMap: textureMapProps,\r\n };\r\n\r\n const renderMaterialId = RenderMaterialElement.insert(imodel2, IModel.dictionaryId, testMaterialName, renderMaterialParams);\r\n\r\n const renderMaterial = imodel2.elements.getElement<RenderMaterialElement>(renderMaterialId);\r\n assert((renderMaterial instanceof RenderMaterialElement) === true, \"did not retrieve an instance of RenderMaterial\");\r\n expect(renderMaterial.paletteName).to.equal(testPaletteName);\r\n expect(renderMaterial.description).to.equal(testDescription);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasBaseColor).to.equal(true);\r\n expect(JSON.stringify(renderMaterial.jsonProperties.materialAssets.renderMaterial.color)).to.equal(JSON.stringify(color));\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasSpecularColor).to.equal(true);\r\n expect(JSON.stringify(renderMaterial.jsonProperties.materialAssets.renderMaterial.specular_color)).to.equal(JSON.stringify(specularColor));\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasFinish).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.finish).to.equal(finish);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasTransmit).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.transmit).to.equal(transmit);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasDiffuse).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.diffuse).to.equal(diffuse);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasSpecular).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.specular).to.equal(specular);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasReflect).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.reflect).to.equal(reflect);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasReflectColor).to.equal(true);\r\n expect(JSON.stringify(renderMaterial.jsonProperties.materialAssets.renderMaterial.reflect_color)).to.equal(JSON.stringify(reflectColor));\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.Map).not.to.be.undefined;\r\n\r\n const patternMap = renderMaterial.jsonProperties.materialAssets.renderMaterial.Map.Pattern;\r\n expect(patternMap).not.to.be.undefined;\r\n expect(patternMap.pattern_angle).to.equal(textureMapProps.pattern_angle);\r\n expect(patternMap.pattern_u_flip).to.equal(textureMapProps.pattern_u_flip);\r\n expect(patternMap.pattern_flip).to.equal(textureMapProps.pattern_flip);\r\n expect(JSON.stringify(patternMap.pattern_scale)).to.equal(JSON.stringify(textureMapProps.pattern_scale));\r\n expect(JSON.stringify(patternMap.pattern_offset)).to.equal(JSON.stringify(textureMapProps.pattern_offset));\r\n expect(patternMap.pattern_scalemode).to.equal(textureMapProps.pattern_scalemode);\r\n expect(patternMap.pattern_mapping).to.equal(textureMapProps.pattern_mapping);\r\n expect(patternMap.pattern_weight).to.equal(textureMapProps.pattern_weight);\r\n expect(patternMap.TextureId).to.equal(textureMapProps.TextureId);\r\n });\r\n\r\n it(\"attempt to apply material to new element in imodel5\", () => {\r\n const testTextureName = \"fake texture name\";\r\n const testTextureFormat = ImageSourceFormat.Png;\r\n const testTextureDescription = \"empty description\";\r\n\r\n const texId = Texture.insertTexture(imodel5, IModel.dictionaryId, testTextureName, testTextureFormat, samplePngTexture.base64, testTextureDescription);\r\n\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n const matId = RenderMaterialElement.insert(imodel5, IModel.dictionaryId, \"test material name\",\r\n {\r\n paletteName: \"TestPaletteName\",\r\n patternMap: {\r\n TextureId: texId,\r\n pattern_offset: [0, 0],\r\n pattern_scale: [1, 1],\r\n pattern_scalemode: TextureMapUnits.Relative,\r\n },\r\n });\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n\r\n /** Create a simple flat mesh with 4 points (2x2) */\r\n const width = imodel5.projectExtents.xLength() * 0.2;\r\n const height = imodel5.projectExtents.yLength() * 0.2;\r\n let shape: GeometryQuery;\r\n const doPolyface = true;\r\n if (doPolyface) {\r\n const options = StrokeOptions.createForFacets();\r\n options.shouldTriangulate = false;\r\n const builder = PolyfaceBuilder.create(options);\r\n\r\n const quad = [\r\n Point3d.create(0.0, 0.0, 0.0),\r\n Point3d.create(width, 0.0, 0.0),\r\n Point3d.create(width, height, 0.0),\r\n Point3d.create(0.0, height, 0.0),\r\n ];\r\n\r\n builder.addQuadFacet(quad);\r\n shape = builder.claimPolyface();\r\n } else {\r\n shape = Loop.create(LineString3d.create([\r\n Point3d.create(0, 0, 0),\r\n Point3d.create(width, 0, 0),\r\n Point3d.create(width, height, 0),\r\n Point3d.create(0, height, 0),\r\n Point3d.create(0, 0, 0),\r\n ]));\r\n }\r\n\r\n const modelId = PhysicalModel.insert(imodel5, IModelDb.rootSubjectId, \"test_render_material_model_name\");\r\n\r\n const categoryId = SpatialCategory.insert(imodel5, IModel.dictionaryId, \"GeoJSON Feature\", { color: ColorDef.white.toJSON() });\r\n\r\n /** generate a geometry stream containing the polyface */\r\n const gsBuilder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(categoryId);\r\n params.materialId = matId;\r\n gsBuilder.appendGeometryParamsChange(params);\r\n gsBuilder.appendGeometry(shape);\r\n const geometry = gsBuilder.geometryStream;\r\n // geometry[0].material = { materialId: matId };\r\n\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n placement: { origin: imodel5.projectExtents.center, angles: new YawPitchRollAngles() },\r\n model: modelId,\r\n code: Code.createEmpty(),\r\n category: categoryId,\r\n geom: geometry,\r\n };\r\n imodel5.elements.insertElement(props);\r\n imodel5.saveChanges();\r\n });\r\n\r\n it(\"should insert a DisplayStyle\", () => {\r\n const model = imodel2.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n expect(model).not.to.be.undefined;\r\n\r\n const settings: DisplayStyleSettingsProps = {\r\n backgroundColor: ColorDef.blue.toJSON(),\r\n viewflags: ViewFlags.fromJSON({\r\n renderMode: RenderMode.SolidFill,\r\n }),\r\n };\r\n\r\n const props: DisplayStyleProps = {\r\n classFullName: DisplayStyle3d.classFullName,\r\n model: IModel.dictionaryId,\r\n code: { spec: BisCodeSpec.displayStyle, scope: IModel.dictionaryId, value: \"test style\" },\r\n isPrivate: false,\r\n jsonProperties: {\r\n styles: settings,\r\n },\r\n };\r\n\r\n const styleId = imodel2.elements.insertElement(props);\r\n let style = imodel2.elements.getElement<DisplayStyle3d>(styleId);\r\n expect(style instanceof DisplayStyle3d).to.be.true;\r\n expect(style.code.spec).equal(imodel2.codeSpecs.getByName(BisCodeSpec.displayStyle).id);\r\n\r\n expect(style.settings.viewFlags.renderMode).to.equal(RenderMode.SolidFill);\r\n expect(style.settings.backgroundColor.equals(ColorDef.blue)).to.be.true;\r\n\r\n const newFlags = style.settings.viewFlags.copy({ renderMode: RenderMode.SmoothShade });\r\n style.settings.viewFlags = newFlags;\r\n style.settings.backgroundColor = ColorDef.red;\r\n style.settings.monochromeColor = ColorDef.green;\r\n expect(style.jsonProperties.styles.viewflags.renderMode).to.equal(RenderMode.SmoothShade);\r\n\r\n imodel2.elements.updateElement(style.toJSON());\r\n style = imodel2.elements.getElement<DisplayStyle3d>(styleId);\r\n expect(style instanceof DisplayStyle3d).to.be.true;\r\n\r\n expect(style.settings.viewFlags.renderMode).to.equal(RenderMode.SmoothShade);\r\n expect(style.settings.backgroundColor.equals(ColorDef.red)).to.be.true;\r\n expect(style.settings.monochromeColor.equals(ColorDef.green)).to.be.true;\r\n });\r\n\r\n it(\"should create display styles\", () => {\r\n const defaultViewFlags = new ViewFlags().toJSON();\r\n const defaultMapImagery = new DisplayStyleSettings({}).toJSON().mapImagery;\r\n\r\n const viewFlags = new ViewFlags({ patterns: false, visibleEdges: true });\r\n const viewflags: ViewFlagProps = { noWhiteOnWhiteReversal: true, shadows: true, noTransp: true };\r\n\r\n const mapImagery: MapImageryProps = {\r\n backgroundBase: ColorDef.red.tbgr,\r\n backgroundLayers: [{\r\n name: \"x\",\r\n url: \"y\",\r\n transparency: 0.5,\r\n formatId: \"WMS\",\r\n visible: true,\r\n }],\r\n };\r\n\r\n const props: DisplayStyleSettingsProps = {\r\n mapImagery,\r\n excludedElements: [\"0x123\", \"0xfed\"],\r\n timePoint: 42,\r\n backgroundColor: ColorDef.green.tbgr,\r\n };\r\n\r\n type TestCase = [DisplayStyleCreationOptions | undefined, ViewFlagProps, boolean];\r\n const testCases: TestCase[] = [\r\n [undefined, defaultViewFlags, false],\r\n [{ viewFlags }, viewFlags.toJSON(), false],\r\n [{ viewflags }, viewflags, false],\r\n [{ viewflags, viewFlags }, viewFlags.toJSON(), false],\r\n [props, defaultViewFlags, false],\r\n [{ ...props, viewflags }, viewflags, false],\r\n [{ backgroundColor: ColorDef.blue }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.from(1, 2, 3, 4) }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.blue.tbgr }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.from(1, 2, 3, 4).tbgr }, defaultViewFlags, false],\r\n ];\r\n\r\n let suffix = 123;\r\n for (const test of testCases) {\r\n const expected = test[0] ?? {};\r\n const styleId = DisplayStyle3d.insert(imodel2, IModel.dictionaryId, `TestStyle${suffix++}`, expected);\r\n const style = imodel2.elements.getElement<DisplayStyle3d>(styleId).toJSON();\r\n expect(style.jsonProperties.styles).not.to.be.undefined;\r\n\r\n expect(style.jsonProperties).not.to.be.undefined;\r\n expect(style.jsonProperties.styles).not.to.be.undefined;\r\n const actual = style.jsonProperties.styles!;\r\n\r\n expect(actual.viewflags).not.to.be.undefined;\r\n const expectedVf = ViewFlags.fromJSON(test[1]);\r\n const actualVf = ViewFlags.fromJSON(actual.viewflags);\r\n expect(actualVf.toJSON()).to.deep.equal(expectedVf.toJSON());\r\n\r\n const expectedBGColor = expected.backgroundColor instanceof ColorDef ? expected.backgroundColor.toJSON() : expected.backgroundColor;\r\n expect(actual.backgroundColor).to.equal(expectedBGColor);\r\n\r\n // DisplayStyleSettings constructor always initializes json.mapImagery.\r\n expect(actual.mapImagery).to.deep.equal(expected.mapImagery ?? defaultMapImagery);\r\n expect(actual.excludedElements).to.deep.equal(expected.excludedElements);\r\n expect(actual.timePoint).to.deep.equal(expected.timePoint);\r\n }\r\n });\r\n\r\n it(\"should have a valid root subject element\", () => {\r\n const rootSubject = imodel1.elements.getRootSubject();\r\n assert.exists(rootSubject);\r\n assert.isTrue(rootSubject instanceof Subject);\r\n assert.isAtLeast(rootSubject.code.value.length, 1);\r\n assert.isFalse(imodel1.elements.hasSubModel(IModel.rootSubjectId));\r\n\r\n try {\r\n imodel1.models.getSubModel(rootSubject.id); // throws error\r\n assert.fail(); // this line should be skipped\r\n } catch (error: any) {\r\n assert.isTrue(error instanceof Error);\r\n assert.isTrue(error instanceof IModelError);\r\n assert.equal(error.errorNumber, IModelStatus.NotFound);\r\n }\r\n\r\n const childIds: Id64String[] = imodel1.elements.queryChildren(rootSubject.id);\r\n assert.isAtLeast(childIds.length, 1);\r\n for (const childId of childIds) {\r\n const childElement = imodel1.elements.getElement(childId);\r\n assert.exists(childElement);\r\n assert.isTrue(childElement instanceof Element);\r\n\r\n roundtripThroughJson(childElement);\r\n assert.equal(rootSubject.id, childElement.parent!.id);\r\n\r\n const childLocalId = Id64.getLocalId(childId);\r\n const childBcId = Id64.getBriefcaseId(childId);\r\n if (childElement instanceof InformationPartitionElement) {\r\n assert.isTrue(imodel1.elements.hasSubModel(childElement.id));\r\n const childSubModel: Model = imodel1.models.getSubModel(childElement.id);\r\n assert.exists(childSubModel, \"InformationPartitionElements should have a subModel\");\r\n\r\n if (childLocalId === 16 && childBcId === 0) {\r\n assert.isTrue(childElement instanceof DefinitionPartition, \"ChildId 0x00000010 should be a DefinitionPartition\");\r\n assert.isTrue(childElement.code.value === \"BisCore.DictionaryModel\", \"Definition Partition should have code value of BisCore.DictionaryModel\");\r\n } else if (childLocalId === 14 && childBcId === 0) {\r\n assert.isTrue(childElement instanceof LinkPartition);\r\n assert.isTrue(childElement.code.value === \"BisCore.RealityDataSources\");\r\n } else if (childLocalId === 17 && childBcId === 0) {\r\n assert.isTrue(childElement instanceof LinkPartition, \"ChildId 0x000000011 should be a LinkPartition\");\r\n assert.isTrue(childElement.code.value === \"Repository Links\");\r\n }\r\n } else if (childElement instanceof Subject) {\r\n assert.isFalse(imodel1.elements.hasSubModel(childElement.id));\r\n if (childLocalId === 19 && childBcId === 0) {\r\n assert.isTrue(childElement instanceof Subject);\r\n assert.isTrue(childElement.code.value === \"DgnV8:mf3, A\", \"Subject should have code value of DgnV8:mf3, A\");\r\n assert.isTrue(childElement.jsonProperties.Subject.Job.DgnV8.V8File === \"mf3.dgn\", \"Subject should have jsonProperty Subject.Job.DgnV.V8File\");\r\n assert.isTrue(childElement.jsonProperties.Subject.Job.DgnV8.V8RootModel === \"A\", \"Subject should have jsonProperty Subject.Job.DgnV.V8RootModel\");\r\n }\r\n }\r\n }\r\n });\r\n\r\n it(\"should load a known model by Id from an existing iModel\", () => {\r\n assert.exists(imodel1.models);\r\n const model2 = imodel1.models.getModel(\"0x1c\");\r\n assert.exists(model2);\r\n const formatter = model2.getJsonProperty(\"formatter\");\r\n assert.exists(formatter, \"formatter should exist as json property\");\r\n assert.equal(formatter.fmtFlags.angMode, 1, \"fmtFlags\");\r\n assert.equal(formatter.mastUnit.label, \"m\", \"mastUnit is meters\");\r\n roundtripThroughJson(model2);\r\n let model = imodel1.models.getModel(IModel.repositoryModelId);\r\n assert.exists(model);\r\n roundtripThroughJson(model);\r\n const code1 = new Code({ spec: \"0x1d\", scope: \"0x1d\", value: \"A\" });\r\n model = imodel1.models.getSubModel(code1);\r\n // By this point, we expect the submodel's class to be in the class registry *cache*\r\n const geomModel = ClassRegistry.getClass(PhysicalModel.classFullName, imodel1);\r\n assert.exists(model);\r\n assert.isTrue(model instanceof geomModel);\r\n roundtripThroughJson(model);\r\n const modelExtents: AxisAlignedBox3d = (model as PhysicalModel).queryExtents();\r\n\r\n assert.isBelow(modelExtents.low.x, modelExtents.high.x);\r\n assert.isBelow(modelExtents.low.y, modelExtents.high.y);\r\n assert.isBelow(modelExtents.low.z, modelExtents.high.z);\r\n });\r\n\r\n it(\"should find a tile tree for a geometric model\", async () => {\r\n // Note: this is an empty model.\r\n const tree = await imodel1.tiles.requestTileTreeProps(\"0x1c\");\r\n expect(tree).not.to.be.undefined;\r\n\r\n expect(tree.id).to.equal(\"0x1c\");\r\n expect(tree.maxTilesToSkip).to.equal(1);\r\n expect(tree.rootTile).not.to.be.undefined;\r\n\r\n // Empty model => identity transform\r\n const tf = Transform.fromJSON(tree.location);\r\n expect(tf.matrix.isIdentity).to.be.true;\r\n expect(tf.origin.x).to.equal(0);\r\n expect(tf.origin.y).to.equal(0);\r\n expect(tf.origin.z).to.equal(0);\r\n\r\n expect(tree.rootTile.contentId).to.equal(\"0/0/0/0/1\");\r\n\r\n // Empty model => null range\r\n const range = Range3d.fromJSON(tree.rootTile.range);\r\n expect(range.isNull).to.be.true;\r\n\r\n expect(tree.rootTile.maximumSize).to.equal(0.0); // empty model => undisplayable root tile => size = 0.0\r\n expect(tree.rootTile.isLeaf).to.be.true; // empty model => empty tile\r\n expect(tree.rootTile.contentRange).to.be.undefined;\r\n });\r\n\r\n it(\"should throw on invalid tile requests\", async () => {\r\n using _r = new DisableNativeAssertions();\r\n let error = await getIModelError(imodel1.tiles.requestTileTreeProps(\"0x12345\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileTreeProps(\"NotAValidId\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"0/0/0/0\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x12345\", \"0/0/0/0/1\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"V/W/X/Y/Z\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"NotAValidId\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n });\r\n\r\n // NOTE: this test can be removed when the deprecated executeQuery method is removed\r\n it(\"should produce an array of rows\", () => {\r\n const rows: any[] = IModelTestUtils.executeQuery(imodel1, `SELECT * FROM ${Category.classFullName}`);\r\n assert.exists(rows);\r\n assert.isArray(rows);\r\n assert.isAtLeast(rows.length, 1);\r\n assert.exists(rows[0].id);\r\n assert.notEqual(rows[0].id.value, \"\");\r\n });\r\n\r\n it(\"should be some categories\", () => {\r\n const categorySql = `SELECT ECInstanceId FROM ${Category.classFullName}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(categorySql, (categoryStatement: ECSqlStatement): void => {\r\n let numCategories = 0;\r\n while (DbResult.BE_SQLITE_ROW === categoryStatement.step()) {\r\n numCategories++;\r\n const categoryId = categoryStatement.getValue(0).getId();\r\n const category: Element = imodel1.elements.getElement(categoryId);\r\n assert.isTrue(category instanceof Category, \"Should be instance of Category\");\r\n\r\n // verify the default subcategory.\r\n const defaultSubCategoryId = (category as Category).myDefaultSubCategoryId();\r\n const defaultSubCategory: Element = imodel1.elements.getElement(defaultSubCategoryId);\r\n assert.isTrue(defaultSubCategory instanceof SubCategory, \"defaultSubCategory should be instance of SubCategory\");\r\n if (defaultSubCategory instanceof SubCategory) {\r\n assert.isTrue(defaultSubCategory.parent!.id === categoryId, \"defaultSubCategory id should be prescribed value\");\r\n assert.isTrue(defaultSubCategory.getSubCategoryName() === category.code.value, \"DefaultSubcategory name should match that of Category\");\r\n assert.isTrue(defaultSubCategory.isDefaultSubCategory, \"isDefaultSubCategory should return true\");\r\n }\r\n\r\n // get the subcategories\r\n const subCategorySql = `SELECT ECInstanceId FROM ${SubCategory.classFullName} WHERE Parent.Id=:parentId`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(subCategorySql, (subCategoryStatement: ECSqlStatement): void => {\r\n let numSubCategories = 0;\r\n subCategoryStatement.bindId(\"parentId\", categoryId);\r\n while (DbResult.BE_SQLITE_ROW === subCategoryStatement.step()) {\r\n numSubCategories++;\r\n const subCategoryId = subCategoryStatement.getValue(0).getId();\r\n const subCategory: Element = imodel1.elements.getElement(subCategoryId);\r\n assert.isTrue(subCategory instanceof SubCategory);\r\n assert.isTrue(subCategory.parent!.id === categoryId);\r\n }\r\n assert.isAtLeast(numSubCategories, 1, \"Expected query to find at least one SubCategory\");\r\n });\r\n }\r\n assert.isAtLeast(numCategories, 1, \"Expected query to find some categories\");\r\n });\r\n });\r\n\r\n it(\"should be some 2d elements\", () => {\r\n const sql = `SELECT ECInstanceId FROM ${DrawingGraphic.classFullName}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(sql, (statement: ECSqlStatement): void => {\r\n let numDrawingGraphics = 0;\r\n let found25: boolean = false;\r\n let found26: boolean = false;\r\n while (DbResult.BE_SQLITE_ROW === statement.step()) {\r\n numDrawingGraphics++;\r\n const drawingGraphicId = statement.getValue(0).getId();\r\n const drawingGraphic = imodel2.elements.getElement<GeometricElement2d>({ id: drawingGraphicId, wantGeometry: true });\r\n assert.exists(drawingGraphic);\r\n assert.isTrue(drawingGraphic.className === \"DrawingGraphic\", \"Should be instance of DrawingGraphic\");\r\n assert.isTrue(drawingGraphic instanceof DrawingGraphic, \"Is instance of DrawingGraphic\");\r\n assert.isTrue(drawingGraphic instanceof GeometricElement2d, \"Is instance of GeometricElement2d\");\r\n if (Id64.getLocalId(drawingGraphic.id) === 0x25) {\r\n found25 = true;\r\n assert.isTrue(drawingGraphic.placement.origin.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.origin.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.angle.radians === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.x === 1.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.y === 1.0);\r\n assert.isDefined(drawingGraphic.geom);\r\n } else if (Id64.getLocalId(drawingGraphic.id) === 0x26) {\r\n found26 = true;\r\n assert.isTrue(drawingGraphic.placement.origin.x === 1.0);\r\n assert.isTrue(drawingGraphic.placement.origin.y === 1.0);\r\n assert.isTrue(drawingGraphic.placement.angle.radians === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.x === 2.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.y === 2.0);\r\n assert.isDefined(drawingGraphic.geom);\r\n }\r\n }\r\n assert.isAtLeast(numDrawingGraphics, 1, \"Expected query to find some DrawingGraphics\");\r\n assert.isTrue(found25, \"Expected to find a specific element\");\r\n assert.isTrue(found26, \"Expected to find a specific element\");\r\n });\r\n });\r\n\r\n it(\"should be able to query for ViewDefinitionProps\", () => {\r\n const viewDefinitionProps: ViewDefinitionProps[] = imodel2.views.queryViewDefinitionProps(); // query for all ViewDefinitions\r\n assert.isAtLeast(viewDefinitionProps.length, 3);\r\n assert.isTrue(viewDefinitionProps[0].classFullName.includes(\"ViewDefinition\"));\r\n assert.isFalse(viewDefinitionProps[1].isPrivate);\r\n\r\n const spatialViewDefinitionProps = imodel2.views.queryViewDefinitionProps(\"BisCore.SpatialViewDefinition\") as SpatialViewDefinitionProps[]; // limit query to SpatialViewDefinitions\r\n assert.isAtLeast(spatialViewDefinitionProps.length, 3);\r\n assert.exists(spatialViewDefinitionProps[2].modelSelectorId);\r\n });\r\n\r\n it(\"should iterate ViewDefinitions\", () => {\r\n // imodel2 contains 3 SpatialViewDefinitions and no other views.\r\n let numViews = 0;\r\n let result = imodel2.views.iterateViews(IModelDb.Views.defaultQueryParams, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return true;\r\n });\r\n\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(3);\r\n\r\n // Query specifically for spatial views\r\n numViews = 0;\r\n result = imodel2.views.iterateViews({ from: \"BisCore.SpatialViewDefinition\" }, (view: ViewDefinition) => {\r\n if (view.isSpatialView())\r\n ++numViews;\r\n\r\n return view.isSpatialView();\r\n });\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(3);\r\n\r\n // Query specifically for 2d views\r\n numViews = 0;\r\n result = imodel2.views.iterateViews({ from: \"BisCore.ViewDefinition2d\" }, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return true;\r\n });\r\n\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(0);\r\n\r\n // Terminate iteration on first view\r\n numViews = 0;\r\n result = imodel2.views.iterateViews(IModelDb.Views.defaultQueryParams, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return false;\r\n });\r\n\r\n expect(result).to.be.false;\r\n expect(numViews).to.equal(1);\r\n });\r\n\r\n it(\"should be children of RootSubject\", () => {\r\n const sql = `SELECT ECInstanceId FROM ${Model.classFullName} WHERE ParentModel.Id=:parentModelId`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(sql, (statement: ECSqlStatement): void => {\r\n statement.bindId(\"parentModelId\", IModel.repositoryModelId);\r\n let numModels = 0;\r\n while (DbResult.BE_SQLITE_ROW === statement.step()) {\r\n numModels++;\r\n const modelId = statement.getValue(0).getId();\r\n const model = imodel2.models.getModel(modelId);\r\n assert.exists(model, \"Model should exist\");\r\n assert.isTrue(model instanceof Model);\r\n\r\n // should be an element with the same Id.\r\n const modeledElement = imodel2.elements.getElement(modelId);\r\n assert.exists(modeledElement, \"Modeled Element should exist\");\r\n\r\n if (model.className === \"LinkModel\") {\r\n // expect LinkModel to be accompanied by LinkPartition\r\n assert.isTrue(modeledElement instanceof LinkPartition);\r\n continue;\r\n } else if (model.className === \"DictionaryModel\") {\r\n assert.isTrue(modeledElement instanceof DefinitionPartition);\r\n continue;\r\n } else if (model.className === \"PhysicalModel\") {\r\n assert.isTrue(modeledElement instanceof PhysicalPartition);\r\n continue;\r\n } else if (model.className === \"GroupModel\") {\r\n assert.isTrue(modeledElement instanceof GroupInformationPartition);\r\n continue;\r\n } else if (model.className === \"DocumentListModel\") {\r\n assert.isTrue(modeledElement instanceof DocumentPartition);\r\n continue;\r\n } else if (model.className === \"DefinitionModel\") {\r\n assert.isTrue(modeledElement instanceof DefinitionPartition);\r\n continue;\r\n } else {\r\n assert.isTrue(false, \"Expected a known model type\");\r\n }\r\n }\r\n assert.isAtLeast(numModels, 1, \"Expected query to find some Models\");\r\n });\r\n });\r\n\r\n it(\"should insert and update auto-handled properties\", () => {\r\n const testElem = imodel4.elements.getElement(\"0x14\");\r\n assert.isDefined(testElem);\r\n assert.equal(testElem.classFullName, \"DgnPlatformTest:TestElementWithNoHandler\");\r\n assert.isUndefined(testElem.asAny.integerProperty1);\r\n\r\n const newTestElem = roundtripThroughJson(testElem) as Element;\r\n assert.equal(newTestElem.classFullName, testElem.classFullName);\r\n newTestElem.asAny.integerProperty1 = 999;\r\n assert.isTrue(testElem.asAny.arrayOfPoint3d[0].isAlmostEqual(newTestElem.asAny.arrayOfPoint3d[0]));\r\n\r\n const loc1 = { street: \"Elm Street\", city: { name: \"Downingtown\", state: \"PA\" } };\r\n const loc2 = { street: \"Oak Street\", city: { name: \"Downingtown\", state: \"PA\" } };\r\n const loc3 = { street: \"Chestnut Street\", city: { name: \"Philadelphia\", state: \"PA\" } };\r\n const arrayOfStructs = [loc2, loc3];\r\n newTestElem.asAny.location = loc1;\r\n newTestElem.asAny.arrayOfStructs = arrayOfStructs;\r\n newTestElem.asAny.dtUtc = new Date(\"2015-03-25\");\r\n newTestElem.asAny.p3d = new Point3d(1, 2, 3);\r\n\r\n const newTestElemId = imodel4.elements.insertElement(newTestElem.toJSON());\r\n\r\n assert.isTrue(Id64.isValidId64(newTestElemId), \"insert worked\");\r\n\r\n const newTestElemFetched = imodel4.elements.getElement(newTestElemId);\r\n assert.isDefined(newTestElemFetched);\r\n assert.isTrue(newTestElemFetched.id === newTestElemId);\r\n assert.equal(newTestElemFetched.classFullName, newTestElem.classFullName);\r\n assert.isDefined(newTestElemFetched.asAny.integerProperty1);\r\n assert.equal(newTestElemFetched.asAny.integerProperty1, newTestElem.asAny.integerProperty1);\r\n assert.isTrue(newTestElemFetched.asAny.arrayOfPoint3d[0].isAlmostEqual(newTestElem.asAny.arrayOfPoint3d[0]));\r\n assert.deepEqual(newTestElemFetched.asAny.location, loc1);\r\n assert.deepEqual(newTestElem.asAny.arrayOfStructs, arrayOfStructs);\r\n // TODO: getElement must convert date ISO string to Date object assert.deepEqual(newTestElemFetched.dtUtc, newTestElem.dtUtc);\r\n assert.deepEqual(newTestElemFetched.asAny.dtUtc, newTestElem.asAny.dtUtc.toJSON());\r\n assert.isTrue(newTestElemFetched.asAny.p3d.isAlmostEqual(newTestElem.asAny.p3d));\r\n\r\n // ----------- updates ----------------\r\n const wasp3d = newTestElemFetched.asAny.p3d;\r\n const editElem = newTestElemFetched;\r\n editElem.asAny.location = loc2;\r\n try {\r\n imodel4.elements.updateElement(editElem.toJSON());\r\n } catch {\r\n assert.fail(\"Element.update failed\");\r\n }\r\n const afterUpdateElemFetched = imodel4.elements.getElement(editElem.id);\r\n assert.deepEqual(afterUpdateElemFetched.asAny.location, loc2, \" location property should be the new one\");\r\n assert.deepEqual(afterUpdateElemFetched.asAny.id, editElem.id, \" the id should not have changed.\");\r\n assert.deepEqual(afterUpdateElemFetched.asAny.p3d, wasp3d, \" p3d property should not have changed\");\r\n\r\n // Make array shorter\r\n assert.equal(afterUpdateElemFetched.asAny.arrayOfInt.length, 300);\r\n\r\n afterUpdateElemFetched.asAny.arrayOfInt = [99, 3];\r\n imodel4.elements.updateElement(afterUpdateElemFetched.toJSON());\r\n\r\n const afterShortenArray = imodel4.elements.getElement(afterUpdateElemFetched.id);\r\n assert.equal(afterUpdateElemFetched.asAny.arrayOfInt.length, 2);\r\n assert.deepEqual(afterShortenArray.asAny.arrayOfInt, [99, 3]);\r\n\r\n // Make array longer\r\n afterShortenArray.asAny.arrayOfInt = [1, 2, 3];\r\n imodel4.elements.updateElement(afterShortenArray.toJSON());\r\n const afterLengthenArray = imodel4.elements.getElement(afterShortenArray.id);\r\n assert.equal(afterLengthenArray.asAny.arrayOfInt.length, 3);\r\n assert.deepEqual(afterLengthenArray.asAny.arrayOfInt, [1, 2, 3]);\r\n\r\n // ------------ delete -----------------\r\n const elid = afterUpdateElemFetched.id;\r\n imodel4.elements.deleteElement(elid);\r\n assert.throws(() => imodel4.elements.getElement(elid), IModelError);\r\n });\r\n\r\n it(\"should handle parent and child deletion properly\", () => {\r\n const categoryId = SpatialCategory.insert(imodel4, IModel.dictionaryId, \"MyTestCategory\", new SubCategoryAppearance());\r\n const category = imodel4.elements.getElement<SpatialCategory>(categoryId);\r\n const subCategory = imodel4.elements.getElement<SubCategory>(category.myDefaultSubCategoryId());\r\n expect(() => imodel4.elements.deleteElement(categoryId)).throws(\"error deleting element\").to.have.property(\"metadata\");\r\n assert.exists(imodel4.elements.getElement(categoryId), \"Category deletes should be blocked in native code\");\r\n assert.exists(imodel4.elements.getElement(subCategory.id), \"Children should not be deleted if parent delete is blocked\");\r\n\r\n const modelId = PhysicalModel.insert(imodel4, IModel.rootSubjectId, \"MyTestPhysicalModel\");\r\n const elementProps: GeometricElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId,\r\n category: categoryId,\r\n code: Code.createEmpty(),\r\n };\r\n const parentId = imodel4.elements.insertElement(elementProps);\r\n elementProps.parent = new ElementOwnsChildElements(parentId);\r\n const childId1 = imodel4.elements.insertElement(elementProps);\r\n const childId2 = imodel4.elements.insertElement(elementProps);\r\n assert.exists(imodel4.elements.getElement(parentId));\r\n assert.exists(imodel4.elements.getElement(childId1));\r\n assert.exists(imodel4.elements.getElement(childId2));\r\n imodel4.elements.deleteElement(parentId);\r\n assert.throws(() => imodel4.elements.getElement(parentId), IModelError);\r\n assert.throws(() => imodel4.elements.getElement(childId1), IModelError);\r\n assert.throws(() => imodel4.elements.getElement(childId2), IModelError);\r\n });\r\n\r\n function checkElementMetaData(entityClass: EntityClass) {\r\n assert.isNotNull(entityClass);\r\n assert.equal(entityClass.fullName, Element.classFullName.replace(\":\", \".\"));\r\n assert.isUndefined(entityClass.baseClass);\r\n\r\n let foundClassHasHandler = false;\r\n let foundClassHasCurrentTimeStampProperty = false;\r\n if (entityClass.customAttributes !== undefined) {\r\n if (entityClass.customAttributes.has(\"BisCore.ClassHasHandler\"))\r\n foundClassHasHandler = true;\r\n if (entityClass.customAttributes.has(\"CoreCustomAttributes.ClassHasCurrentTimeStampProperty\"))\r\n foundClassHasCurrentTimeStampProperty = true;\r\n }\r\n assert.isTrue(foundClassHasHandler);\r\n assert.isTrue(foundClassHasCurrentTimeStampProperty);\r\n const federationGuid = entityClass.getPropertySync(\"federationGuid\", false);\r\n if (federationGuid !== undefined) {\r\n assert.isTrue(federationGuid.isPrimitive());\r\n assert.equal(federationGuid.propertyType, PropertyType.Binary);\r\n assert.equal((federationGuid as PrimitiveOrEnumPropertyBase).extendedTypeName, \"BeGuid\");\r\n }\r\n }\r\n\r\n it(\"should get metadata for a relationship\", async () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"relationshipMetadata.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"relationshipMetadata\" } });\r\n\r\n const partitionId = imodel.elements.insertElement({\r\n classFullName: \"BisCore:PhysicalPartition\",\r\n model: IModel.repositoryModelId,\r\n parent: {\r\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\r\n id: IModel.rootSubjectId,\r\n },\r\n code: new Code({\r\n spec: imodel.codeSpecs.getByName(BisCodeSpec.informationPartitionElement).id,\r\n scope: IModel.rootSubjectId,\r\n value: \"physical model\",\r\n }),\r\n });\r\n\r\n for await (const row of imodel.createQueryReader(`SELECT * FROM bis.Element LIMIT ${1}`)) {\r\n const relId = imodel.relationships.insertInstance({\r\n classFullName: \"BisCore:ElementHasLinks\",\r\n sourceId: partitionId,\r\n targetId: row.ECInstanceId,\r\n });\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementHasLinks\", relId);\r\n const metadata = await relationship.getMetaData();\r\n assert.isDefined(metadata, \"metadata should be defined\");\r\n }\r\n imodel.close();\r\n });\r\n\r\n it(\"should get metadata for class\", () => {\r\n const metaData = imodel1.schemaContext.getSchemaItemSync(Element.classFullName, EntityClass);\r\n assert.exists(metaData);\r\n if (metaData !== undefined)\r\n checkElementMetaData(metaData);\r\n });\r\n\r\n it(\"should iterate through metadata for a relationship\", async () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"relationshipMetadata.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"relationshipMetadata\" } });\r\n\r\n const partitionId = imodel.elements.insertElement({\r\n classFullName: \"BisCore:PhysicalPartition\",\r\n model: IModel.repositoryModelId,\r\n parent: {\r\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\r\n id: IModel.rootSubjectId,\r\n },\r\n code: new Code({\r\n spec: imodel.codeSpecs.getByName(BisCodeSpec.informationPartitionElement).id,\r\n scope: IModel.rootSubjectId,\r\n value: \"physical model\",\r\n }),\r\n });\r\n\r\n for await (const row of imodel.createQueryReader(`SELECT * FROM bis.Element LIMIT ${1}`)) {\r\n const relId = imodel.relationships.insertInstance({\r\n classFullName: \"BisCore:ElementHasLinks\",\r\n sourceId: partitionId,\r\n targetId: row.ECInstanceId,\r\n });\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementHasLinks\", relId);\r\n relationship.forEach((propName, propMeta) => {\r\n assert.isDefined(propName, \"Property name should be defined\");\r\n assert.isDefined(propMeta, \"Property metadata should be defined\");\r\n });\r\n }\r\n\r\n imodel.close();\r\n });\r\n\r\n it(\"update the project extents\", async () => {\r\n const originalExtents = imodel1.projectExtents;\r\n const newExtents = Range3d.create(originalExtents.low, originalExtents.high);\r\n newExtents.low.x -= 50;\r\n newExtents.low.y -= 25;\r\n newExtents.low.z -= 189;\r\n newExtents.high.x += 1087;\r\n newExtents.high.y += 19;\r\n newExtents.high.z += .001;\r\n imodel1.updateProjectExtents(newExtents);\r\n\r\n const updatedProps = imodel1[_nativeDb].getIModelProps();\r\n assert.isTrue(updatedProps.hasOwnProperty(\"projectExtents\"), \"Returned property JSON object has project extents\");\r\n const updatedExtents = Range3d.fromJSON(updatedProps.projectExtents);\r\n assert.isTrue(newExtents.isAlmostEqual(updatedExtents), \"Project extents successfully updated in database\");\r\n });\r\n\r\n it(\"read view thumbnail\", () => {\r\n const viewId = \"0x24\";\r\n const thumbnail = imodel5.views.getThumbnail(viewId);\r\n assert.exists(thumbnail);\r\n if (!thumbnail)\r\n return;\r\n assert.equal(thumbnail.format, \"jpeg\");\r\n assert.equal(thumbnail.height, 768);\r\n assert.equal(thumbnail.width, 768);\r\n assert.equal(thumbnail.image.length, 18062);\r\n\r\n thumbnail.width = 100;\r\n thumbnail.height = 200;\r\n thumbnail.format = \"png\";\r\n thumbnail.image = new Uint8Array(200);\r\n thumbnail.image.fill(12);\r\n const stat = imodel5.views.saveThumbnail(viewId, thumbnail);\r\n assert.equal(stat, 0, \"save thumbnail\");\r\n\r\n const thumbnail2 = imodel5.views.getThumbnail(viewId);\r\n assert.exists(thumbnail2);\r\n if (!thumbnail2)\r\n return;\r\n assert.equal(thumbnail2.format, \"png\");\r\n assert.equal(thumbnail2.height, 200);\r\n assert.equal(thumbnail2.width, 100);\r\n assert.equal(thumbnail2.image.length, 200);\r\n assert.equal(thumbnail2.image[0], 12);\r\n });\r\n\r\n it(\"ecefLocation for iModels\", () => {\r\n assert.isTrue(imodel5.isGeoLocated);\r\n const center = { x: 289095, y: 3803860, z: 10 }; // near center of project extents, 10 meters above ground.\r\n const ecefPt = imodel5.spatialToEcef(center);\r\n const pt = { x: -3575156.3661052254, y: 3873432.0891543664, z: 3578996.012643183 };\r\n assert.isTrue(ecefPt.isAlmostEqual(pt), \"spatialToEcef\");\r\n\r\n const z2 = imodel5.ecefToSpatial(ecefPt);\r\n assert.isTrue(z2.isAlmostEqual(center), \"ecefToSpatial\");\r\n\r\n const carto = imodel5.spatialToCartographicFromEcef(center);\r\n assert.approximately(carto.longitudeDegrees, 132.70683882277805, .1); // this data is in Japan\r\n assert.approximately(carto.latitudeDegrees, 34.35462768786055, .1);\r\n const c2 = { longitude: 2.3161712773709127, latitude: 0.5996013664499733, height: 10 };\r\n assert.isTrue(carto.equalsEpsilon(c2, .001), \"spatialToCartographic\");\r\n\r\n imodel5.cartographicToSpatialFromEcef(carto, z2);\r\n assert.isTrue(z2.isAlmostEqual(center, .001), \"cartographicToSpatial\");\r\n\r\n assert.isTrue(imodel5.geographicCoordinateSystem !== undefined);\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.horizontalCRS !== undefined);\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.verticalCRS !== undefined);\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.verticalCRS!.id !== undefined);\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.horizontalCRS!.id === \"UTM84-53N\");\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.verticalCRS!.id === \"ELLIPSOID\");\r\n });\r\n\r\n function checkClassHasHandlerMetaData(classToCheck: CustomAttributeClass) {\r\n assert.isDefined(classToCheck);\r\n\r\n const propertiesArray = Array.from(classToCheck.getPropertiesSync(true));\r\n assert.equal(propertiesArray.length, 1);\r\n\r\n const restrictionProperty = propertiesArray[0];\r\n assert.isDefined(restrictionProperty);\r\n assert.equal(restrictionProperty.name, \"Restrictions\");\r\n assert.equal(propertyTypeToString(restrictionProperty.propertyType), \"PrimitiveArrayProperty\");\r\n assert.equal((restrictionProperty as PrimitiveArrayProperty).minOccurs, 0);\r\n }\r\n\r\n it(\"should get metadata for CA class just as well (and we'll see a array-typed property)\", () => {\r\n const metaData = imodel1.schemaContext.getSchemaItemSync(\"BisCore.ClassHasHandler\", CustomAttributeClass);\r\n assert.exists(metaData);\r\n if (metaData !== undefined) {\r\n assert.equal(metaData.schemaItemType, SchemaItemType.CustomAttributeClass);\r\n checkClassHasHandlerMetaData(metaData);\r\n }\r\n });\r\n\r\n it(\"should exercise ECSqlStatement (backend only)\", () => {\r\n // Reject an invalid statement\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.prepareStatement(\"select no_such_property, codeValue from bis.element\", false);\r\n assert.fail(\"prepare should have failed with an exception\");\r\n } catch (err: any) {\r\n assert.isTrue(err.constructor.name === \"IModelError\");\r\n assert.notEqual(err.status, DbResult.BE_SQLITE_OK);\r\n }\r\n let lastId: string = \"\";\r\n let firstCodeValue: string = \"\";\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element\", (stmt: ECSqlStatement) => {\r\n assert.isNotNull(stmt);\r\n // Reject an attempt to bind when there are no placeholders in the statement\r\n try {\r\n stmt.bindStruct(1, { foo: 1 });\r\n assert.fail(\"bindStruct should have failed with an exception\");\r\n } catch (err2: any) {\r\n assert.isTrue(err2.constructor.name === \"IModelError\");\r\n assert.notEqual(err2.status, DbResult.BE_SQLITE_OK);\r\n }\r\n\r\n // Verify that we get a bunch of rows with the expected shape\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n const row = stmt.getRow();\r\n assert.isNotNull(row);\r\n assert.isObject(row);\r\n assert.isTrue(row.id !== undefined);\r\n assert.isTrue(Id64.isValid(Id64.fromJSON(row.id)));\r\n lastId = row.id;\r\n if (row.codeValue !== undefined)\r\n firstCodeValue = row.codeValue;\r\n count = count + 1;\r\n }\r\n assert.isTrue(count > 1);\r\n assert.notEqual(lastId, \"\");\r\n assert.notEqual(firstCodeValue, \"\");\r\n\r\n // Try iterator style\r\n let firstCodeValueIter: string = \"\";\r\n let iteratorCount = 0;\r\n let lastIterId: string = \"\";\r\n stmt.reset();\r\n for (const row of stmt) {\r\n assert.isNotNull(row);\r\n assert.isObject(row);\r\n assert.isTrue(row.id !== undefined);\r\n assert.isTrue(Id64.isValid(Id64.fromJSON(row.id)));\r\n lastIterId = row.id;\r\n iteratorCount = iteratorCount + 1;\r\n if (row.codeValue !== undefined)\r\n firstCodeValueIter = row.codeValue;\r\n }\r\n assert.equal(iteratorCount, count, \"iterator loop should find the same number of rows as the step loop\");\r\n assert.equal(lastIterId, lastId, \"iterator loop should see the same last row as the step loop\");\r\n assert.equal(firstCodeValueIter, firstCodeValue, \"iterator loop should find the first non-null code value as the step loop\");\r\n });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element WHERE (ecinstanceid=?)\", (stmt3: ECSqlStatement) => {\r\n // Now try a statement with a placeholder\r\n const idToFind = Id64.fromJSON(lastId);\r\n stmt3.bindId(1, idToFind);\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt3.step()) {\r\n count = count + 1;\r\n const row = stmt3.getRow();\r\n // Verify that we got the row that we asked for\r\n assert.isTrue(idToFind === Id64.fromJSON(row.id));\r\n }\r\n // Verify that we got the row that we asked for\r\n assert.equal(count, 1);\r\n });\r\n\r\n let firstCodeValueId: Id64String | undefined;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element WHERE (codeValue = :codevalue)\", (stmt4: ECSqlStatement) => {\r\n // Try a named placeholder\r\n const codeValueToFind = firstCodeValue;\r\n stmt4.bindString(\"codeValue\", codeValueToFind);\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt4.step()) {\r\n count = count + 1;\r\n const row = stmt4.getRow();\r\n // Verify that we got the row that we asked for\r\n assert.equal(row.codeValue, codeValueToFind);\r\n firstCodeValueId = row.id;\r\n }\r\n // Verify that we got the row that we asked for\r\n assert.equal(count, 1);\r\n });\r\n\r\n // make sure we can use parameterized values for queryEnityId (test on parameterized codevalue)\r\n const ids = imodel2.queryEntityIds({ from: \"bis.element\", where: \"codevalue=:cv\", bindings: { cv: firstCodeValue } });\r\n assert.equal(ids.values().next().value, firstCodeValueId);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid as id, codevalue from bis.element\", (stmt5: ECSqlStatement) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt5.step()) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select codevalue from bis.element where ecinstanceid=?\", (stmt6: ECSqlStatement) => {\r\n stmt6.bindId(1, stmt5.getRow().id);\r\n while (DbResult.BE_SQLITE_ROW === stmt6.step()) {\r\n assert.equal(stmt6.getRow().codevalue, stmt5.getRow().codevalue);\r\n }\r\n });\r\n }\r\n });\r\n\r\n // make sure queryEnityIds works fine when all params are specified\r\n const physicalObjectIds = imodel2.queryEntityIds({ from: \"generic.PhysicalObject\", where: \"codevalue is null\", limit: 1, offset: 1, only: true, orderBy: \"ecinstanceid desc\" });\r\n assert.equal(physicalObjectIds.size, 1);\r\n });\r\n\r\n it(\"validate BisCodeSpecs\", async () => {\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.nullCodeSpec).scopeType, CodeScopeSpec.Type.Repository);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subCategory).scopeType, CodeScopeSpec.Type.ParentElement);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.viewDefinition).scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subject).scopeReq, CodeScopeSpec.ScopeRequirement.ElementId);\r\n });\r\n\r\n it(\"should create and insert CodeSpecs\", () => {\r\n const testImodel = imodel2;\r\n const codeSpec = CodeSpec.create(testImodel, \"CodeSpec1\", CodeScopeSpec.Type.Model);\r\n const codeSpecId = testImodel.codeSpecs.insert(codeSpec); // throws in case of error\r\n assert.deepEqual(codeSpecId, codeSpec.id);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.ElementId);\r\n\r\n // Should not be able to insert a duplicate.\r\n const codeSpecDup = CodeSpec.create(testImodel, \"CodeSpec1\", CodeScopeSpec.Type.Model);\r\n assert.throws(() => testImodel.codeSpecs.insert(codeSpecDup), \"CodeSpec already exists\");\r\n\r\n // We should be able to insert another CodeSpec with a different name.\r\n const codeSpec2 = CodeSpec.create(testImodel, \"CodeSpec2\", CodeScopeSpec.Type.Model, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpec2Id = testImodel.codeSpecs.insert(codeSpec2); // throws in case of error\r\n assert.deepEqual(codeSpec2Id, codeSpec2.id);\r\n assert.notDeepEqual(codeSpec2Id, codeSpecId);\r\n\r\n // make sure CodeScopeSpec.Type.Repository works\r\n const codeSpec3 = CodeSpec.create(testImodel, \"CodeSpec3\", CodeScopeSpec.Type.Repository, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpec3Id = testImodel.codeSpecs.insert(codeSpec3); // throws in case of error\r\n assert.notDeepEqual(codeSpec2Id, codeSpec3Id);\r\n\r\n const codeSpec4 = testImodel.codeSpecs.getById(codeSpec3Id);\r\n codeSpec4.name = \"CodeSpec4\";\r\n const codeSpec4Id = testImodel.codeSpecs.insert(codeSpec4); // throws in case of error\r\n assert.notDeepEqual(codeSpec3Id, codeSpec4Id);\r\n assert.equal(codeSpec4.scopeType, CodeScopeSpec.Type.Repository);\r\n assert.equal(codeSpec4.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const copyOfCodeSpec4 = testImodel.codeSpecs.getById(codeSpec4Id);\r\n assert.deepEqual(codeSpec4, copyOfCodeSpec4);\r\n\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec1\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec2\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec3\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec4\"));\r\n assert.isFalse(testImodel.codeSpecs.hasName(\"CodeSpec5\"));\r\n\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec2.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec3.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec4.id));\r\n assert.isFalse(testImodel.codeSpecs.hasId(Id64.invalid));\r\n });\r\n\r\n it(\"validate CodeSpec properties\", async () => {\r\n const iModelFileName: string = IModelTestUtils.prepareOutputFile(\"IModel\", \"ReadWriteCodeSpec.bim\");\r\n const codeSpecName = \"CodeSpec1\";\r\n\r\n // Write new CodeSpec to iModel\r\n if (true) {\r\n const iModelDb = IModelTestUtils.createSnapshotFromSeed(iModelFileName, IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\"));\r\n const codeSpec = CodeSpec.create(iModelDb, codeSpecName, CodeScopeSpec.Type.Model, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpecId = iModelDb.codeSpecs.insert(codeSpec);\r\n assert.isTrue(Id64.isValidId64(codeSpec.id));\r\n assert.equal(codeSpec.id, codeSpecId);\r\n assert.equal(codeSpec.name, codeSpecName);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n iModelDb.saveChanges();\r\n iModelDb.close();\r\n }\r\n\r\n // Reopen iModel (ensure CodeSpec cache is cleared) and reconfirm CodeSpec properties\r\n if (true) {\r\n const iModelDb = SnapshotDb.openFile(iModelFileName);\r\n const codeSpec = iModelDb.codeSpecs.getByName(codeSpecName);\r\n assert.isTrue(Id64.isValidId64(codeSpec.id));\r\n assert.equal(codeSpec.name, codeSpecName);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n iModelDb.close();\r\n }\r\n });\r\n\r\n it(\"snapping\", async () => {\r\n const worldToView = Matrix4d.createIdentity();\r\n const response = await imodel2.requestSnap(\"0x222\", { testPoint: { x: 1, y: 2, z: 3 }, closePoint: { x: 1, y: 2, z: 3 }, id: \"0x111\", worldToView: worldToView.toJSON() });\r\n assert.isDefined(response.status);\r\n });\r\n\r\n it(\"should import schemas\", async () => {\r\n const metaData = await imodel1.schemaContext.getSchemaItem(\"TestBim:TestDocument\", EntityClass);\r\n assert.isDefined(metaData);\r\n if (metaData !== undefined) {\r\n const property = await metaData.getProperty(\"testDocumentProperty\");\r\n assert.isDefined(property);\r\n if (property !== undefined)\r\n assert.isDefined(property.propertyType, propertyTypeToString(PropertyType.Integer));\r\n }\r\n });\r\n\r\n it(\"should do CRUD on models\", () => {\r\n\r\n const testImodel = imodel2;\r\n\r\n const [modeledElementId, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);\r\n\r\n const newModelPersist = testImodel.models.getModel(newModelId);\r\n\r\n // Check that it has the properties that we set.\r\n assert.equal(newModelPersist.classFullName, PhysicalModel.classFullName);\r\n assert.isTrue(newModelPersist.isPrivate);\r\n assert.deepEqual(newModelPersist.modeledElement.id, modeledElementId);\r\n\r\n // Update the model\r\n newModelPersist.isPrivate = false;\r\n testImodel.models.updateModel(newModelPersist.toJSON());\r\n // ... and check that it updated the model in the db\r\n const newModelPersist2 = testImodel.models.getModel(newModelId);\r\n assert.isFalse(newModelPersist2.isPrivate);\r\n\r\n // Delete the model\r\n testImodel.models.deleteModel(newModelId);\r\n\r\n // Test insertModel error handling\r\n try {\r\n testImodel.models.insertModel({\r\n classFullName: DefinitionModel.classFullName,\r\n modeledElement: { id: \"0x10000000bad\" },\r\n });\r\n } catch (error: any) {\r\n assert.isTrue(error instanceof IModelError || error.iTwinErrorId !== undefined);\r\n }\r\n\r\n });\r\n\r\n it(\"should create model with custom relationship to modeled element\", async () => {\r\n const testImodel = imodel1;\r\n\r\n assert.doesNotThrow(() => testImodel.schemaContext.getSchemaItemSync(\"TestBim:TestModelModelsElement\", EntityClass), \"TestModelModelsElement is expected to be defined in TestBim.ecschema.xml\");\r\n\r\n let newModelId1: Id64String;\r\n let newModelId2: Id64String;\r\n let relClassName1: string | undefined;\r\n let relClassName2: string | undefined;\r\n\r\n if (true) {\r\n const newPartition1 = IModelTestUtils.createAndInsertPhysicalPartition(testImodel, Code.createEmpty());\r\n relClassName1 = \"TestBim:TestModelModelsElement\";\r\n const modeledElementRef = new RelatedElement({ id: newPartition1, relClassName: relClassName1 });\r\n newModelId1 = IModelTestUtils.createAndInsertPhysicalModel(testImodel, modeledElementRef);\r\n assert.isTrue(Id64.isValidId64(newModelId1));\r\n }\r\n\r\n if (true) {\r\n [, newModelId2] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty());\r\n const newModel2 = testImodel.models.getModel(newModelId2);\r\n relClassName2 = newModel2.modeledElement.relClassName;\r\n }\r\n\r\n const model1 = testImodel.models.getModel(newModelId1);\r\n const model2 = testImodel.models.getModel(newModelId2);\r\n\r\n const foundRelClassName1 = model1.modeledElement.relClassName;\r\n const foundRelClassName2 = model2.modeledElement.relClassName;\r\n\r\n assert.equal(foundRelClassName1, relClassName1);\r\n assert.equal(foundRelClassName2, relClassName2);\r\n });\r\n\r\n it(\"should create link table relationship instances\", () => {\r\n const snapshotFile2: string = IModelTestUtils.prepareOutputFile(\"IModel\", \"CreateLinkTable.bim\");\r\n const testImodel = StandaloneDb.createEmpty(snapshotFile2, { rootSubject: { name: \"test1\" }, allowEdit: JSON.stringify({ txns: true }) });\r\n const elements = testImodel.elements;\r\n\r\n // Create a new physical model\r\n const newModelId = PhysicalModel.insert(testImodel, IModel.rootSubjectId, \"TestModel\");\r\n\r\n // create a SpatialCategory\r\n const spatialCategoryId = SpatialCategory.insert(testImodel, IModel.dictionaryId, \"MySpatialCategory\", new SubCategoryAppearance({ color: ColorByName.darkRed }));\r\n\r\n // Create a couple of physical elements.\r\n const elementProps: GeometricElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: newModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n const id0 = elements.insertElement(elementProps);\r\n const id1 = elements.insertElement(elementProps);\r\n const id2 = elements.insertElement(elementProps);\r\n\r\n const geometricModel = testImodel.models.getModel<GeometricModel>(newModelId);\r\n assert.throws(() => geometricModel.queryExtents()); // no geometry\r\n\r\n // Create grouping relationships from 0 to 1 and from 0 to 2\r\n const r1 = ElementGroupsMembers.create(testImodel, id0, id1, 1);\r\n r1.insert();\r\n const r2 = ElementGroupsMembers.create(testImodel, id0, id2);\r\n r2.insert();\r\n\r\n // Look up by id\r\n const g1 = ElementGroupsMembers.getInstance<ElementGroupsMembers>(testImodel, r1.id);\r\n const g2 = ElementGroupsMembers.getInstance<ElementGroupsMembers>(testImodel, r2.id);\r\n\r\n assert.deepEqual(g1.id, r1.id);\r\n assert.equal(g1.classFullName, ElementGroupsMembers.classFullName);\r\n assert.equal(g1.memberPriority, 1, \"g1.memberPriority\");\r\n assert.deepEqual(g2.id, r2.id);\r\n assert.equal(g2.classFullName, ElementGroupsMembers.classFullName);\r\n assert.equal(g2.memberPriority, 0, \"g2.memberPriority\"); // The memberPriority parameter defaults to 0 in ElementGroupsMembers.create\r\n\r\n // Look up by source and target\r\n const g1byst = ElementGroupsMembers.getInstance<ElementGroupsMembers>(testImodel, { sourceId: r1.sourceId, targetId: r1.targetId });\r\n assert.deepEqual(g1byst, g1);\r\n\r\n // Update relationship instance property\r\n r1.asAny.memberPriority = 2;\r\n r1.update();\r\n\r\n const g11 = ElementGroupsMembers.getInstance<ElementGroupsMembers>(testImodel, r1.id);\r\n assert.equal(g11.memberPriority, 2, \"g11.memberPriority\");\r\n testImodel.saveChanges(\"step 1\");\r\n\r\n // Delete relationship instance property\r\n g11.delete();\r\n testImodel.saveChanges(\"step 2\");\r\n assert.throws(() => ElementGroupsMembers.getInstance(testImodel, r1.id), IModelError);\r\n\r\n const d0 = elements.insertElement(elementProps);\r\n const d1 = elements.insertElement(elementProps);\r\n const ede1 = ElementDrivesElement.create(testImodel, d0, d1, 0);\r\n ede1.insert();\r\n testImodel.saveChanges(\"step 3\");\r\n\r\n ede1.delete();\r\n testImodel.saveChanges(\"step 4\");\r\n testImodel.close();\r\n });\r\n\r\n it(\"should insert DefinitionSets\", () => {\r\n const iModelFileName: string = IModelTestUtils.prepareOutputFile(\"IModel\", \"DefinitionSets.bim\");\r\n const iModelDb = SnapshotDb.createEmpty(iModelFileName, { rootSubject: { name: \"DefinitionSets\" }, createClassViews: true });\r\n const definitionContainerId = DefinitionContainer.insert(iModelDb, IModel.dictionaryId, Code.createEmpty());\r\n assert.exists(iModelDb.elements.getElement<DefinitionContainer>(definitionContainerId));\r\n assert.exists(iModelDb.models.getModel<DefinitionModel>(definitionContainerId));\r\n const categoryId1 = SpatialCategory.insert(iModelDb, definitionContainerId, \"Category1\", new SubCategoryAppearance());\r\n const categoryId2 = SpatialCategory.insert(iModelDb, definitionContainerId, \"Category2\", new SubCategoryAppearance());\r\n const categoryId3 = SpatialCategory.insert(iModelDb, definitionContainerId, \"Category3\", new SubCategoryAppearance());\r\n const definitionGroupId = DefinitionGroup.create(iModelDb, definitionContainerId, Code.createEmpty()).insert();\r\n DefinitionGroupGroupsDefinitions.insert(iModelDb, definitionGroupId, categoryId1);\r\n DefinitionGroupGroupsDefinitions.insert(iModelDb, definitionGroupId, categoryId2);\r\n DefinitionGroupGroupsDefinitions.insert(iModelDb, definitionGroupId, categoryId3);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const numMembers = iModelDb.withPreparedStatement(`SELECT COUNT(*) FROM ${DefinitionGroupGroupsDefinitions.classFullName}`, (statement: ECSqlStatement): number => {\r\n return statement.step() === DbResult.BE_SQLITE_ROW ? statement.getValue(0).getInteger() : 0;\r\n });\r\n assert.equal(numMembers, 3);\r\n iModelDb.saveChanges();\r\n iModelDb.close();\r\n });\r\n\r\n it(\"should set EC properties of various types\", async () => {\r\n\r\n const testImodel = imodel1;\r\n assert.doesNotThrow(() => testImodel.schemaContext.getSchemaItemSync(\"TestBim:TestPhysicalObject\", EntityClass), \"TestPhysicalObject is expected to be defined in TestBim.ecschema.xml\");\r\n\r\n // Create a new physical model\r\n const [, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);\r\n\r\n // Find or create a SpatialCategory\r\n let spatialCategoryId = SpatialCategory.queryCategoryIdByName(testImodel, IModel.dictionaryId, \"MySpatialCategory\");\r\n if (undefined === spatialCategoryId) {\r\n spatialCategoryId = SpatialCategory.insert(testImodel, IModel.dictionaryId, \"MySpatialCategory\", new SubCategoryAppearance());\r\n }\r\n\r\n const trelClassName = \"TestBim:TestPhysicalObjectRelatedToTestPhysicalObject\";\r\n\r\n let id1: Id64String;\r\n let id2: Id64String;\r\n\r\n if (true) {\r\n // Create a couple of TestPhysicalObjects\r\n const elementProps: GeometricElementProps = {\r\n classFullName: \"TestBim:TestPhysicalObject\",\r\n model: newModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n id1 = testImodel.elements.insertElement(testImodel.elements.createElement(elementProps).toJSON());\r\n assert.isTrue(Id64.isValidId64(id1));\r\n\r\n // The second one should point to the first.\r\n elementProps.id = Id64.invalid;\r\n (elementProps as any).relatedElement = { id: id1, relClassName: trelClassName };\r\n elementProps.parent = { id: id1, relClassName: trelClassName };\r\n (elementProps as any).longProp = 4294967295; // make sure that we can save values in the range 0 ... UINT_MAX\r\n\r\n id2 = testImodel.elements.insertElement(testImodel.elements.createElement(elementProps).toJSON());\r\n assert.isTrue(Id64.isValidId64(id2));\r\n }\r\n\r\n if (true) {\r\n // Test that el2 points to el1\r\n const el2 = testImodel.elements.getElement(id2);\r\n assert.equal(el2.classFullName, \"TestBim:TestPhysicalObject\");\r\n assert.isTrue(\"relatedElement\" in el2);\r\n assert.isTrue(\"id\" in el2.asAny.relatedElement);\r\n assert.deepEqual(el2.asAny.relatedElement.id, id1);\r\n assert.equal(el2.asAny.longProp, 4294967295);\r\n\r\n // Even though I didn't set it, the platform knows the relationship class and reports it.\r\n assert.isTrue(\"relClassName\" in el2.asAny.relatedElement);\r\n assert.equal(el2.asAny.relatedElement.relClassName.replace(\".\", \":\"), trelClassName);\r\n }\r\n\r\n if (true) {\r\n // Change el2 to point to itself.\r\n const el2Modified = testImodel.elements.getElement(id2);\r\n el2Modified.asAny.relatedElement = { id: id2, relClassName: trelClassName };\r\n testImodel.elements.updateElement(el2Modified.toJSON());\r\n // Test that el2 points to itself.\r\n const el2after: Element = testImodel.elements.getElement(id2);\r\n assert.deepEqual(el2after.asAny.relatedElement.id, id2);\r\n assert.equal(el2after.asAny.relatedElement.relClassName.replace(\".\", \":\"), trelClassName);\r\n }\r\n\r\n if (true) {\r\n // Test that we can null out the navigation property\r\n const el2Modified = testImodel.elements.getElement(id2);\r\n el2Modified.asAny.relatedElement = null;\r\n testImodel.elements.updateElement(el2Modified.toJSON());\r\n // Test that el2 has no relatedElement property value\r\n const el2after: Element = testImodel.elements.getElement(id2);\r\n assert.isUndefined(el2after.asAny.relatedElement);\r\n }\r\n });\r\n\r\n it(\"should be able to create a snapshot IModel\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const iModel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot.bim\"), args);\r\n assert.equal(iModel.iModelId, args.guid);\r\n assert.equal(iModel.rootSubject.name, args.rootSubject.name);\r\n assert.equal(iModel.rootSubject.description, args.rootSubject.description);\r\n assert.equal(iModel.projectExtents.low.x, args.projectExtents.low.x);\r\n assert.equal(iModel.projectExtents.low.y, args.projectExtents.low.y);\r\n assert.equal(iModel.projectExtents.low.z, args.projectExtents.low.z);\r\n assert.equal(iModel.globalOrigin.x, args.globalOrigin.x);\r\n assert.equal(iModel.globalOrigin.y, args.globalOrigin.y);\r\n assert.equal(iModel.globalOrigin.z, 0);\r\n\r\n const client = iModel.queryFilePropertyString({ name: \"Client\", namespace: \"dgn_Db\" });\r\n assert.equal(client, args.client, \"query Client property\");\r\n\r\n const dbguid = iModel.queryFilePropertyBlob({ name: \"DbGuid\", namespace: \"be_Db\" });\r\n assert.equal(dbguid!.byteLength, 16, \"query guid property\");\r\n\r\n const myPropsStr: FilePropertyProps = { name: \"MyProp\", namespace: \"test1\", id: 1, subId: 1 };\r\n const myStrVal = \"this is a test\";\r\n iModel.saveFileProperty(myPropsStr, myStrVal);\r\n const readFromDb = iModel.queryFilePropertyString(myPropsStr);\r\n assert.equal(readFromDb, myStrVal, \"query string after save\");\r\n\r\n const myPropsBlob: FilePropertyProps = { name: \"MyBlob\", namespace: \"test1\", id: 10 };\r\n const testRange = new Uint8Array(500);\r\n testRange.fill(11);\r\n iModel.saveFileProperty(myPropsBlob, undefined, testRange);\r\n const blobFromDb = iModel.queryFilePropertyBlob(myPropsBlob);\r\n assert.deepEqual(blobFromDb, testRange, \"query blob after save\");\r\n\r\n let next = iModel.queryNextAvailableFileProperty(myPropsBlob);\r\n assert.equal(11, next, \"queryNextAvailableFileProperty blob\");\r\n\r\n next = iModel.queryNextAvailableFileProperty(myPropsStr);\r\n assert.equal(2, next, \"queryNextAvailableFileProperty str\");\r\n iModel.deleteFileProperty(myPropsStr);\r\n assert.isUndefined(iModel.queryFilePropertyString(myPropsStr), \"property was deleted\");\r\n next = iModel.queryNextAvailableFileProperty(myPropsStr);\r\n assert.equal(0, next, \"queryNextAvailableFileProperty, should return 0 when none present\");\r\n\r\n const testLocal = \"TestLocal\";\r\n const testValue = \"this is a test\";\r\n const nativeDb = iModel[_nativeDb];\r\n assert.isUndefined(nativeDb.queryLocalValue(testLocal));\r\n nativeDb.saveLocalValue(testLocal, testValue);\r\n assert.equal(nativeDb.queryLocalValue(testLocal), testValue);\r\n\r\n iModel.close();\r\n });\r\n\r\n it(\"should be able to create a snapshot IModel and set geolocation by GCS\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const gcs = new GeographicCRS({\r\n horizontalCRS: {\r\n id: \"10TM115-27\",\r\n description: \"\",\r\n source: \"Mentor Software Client\",\r\n deprecated: false,\r\n datumId: \"NAD27\",\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n centralMeridian: -115,\r\n latitudeOfOrigin: 0,\r\n scaleFactor: 0.9992,\r\n falseEasting: 0.0,\r\n falseNorthing: 0.0,\r\n },\r\n extent: {\r\n southWest: { latitude: 48, longitude: -120.5 },\r\n northEast: { latitude: 84, longitude: -109.5 },\r\n },\r\n },\r\n verticalCRS: { id: \"GEOID\" },\r\n additionalTransform: {\r\n helmert2DWithZOffset: {\r\n translationX: 10.0,\r\n translationY: 15.0,\r\n translationZ: 0.02,\r\n rotDeg: 1.2,\r\n scale: 1.0001,\r\n },\r\n },\r\n });\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot2.bim\");\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n let eventListenedTo = false;\r\n const gcsListener = (previousGCS: GeographicCRS | undefined) => {\r\n assert.equal(previousGCS, undefined);\r\n assert.isTrue(iModel.geographicCoordinateSystem !== undefined);\r\n assert.isTrue(iModel.geographicCoordinateSystem!.equals(gcs));\r\n eventListenedTo = true;\r\n };\r\n iModel.onGeographicCoordinateSystemChanged.addListener(gcsListener);\r\n\r\n assert.isTrue(iModel.geographicCoordinateSystem === undefined);\r\n\r\n assert.isFalse(eventListenedTo);\r\n\r\n iModel.geographicCoordinateSystem = gcs;\r\n\r\n assert.isTrue(eventListenedTo);\r\n\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n iModel.close();\r\n\r\n const iModel2 = SnapshotDb.openFile(testFile);\r\n\r\n assert.isTrue(iModel2.geographicCoordinateSystem !== undefined);\r\n\r\n // The reloaded gcs will be different as the datum definition will have been expanded\r\n assert.isFalse(iModel2.geographicCoordinateSystem!.equals(gcs));\r\n\r\n // But other properties will be identical\r\n assert.isTrue(iModel2.geographicCoordinateSystem !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.verticalCRS !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.verticalCRS!.equals(gcs.verticalCRS!));\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.additionalTransform !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.additionalTransform!.equals(gcs.additionalTransform!));\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.projection !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.projection!.equals(gcs.horizontalCRS!.projection!));\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.id !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.id === gcs.horizontalCRS!.id!);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.extent !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.extent!.equals(gcs.horizontalCRS!.extent!));\r\n\r\n // The following were not in initial definition but were completed after storage.\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.datum !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.datum!.additionalTransformPaths !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.datum!.additionalTransformPaths!.length >= 0);\r\n\r\n // When a gcs is present then the ECEF is automatically defined.\r\n assert.isTrue(iModel2.ecefLocation !== undefined);\r\n\r\n iModel2.close();\r\n });\r\n\r\n describe(\"async coordinate conversions\", () => {\r\n it(\"should output same number of points as input\", async () => {\r\n const iModelCoords: Point3d[] = [];\r\n const geoCoords: Point3d[] = [];\r\n for (let numPts = 0; numPts < 3; numPts++) {\r\n const geoResponse = await imodel5.getGeoCoordinatesFromIModelCoordinates({ target: \"WGS84\", iModelCoords });\r\n expect(geoResponse.geoCoords.length).to.equal(numPts);\r\n\r\n const iModelResponse = await imodel5.getIModelCoordinatesFromGeoCoordinates({ source: \"WGS84\", geoCoords });\r\n expect(iModelResponse.iModelCoords.length).to.equal(numPts);\r\n\r\n iModelCoords.push(new Point3d());\r\n geoCoords.push(new Point3d());\r\n }\r\n });\r\n\r\n it(\"should always have fromCache = 0\", async () => {\r\n const iModelCoords: Point3d[] = [];\r\n const geoCoords: Point3d[] = [];\r\n for (let numPts = 0; numPts < 3; numPts++) {\r\n const geoResponse = await imodel5.getGeoCoordinatesFromIModelCoordinates({ target: \"WGS84\", iModelCoords });\r\n expect(geoResponse.fromCache).to.equal(0);\r\n\r\n const iModelResponse = await imodel5.getIModelCoordinatesFromGeoCoordinates({ source: \"WGS84\", geoCoords });\r\n expect(iModelResponse.iModelCoords.length).to.equal(numPts);\r\n expect(iModelResponse.fromCache).to.equal(0);\r\n\r\n iModelCoords.push(new Point3d());\r\n geoCoords.push(new Point3d());\r\n }\r\n });\r\n });\r\n\r\n if (!ProcessDetector.isIOSAppBackend) {\r\n it(\"should be able to reproject with iModel coordinates to or from any other GeographicCRS\", async () => {\r\n const convertTest = async (fileName: string, fileGCS: GeographicCRSProps, datum: string | GeographicCRSProps, inputCoord: XYZProps, outputCoord: PointWithStatus) => {\r\n\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test project\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 0.0, y: 0.0 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n let datumOrGCS: string;\r\n if (typeof datum === \"object\")\r\n datumOrGCS = JSON.stringify(datum);\r\n else\r\n datumOrGCS = datum;\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", fileName);\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n iModel.setGeographicCoordinateSystem(fileGCS);\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n\r\n const testPoint1: XYZProps[] = [];\r\n testPoint1.push(inputCoord);\r\n const requestProps1: GeoCoordinatesRequestProps = { target: datumOrGCS, iModelCoords: testPoint1 };\r\n const response1 = await iModel.getGeoCoordinatesFromIModelCoordinates(requestProps1);\r\n\r\n expect(response1.geoCoords[0].s === outputCoord.s).to.be.true;\r\n\r\n // If success or warning we compare result\r\n if (outputCoord.s === GeoCoordStatus.Success || outputCoord.s === GeoCoordStatus.OutOfUsefulRange) {\r\n\r\n const expectedPt1 = Point3d.fromJSON(outputCoord.p);\r\n const outPt1 = Point3d.fromJSON(response1.geoCoords[0].p);\r\n\r\n expect(Geometry.isSamePoint3dXY(expectedPt1, outPt1)).to.be.true;\r\n expect(Math.abs(expectedPt1.z - outPt1.z) < 0.0001).to.be.true;\r\n\r\n // No point testing reversal when Out of useful range since reversibility is doubtful\r\n if (outputCoord.s !== GeoCoordStatus.OutOfUsefulRange) {\r\n const testPoint2: XYZProps[] = [];\r\n testPoint2.push(outputCoord.p);\r\n const requestProps2: IModelCoordinatesRequestProps = { source: datumOrGCS, geoCoords: testPoint2 };\r\n const response2 = await iModel.getIModelCoordinatesFromGeoCoordinates(requestProps2);\r\n\r\n const expectedPt2 = Point3d.fromJSON(inputCoord);\r\n const outPt2 = Point3d.fromJSON(response2.iModelCoords[0].p);\r\n\r\n expect(expectedPt2.distanceXY(outPt2) < 0.001).to.be.true;\r\n expect(Math.abs(expectedPt2.z - outPt2.z) < 0.001).to.be.true;\r\n }\r\n }\r\n\r\n iModel.close();\r\n };\r\n\r\n const EWRGCS: GeographicCRSProps = {\r\n horizontalCRS: {\r\n id: \"EPSG:27700\",\r\n description: \"OSGB 1936 / British National Grid\",\r\n source: \"EPSG V6 [Large and medium scale topographic mapping and engin]\",\r\n datumId: \"EPSG:6277\",\r\n datum: {\r\n id: \"EPSG:6277\",\r\n description: \"OSGB36 - Use OSGB-7P-2. Consider OSGB/OSTN15 instead\",\r\n deprecated: true,\r\n source: \"EPSG V6.12 operation EPSG:1314 [EPSG]\",\r\n ellipsoidId: \"EPSG:7001\",\r\n ellipsoid: {\r\n equatorialRadius: 6377563.396,\r\n polarRadius: 6356256.909237,\r\n id: \"EPSG:7001\",\r\n description: \"Airy 1830\",\r\n source: \"EPSG, Version 6 [EPSG]\",\r\n },\r\n transforms: [\r\n {\r\n method: \"PositionalVector\",\r\n sourceEllipsoid: {\r\n equatorialRadius: 6377563.396,\r\n polarRadius: 6356256.909237,\r\n id: \"EPSG:7001\",\r\n },\r\n targetEllipsoid: {\r\n equatorialRadius: 6378137,\r\n polarRadius: 6356752.3142,\r\n id: \"WGS84\",\r\n },\r\n positionalVector: {\r\n delta: {\r\n x: 446.448,\r\n y: -125.157,\r\n z: 542.06,\r\n },\r\n rotation: {\r\n x: 0.15,\r\n y: 0.247,\r\n z: 0.842,\r\n },\r\n scalePPM: -20.489,\r\n },\r\n }],\r\n },\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n falseEasting: 400000,\r\n falseNorthing: -100000,\r\n centralMeridian: -2,\r\n latitudeOfOrigin: 49,\r\n scaleFactor: 0.999601272737422,\r\n },\r\n extent: {\r\n southWest: {\r\n latitude: 49.96,\r\n longitude: -7.56,\r\n },\r\n northEast: {\r\n latitude: 60.84,\r\n longitude: 1.78,\r\n },\r\n },\r\n },\r\n verticalCRS: {\r\n id: \"ELLIPSOID\",\r\n },\r\n additionalTransform: {\r\n helmert2DWithZOffset: {\r\n translationX: 284597.3343,\r\n translationY: 79859.4651,\r\n translationZ: 0,\r\n rotDeg: 0.5263624458992088,\r\n scale: 0.9996703340508721,\r\n },\r\n },\r\n };\r\n\r\n await convertTest(\"ExtonCampus1.bim\", { horizontalCRS: { id: \"EPSG:2272\" }, verticalCRS: { id: \"NAVD88\" } }, \"WGS84\", { x: 775970.3155166894, y: 83323.24543981979, z: 130.74977547686285 }, { p: { x: -75.68712011112366, y: 40.06524845273591, z: 95.9769083 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"UTM83-10-NGVD29-10.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NAVD88\" } }, { horizontalCRS: { id: \"UTM27-10\" }, verticalCRS: { id: \"NGVD29\" } }, { x: 548296.472, y: 4179414.470, z: 0.8457 }, { p: { x: 548392.9689991799, y: 4179217.683834238, z: -0.0006774162750405877 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"BritishNatGrid-EllipsoidHelmert1.bim\", EWRGCS, \"WGS84\", { x: 199247.08883859176, y: 150141.68625139236, z: 0.0 }, { p: { x: -0.80184489371471, y: 51.978341907041205, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"BritishNatGrid-Ellipsoid1.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"\", { x: 170370.718, y: 11572.405, z: 0.0 }, { p: { x: -5.2020119082059511, y: 49.959453295440234, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"BritishNatGrid-Ellipsoid2.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"ETRF89\", { x: 170370.718, y: 11572.405, z: 0.0 }, { p: { x: -5.2030365061523707, y: 49.960007477936202, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"BritishNatGrid-Ellipsoid3.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"OSGB\", { x: 170370.718, y: 11572.405, z: 0.0 }, { p: { x: -5.2020119082059511, y: 49.959453295440234, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"GermanyDHDN-3-Ellipsoid1.bim\", { horizontalCRS: { id: \"DHDN/3.GK3d-4/EN\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"\", { x: 4360857.005, y: 5606083.067, z: 0.0 }, { p: { x: 10.035413954488630, y: 50.575070810112159, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"GermanyDHDN-3-Ellipsoid2.bim\", { horizontalCRS: { id: \"DHDN/3.GK3d-4/EN\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"DHDN/3\", { x: 4360857.005, y: 5606083.067, z: 0.0 }, { p: { x: 10.035413954488630, y: 50.575070810112159, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"GermanyDHDN-3-Ellipsoid3.bim\", { horizontalCRS: { id: \"DHDN/3.GK3d-4/EN\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"WGS84\", { x: 4360857.005, y: 5606083.067, z: 0.0 }, { p: { x: 10.034215937440818, y: 50.573862480894853, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-1.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, \"\", { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-2.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, \"NAD83\", { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: -30.12668428839329 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-3.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, \"WGS84\", { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: -30.12668428839329 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM27-10-Ellipsoid1.bim\", { horizontalCRS: { id: \"UTM27-10\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"\", { x: 623075.328, y: 4265650.532, z: 0.0 }, { p: { x: -121.58798236995744, y: 38.532616292207997, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM27-10-Ellipsoid2.bim\", { horizontalCRS: { id: \"UTM27-10\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"NAD83\", { x: 623075.328, y: 4265650.532, z: 0.0 }, { p: { x: -121.58905088839697, y: 38.532522753851708, z: 0.0 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"UTM83-10-NGVD29-4.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"LL84\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: -30.12668428839329 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"UTM83-10-NGVD29-5.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"LL84\" }, verticalCRS: { id: \"GEOID\" } }, { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: 0.7621583779125531 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-6.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"CA83-II\" }, verticalCRS: { id: \"NAVD88\" } }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.745910484422781 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-7.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"CA83-II\" }, verticalCRS: { id: \"GEOID\" } }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.745910484422781 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-8.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"CA83-II\" }, verticalCRS: { id: \"NGVD29\" } }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-9.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { epsg: 26942 }, verticalCRS: { id: \"NAVD88\" } }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.745910484422781 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-10.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NAVD88\" } }, { horizontalCRS: { id: \"UTM27-10\" }, verticalCRS: { id: \"NGVD29\" } }, { x: 548296.472, y: 4179414.470, z: 0.8457 }, { p: { x: 548392.9689991799, y: 4179217.683834238, z: -0.0006774162750405877 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"BritishNatGrid-Ellipsoid4.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"HS2_Snake_2015\" }, verticalCRS: { id: \"GEOID\" } }, { x: 473327.251, y: 257049.636, z: 0.0 }, { p: { x: 237732.58101946692, y: 364048.01547843055, z: -47.874172425966336 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"BritishNatGrid-Ellipsoid5.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } },\r\n {\r\n horizontalCRS: {\r\n id: \"HS2-MOCK\",\r\n description: \"USES CUSTOM DATUM\",\r\n source: \"Test\",\r\n deprecated: false,\r\n datumId: \"HS2SD_2015\",\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n centralMeridian: -1.5,\r\n latitudeOfOrigin: 52.30,\r\n scaleFactor: 1.0,\r\n falseEasting: 198873.0046,\r\n falseNorthing: 375064.3871,\r\n },\r\n },\r\n verticalCRS: {\r\n id: \"GEOID\",\r\n },\r\n }\r\n , { x: 473327.251, y: 257049.636, z: 0.0 }, { p: { x: 237732.58101952373, y: 364048.01548327296, z: -47.874172425966336 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"BritishNatGrid-Ellipsoid.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"OSGB-GPS-2015\" }, verticalCRS: { id: \"GEOID\" } }, { x: 473327.251, y: 257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"UTM83-10-NGVD29-12.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } },\r\n {\r\n horizontalCRS: {\r\n id: \"California2\",\r\n description: \"USES CUSTOM DATUM\",\r\n source: \"Test\",\r\n deprecated: false,\r\n datumId: \"NAD83\",\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"LambertConformalConicTwoParallels\",\r\n longitudeOfOrigin: -122,\r\n latitudeOfOrigin: 37.66666666667,\r\n standardParallel1: 39.833333333333336,\r\n standardParallel2: 38.333333333333336,\r\n falseEasting: 2000000.0,\r\n falseNorthing: 500000.0,\r\n },\r\n extent: {\r\n southWest: {\r\n latitude: 35,\r\n longitude: -125,\r\n },\r\n northEast: {\r\n latitude: 39.1,\r\n longitude: -120.45,\r\n },\r\n },\r\n },\r\n verticalCRS: {\r\n id: \"GEOID\",\r\n },\r\n }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.745910484422781 }, s: GeoCoordStatus.Success });\r\n\r\n // Do some test that return errors\r\n // First test uses one GCS in Eastern USA and the other in UK. This will produce a hard domain error\r\n await convertTest(\"Error1.bim\", { horizontalCRS: { id: \"UTM84-17N\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"OSGB-GPS-2015\" }, verticalCRS: { id: \"GEOID\" } }, { x: 1473327.251, y: 1257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.OutOfMathematicalDomain });\r\n\r\n // This test performs conversion in a region outside normal use of GCS but still mathematically valid (soft domain error)\r\n await convertTest(\"Error2.bim\", { horizontalCRS: { id: \"DanishS34-S99\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"\", { x: -6618.5925260757449, y: 36058.097489683532, z: 0.0 }, { p: { x: 13.53250346041385, y: 54.71216475341563, z: 0.0 }, s: GeoCoordStatus.OutOfUsefulRange });\r\n // -6618.5925260757449, 36058.097489683532\r\n // { x: -221748.034, y: -10012.784, z: 0.0 } { p: { x: 10.36481105, y: 54.38462506, z: 0.0 }\r\n // This test makes use of a GCS using a grid file that does not even exist and will return a datum conversion error.\r\n const userGCSWithinexistentGridFile: GeographicCRSProps = {\r\n horizontalCRS: {\r\n id: \"User1\",\r\n datumId: \"UserDatum1\",\r\n datum: {\r\n id: \"UserDatum1\",\r\n ellipsoidId: \"CLRK66\",\r\n transforms: [\r\n {\r\n method: \"GridFiles\",\r\n sourceEllipsoid: {\r\n id: \"CLRK66\",\r\n equatorialRadius: 6378160.0,\r\n polarRadius: 6356774.719195306,\r\n },\r\n targetEllipsoid: {\r\n id: \"WGS84\",\r\n equatorialRadius: 6378160.0,\r\n polarRadius: 6356774.719195306,\r\n },\r\n gridFile: {\r\n files: [\r\n { fileName: \"./user/inexistent.gdc\", format: \"NTv2\", direction: \"Direct\" },\r\n ],\r\n },\r\n },\r\n ],\r\n },\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n centralMeridian: -115,\r\n latitudeOfOrigin: 0,\r\n scaleFactor: 0.9992,\r\n falseEasting: 1.0,\r\n falseNorthing: 2.0,\r\n },\r\n extent: {\r\n southWest: { latitude: 48, longitude: -120.5 },\r\n northEast: { latitude: 84, longitude: -109.5 },\r\n },\r\n }, verticalCRS: { id: \"ELLIPSOID\" },\r\n };\r\n\r\n await convertTest(\"Error3.bim\", userGCSWithinexistentGridFile, \"WGS84\", { x: 1473327.251, y: 1257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.NoDatumConverter });\r\n\r\n // The model GCS is not valid\r\n await convertTest(\"Error4.bim\", { horizontalCRS: { id: \"badfood\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"OSGB-GPS-2015\" }, verticalCRS: { id: \"GEOID\" } }, { x: 1473327.251, y: 1257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.NoGCSDefined });\r\n\r\n // The given GCS is not valid\r\n await convertTest(\"Error5.bim\", { horizontalCRS: { id: \"UTM84-17N\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"badfood\" }, verticalCRS: { id: \"GEOID\" } }, { x: 1473327.251, y: 1257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.NoGCSDefined });\r\n\r\n });\r\n }\r\n\r\n it(\"should be able to create a snapshot IModel and set geolocation by ECEF\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const ecef = new EcefLocation({\r\n origin: [42, 21, 0],\r\n orientation: { yaw: 1, pitch: 1, roll: -1 },\r\n });\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot3.bim\");\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n assert.isTrue(iModel.ecefLocation === undefined);\r\n\r\n iModel.ecefLocation = ecef;\r\n\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n iModel.close();\r\n\r\n const iModel2 = SnapshotDb.openFile(testFile);\r\n\r\n assert.isTrue(iModel2.ecefLocation !== undefined);\r\n assert.isTrue(iModel2.ecefLocation!.isAlmostEqual(ecef));\r\n\r\n iModel2.close();\r\n });\r\n\r\n it(\"should be able to create a snapshot IModel and set geolocation by ECEF with 0,0,0 rotation\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const ecef = new EcefLocation({\r\n origin: [42, 21, 0],\r\n orientation: { yaw: 0, pitch: 0, roll: 0 },\r\n });\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot3_000.bim\");\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n assert.isTrue(iModel.ecefLocation === undefined);\r\n\r\n iModel.ecefLocation = ecef;\r\n\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n iModel.close();\r\n\r\n const iModel2 = SnapshotDb.openFile(testFile);\r\n\r\n assert.isTrue(iModel2.ecefLocation !== undefined);\r\n assert.isTrue(iModel2.ecefLocation!.isAlmostEqual(ecef));\r\n\r\n iModel2.close();\r\n });\r\n\r\n it(\"presence of a GCS imposes the ecef value\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const gcs = new GeographicCRS({\r\n horizontalCRS: {\r\n id: \"10TM115-27\",\r\n description: \"\",\r\n source: \"Mentor Software Client\",\r\n deprecated: false,\r\n datumId: \"NAD27\",\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n centralMeridian: -115,\r\n latitudeOfOrigin: 0,\r\n scaleFactor: 0.9992,\r\n falseEasting: 0.0,\r\n falseNorthing: 0.0,\r\n },\r\n extent: {\r\n southWest: { latitude: 48, longitude: -120.5 },\r\n northEast: { latitude: 84, longitude: -109.5 },\r\n },\r\n },\r\n verticalCRS: { id: \"GEOID\" },\r\n additionalTransform: {\r\n helmert2DWithZOffset: {\r\n translationX: 10.0,\r\n translationY: 15.0,\r\n translationZ: 0.02,\r\n rotDeg: 1.2,\r\n scale: 1.0001,\r\n },\r\n },\r\n });\r\n\r\n const ecef = new EcefLocation({\r\n origin: [42, 21, 0],\r\n orientation: { yaw: 1, pitch: 1, roll: -1 },\r\n });\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot4.bim\");\r\n\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n iModel.ecefLocation = ecef;\r\n\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n iModel.close();\r\n\r\n const iModel2 = SnapshotDb.openForApplyChangesets(testFile);\r\n\r\n assert.isTrue(iModel2.ecefLocation !== undefined);\r\n assert.isTrue(iModel2.ecefLocation!.isAlmostEqual(ecef));\r\n\r\n assert.isTrue(iModel2.geographicCoordinateSystem === undefined);\r\n\r\n iModel2.geographicCoordinateSystem = gcs;\r\n\r\n iModel2.updateIModelProps();\r\n iModel2.saveChanges();\r\n iModel2.close();\r\n\r\n const iModel3 = SnapshotDb.openFile(testFile);\r\n\r\n assert.isTrue(iModel3.geographicCoordinateSystem !== undefined);\r\n\r\n // When a gcs is present then ecef value is imposed by the gcs disregarding previous value.\r\n assert.isTrue(iModel3.ecefLocation !== undefined);\r\n assert.isFalse(iModel3.ecefLocation!.isAlmostEqual(ecef));\r\n\r\n iModel3.close();\r\n });\r\n\r\n it(\"should be able to open checkpoints for RPC\", async () => {\r\n const changeset: ChangesetIdWithIndex = { id: \"fakeChangeSetId\", index: 10 };\r\n const iTwinId = \"fakeIModelId\";\r\n const iModelId = \"fakeIModelId\";\r\n const cloudContainer = { accessToken: \"sas\" };\r\n const fakeSnapshotDb: any =\r\n {\r\n cloudContainer,\r\n isReadonly: () => true,\r\n isOpen: () => true,\r\n getIModelId: () => iModelId,\r\n getITwinId: () => iTwinId,\r\n getCurrentChangeset: () => changeset,\r\n setIModelDb: () => { },\r\n closeFile: () => { },\r\n clearECDbCache: () => { },\r\n };\r\n\r\n const errorLogStub = sinon.stub(Logger, \"logError\").callsFake(() => { });\r\n const infoLogStub = sinon.stub(Logger, \"logInfo\").callsFake(() => { });\r\n\r\n // Mock iModelHub\r\n const mockCheckpointV2: V2CheckpointAccessProps = {\r\n accountName: \"testAccount\",\r\n containerId: \"imodelblocks-123\",\r\n sasToken: \"testSAS\",\r\n dbName: \"testDb\",\r\n storageType: \"azure?sas=1\",\r\n };\r\n\r\n sinon.stub(IModelHost, _hubAccess).get(() => HubMock);\r\n sinon.stub(V2CheckpointManager, \"attach\").callsFake(async () => {\r\n return { dbName: \"fakeDb\", container: { accessToken: \"sas\" } as any };\r\n });\r\n const queryStub = sinon.stub(IModelHost[_hubAccess], \"queryV2Checkpoint\").callsFake(async () => mockCheckpointV2);\r\n\r\n const openDgnDbStub = sinon.stub(SnapshotDb, \"openDgnDb\").returns(fakeSnapshotDb);\r\n sinon.stub(IModelDb.prototype, \"initializeIModelDb\" as any);\r\n sinon.stub(IModelDb.prototype, \"loadIModelSettings\" as any);\r\n\r\n const accessToken = \"token\";\r\n const checkpoint = await SnapshotDb.openCheckpointFromRpc({ accessToken, iTwinId, iModelId, changeset });\r\n expect(openDgnDbStub.calledOnce).to.be.true;\r\n expect(openDgnDbStub.firstCall.firstArg.path).to.equal(\"fakeDb\");\r\n\r\n const props = checkpoint.getRpcProps();\r\n assert.equal(props.iModelId, iModelId);\r\n assert.equal(props.iTwinId, iTwinId);\r\n assert.equal(props.changeset?.id, changeset.id);\r\n assert.equal(errorLogStub.callCount, 1);\r\n assert.include(errorLogStub.args[0][1], \"attached with timestamp that expires before\");\r\n\r\n errorLogStub.resetHistory();\r\n expect(cloudContainer.accessToken).equal(\"sas\");\r\n await checkpoint.refreshContainerForRpc(accessToken);\r\n expect(cloudContainer.accessToken).equal(\"testSAS\");\r\n\r\n assert.equal(errorLogStub.callCount, 1);\r\n assert.include(errorLogStub.args[0][1], \"attached with timestamp that expires before\");\r\n assert.equal(infoLogStub.callCount, 2);\r\n assert.include(infoLogStub.args[0][1], \"attempting to refresh\");\r\n assert.include(infoLogStub.args[1][1], \"refreshed checkpoint\");\r\n\r\n errorLogStub.resetHistory();\r\n queryStub.callsFake(async () => {\r\n throw new Error(\"no checkpoint\");\r\n });\r\n await expect(checkpoint.refreshContainerForRpc(accessToken)).to.eventually.be.rejectedWith(\"no checkpoint\");\r\n\r\n checkpoint.close();\r\n });\r\n\r\n it(\"should throw for missing/invalid checkpoint in hub\", async () => {\r\n process.env.CHECKPOINT_CACHE_DIR = \"/foo/\";\r\n sinon.stub(IModelHost, _hubAccess).get(() => HubMock);\r\n sinon.stub(IModelHost[_hubAccess], \"queryV2Checkpoint\").callsFake(async () => undefined);\r\n\r\n const accessToken = \"token\";\r\n const error = await getIModelError(SnapshotDb.openCheckpointFromRpc({ accessToken, iTwinId: Guid.createValue(), iModelId: Guid.createValue(), changeset: IModelTestUtils.generateChangeSetId() }));\r\n expectIModelError(IModelStatus.NotFound, error);\r\n });\r\n\r\n it(\"attempting to re-attach a non-checkpoint snapshot should be a no-op\", async () => {\r\n process.env.CHECKPOINT_CACHE_DIR = \"/foo/\";\r\n const accessToken = \"token\";\r\n await imodel1.refreshContainerForRpc(accessToken);\r\n });\r\n\r\n function hasClassView(db: IModelDb, name: string): boolean {\r\n try {\r\n return db.withSqliteStatement(`SELECT ECInstanceId FROM [${name}]`, (): boolean => true, false);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n it(\"Check busyTimeout option\", () => {\r\n const standaloneFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"StandaloneReadWrite.bim\");\r\n const tryOpen = (fileName: string, options?: SnapshotDbOpenArgs) => {\r\n const start = performance.now();\r\n let didThrow = false;\r\n try {\r\n StandaloneDb.openFile(fileName, OpenMode.ReadWrite, options);\r\n } catch (e: any) {\r\n assert.strictEqual(e.errorNumber, DbResult.BE_SQLITE_BUSY, \"Expect error 'Db is busy'\");\r\n didThrow = true;\r\n }\r\n assert.isTrue(didThrow);\r\n return performance.now() - start;\r\n };\r\n const seconds = (s: number) => s * 1000;\r\n\r\n const db = StandaloneDb.createEmpty(standaloneFile, { rootSubject: { name: \"Standalone\" } });\r\n db.saveChanges();\r\n // lock db so another connection cannot write to it.\r\n db.saveFileProperty({ name: \"test\", namespace: \"test\" }, \"\");\r\n\r\n assert.isAtMost(tryOpen(standaloneFile, { busyTimeout: seconds(0) }), seconds(1), \"open should fail with busy error instantly\");\r\n assert.isAtLeast(tryOpen(standaloneFile, { busyTimeout: seconds(1) }), seconds(1), \"open should fail with atleast 1 sec delay due to retry\");\r\n assert.isAtLeast(tryOpen(standaloneFile, { busyTimeout: seconds(2) }), seconds(2), \"open should fail with atleast 2 sec delay due to retry\");\r\n assert.isAtLeast(tryOpen(standaloneFile, { busyTimeout: seconds(3) }), seconds(3), \"open should fail with atleast 3 sec delay due to retry\");\r\n\r\n db.abandonChanges();\r\n db.close();\r\n });\r\n\r\n it(\"Cache cleared on abandonChanges\", () => {\r\n const standaloneFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"StandaloneReadWrite.bim\");\r\n const db = StandaloneDb.createEmpty(standaloneFile, { rootSubject: { name: \"Standalone\" } });\r\n db.saveChanges();\r\n\r\n const code = Code.createEmpty();\r\n code.value = \"foo\";\r\n const props: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n const id = db.elements.insertElement(props);\r\n const element1 = db.elements.getElementProps(id);\r\n db.abandonChanges();\r\n\r\n code.value = \"bar\";\r\n const props2: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n const id2 = db.elements.insertElement(props2);\r\n expect(id2).to.equal(id);\r\n const element2 = db.elements.getElementProps(id2);\r\n expect(element2).to.not.equal(element1);\r\n\r\n // Make sure that the statement caches are not cleared\r\n expect((db as any)._sqliteStatementCache.size).to.be.greaterThan(0);\r\n expect((db as any)._statementCache.size).to.be.greaterThan(0);\r\n\r\n db.abandonChanges();\r\n db.close();\r\n });\r\n\r\n it(\"Standalone iModel properties\", () => {\r\n const standaloneRootSubjectName = \"Standalone\";\r\n const standaloneFile1 = IModelTestUtils.prepareOutputFile(\"IModel\", \"Standalone1.bim\");\r\n const ecefLocation = new EcefLocation({ origin: [1, 2, 3], orientation: { yaw: 0, pitch: 0, roll: 0 } })\r\n const geographicCoordinateSystem = {\r\n horizontalCRS: { id: \"10TM115-27\" },\r\n }\r\n let standaloneDb1 = StandaloneDb.createEmpty(standaloneFile1, { rootSubject: { name: standaloneRootSubjectName }, ecefLocation, geographicCoordinateSystem });\r\n assert.isTrue(standaloneDb1.isStandaloneDb());\r\n assert.isTrue(standaloneDb1.isStandalone);\r\n assert.isFalse(standaloneDb1.isReadonly, \"Expect standalone iModels to be read-write during create\");\r\n assert.equal(standaloneDb1.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(standaloneDb1.pathName, standaloneFile1);\r\n assert.equal(standaloneDb1, StandaloneDb.tryFindByKey(standaloneDb1.key), \"Should be in the list of open StandaloneDbs\");\r\n assert.equal(standaloneDb1.elements.getRootSubject().code.value, standaloneRootSubjectName);\r\n assert.isTrue(standaloneDb1.isOpen);\r\n assert.isTrue(Guid.isV4Guid(standaloneDb1.iModelId));\r\n assert.equal(standaloneDb1.iTwinId, Guid.empty);\r\n assert.strictEqual(\"\", standaloneDb1.changeset.id);\r\n assert.strictEqual(0, standaloneDb1.changeset.index);\r\n assert.deepEqual(standaloneDb1.ecefLocation?.origin, ecefLocation.origin, \"standalone ecefLocation should be set\");\r\n assert.strictEqual(standaloneDb1.geographicCoordinateSystem?.horizontalCRS?.id, \"10TM115-27\", \"standalone coordinate system should be set\");\r\n assert.equal(standaloneDb1.openMode, OpenMode.ReadWrite);\r\n standaloneDb1.close();\r\n assert.isFalse(standaloneDb1.isOpen);\r\n standaloneDb1.close(); // calling `close()` a second time is a no-op\r\n assert.isUndefined(StandaloneDb.tryFindByKey(standaloneDb1.key));\r\n standaloneDb1 = StandaloneDb.openFile(standaloneFile1);\r\n assert.equal(standaloneDb1, StandaloneDb.tryFindByKey(standaloneDb1.key));\r\n assert.isFalse(standaloneDb1.isReadonly, \"By default, StandaloneDbs are opened read/write\");\r\n standaloneDb1.close();\r\n assert.isUndefined(StandaloneDb.tryFindByKey(standaloneDb1.key));\r\n });\r\n\r\n it(\"Snapshot iModel properties\", async () => {\r\n const snapshotRootSubjectName = \"Snapshot\";\r\n const snapshotFile1 = IModelTestUtils.prepareOutputFile(\"IModel\", \"Snapshot1.bim\");\r\n const snapshotFile2 = IModelTestUtils.prepareOutputFile(\"IModel\", \"Snapshot2.bim\");\r\n const snapshotFile3 = IModelTestUtils.prepareOutputFile(\"IModel\", \"Snapshot3.bim\");\r\n const imodel = await generateTestSnapshot(\"test_for_snapshot.bim\", \"test.bim\");\r\n const ecefLocation = new EcefLocation({ origin: [1, 2, 3], orientation: { yaw: 0, pitch: 0, roll: 0 } })\r\n const geographicCoordinateSystem = {\r\n horizontalCRS: { id: \"10TM115-27\" },\r\n }\r\n let snapshotDb1 = SnapshotDb.createEmpty(snapshotFile1, { rootSubject: { name: snapshotRootSubjectName }, createClassViews: true, ecefLocation, geographicCoordinateSystem });\r\n let snapshotDb2 = SnapshotDb.createFrom(snapshotDb1, snapshotFile2);\r\n let snapshotDb3 = SnapshotDb.createFrom(imodel, snapshotFile3, { createClassViews: true });\r\n assert.isTrue(snapshotDb1.isSnapshotDb());\r\n assert.isTrue(snapshotDb2.isSnapshotDb());\r\n assert.isTrue(snapshotDb3.isSnapshotDb());\r\n assert.isTrue(snapshotDb1.isSnapshot);\r\n assert.isTrue(snapshotDb2.isSnapshot);\r\n assert.isTrue(snapshotDb3.isSnapshot);\r\n assert.isFalse(snapshotDb1.isReadonly, \"Expect snapshots to be read-write during create\");\r\n assert.isFalse(snapshotDb2.isReadonly, \"Expect snapshots to be read-write during create\");\r\n assert.isFalse(snapshotDb3.isReadonly, \"Expect snapshots to be read-write during create\");\r\n assert.equal(snapshotDb1.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(snapshotDb2.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(snapshotDb3.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(imodel.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(snapshotDb1.pathName, snapshotFile1);\r\n assert.equal(snapshotDb2.pathName, snapshotFile2);\r\n assert.equal(snapshotDb3.pathName, snapshotFile3);\r\n assert.equal(snapshotDb1, SnapshotDb.tryFindByKey(snapshotDb1.key));\r\n assert.equal(snapshotDb2, SnapshotDb.tryFindByKey(snapshotDb2.key));\r\n assert.equal(snapshotDb3, SnapshotDb.tryFindByKey(snapshotDb3.key));\r\n const iModelGuid1: GuidString = snapshotDb1.iModelId;\r\n const iModelGuid2: GuidString = snapshotDb2.iModelId;\r\n const iModelGuid3: GuidString = snapshotDb3.iModelId;\r\n assert.notEqual(iModelGuid1, iModelGuid2, \"Expect different iModel GUIDs for each snapshot\");\r\n assert.notEqual(iModelGuid2, iModelGuid3, \"Expect different iModel GUIDs for each snapshot\");\r\n const rootSubjectName1 = snapshotDb1.elements.getRootSubject().code.value;\r\n const rootSubjectName2 = snapshotDb2.elements.getRootSubject().code.value;\r\n const rootSubjectName3 = snapshotDb3.elements.getRootSubject().code.value;\r\n const imodelRootSubjectName = imodel.elements.getRootSubject().code.value;\r\n assert.equal(rootSubjectName1, snapshotRootSubjectName);\r\n assert.equal(rootSubjectName1, rootSubjectName2, \"Expect a snapshot to maintain the root Subject name from its seed\");\r\n assert.equal(rootSubjectName3, imodelRootSubjectName, \"Expect a snapshot to maintain the root Subject name from its seed\");\r\n assert.isTrue(snapshotDb1.isOpen);\r\n assert.isTrue(snapshotDb2.isOpen);\r\n assert.isTrue(snapshotDb3.isOpen);\r\n assert.deepEqual(snapshotDb1.ecefLocation?.origin, ecefLocation.origin, \"snapshot ecefLocation should be set\");\r\n assert.strictEqual(snapshotDb1.geographicCoordinateSystem?.horizontalCRS?.id, \"10TM115-27\", \"snapshot coordinate system should be set\");\r\n snapshotDb1.close();\r\n snapshotDb2.close();\r\n snapshotDb3.close();\r\n assert.isFalse(snapshotDb1.isOpen);\r\n assert.isFalse(snapshotDb2.isOpen);\r\n assert.isFalse(snapshotDb3.isOpen);\r\n snapshotDb1.close(); // calling `close()` a second time is a no-op\r\n snapshotDb2.close(); // calling `close()` a second time is a no-op\r\n snapshotDb3.close(); // calling `close()` a second time is a no-op\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb1.key));\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb2.key));\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb3.key));\r\n snapshotDb1 = SnapshotDb.openFile(snapshotFile1);\r\n snapshotDb2 = SnapshotDb.openFile(snapshotFile2);\r\n snapshotDb3 = SnapshotDb.openFile(snapshotFile3);\r\n assert.equal(snapshotDb1, SnapshotDb.tryFindByKey(snapshotDb1.key));\r\n assert.equal(snapshotDb2, SnapshotDb.tryFindByKey(snapshotDb2.key));\r\n assert.equal(snapshotDb3, SnapshotDb.tryFindByKey(snapshotDb3.key));\r\n assert.equal(snapshotDb3, SnapshotDb.findByKey(snapshotDb3.key));\r\n assert.equal(snapshotDb3, IModelDb.findByKey(snapshotDb3.key));\r\n assert.throws(() => BriefcaseDb.findByKey(snapshotDb1.key)); // lookup of key for SnapshotDb via BriefcaseDb should throw\r\n assert.throws(() => StandaloneDb.findByKey(snapshotDb1.key)); // likewise for StandaloneDb\r\n assert.isTrue(snapshotDb1.isReadonly, \"Expect snapshots to be read-only after open\");\r\n assert.isTrue(snapshotDb2.isReadonly, \"Expect snapshots to be read-only after open\");\r\n assert.isTrue(snapshotDb3.isReadonly, \"Expect snapshots to be read-only after open\");\r\n assert.isTrue(hasClassView(snapshotDb1, \"bis.Element\"));\r\n assert.isTrue(hasClassView(snapshotDb1, \"bis.ElementAspect\"));\r\n assert.isTrue(hasClassView(snapshotDb1, \"bis.Model\"));\r\n assert.isTrue(hasClassView(snapshotDb1, \"bis.ElementRefersToElements\"));\r\n assert.isFalse(hasClassView(snapshotDb2, \"bis.Element\"));\r\n assert.isTrue(hasClassView(snapshotDb3, \"bis.Element\"));\r\n\r\n imodel.close();\r\n snapshotDb1.close();\r\n snapshotDb2.close();\r\n snapshotDb3.close();\r\n\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb1.key));\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb2.key));\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb3.key));\r\n });\r\n\r\n it(\"upgrade the domain schema in a StandaloneDb\", async () => {\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"UpgradeIModel\", \"testImodel.bim\");\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"testImodel.bim\");\r\n IModelJsFs.copySync(seedFileName, testFileName);\r\n\r\n let iModel = StandaloneDb.openFile(testFileName, OpenMode.ReadWrite);\r\n const beforeVersion = iModel.querySchemaVersion(\"BisCore\");\r\n assert.isTrue(semver.satisfies(beforeVersion!, \"= 1.0.0\"));\r\n iModel.close();\r\n\r\n const schemaState: SchemaState = StandaloneDb.validateSchemas(testFileName, true);\r\n assert.strictEqual(schemaState, SchemaState.UpgradeRecommended);\r\n\r\n StandaloneDb.upgradeStandaloneSchemas(testFileName);\r\n\r\n iModel = StandaloneDb.openFile(testFileName, OpenMode.ReadWrite);\r\n const afterVersion = iModel.querySchemaVersion(\"BisCore\");\r\n assert.isTrue(semver.satisfies(afterVersion!, \">= 1.0.10\"));\r\n iModel.close();\r\n });\r\n\r\n it(\"Run plain SQL\", () => {\r\n imodel1.withPreparedSqliteStatement(\"CREATE TABLE Test(Id INTEGER PRIMARY KEY, Name TEXT NOT NULL, Code INTEGER)\", (stmt: SqliteStatement) => {\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(1, \"Dummy 1\");\r\n stmt.bindValue(2, 100);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\r\n stmt.bindValues([\"Dummy 2\", 200]);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(\":p1\", \"Dummy 3\");\r\n stmt.bindValue(\":p2\", 300);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\r\n stmt.bindValues({ \":p1\": \"Dummy 4\", \":p2\": 400 });\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.saveChanges();\r\n\r\n imodel1.withPreparedSqliteStatement(\"SELECT Id,Name,Code FROM Test ORDER BY Id\", (stmt: SqliteStatement) => {\r\n for (let i: number = 1; i <= 4; i++) {\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\r\n assert.equal(stmt.getColumnCount(), 3);\r\n const val0: SqliteValue = stmt.getValue(0);\r\n assert.equal(val0.columnName, \"Id\");\r\n assert.equal(val0.type, SqliteValueType.Integer);\r\n assert.isFalse(val0.isNull);\r\n assert.equal(val0.getInteger(), i);\r\n\r\n const val1: SqliteValue = stmt.getValue(1);\r\n assert.equal(val1.columnName, \"Name\");\r\n assert.equal(val1.type, SqliteValueType.String);\r\n assert.isFalse(val1.isNull);\r\n assert.equal(val1.getString(), `Dummy ${i}`);\r\n\r\n const val2: SqliteValue = stmt.getValue(2);\r\n assert.equal(val2.columnName, \"Code\");\r\n assert.equal(val2.type, SqliteValueType.Integer);\r\n assert.isFalse(val2.isNull);\r\n assert.equal(val2.getInteger(), i * 100);\r\n\r\n const row: any = stmt.getRow();\r\n assert.equal(row.id, i);\r\n assert.equal(row.name, `Dummy ${i}`);\r\n assert.equal(row.code, i * 100);\r\n }\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"SELECT 1 FROM ec_CustomAttribute WHERE ContainerId=? AND Instance LIKE '<IsMixin%' COLLATE NOCASE\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(1, \"0x1f\");\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n });\r\n\r\n it(\"Run plain SQL against readonly connection\", () => {\r\n let iModel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"sqlitesqlreadonlyconnection.bim\"), { rootSubject: { name: \"test\" } });\r\n const iModelPath = iModel.pathName;\r\n iModel.close();\r\n iModel = SnapshotDb.openFile(iModelPath);\r\n\r\n iModel.withPreparedSqliteStatement(\"SELECT Name,StrData FROM be_Prop WHERE Namespace='ec_Db'\", (stmt: SqliteStatement) => {\r\n let rowCount: number = 0;\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n rowCount++;\r\n assert.equal(stmt.getColumnCount(), 2);\r\n const nameVal: SqliteValue = stmt.getValue(0);\r\n assert.equal(nameVal.columnName, \"Name\");\r\n assert.equal(nameVal.type, SqliteValueType.String);\r\n assert.isFalse(nameVal.isNull);\r\n const name: string = nameVal.getString();\r\n\r\n const versionVal: SqliteValue = stmt.getValue(1);\r\n assert.equal(versionVal.columnName, \"StrData\");\r\n assert.equal(versionVal.type, SqliteValueType.String);\r\n assert.isFalse(versionVal.isNull);\r\n const profileVersion: any = JSON.parse(versionVal.getString());\r\n\r\n assert.isTrue(name === \"SchemaVersion\" || name === \"InitialSchemaVersion\");\r\n if (name === \"SchemaVersion\") {\r\n assert.equal(profileVersion.major, 4);\r\n assert.equal(profileVersion.minor, 0);\r\n assert.equal(profileVersion.sub1, 0);\r\n assert.isAtLeast(profileVersion.sub2, 1);\r\n } else if (name === \"InitialSchemaVersion\") {\r\n assert.equal(profileVersion.major, 4);\r\n assert.equal(profileVersion.minor, 0);\r\n assert.equal(profileVersion.sub1, 0);\r\n assert.isAtLeast(profileVersion.sub2, 1);\r\n }\r\n }\r\n assert.equal(rowCount, 2);\r\n });\r\n iModel.close();\r\n });\r\n\r\n it(\"tryPrepareStatement\", () => {\r\n const sql = `SELECT * FROM ${Element.classFullName} LIMIT 1`;\r\n const invalidSql = \"SELECT * FROM InvalidSchemaName:InvalidClassName LIMIT 1\";\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.throws(() => imodel1.prepareStatement(invalidSql, false));\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.isUndefined(imodel1.tryPrepareStatement(invalidSql));\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n using statement: ECSqlStatement | undefined = imodel1.tryPrepareStatement(sql);\r\n assert.isDefined(statement);\r\n assert.isTrue(statement?.isPrepared);\r\n });\r\n\r\n it(\"containsClass\", () => {\r\n assert.isTrue(imodel1.containsClass(Element.classFullName));\r\n assert.isTrue(imodel1.containsClass(\"BisCore:Element\"));\r\n assert.isTrue(imodel1.containsClass(\"BisCore.Element\"));\r\n assert.isTrue(imodel1.containsClass(\"biscore:element\"));\r\n assert.isTrue(imodel1.containsClass(\"biscore.element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis:Element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis.Element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis:element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis.element\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore:Element:InvalidExtra\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore\"));\r\n assert.isFalse(imodel1.containsClass(\":Element\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore:InvalidClassName\"));\r\n assert.isFalse(imodel1.containsClass(\"InvalidSchemaName:Element\"));\r\n });\r\n\r\n it(\"should update Element code\", () => {\r\n const elementId = imodel4.elements.insertElement({\r\n classFullName: \"DgnPlatformTest:TestInformationRecord\",\r\n model: IModel.repositoryModelId,\r\n code: Code.createEmpty(),\r\n });\r\n let element = imodel4.elements.getElement<InformationRecordElement>(elementId, InformationRecordElement);\r\n assert.isTrue(Code.isValid(element.code));\r\n assert.isTrue(Code.isEmpty(element.code));\r\n const codeSpecId = imodel4.codeSpecs.insert(\"TestCodeSpec\", CodeScopeSpec.Type.Model);\r\n const codeValue = `${element.className}-1`;\r\n element.code = new Code({ spec: codeSpecId, scope: IModel.repositoryModelId, value: codeValue });\r\n element.update();\r\n element = imodel4.elements.getElement<InformationRecordElement>(elementId, InformationRecordElement);\r\n assert.isTrue(Code.isValid(element.code));\r\n assert.isFalse(Code.isEmpty(element.code));\r\n assert.equal(element.code.value, codeValue);\r\n });\r\n\r\n it(\"should update UserLabel\", () => {\r\n // type coercion reminder!\r\n const s: string = \"\";\r\n assert.isTrue(s === \"\");\r\n assert.isFalse(s ? true : false);\r\n\r\n // insert element with an undefined UserLabel\r\n const elementProps: DefinitionElementProps = {\r\n classFullName: SpatialCategory.classFullName,\r\n model: IModel.dictionaryId,\r\n code: SpatialCategory.createCode(imodel1, IModel.dictionaryId, \"TestCategoryForClearUserLabel\"),\r\n };\r\n const elementId = imodel1.elements.insertElement(elementProps);\r\n let element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.isUndefined(element.userLabel);\r\n\r\n // update element with a defined userLabel\r\n element.userLabel = \"UserLabel\";\r\n element.update();\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.equal(element.userLabel, \"UserLabel\");\r\n\r\n // make sure userLabel is not updated when not part of the specified ElementProps\r\n imodel1.elements.updateElement({\r\n id: element.id,\r\n classFullName: element.classFullName,\r\n model: element.model,\r\n code: element.code,\r\n });\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.equal(element.userLabel, \"UserLabel\"); // NOTE: userLabel is not modified when userLabel is not part of the input ElementProps\r\n\r\n const elProps = imodel1.elements.getElementProps({ id: elementId, onlyBaseProperties: true });\r\n expect(elProps.userLabel).equal(element.userLabel);\r\n expect(elProps.classFullName).equal(SpatialCategory.classFullName);\r\n expect(elProps.model).equal(element.model);\r\n expect(elProps.code.value).equal(element.code.value);\r\n expect(elProps.code.scope).equal(element.code.scope);\r\n expect(elProps.code.spec).equal(element.code.spec);\r\n expect(elProps.federationGuid).equal(element.federationGuid);\r\n expect((elProps as any).isPrivate).to.be.oneOf([false, undefined]);\r\n expect((elProps as any).isInstanceOfEntity).undefined;\r\n\r\n // remove userlabel by setting it to the blank string\r\n element.userLabel = \"\";\r\n element.update();\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.isUndefined(element.userLabel); // NOTE: userLabel is cleared when the empty string is specified\r\n });\r\n\r\n it(\"should update FederationGuid\", () => {\r\n // insert element with an undefined FederationGuid\r\n const elementProps: DefinitionElementProps = {\r\n classFullName: SpatialCategory.classFullName,\r\n model: IModel.dictionaryId,\r\n federationGuid: Guid.empty,\r\n code: SpatialCategory.createCode(imodel1, IModel.dictionaryId, \"TestCategoryForClearFederationGuid\"),\r\n };\r\n const elementId = imodel1.elements.insertElement(elementProps);\r\n let element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.isUndefined(element.federationGuid);\r\n assert.isFalse(element.isPrivate);\r\n\r\n // update element with a defined FederationGuid\r\n const federationGuid = Guid.createValue();\r\n element.federationGuid = federationGuid;\r\n element.isPrivate = true;\r\n element.update();\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.equal(element.federationGuid, federationGuid);\r\n assert.isTrue(element.isPrivate);\r\n\r\n // make sure FederationGuid is not updated when not part of the specified ElementProps\r\n imodel1.elements.updateElement({\r\n id: element.id,\r\n classFullName: element.classFullName,\r\n model: element.model,\r\n code: element.code,\r\n });\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.equal(element.federationGuid, federationGuid);\r\n assert.isTrue(element.isPrivate);\r\n\r\n // remove federationGuid by setting it to undefined in ElementProps\r\n const elProps = element.toJSON();\r\n elProps.federationGuid = undefined;\r\n imodel1.elements.updateElement(elProps);\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.isUndefined(element.federationGuid);\r\n\r\n // ensure that update doesn't change federationGuid from an element immediately after insert (toJSON should remove undefined value)\r\n const subject5 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject5\");\r\n const s5Id = subject5.insert();\r\n const s5pre = imodel1.elements.getElement<Subject>(s5Id);\r\n subject5.description = \"new descr\";\r\n subject5.update();\r\n const s5post = imodel1.elements.getElement<Subject>(s5Id);\r\n expect(s5pre.federationGuid).equal(s5post.federationGuid);\r\n expect(s5post.description).equal(subject5.description);\r\n });\r\n\r\n it(\"should support partial update\", () => {\r\n // Insert Subject elements - initializing Description and UserLabel to similar values\r\n let subject1 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject1\", \"Description1\");\r\n let subject2 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject2\", \"Description2\");\r\n let subject3 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject3\", \"\");\r\n let subject4 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject4\");\r\n subject1.userLabel = \"UserLabel1\";\r\n subject2.userLabel = \"UserLabel2\";\r\n subject3.userLabel = \"\";\r\n subject4.userLabel = undefined;\r\n const federationGuid1 = Guid.createValue();\r\n const federationGuid2 = Guid.createValue();\r\n subject1.federationGuid = federationGuid1;\r\n subject2.federationGuid = federationGuid2;\r\n subject3.federationGuid = \"\";\r\n subject4.federationGuid = Guid.empty;\r\n const subjectId1 = subject1.insert();\r\n const subjectId2 = subject2.insert();\r\n const subjectId3 = subject3.insert();\r\n const subjectId4 = subject4.insert();\r\n subject1 = imodel1.elements.getElement<Subject>(subjectId1, Subject);\r\n subject2 = imodel1.elements.getElement<Subject>(subjectId2, Subject);\r\n subject3 = imodel1.elements.getElement<Subject>(subjectId3, Subject);\r\n subject4 = imodel1.elements.getElement<Subject>(subjectId4, Subject);\r\n\r\n // Subject.Description is an auto-handled property\r\n assert.equal(subject1.description, \"Description1\");\r\n assert.equal(subject2.description, \"Description2\");\r\n assert.equal(subject3.description, \"\"); // NOTE: different behavior between auto-handled and custom-handled\r\n assert.isUndefined(subject4.description);\r\n\r\n // Test toJSON\r\n assert.equal(subject1.toJSON().description, \"Description1\");\r\n assert.equal(subject2.toJSON().description, \"Description2\");\r\n assert.equal(subject3.toJSON().description, \"\");\r\n assert.isUndefined(subject4.toJSON().description);\r\n\r\n // Element.UserLabel is a custom-handled property\r\n assert.equal(subject1.userLabel, \"UserLabel1\");\r\n assert.equal(subject2.userLabel, \"UserLabel2\");\r\n assert.isUndefined(subject3.userLabel); // NOTE: different behavior between auto-handled and custom-handled\r\n assert.isUndefined(subject4.userLabel);\r\n\r\n // Element.FederationGuid is a custom-handled property\r\n assert.equal(subject1.federationGuid, federationGuid1);\r\n assert.equal(subject2.federationGuid, federationGuid2);\r\n assert.isUndefined(subject4.federationGuid);\r\n\r\n // test partial update of Description (auto-handled)\r\n imodel1.elements.updateElement<SubjectProps>({ id: subject1.id, description: \"Description1-Updated\" });\r\n subject1 = imodel1.elements.getElement<Subject>(subjectId1, Subject);\r\n assert.equal(subject1.description, \"Description1-Updated\"); // should have been updated\r\n assert.isDefined(subject1.model);\r\n assert.isDefined(subject1.parent);\r\n assert.equal(subject1.code.value, \"Subject1\"); // should not have changed\r\n assert.equal(subject1.userLabel, \"UserLabel1\"); // should not have changed\r\n assert.equal(subject1.federationGuid, federationGuid1); // should not have changed\r\n\r\n // test partial update of UserLabel (custom-handled)\r\n imodel1.elements.updateElement<SubjectProps>({ id: subject2.id, userLabel: \"UserLabel2-Updated\" });\r\n subject2 = imodel1.elements.getElement<Subject>(subjectId2, Subject);\r\n assert.isDefined(subject2.model);\r\n assert.isDefined(subject2.parent);\r\n assert.equal(subject2.userLabel, \"UserLabel2-Updated\"); // should have been updated\r\n assert.equal(subject2.code.value, \"Subject2\"); // should not have changed\r\n assert.equal(subject2.description, \"Description2\"); // should not have changed\r\n assert.equal(subject2.federationGuid, federationGuid2); // should not have changed\r\n\r\n // Update Subject elements - setting Description and UserLabel to similar values\r\n subject1.description = undefined;\r\n subject2.description = \"\";\r\n subject3.description = \"Description3\";\r\n subject4.description = \"Description4\";\r\n subject2.userLabel = \"\";\r\n subject3.userLabel = \"UserLabel3\";\r\n subject4.userLabel = \"UserLabel4\";\r\n subject1.update();\r\n subject2.update();\r\n subject3.update();\r\n subject4.update();\r\n subject1 = imodel1.elements.getElement<Subject>(subjectId1, Subject);\r\n subject2 = imodel1.elements.getElement<Subject>(subjectId2, Subject);\r\n subject3 = imodel1.elements.getElement<Subject>(subjectId3, Subject);\r\n subject4 = imodel1.elements.getElement<Subject>(subjectId4, Subject);\r\n\r\n // Subject.Description is an auto-handled property\r\n assert.isUndefined(subject1.description);\r\n assert.equal(subject2.description, \"\"); // NOTE: different behavior between auto-handled and custom-handled\r\n assert.equal(subject3.description, \"Description3\");\r\n assert.equal(subject4.description, \"Description4\");\r\n\r\n // Element.UserLabel is a custom-handled property\r\n assert.isUndefined(subject2.userLabel); // NOTE: different behavior between auto-handled and custom-handled\r\n assert.equal(subject3.userLabel, \"UserLabel3\");\r\n assert.equal(subject4.userLabel, \"UserLabel4\");\r\n\r\n // test partial update of Description to undefined\r\n const s3Fed = subject3.federationGuid;\r\n imodel1.elements.updateElement<SubjectProps>({ id: subject3.id, description: undefined });\r\n subject3 = imodel1.elements.getElement<Subject>(subjectId3, Subject);\r\n assert.isUndefined(subject3.description); // should have been updated\r\n assert.isDefined(subject3.model);\r\n assert.isDefined(subject3.parent);\r\n assert.equal(subject3.code.value, \"Subject3\"); // should not have changed\r\n assert.equal(subject3.userLabel, \"UserLabel3\"); // should not have changed\r\n assert.equal(subject3.federationGuid, s3Fed); // should not have changed\r\n\r\n // test partial update of UserLabel to undefined\r\n imodel1.elements.updateElement<SubjectProps>({ id: subject4.id, userLabel: undefined });\r\n subject4 = imodel1.elements.getElement<Subject>(subjectId4, Subject);\r\n assert.isDefined(subject4.model);\r\n assert.isDefined(subject4.parent);\r\n // assert.isUndefined(subject4.userLabel); // should have been updated - WIP WIP WIP\r\n assert.equal(subject4.code.value, \"Subject4\"); // should not have changed\r\n assert.equal(subject4.description, \"Description4\"); // should not have changed\r\n assert.isUndefined(subject4.federationGuid); // should not have changed\r\n\r\n });\r\n\r\n it('should allow untrimmed codes when using \"exact\" codeValueBehavior', () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"codeValueBehavior.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"codeValueBehaviors\" } });\r\n\r\n const getNumberedCodeValAndProps = (n: number) => {\r\n const trimmedCodeVal = `CodeValue${n}`;\r\n const untrimmedCodeVal = `${trimmedCodeVal}\\xa0`;\r\n const spec = imodel.codeSpecs.getByName(SpatialCategory.getCodeSpecName()).id;\r\n const props: ElementProps = {\r\n // the [[Code]] class still (as it always has) trims unicode space, so avoid it\r\n code: { spec, scope: IModelDb.dictionaryId, value: untrimmedCodeVal },\r\n model: IModelDb.dictionaryId,\r\n classFullName: SpatialCategory.classFullName,\r\n };\r\n return { trimmedCodeVal, untrimmedCodeVal, props };\r\n };\r\n\r\n expect(imodel.codeValueBehavior).to.equal(\"trim-unicode-whitespace\");\r\n\r\n const code1 = getNumberedCodeValAndProps(1);\r\n const categ1Id = imodel.elements.insertElement(code1.props);\r\n const categ1 = imodel.elements.getElementProps({ id: categ1Id });\r\n expect(categ1.code.value).to.equal(code1.trimmedCodeVal);\r\n\r\n imodel.codeValueBehavior = \"exact\";\r\n const code2 = getNumberedCodeValAndProps(2);\r\n const categ2Id = imodel.elements.insertElement(code2.props);\r\n const categ2 = imodel.elements.getElementProps({ id: categ2Id });\r\n expect(categ2.code.value).to.equal(code2.untrimmedCodeVal);\r\n\r\n imodel.codeValueBehavior = \"trim-unicode-whitespace\";\r\n const code3 = getNumberedCodeValAndProps(3);\r\n const categ3Id = imodel.elements.insertElement(code3.props);\r\n const categ3 = imodel.elements.getElement({ id: categ3Id });\r\n expect(categ3.code.value).to.equal(code3.trimmedCodeVal);\r\n\r\n imodel.close();\r\n });\r\n\r\n it(\"should throw iTwinErrors on element CRUD opertion fails\", async () => {\r\n const code = Code.createEmpty();\r\n code.value = \"foo\";\r\n\r\n const props: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n imodel1.elements.insertElement(props);\r\n\r\n expect(() => imodel1.elements.insertElement(props)).throws(\"Error inserting element [duplicate code]\").to.have.property(\"iTwinErrorId\");\r\n const updateProps: TypeDefinitionElementProps = {\r\n id: Id64.fromString(\"0x111111\"),\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n expect(() => imodel1.elements.updateElement(updateProps)).throws(`Error updating element [missing id], id: ${updateProps.id}`).to.have.property(\"iTwinErrorId\");\r\n expect(() => imodel1.elements.deleteElement(updateProps.id!)).throws(`Error deleting element [missing id], id: ${updateProps.id}`).to.have.property(\"iTwinErrorId\");\r\n\r\n expect(() => imodel1.models.insertModel({ classFullName: DefinitionModel.classFullName, modeledElement: { id: \"0x10000000bad\" } })).throws(\"Error inserting model [error=10004], class=BisCore:DefinitionModel\").to.have.property(\"iTwinErrorId\");\r\n expect(() => imodel1.models.updateModel({\r\n id: Id64.fromString(\"0x111111\"),\r\n modeledElement: { id: Id64.fromString(\"0x111111\") },\r\n classFullName: \"\"\r\n })).throws(`Error updating model [missing id], id: ${Id64.fromString(\"0x111111\")}`).to.have.property(\"iTwinErrorId\");\r\n expect(() => imodel1.models.deleteModel(Id64.fromString(\"0x111111\"))).throws(`Error deleting model [missing id], id: ${Id64.fromString(\"0x111111\")}`).to.have.property(\"iTwinErrorId\");\r\n });\r\n\r\n it(\"throws NotFound when attempting to access element props after closing the iModel\", () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"accessAfterClose.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"accessAfterClose\" } });\r\n\r\n const elem = imodel.elements.getElement<Subject>(IModel.rootSubjectId);\r\n expect(elem.id).to.equal(IModel.rootSubjectId);\r\n\r\n imodel.close();\r\n\r\n expect(() => imodel.elements.getElement<Subject>(IModel.rootSubjectId)).to.throw(IModelError, \"Element=0x1\", \"Not Found\");\r\n });\r\n\r\n it(\"should throw \\\"constraint failed (BE_SQLITE_CONSTRAINT_UNIQUE)\\\" when inserting a relationsip instance with the same prop twice\", () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"insertDuplicateInstance.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"insertDuplicateInstance\" } });\r\n const elements = imodel.elements;\r\n\r\n // Create a new physical model\r\n const newModelId = PhysicalModel.insert(imodel, IModel.rootSubjectId, \"TestModel\");\r\n\r\n // create a SpatialCategory\r\n const spatialCategoryId = SpatialCategory.insert(imodel, IModel.dictionaryId, \"MySpatialCategory\", new SubCategoryAppearance({ color: ColorByName.darkRed }));\r\n\r\n // Create a couple of physical elements.\r\n const elementProps: GeometricElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: newModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n const id0 = elements.insertElement(elementProps);\r\n const id1 = elements.insertElement(elementProps);\r\n\r\n const props: ElementGroupsMembersProps = {\r\n classFullName: \"BisCore:ElementGroupsMembers\",\r\n sourceId: id0,\r\n targetId: id1,\r\n memberPriority: 1,\r\n };\r\n\r\n imodel.relationships.insertInstance(props)\r\n expect(() => imodel.relationships.insertInstance(props)).to.throw(`Failed to insert relationship [${imodelPath}]: rc=2067, constraint failed (BE_SQLITE_CONSTRAINT_UNIQUE)`);\r\n\r\n imodel.close();\r\n });\r\n\r\n function createElemProps(_imodel: IModelDb, modId: Id64String, catId: Id64String, className: string): GeometricElementProps {\r\n // Create props\r\n const elementProps: GeometricElementProps = {\r\n classFullName: className,\r\n model: modId,\r\n category: catId,\r\n code: Code.createEmpty(),\r\n };\r\n return elementProps;\r\n }\r\n\r\n function insertElement(imodel: IModelDb, mId: Id64String, cId: Id64String, cName: string, propName: string): Id64String {\r\n const elementProps = createElemProps(imodel, mId, cId, cName);\r\n const geomElement = imodel.elements.createElement(elementProps);\r\n (geomElement as any).name = propName; // Add a custom property to the element\r\n const id = imodel.elements.insertElement(geomElement.toJSON());\r\n assert.isTrue(Id64.isValidId64(id), \"insert failed\");\r\n return id;\r\n }\r\n\r\n function validateADrivesBRowCount(imodel: IModelDb, expectedRows: number): void {\r\n const reader = IModelTestUtils.executeQuery(imodel, `select * from trs.ADrivesB`);\r\n assert.strictEqual(reader.length, expectedRows, `Expected ${expectedRows} rows in trs.ADrivesB table`);\r\n }\r\n\r\n function validateNavProp(imodel: IModelDb, expectedNavPropValue: any): void {\r\n const reader = IModelTestUtils.executeQuery(imodel, `select NavPropChildB from trs.ChildA`);\r\n assert.strictEqual(reader.length, 1);\r\n assert.deepEqual(reader[0].navPropChildB, expectedNavPropValue, `Expected NavPropChildB to be \"${expectedNavPropValue}\"`);\r\n }\r\n\r\n it(\"Validate invalid relationship classes being inserted/updated\", async () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"invalidRelationshipClass.bim\");\r\n\r\n if (IModelJsFs.existsSync(imodelPath))\r\n IModelJsFs.unlinkSync(imodelPath);\r\n\r\n const testImodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"invalidRelationshipClass\" } });\r\n\r\n await testImodel.importSchemaStrings([\r\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestRelationSchema\" alias=\"trs\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"TestElement\">\r\n <BaseClass>bis:PhysicalElement</BaseClass>\r\n <ECProperty propertyName=\"Name\" typeName=\"string\" />\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"ChildA\" >\r\n <BaseClass>TestElement</BaseClass>\r\n <ECNavigationProperty propertyName=\"NavPropChildB\" relationshipName=\"ADrivesB\" direction=\"Forward\" readOnly=\"True\">\r\n </ECNavigationProperty>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"ChildB\" >\r\n <BaseClass>TestElement</BaseClass>\r\n </ECEntityClass>\r\n\r\n <ECRelationshipClass typeName=\"ADrivesB\" strengthDirection=\"Backward\" strength=\"referencing\" modifier=\"Sealed\">\r\n <Source multiplicity=\"(0..*)\" polymorphic=\"true\" roleLabel=\"drives\">\r\n <Class class=\"ChildA\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..1)\" polymorphic=\"true\" roleLabel=\"is driven by\">\r\n <Class class=\"ChildB\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n\r\n <ECEntityClass typeName=\"ChildC\">\r\n <BaseClass>TestElement</BaseClass>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"ChildD\">\r\n <BaseClass>TestElement</BaseClass>\r\n </ECEntityClass>\r\n\r\n <ECRelationshipClass typeName=\"CIsRelatedToD\" strength=\"referencing\" modifier=\"Sealed\">\r\n <BaseClass>bis:ElementRefersToElements</BaseClass>\r\n <Source multiplicity=\"(0..*)\" roleLabel=\"IsRelatedTo\" polymorphic=\"true\">\r\n <Class class=\"ChildC\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..*)\" roleLabel=\"IsRelatedTo (Reversed)\" polymorphic=\"true\">\r\n <Class class=\"ChildD\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n </ECSchema>`]);\r\n\r\n // Enable ECSQL write validation and verify it's set\r\n const pragmaRows = IModelTestUtils.executeQuery(testImodel, `PRAGMA validate_ecsql_writes=true`);\r\n assert.exists(pragmaRows);\r\n assert.strictEqual(pragmaRows[0].validate_ecsql_writes, true);\r\n\r\n // Ensure ADrivesB table is empty before test\r\n validateADrivesBRowCount(testImodel, 0);\r\n\r\n // Create a physical model and spatial category if needed\r\n const [, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);\r\n let spatialCategoryId = SpatialCategory.queryCategoryIdByName(testImodel, IModel.dictionaryId, \"MySpatialCategory\");\r\n if (!spatialCategoryId) {\r\n spatialCategoryId = SpatialCategory.insert(\r\n testImodel,\r\n IModel.dictionaryId,\r\n \"MySpatialCategory\",\r\n new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() })\r\n );\r\n }\r\n\r\n // Insert a ChildB element to be referenced by ChildA\r\n const idB = insertElement(testImodel, newModelId, spatialCategoryId, \"TestRelationSchema:ChildB\", \"ChildBElement\");\r\n assert.isTrue(Id64.isValidId64(idB), \"Insert ChildBElement failed\");\r\n\r\n testImodel.saveChanges();\r\n\r\n // Prepare base props for ChildA\r\n const elementProps = createElemProps(testImodel, newModelId, spatialCategoryId, \"TestRelationSchema:ChildA\");\r\n\r\n // Test various relationship class names for navigation property\r\n const testCases = [\r\n { name: \"trs:ADrivesB\", shouldSucceed: true, expectedRows: 1 },\r\n { name: \"trs.FakeClass\", shouldSucceed: true, expectedRows: 0 },\r\n { name: \"trs:ChildA\", shouldSucceed: false, expectedRows: 0 },\r\n { name: \"trs:ChildB\", shouldSucceed: false, expectedRows: 0 },\r\n { name: \"trs:CIsRelatedToD\", shouldSucceed: false, expectedRows: 0 },\r\n ];\r\n\r\n for (const { name, shouldSucceed, expectedRows } of testCases) {\r\n const elemRef = new RelatedElement({ id: idB, relClassName: name });\r\n (elementProps as any).navPropChildB = elemRef;\r\n (elementProps as any).name = \"ChildAElement\";\r\n const geomElement = testImodel.elements.createElement(elementProps);\r\n\r\n let idA: Id64String | undefined;\r\n try {\r\n idA = testImodel.elements.insertElement(geomElement.toJSON());\r\n if (shouldSucceed)\r\n assert.isTrue(Id64.isValidId64(idA), `Insert should have succeeded for ${name}.`);\r\n else\r\n assert.fail(`Insert should have failed for ${name}.`);\r\n } catch (err: any) {\r\n if (shouldSucceed)\r\n assert.fail(`Insert should have succeeded for ${name}. Error: ${err.message}`);\r\n\r\n // If should not succeed, error is expected\r\n }\r\n\r\n // Validate row count in ADrivesB table\r\n validateADrivesBRowCount(testImodel, expectedRows);\r\n\r\n // If insert succeeded, test update and delete scenarios\r\n if (expectedRows === 1 && idA !== undefined) {\r\n validateNavProp(testImodel, { id: idB, relClassName: \"TestRelationSchema.ADrivesB\" });\r\n\r\n const editElem: any = testImodel.elements.getElement(idA);\r\n editElem.navPropChildB = new RelatedElement({ id: idB, relClassName: \"trs.FakeClass\" });\r\n editElem.name = \"ChildAElementUpdated\";\r\n testImodel.elements.updateElement(editElem);\r\n\r\n validateADrivesBRowCount(testImodel, 1);\r\n validateNavProp(testImodel, { id: idB, relClassName: \"TestRelationSchema.ADrivesB\" });\r\n\r\n const editedElem: any = testImodel.elements.getElement(idA);\r\n assert.equal(editedElem.name, \"ChildAElementUpdated\", `Expected name to be \"ChildAElementUpdated\" after update, but got \"${editedElem.name}\"`);\r\n assert.strictEqual(editedElem.navPropChildB.relClassName, \"TestRelationSchema.ADrivesB\", `Expected navPropChildB to be \"TestRelationSchema.ADrivesB\" after update, but got \"${editedElem.navPropChildB}\"`);\r\n\r\n // Set the nav prop value to null\r\n editElem.name = \"ChildAElementNulled\";\r\n editElem.navPropChildB = null;\r\n testImodel.elements.updateElement(editElem);\r\n\r\n validateADrivesBRowCount(testImodel, 0);\r\n const nulledElem: any = testImodel.elements.getElement(idA);\r\n assert.equal(nulledElem.name, \"ChildAElementNulled\", `Expected name to be \"ChildAElementNulled\" after nulling, but got \"${nulledElem.name}\"`);\r\n assert.isUndefined(nulledElem.navPropChildB, `Expected navPropChildB to be undefined after nulling, but got \"${nulledElem.navPropChildB}\"`);\r\n\r\n if (shouldSucceed) {\r\n // Delete the element\r\n testImodel.elements.deleteElement(idA);\r\n assert.isUndefined(testImodel.elements.tryGetElement(idA), `Expected element with id ${idA} to be deleted, but it still exists.`);\r\n }\r\n }\r\n\r\n testImodel.abandonChanges();\r\n }\r\n testImodel.close();\r\n });\r\n\r\n it(\"should update codeValues that are switched between elements\", async () => {\r\n const dbFileName = IModelTestUtils.prepareOutputFile(\"IModel\", \"change-codeValues.bim\");\r\n const imodelDb = SnapshotDb.createEmpty(dbFileName, {\r\n rootSubject: { name: \"change-codeValues\" },\r\n });\r\n let categoryA = SpatialCategory.create(\r\n imodelDb,\r\n IModel.dictionaryId,\r\n \"A\"\r\n );\r\n let categoryB = SpatialCategory.create(\r\n imodelDb,\r\n IModel.dictionaryId,\r\n \"B\"\r\n );\r\n categoryA.userLabel = \"A\";\r\n categoryB.userLabel = \"B\";\r\n categoryA.insert();\r\n categoryB.insert();\r\n imodelDb.saveChanges();\r\n\r\n categoryA = imodelDb.elements.getElement(\r\n SpatialCategory.createCode(imodelDb, IModel.dictionaryId, \"A\")\r\n );\r\n categoryB = imodelDb.elements.getElement(\r\n SpatialCategory.createCode(imodelDb, IModel.dictionaryId, \"B\")\r\n );\r\n categoryA.code.value = \"temp\";\r\n categoryA.update();\r\n categoryB.code.value = \"A\";\r\n categoryB.update();\r\n categoryA.code.value = \"B\";\r\n categoryA.update();\r\n imodelDb.saveChanges();\r\n\r\n categoryA = imodelDb.elements.getElement(\r\n SpatialCategory.createCode(imodelDb, IModel.dictionaryId, \"A\")\r\n );\r\n categoryB = imodelDb.elements.getElement(\r\n SpatialCategory.createCode(imodelDb, IModel.dictionaryId, \"B\")\r\n );\r\n\r\n expect(categoryA.userLabel).to.equal(\"B\", `categoryA.userLabel mismatch in ${imodelDb.name}`);\r\n expect(categoryB.userLabel).to.equal(\"A\", `categoryB.userLabel mismatch in ${imodelDb.name}`);\r\n imodelDb.close();\r\n });\r\n\r\n it(\"should provide meaningful error when querying a closed iModel\", () => {\r\n const testImodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"QueryingClosedImodel.bim\"), { rootSubject: { name: \"QueryClosedTest\" } });\r\n assert.isTrue(testImodel.isOpen);\r\n\r\n // Close the iModel for the tests\r\n testImodel.close();\r\n assert.isFalse(testImodel.isOpen);\r\n\r\n const closedDbError = \"Cannot query a closed Db\";\r\n expect(() => testImodel.withPreparedSqliteStatement(\"SELECT 1\", () => { })).to.throw(closedDbError);\r\n expect(() => testImodel.withPreparedSqliteStatement(\"SELECT 1\", () => { })).to.throw(closedDbError);\r\n expect(() => testImodel.prepareSqliteStatement(\"SELECT 1\")).to.throw(closedDbError);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n expect(() => testImodel.prepareStatement(\"SELECT 1\")).to.throw(closedDbError);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n expect(() => testImodel.withPreparedStatement(\"SELECT ECInstanceId FROM BisCore:Element LIMIT 1\", () => { })).to.throw(closedDbError);\r\n expect(() => testImodel.elements.queryChildren(IModel.rootSubjectId)).to.throw(closedDbError);\r\n expect(() => testImodel.elements.getAspects(\"0x1\", \"WrongSchema:WrongClass\")).to.throw(\"db is not open\");\r\n expect(() => testImodel.createQueryReader(\"SELECT 1\")).to.throw(\"db not open\");\r\n });\r\n\r\n describe(\"Delete relationship instances\", () => {\r\n let testImodel: SnapshotDb;\r\n const relationshipClasses = [\r\n \"BisCore:ElementGroupsMembers\",\r\n \"BisCore:ElementDrivesElement\",\r\n \"BisCore:ElementRefersToDocuments\"\r\n ];\r\n\r\n afterEach(() => {\r\n if (testImodel !== undefined) {\r\n const iModelPath = testImodel.pathName;\r\n if (testImodel.isOpen)\r\n testImodel.close();\r\n IModelJsFs.unlinkSync(iModelPath);\r\n }\r\n });\r\n\r\n function setupRelationships(numOfRelationships: number, multipleClasses: boolean = false): RelationshipProps[] {\r\n testImodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"DeleteRelationshipInstances.bim\"), { rootSubject: { name: \"DeleteRelationshipInstances\" } });\r\n assert.isTrue(testImodel.isOpen);\r\n\r\n const [, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);\r\n let spatialCategoryId = SpatialCategory.queryCategoryIdByName(testImodel, IModel.dictionaryId, \"MySpatialCategory\");\r\n if (!spatialCategoryId) {\r\n spatialCategoryId = SpatialCategory.insert(testImodel, IModel.dictionaryId, \"MySpatialCategory\", new SubCategoryAppearance());\r\n }\r\n\r\n const relationships: RelationshipProps[] = [];\r\n for (let i = 0; i < numOfRelationships; ++i) {\r\n const sourceProps = createElemProps(testImodel, newModelId, spatialCategoryId, \"Generic:PhysicalObject\");\r\n const sourceId = testImodel.elements.insertElement(sourceProps);\r\n\r\n const targetProps = createElemProps(testImodel, newModelId, spatialCategoryId, \"Generic:PhysicalObject\");\r\n const targetId = testImodel.elements.insertElement(targetProps);\r\n\r\n let relationshipClass = \"BisCore:ElementGroupsMembers\";\r\n if (multipleClasses)\r\n relationshipClass = relationshipClasses[i % relationshipClasses.length];\r\n\r\n const relationshipProps: RelationshipProps = {\r\n classFullName: relationshipClass,\r\n sourceId,\r\n targetId,\r\n };\r\n\r\n relationshipProps.id = testImodel.relationships.insertInstance(relationshipProps);\r\n relationships.push(relationshipProps);\r\n }\r\n testImodel.saveChanges();\r\n return relationships;\r\n }\r\n\r\n async function getRelationshipCount(iModel: IModelDb, relationshipClass: string): Promise<number> {\r\n const reader = iModel.createQueryReader(`SELECT COUNT(*) AS [count] FROM ${relationshipClass}`);\r\n await reader.step();\r\n return reader.current.count;\r\n }\r\n\r\n it(\"deleteInstances with an empty array\", async () => {\r\n const relationships = setupRelationships(10);\r\n assert.equal(relationships.length, await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\"));\r\n\r\n testImodel.relationships.deleteInstances([]);\r\n testImodel.saveChanges();\r\n\r\n assert.equal(relationships.length, await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\"));\r\n });\r\n\r\n it(\"deleteInstances with a single relationship instance\", async () => {\r\n const relationships = setupRelationships(10);\r\n assert.equal(relationships.length, await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\"), \"Should delete exactly one relationship\");\r\n\r\n // Delete just one relationship using deleteInstances method\r\n testImodel.relationships.deleteInstances([relationships[0]]);\r\n testImodel.saveChanges();\r\n\r\n const remainingCount = await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\");\r\n assert.equal(remainingCount, relationships.length - 1, \"Should delete exactly one relationship\");\r\n });\r\n\r\n it(\"deleteInstances with different relationship classes\", async () => {\r\n const relationships = setupRelationships(500, true);\r\n\r\n // Verify relationships were created across different classes\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\") >= Math.floor(relationships.length / 3));\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementDrivesElement\") >= Math.floor(relationships.length / 3));\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementRefersToDocuments\") >= Math.floor(relationships.length / 3));\r\n\r\n // Test deleteInstances with mixed relationship classes\r\n testImodel.relationships.deleteInstances(relationships);\r\n testImodel.saveChanges();\r\n\r\n // Verify all relationships were deleted regardless of their class\r\n assert.equal(0, await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\"), \"All ElementGroupsMembers relationships should be deleted\");\r\n assert.equal(0, await getRelationshipCount(testImodel, \"BisCore.ElementDrivesElement\"), \"All ElementDrivesElement relationships should be deleted\");\r\n assert.equal(0, await getRelationshipCount(testImodel, \"BisCore.ElementRefersToDocuments\"), \"All ElementRefersToDocuments relationships should be deleted\");\r\n });\r\n\r\n it(\"deleteInstances for random relationship instances\", async () => {\r\n const relationships = setupRelationships(1000, true);\r\n\r\n // Verify relationships exist before deletion\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\") >= Math.floor(relationships.length / 3));\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementDrivesElement\") >= Math.floor(relationships.length / 3));\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementRefersToDocuments\") >= Math.floor(relationships.length / 3));\r\n\r\n // Create a subset of random relationship entries to delete\r\n const relationshipsToDelete: RelationshipProps[] = [];\r\n for (let i = 0; i < 250; ++i) {\r\n relationshipsToDelete.push(relationships[Math.floor(Math.random() * relationships.length)]);\r\n }\r\n\r\n testImodel.relationships.deleteInstances(relationshipsToDelete);\r\n testImodel.saveChanges();\r\n\r\n // Verify all relationships were deleted\r\n for (const relClass of relationshipsToDelete) {\r\n const reader = testImodel.createQueryReader(`SELECT ECInstanceId FROM ${relClass.classFullName} WHERE SourceECInstanceId=? AND TargetECInstanceId=?`, new QueryBinder().bindId(1, relClass.sourceId).bindId(2, relClass.targetId));\r\n assert.isFalse(await reader.step(), `Relationship ${relClass.id} should be deleted`); // No row should be returned\r\n }\r\n });\r\n });\r\n});\r\n\r\ndescribe(\"IModelDb.requireMinimumSchemaVersion\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => imodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"MinSchemaVer.bim\"), { rootSubject: { name: \"MinSchemaVer\" } }));\r\n after(() => imodel.close());\r\n\r\n it(\"throws if the schema does not exist\", () => {\r\n expect(\r\n () => imodel.requireMinimumSchemaVersion(\"FakeSchema\", new ECVersion(1, 0, 0), \"Scrobbles\")\r\n ).to.throw(\"Scrobbles requires FakeSchema v01.00.00 or newer\");\r\n });\r\n\r\n it(\"throws IFF the schema version is older than the minimum\", () => {\r\n function test(minVer: ECVersion, expectError: boolean): void {\r\n expect(imodel.meetsMinimumSchemaVersion(\"BisCore\", minVer)).to.equal(!expectError);\r\n const require = () => imodel.requireMinimumSchemaVersion(\"BisCore\", minVer, \"Scrobbles\");\r\n if (expectError) {\r\n expect(require).to.throw(`Scrobbles requires BisCore v${minVer.toString()} or newer`);\r\n } else {\r\n require();\r\n }\r\n }\r\n\r\n const bisVer = imodel.querySchemaVersionNumbers(\"BisCore\")!;\r\n expect(bisVer.read).to.equal(1);\r\n expect(bisVer.write).to.equal(0);\r\n expect(bisVer.minor).to.least(24);\r\n\r\n test(bisVer, false);\r\n test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor - 1), false);\r\n test(new ECVersion(0, 0, 1), false);\r\n\r\n test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor + 1), true);\r\n test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor + 1), true);\r\n test(new ECVersion(bisVer.read + 1, bisVer.write + 1, bisVer.minor), true);\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"IModel.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModel.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert, expect } from \"chai\";\r\nimport * as path from \"path\";\r\nimport * as semver from \"semver\";\r\nimport * as sinon from \"sinon\";\r\nimport { DbResult, Guid, GuidString, Id64, Id64String, IModelStatus, Logger, OpenMode, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport {\r\n AxisAlignedBox3d, BisCodeSpec, BriefcaseIdValue, ChangesetIdWithIndex, Code, CodeScopeSpec, CodeSpec, ColorByName, ColorDef, DefinitionElementProps,\r\n DisplayStyleProps, DisplayStyleSettings, DisplayStyleSettingsProps, EcefLocation, ElementProps, EntityProps, FilePropertyProps,\r\n FontMap, FontType, GeoCoordinatesRequestProps, GeoCoordStatus, GeographicCRS, GeographicCRSProps, GeometricElementProps, GeometryParams, GeometryStreamBuilder,\r\n ImageSourceFormat, IModel, IModelCoordinatesRequestProps, IModelError, LightLocationProps, MapImageryProps, PhysicalElementProps,\r\n PointWithStatus, QueryBinder, RelatedElement, RelationshipProps, RenderMode, SchemaState, SpatialViewDefinitionProps, SubCategoryAppearance, SubjectProps, TextureMapping,\r\n TextureMapProps, TextureMapUnits, TypeDefinitionElementProps, ViewDefinitionProps, ViewFlagProps, ViewFlags,\r\n} from \"@itwin/core-common\";\r\nimport {\r\n Geometry, GeometryQuery, LineString3d, Loop, Matrix4d, Point3d, PolyfaceBuilder, Range3d, StrokeOptions, Transform, XYZProps, YawPitchRollAngles,\r\n} from \"@itwin/core-geometry\";\r\nimport { V2CheckpointAccessProps } from \"../../BackendHubAccess\";\r\nimport { V2CheckpointManager } from \"../../CheckpointManager\";\r\nimport {\r\n _nativeDb, BisCoreSchema, Category, ClassRegistry, DefinitionContainer, DefinitionGroup, DefinitionGroupGroupsDefinitions,\r\n DefinitionModel, DefinitionPartition, DictionaryModel, DisplayStyle3d, DisplayStyleCreationOptions, DocumentPartition, DrawingGraphic, ECSqlStatement,\r\n Element, ElementDrivesElement, ElementGroupsMembers, ElementGroupsMembersProps, ElementOwnsChildElements, Entity, GenericGraphicalType2d, GeometricElement2d, GeometricElement3d,\r\n GeometricModel, GroupInformationPartition, IModelDb, IModelHost, IModelJsFs, InformationPartitionElement, InformationRecordElement, LightLocation,\r\n LinkPartition, Model, PhysicalElement, PhysicalModel, PhysicalObject, PhysicalPartition, RenderMaterialElement, RenderMaterialElementParams, SnapshotDb, SpatialCategory,\r\n SqliteStatement, SqliteValue, SqliteValueType, StandaloneDb, SubCategory, Subject, Texture, ViewDefinition,\r\n} from \"../../core-backend\";\r\nimport { BriefcaseDb, SnapshotDbOpenArgs } from \"../../IModelDb\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { DisableNativeAssertions } from \"../TestUtils\";\r\nimport { samplePngTexture } from \"../imageData\";\r\nimport { performance } from \"perf_hooks\";\r\nimport { _cache, _hubAccess, _instanceKeyCache } from \"../../internal/Symbols\";\r\nimport { CustomAttributeClass, ECVersion, EntityClass, PrimitiveArrayProperty, PrimitiveOrEnumPropertyBase, PropertyType, propertyTypeToString, SchemaItemType } from \"@itwin/ecschema-metadata\";\r\n// spell-checker: disable\r\n\r\nasync function getIModelError<T>(promise: Promise<T>): Promise<IModelError | undefined> {\r\n try {\r\n await promise;\r\n return undefined;\r\n } catch (err) {\r\n return err instanceof IModelError ? err : undefined;\r\n }\r\n}\r\n\r\nfunction expectIModelError(expectedErrorNumber: IModelStatus | DbResult, error: IModelError | undefined): void {\r\n expect(error).not.to.be.undefined;\r\n expect(error).instanceof(IModelError);\r\n expect(error!.errorNumber).to.equal(expectedErrorNumber);\r\n}\r\n\r\nasync function generateTestSnapshot(targetFileName: string, seedAssetName: string): Promise<SnapshotDb> {\r\n const seedFile = IModelTestUtils.resolveAssetFile(seedAssetName);\r\n const snapshotFile = IModelTestUtils.prepareOutputFile(\"IModel\", targetFileName);\r\n const imodel = IModelTestUtils.createSnapshotFromSeed(snapshotFile, seedFile);\r\n const schemaPathname = path.join(KnownTestLocations.assetsDir, \"TestBim.ecschema.xml\");\r\n await imodel.importSchemas([schemaPathname]); // will throw an exception if import fails\r\n imodel.saveChanges();\r\n return imodel;\r\n}\r\n\r\ndescribe(\"iModel\", () => {\r\n //TODO: These imodels are used and modified across multiple tests. This is not a good practice and should be refactored.\r\n let imodel1: SnapshotDb;\r\n let imodel2: SnapshotDb;\r\n let imodel3: SnapshotDb;\r\n let imodel4: SnapshotDb;\r\n let imodel5: SnapshotDb;\r\n let originalEnv: any;\r\n\r\n before(async () => {\r\n originalEnv = { ...process.env };\r\n\r\n IModelTestUtils.registerTestBimSchema();\r\n imodel1 = await generateTestSnapshot(\"test.bim\", \"test.bim\");\r\n imodel2 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile(\"IModel\", \"CompatibilityTestSeed.bim\"), IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\"));\r\n imodel3 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\"));\r\n imodel4 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile(\"IModel\", \"GetSetAutoHandledArrayProperties.bim\"), IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledArrayProperties.bim\"));\r\n imodel5 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile(\"IModel\", \"mirukuru.ibim\"), IModelTestUtils.resolveAssetFile(\"mirukuru.ibim\"));\r\n });\r\n\r\n after(() => {\r\n process.env = originalEnv;\r\n imodel1.close();\r\n imodel2.close();\r\n imodel3.close();\r\n imodel4.close();\r\n imodel5.close();\r\n });\r\n\r\n afterEach(() => {\r\n sinon.restore();\r\n });\r\n\r\n /** Roundtrip the entity through a json string and back to a new entity. */\r\n const roundtripThroughJson = (entity1: Entity): Entity => {\r\n const string1 = JSON.stringify(entity1);\r\n const props1 = JSON.parse(string1) as EntityProps;\r\n const entity2 = new (entity1.constructor as any)(props1, entity1.iModel); // create a new entity from the EntityProps\r\n const string2 = JSON.stringify(entity2);\r\n assert.equal(string1, string2);\r\n return entity2;\r\n };\r\n\r\n it(\"should be able to get properties of an iIModel\", () => {\r\n expect(imodel1.name).equals(\"TBD\"); // That's the name of the root subject!\r\n const extents: AxisAlignedBox3d = imodel1.projectExtents;\r\n assert(!extents.isNull);\r\n\r\n // make sure we can construct a new element even if we haven't loaded its metadata (will be loaded in ctor)\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.isUndefined(imodel1.classMetaDataRegistry.find(\"biscore:lightlocation\"));\r\n const e1 = imodel1.constructEntity<LightLocation, LightLocationProps>({ category: \"0x11\", classFullName: \"BisCore:LightLocation\", model: \"0x01\", code: Code.createEmpty() });\r\n assert.isDefined(e1);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.isDefined(imodel1.classMetaDataRegistry.find(\"biscore:lightlocation\")); // should have been loaded in ctor\r\n });\r\n\r\n it(\"should use schema to look up classes by name\", () => {\r\n const elementClass = ClassRegistry.findRegisteredClass(Element.classFullName);\r\n const categoryClass = ClassRegistry.findRegisteredClass(Category.classFullName);\r\n assert.isDefined(elementClass);\r\n assert.isDefined(categoryClass);\r\n assert.equal(elementClass!.schema, BisCoreSchema);\r\n assert.equal(categoryClass!.schema, BisCoreSchema);\r\n assert.equal(elementClass!.className, \"Element\");\r\n assert.equal(categoryClass!.className, \"Category\");\r\n });\r\n\r\n it(\"Fonts\", () => {\r\n const dbFonts = imodel1.fonts;\r\n expect(Array.from(dbFonts.queryMappedFamilies({ includeNonEmbedded: true })).length).to.equal(4);\r\n expect(dbFonts.findDescriptor(1)).to.deep.equal({ name: \"Arial\", type: FontType.TrueType });\r\n expect(dbFonts.findId({ name: \"Arial\" })).to.equal(1);\r\n expect(dbFonts.findId({ name: \"arial\" })).to.equal(1);\r\n\r\n expect(dbFonts.findDescriptor(2)).to.deep.equal({ name: \"Font0\", type: FontType.Rsc });\r\n expect(dbFonts.findId({ name: \"Font0\" })).to.equal(2);\r\n expect(dbFonts.findId({ name: \"fOnt0\" })).to.equal(2);\r\n\r\n expect(dbFonts.findDescriptor(3)).to.deep.equal({ name: \"ShxFont0\", type: FontType.Shx });\r\n expect(dbFonts.findId({ name: \"ShxFont0\" })).to.equal(3);\r\n expect(dbFonts.findId({ name: \"shxfont0\" })).to.equal(3);\r\n\r\n expect(dbFonts.findDescriptor(4)).to.deep.equal({ name: \"Calibri\", type: FontType.TrueType });\r\n expect(dbFonts.findId({ name: \"Calibri\" })).to.equal(4);\r\n expect(dbFonts.findId({ name: \"cAlIbRi\" })).to.equal(4);\r\n\r\n expect(dbFonts.findId({ name: \"notfound\" })).to.be.undefined;\r\n\r\n const fonts1 = imodel1.fontMap; // eslint-disable-line @typescript-eslint/no-deprecated\r\n assert.equal(fonts1.fonts.size, 4, \"font map size should be 4\");\r\n assert.equal(FontType.TrueType, fonts1.getFont(1)!.type, \"get font 1 type is TrueType\");\r\n assert.equal(\"Arial\", fonts1.getFont(1)!.name, \"get Font 1 name\");\r\n assert.equal(1, fonts1.getFont(\"Arial\")!.id, \"get Font 1, by name\");\r\n assert.equal(1, fonts1.getFont(\"arial\")!.id, \"get Font 1, by name case insensitive\");\r\n\r\n assert.equal(FontType.Rsc, fonts1.getFont(2)!.type, \"get font 2 type is Rsc\");\r\n assert.equal(\"Font0\", fonts1.getFont(2)!.name, \"get Font 2 name\");\r\n assert.equal(2, fonts1.getFont(\"Font0\")!.id, \"get Font 2, by name\");\r\n assert.equal(2, fonts1.getFont(\"fOnt0\")!.id, \"get Font 2, by name case insensitive\");\r\n\r\n assert.equal(FontType.Shx, fonts1.getFont(3)!.type, \"get font 1 type is Shx\");\r\n assert.equal(\"ShxFont0\", fonts1.getFont(3)!.name, \"get Font 3 name\");\r\n assert.equal(3, fonts1.getFont(\"ShxFont0\")!.id, \"get Font 3, by name\");\r\n assert.equal(3, fonts1.getFont(\"shxfont0\")!.id, \"get Font 3, by name case insensitive\");\r\n\r\n assert.equal(FontType.TrueType, fonts1.getFont(4)!.type, \"get font 4 type is TrueType\");\r\n assert.equal(\"Calibri\", fonts1.getFont(4)!.name, \"get Font 4 name\");\r\n assert.equal(4, fonts1.getFont(\"Calibri\")!.id, \"get Font 4, by name\");\r\n assert.equal(4, fonts1.getFont(\"cAlIbRi\")!.id, \"get Font 4, by name case insensitive\");\r\n\r\n assert.isUndefined(fonts1.getFont(\"notfound\"), \"attempt lookup of a font that should not be found\");\r\n\r\n assert.deepEqual(new FontMap(fonts1.toJSON()), fonts1, \"toJSON on FontMap\"); // eslint-disable-line @typescript-eslint/no-deprecated\r\n });\r\n\r\n it(\"should load a known element by Id from an existing iModel\", () => {\r\n assert.exists(imodel1.elements);\r\n const code1 = new Code({ spec: \"0x10\", scope: \"0x11\", value: \"RF1.dgn\" });\r\n const el = imodel1.elements.getElement(code1);\r\n assert.exists(el);\r\n const el2ById = imodel1.elements.getElement(\"0x34\");\r\n assert.exists(el2ById);\r\n const badCode = new Code({ spec: \"0x10\", scope: \"0x11\", value: \"RF1_does_not_exist.dgn\" });\r\n\r\n try {\r\n imodel1.elements.getElement(badCode); // throws Error\r\n assert.fail(); // this line should be skipped\r\n } catch (error: any) {\r\n assert.instanceOf(error, Error);\r\n assert.instanceOf(error, IModelError);\r\n assert.equal(error.errorNumber, IModelStatus.NotFound);\r\n }\r\n\r\n const element1 = imodel1.elements.tryGetElement(code1);\r\n const element2 = imodel1.elements.tryGetElement(\"0x34\");\r\n const element3 = imodel1.elements.tryGetElement(badCode);\r\n assert.isDefined(element1);\r\n assert.isDefined(element2);\r\n assert.isUndefined(element3);\r\n const elementProps1 = imodel1.elements.tryGetElementProps(code1);\r\n const elementProps2 = imodel1.elements.tryGetElementProps(\"0x34\");\r\n const elementProps3 = imodel1.elements.tryGetElementProps(badCode);\r\n assert.isDefined(elementProps1);\r\n assert.isDefined(elementProps2);\r\n assert.isUndefined(elementProps3);\r\n\r\n const model1 = imodel1.models.tryGetModel(IModel.dictionaryId);\r\n const modelProps1 = imodel1.models.tryGetModelProps(IModel.dictionaryId);\r\n const subModel1 = imodel1.models.tryGetSubModel(IModel.dictionaryId);\r\n assert.isDefined(model1);\r\n assert.isDefined(modelProps1);\r\n assert.isDefined(subModel1);\r\n const badModel1 = imodel1.models.tryGetModel(Id64.fromUint32Pair(999, 999));\r\n const badModelProps1 = imodel1.models.tryGetModelProps(Id64.fromUint32Pair(999, 999));\r\n const badSubModel1 = imodel1.models.tryGetSubModel(IModel.rootSubjectId);\r\n const badSubModel2 = imodel1.models.tryGetSubModel(badCode);\r\n assert.isUndefined(badModel1);\r\n assert.isUndefined(badModelProps1);\r\n assert.isUndefined(badSubModel1);\r\n assert.isUndefined(badSubModel2);\r\n\r\n const subCat = imodel1.elements.getElement(\"0x2e\");\r\n assert.isTrue(subCat instanceof SubCategory);\r\n if (subCat instanceof SubCategory) {\r\n assert.isTrue(subCat.appearance.color.tbgr === 16777215);\r\n assert.isTrue(subCat.appearance.weight === 2);\r\n assert.equal(Id64.getLocalId(subCat.id), 46);\r\n assert.equal(Id64.getBriefcaseId(subCat.id), 0);\r\n assert.equal(Id64.getLocalId(subCat.code.spec), 30);\r\n assert.equal(Id64.getBriefcaseId(subCat.code.spec), 0);\r\n assert.isTrue(subCat.code.scope === \"0x2d\");\r\n assert.isTrue(subCat.code.value === \"A-Z013-G-Legn\");\r\n roundtripThroughJson(subCat);\r\n }\r\n\r\n /// Get the parent Category of the subcategory.\r\n const cat = imodel1.elements.getElement((subCat as SubCategory).getCategoryId());\r\n assert.isTrue(cat instanceof Category);\r\n if (cat instanceof Category) {\r\n assert.equal(Id64.getLocalId(cat.id), 45);\r\n assert.equal(Id64.getBriefcaseId(cat.id), 0);\r\n assert.isTrue(cat.description === \"Legends, symbols keys\");\r\n assert.equal(Id64.getLocalId(cat.code.spec), 22);\r\n assert.equal(Id64.getBriefcaseId(cat.code.spec), 0);\r\n assert.isTrue(cat.code.value === \"A-Z013-G-Legn\");\r\n roundtripThroughJson(cat);\r\n }\r\n\r\n const phys = imodel1.elements.getElement(\"0x38\");\r\n assert.isTrue(phys instanceof GeometricElement3d);\r\n\r\n const locateMsg = phys.getToolTipMessage();\r\n assert.isDefined(locateMsg);\r\n\r\n const a2 = imodel2.elements.getElement(\"0x1d\");\r\n assert.exists(a2);\r\n expect(a2.federationGuid).equal(\"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n const el3 = imodel2.elements.getElement(a2.federationGuid!);\r\n assert.exists(el3);\r\n assert.notEqual(a2, el3);\r\n assert.equal(a2.id, el3.id);\r\n roundtripThroughJson(el3);\r\n\r\n const newEl = el3.toJSON();\r\n newEl.federationGuid = undefined;\r\n newEl.code = { scope: \"bad scope\", spec: \"0x10\", value: \"new code\" };\r\n expect(() => imodel2.elements.insertElement(newEl)).throws(\"invalid code scope\").to.have.property(\"metadata\");\r\n newEl.code.scope = \"0x34322\"; // valid id, but element doesn't exist\r\n expect(() => imodel2.elements.insertElement(newEl)).throws(\"invalid code scope\").to.have.property(\"metadata\");\r\n\r\n newEl.code.scope = el3.federationGuid!;\r\n const newId = imodel2.elements.insertElement(newEl); // code scope from FederationGuid should get converted to ElementId\r\n const a4 = imodel2.elements.getElementProps(newId);\r\n expect(a4.code.scope).equal(el3.id);\r\n\r\n a4.code.scope = \"0x13343\";\r\n expect(() => imodel2.elements.updateElement(a4)).throws(\"invalid code scope\").to.have.property(\"metadata\");\r\n\r\n a4.code.scope = \"0x1\";\r\n imodel2.elements.updateElement(a4); // should change the code scope to new element\r\n let a5 = imodel2.elements.getElementProps(newId);\r\n expect(a5.code.scope).equal(\"0x1\");\r\n\r\n // only pass minimum, but expect model and classFullName to be added.\r\n const newProps = { id: a4.id, code: a4.code, classFullName: undefined, model: undefined };\r\n newProps.code.scope = el3.federationGuid!; // should convert FederationGuid to ElementId\r\n imodel2.elements.updateElement(newProps);\r\n expect(newProps.classFullName).eq(a4.classFullName);\r\n expect(newProps.model).eq(a4.model);\r\n\r\n a5 = imodel2.elements.getElementProps(newId);\r\n expect(a5.code.scope).equal(el3.id);\r\n });\r\n\r\n it(\"should optionally detect class mismatches\", () => {\r\n // tryGetElement\r\n const subjectUnvalidated = imodel1.elements.tryGetElement<Subject>(IModel.rootSubjectId);\r\n assert.isDefined(subjectUnvalidated);\r\n const subjectValidated = imodel1.elements.tryGetElement<Subject>(IModel.rootSubjectId, Subject);\r\n assert.isDefined(subjectValidated);\r\n const physicalElementUnvalidated = imodel1.elements.tryGetElement<PhysicalElement>(IModel.rootSubjectId);\r\n assert.isDefined(physicalElementUnvalidated); // wrong type, but class to validate was not passed\r\n const physicalElementValidated = imodel1.elements.tryGetElement<PhysicalElement>(IModel.rootSubjectId, PhysicalElement); // abstract class\r\n assert.isUndefined(physicalElementValidated); // wrong type\r\n const physicalObjectUnvalidated = imodel1.elements.tryGetElement<PhysicalObject>(IModel.rootSubjectId);\r\n assert.isDefined(physicalObjectUnvalidated); // wrong type, but class to validate was not passed\r\n const physicalObjectValidated = imodel1.elements.tryGetElement<PhysicalObject>(IModel.rootSubjectId, PhysicalObject); // concrete class\r\n assert.isUndefined(physicalObjectValidated); // wrong type\r\n // tryGetModel\r\n const dictionaryUnvalidated = imodel1.models.tryGetModel<DictionaryModel>(IModel.dictionaryId);\r\n assert.isDefined(dictionaryUnvalidated);\r\n const dictionaryValidated = imodel1.models.tryGetModel<DictionaryModel>(IModel.dictionaryId, DictionaryModel);\r\n assert.isDefined(dictionaryValidated);\r\n const geometricModelUnvalidated = imodel1.models.tryGetModel<GeometricModel>(IModel.dictionaryId);\r\n assert.isDefined(geometricModelUnvalidated); // wrong type, but class to validate was not passed\r\n const geometricModelValidated = imodel1.models.tryGetModel<GeometricModel>(IModel.dictionaryId, GeometricModel); // abstract class\r\n assert.isUndefined(geometricModelValidated); // wrong type\r\n const physicalModelUnvalidated = imodel1.models.tryGetModel<PhysicalModel>(IModel.dictionaryId);\r\n assert.isDefined(physicalModelUnvalidated); // wrong type, but class to validate was not passed\r\n const physicalModelValidated = imodel1.models.tryGetModel<PhysicalModel>(IModel.dictionaryId, PhysicalModel); // concrete class\r\n assert.isUndefined(physicalModelValidated); // wrong type\r\n // tryGetSubModel\r\n const dictionarySubUnvalidated = imodel1.models.tryGetSubModel<DictionaryModel>(IModel.dictionaryId);\r\n assert.isDefined(dictionarySubUnvalidated);\r\n const dictionarySubValidated = imodel1.models.tryGetSubModel<DictionaryModel>(IModel.dictionaryId, DictionaryModel);\r\n assert.isDefined(dictionarySubValidated);\r\n const geometricSubModelUnvalidated = imodel1.models.tryGetSubModel<GeometricModel>(IModel.dictionaryId);\r\n assert.isDefined(geometricSubModelUnvalidated); // wrong type, but class to validate was not passed\r\n const geometricSubModelValidated = imodel1.models.tryGetSubModel<GeometricModel>(IModel.dictionaryId, GeometricModel); // abstract class\r\n assert.isUndefined(geometricSubModelValidated); // wrong type\r\n const physicalSubModelUnvalidated = imodel1.models.tryGetSubModel<PhysicalModel>(IModel.dictionaryId);\r\n assert.isDefined(physicalSubModelUnvalidated); // wrong type, but class to validate was not passed\r\n const physicalSubModelValidated = imodel1.models.tryGetSubModel<PhysicalModel>(IModel.dictionaryId, PhysicalModel); // concrete class\r\n assert.isUndefined(physicalSubModelValidated); // wrong type\r\n });\r\n\r\n it(\"should create elements\", () => {\r\n const seedElement = imodel2.elements.getElement<GeometricElement3d>(\"0x1d\");\r\n assert.exists(seedElement);\r\n assert.isTrue(seedElement.federationGuid! === \"18eb4650-b074-414f-b961-d9cfaa6c8746\");\r\n\r\n for (let i = 0; i < 25; i++) {\r\n const elementProps: GeometricElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n model: seedElement.model,\r\n category: seedElement.category,\r\n code: Code.createEmpty(),\r\n federationGuid: Guid.createValue(),\r\n userLabel: `UserLabel-${i}`,\r\n };\r\n\r\n const element: Element = imodel2.elements.createElement(elementProps);\r\n element.setUserProperties(\"performanceTest\", { s: `String-${i}`, n: i });\r\n\r\n const elementId = imodel2.elements.insertElement(element.toJSON());\r\n assert.isTrue(Id64.isValidId64(elementId));\r\n }\r\n });\r\n\r\n it(\"should insert a RenderMaterial\", () => {\r\n const model = imodel2.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n expect(model).not.to.be.undefined;\r\n\r\n const testMaterialName = \"test material name\";\r\n const testPaletteName = \"test palette name\";\r\n const testDescription = \"test description\";\r\n const color = [0.3, 0.7, 0.8];\r\n const specularColor = [0.1, 1, 0];\r\n const finish = 0.4;\r\n const transmit = 0.1;\r\n const diffuse = 0.24;\r\n const specular = 0.9;\r\n const reflect = 0.3;\r\n const reflectColor = [1, 0, 0.5];\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n const textureMapProps: TextureMapProps = {\r\n pattern_angle: 3.0,\r\n pattern_u_flip: false,\r\n pattern_flip: false,\r\n pattern_scale: [1.0, 1.0],\r\n pattern_offset: [0.0, 0.0],\r\n pattern_scalemode: TextureMapUnits.Inches,\r\n pattern_mapping: TextureMapping.Mode.Planar,\r\n pattern_weight: 0.5,\r\n TextureId: \"test_textureid\",\r\n };\r\n\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n const renderMaterialParams: RenderMaterialElementParams = {\r\n paletteName: testPaletteName,\r\n description: testDescription,\r\n color,\r\n specularColor,\r\n finish,\r\n transmit,\r\n diffuse,\r\n specular,\r\n reflect,\r\n reflectColor,\r\n patternMap: textureMapProps,\r\n };\r\n\r\n const renderMaterialId = RenderMaterialElement.insert(imodel2, IModel.dictionaryId, testMaterialName, renderMaterialParams);\r\n\r\n const renderMaterial = imodel2.elements.getElement<RenderMaterialElement>(renderMaterialId);\r\n assert((renderMaterial instanceof RenderMaterialElement) === true, \"did not retrieve an instance of RenderMaterial\");\r\n expect(renderMaterial.paletteName).to.equal(testPaletteName);\r\n expect(renderMaterial.description).to.equal(testDescription);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasBaseColor).to.equal(true);\r\n expect(JSON.stringify(renderMaterial.jsonProperties.materialAssets.renderMaterial.color)).to.equal(JSON.stringify(color));\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasSpecularColor).to.equal(true);\r\n expect(JSON.stringify(renderMaterial.jsonProperties.materialAssets.renderMaterial.specular_color)).to.equal(JSON.stringify(specularColor));\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasFinish).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.finish).to.equal(finish);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasTransmit).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.transmit).to.equal(transmit);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasDiffuse).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.diffuse).to.equal(diffuse);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasSpecular).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.specular).to.equal(specular);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasReflect).to.equal(true);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.reflect).to.equal(reflect);\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.HasReflectColor).to.equal(true);\r\n expect(JSON.stringify(renderMaterial.jsonProperties.materialAssets.renderMaterial.reflect_color)).to.equal(JSON.stringify(reflectColor));\r\n expect(renderMaterial.jsonProperties.materialAssets.renderMaterial.Map).not.to.be.undefined;\r\n\r\n const patternMap = renderMaterial.jsonProperties.materialAssets.renderMaterial.Map.Pattern;\r\n expect(patternMap).not.to.be.undefined;\r\n expect(patternMap.pattern_angle).to.equal(textureMapProps.pattern_angle);\r\n expect(patternMap.pattern_u_flip).to.equal(textureMapProps.pattern_u_flip);\r\n expect(patternMap.pattern_flip).to.equal(textureMapProps.pattern_flip);\r\n expect(JSON.stringify(patternMap.pattern_scale)).to.equal(JSON.stringify(textureMapProps.pattern_scale));\r\n expect(JSON.stringify(patternMap.pattern_offset)).to.equal(JSON.stringify(textureMapProps.pattern_offset));\r\n expect(patternMap.pattern_scalemode).to.equal(textureMapProps.pattern_scalemode);\r\n expect(patternMap.pattern_mapping).to.equal(textureMapProps.pattern_mapping);\r\n expect(patternMap.pattern_weight).to.equal(textureMapProps.pattern_weight);\r\n expect(patternMap.TextureId).to.equal(textureMapProps.TextureId);\r\n });\r\n\r\n it(\"attempt to apply material to new element in imodel5\", () => {\r\n const testTextureName = \"fake texture name\";\r\n const testTextureFormat = ImageSourceFormat.Png;\r\n const testTextureDescription = \"empty description\";\r\n\r\n const texId = Texture.insertTexture(imodel5, IModel.dictionaryId, testTextureName, testTextureFormat, samplePngTexture.base64, testTextureDescription);\r\n\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n const matId = RenderMaterialElement.insert(imodel5, IModel.dictionaryId, \"test material name\",\r\n {\r\n paletteName: \"TestPaletteName\",\r\n patternMap: {\r\n TextureId: texId,\r\n pattern_offset: [0, 0],\r\n pattern_scale: [1, 1],\r\n pattern_scalemode: TextureMapUnits.Relative,\r\n },\r\n });\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n\r\n /** Create a simple flat mesh with 4 points (2x2) */\r\n const width = imodel5.projectExtents.xLength() * 0.2;\r\n const height = imodel5.projectExtents.yLength() * 0.2;\r\n let shape: GeometryQuery;\r\n const doPolyface = true;\r\n if (doPolyface) {\r\n const options = StrokeOptions.createForFacets();\r\n options.shouldTriangulate = false;\r\n const builder = PolyfaceBuilder.create(options);\r\n\r\n const quad = [\r\n Point3d.create(0.0, 0.0, 0.0),\r\n Point3d.create(width, 0.0, 0.0),\r\n Point3d.create(width, height, 0.0),\r\n Point3d.create(0.0, height, 0.0),\r\n ];\r\n\r\n builder.addQuadFacet(quad);\r\n shape = builder.claimPolyface();\r\n } else {\r\n shape = Loop.create(LineString3d.create([\r\n Point3d.create(0, 0, 0),\r\n Point3d.create(width, 0, 0),\r\n Point3d.create(width, height, 0),\r\n Point3d.create(0, height, 0),\r\n Point3d.create(0, 0, 0),\r\n ]));\r\n }\r\n\r\n const modelId = PhysicalModel.insert(imodel5, IModelDb.rootSubjectId, \"test_render_material_model_name\");\r\n\r\n const categoryId = SpatialCategory.insert(imodel5, IModel.dictionaryId, \"GeoJSON Feature\", { color: ColorDef.white.toJSON() });\r\n\r\n /** generate a geometry stream containing the polyface */\r\n const gsBuilder = new GeometryStreamBuilder();\r\n const params = new GeometryParams(categoryId);\r\n params.materialId = matId;\r\n gsBuilder.appendGeometryParamsChange(params);\r\n gsBuilder.appendGeometry(shape);\r\n const geometry = gsBuilder.geometryStream;\r\n // geometry[0].material = { materialId: matId };\r\n\r\n const props: PhysicalElementProps = {\r\n classFullName: \"Generic:PhysicalObject\",\r\n placement: { origin: imodel5.projectExtents.center, angles: new YawPitchRollAngles() },\r\n model: modelId,\r\n code: Code.createEmpty(),\r\n category: categoryId,\r\n geom: geometry,\r\n };\r\n imodel5.elements.insertElement(props);\r\n imodel5.saveChanges();\r\n });\r\n\r\n it(\"should insert a DisplayStyle\", () => {\r\n const model = imodel2.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n expect(model).not.to.be.undefined;\r\n\r\n const settings: DisplayStyleSettingsProps = {\r\n backgroundColor: ColorDef.blue.toJSON(),\r\n viewflags: ViewFlags.fromJSON({\r\n renderMode: RenderMode.SolidFill,\r\n }),\r\n };\r\n\r\n const props: DisplayStyleProps = {\r\n classFullName: DisplayStyle3d.classFullName,\r\n model: IModel.dictionaryId,\r\n code: { spec: BisCodeSpec.displayStyle, scope: IModel.dictionaryId, value: \"test style\" },\r\n isPrivate: false,\r\n jsonProperties: {\r\n styles: settings,\r\n },\r\n };\r\n\r\n const styleId = imodel2.elements.insertElement(props);\r\n let style = imodel2.elements.getElement<DisplayStyle3d>(styleId);\r\n expect(style instanceof DisplayStyle3d).to.be.true;\r\n expect(style.code.spec).equal(imodel2.codeSpecs.getByName(BisCodeSpec.displayStyle).id);\r\n\r\n expect(style.settings.viewFlags.renderMode).to.equal(RenderMode.SolidFill);\r\n expect(style.settings.backgroundColor.equals(ColorDef.blue)).to.be.true;\r\n\r\n const newFlags = style.settings.viewFlags.copy({ renderMode: RenderMode.SmoothShade });\r\n style.settings.viewFlags = newFlags;\r\n style.settings.backgroundColor = ColorDef.red;\r\n style.settings.monochromeColor = ColorDef.green;\r\n expect(style.jsonProperties.styles.viewflags.renderMode).to.equal(RenderMode.SmoothShade);\r\n\r\n imodel2.elements.updateElement(style.toJSON());\r\n style = imodel2.elements.getElement<DisplayStyle3d>(styleId);\r\n expect(style instanceof DisplayStyle3d).to.be.true;\r\n\r\n expect(style.settings.viewFlags.renderMode).to.equal(RenderMode.SmoothShade);\r\n expect(style.settings.backgroundColor.equals(ColorDef.red)).to.be.true;\r\n expect(style.settings.monochromeColor.equals(ColorDef.green)).to.be.true;\r\n });\r\n\r\n it(\"should create display styles\", () => {\r\n const defaultViewFlags = new ViewFlags().toJSON();\r\n const defaultMapImagery = new DisplayStyleSettings({}).toJSON().mapImagery;\r\n\r\n const viewFlags = new ViewFlags({ patterns: false, visibleEdges: true });\r\n const viewflags: ViewFlagProps = { noWhiteOnWhiteReversal: true, shadows: true, noTransp: true };\r\n\r\n const mapImagery: MapImageryProps = {\r\n backgroundBase: ColorDef.red.tbgr,\r\n backgroundLayers: [{\r\n name: \"x\",\r\n url: \"y\",\r\n transparency: 0.5,\r\n formatId: \"WMS\",\r\n visible: true,\r\n }],\r\n };\r\n\r\n const props: DisplayStyleSettingsProps = {\r\n mapImagery,\r\n excludedElements: [\"0x123\", \"0xfed\"],\r\n timePoint: 42,\r\n backgroundColor: ColorDef.green.tbgr,\r\n };\r\n\r\n type TestCase = [DisplayStyleCreationOptions | undefined, ViewFlagProps, boolean];\r\n const testCases: TestCase[] = [\r\n [undefined, defaultViewFlags, false],\r\n [{ viewFlags }, viewFlags.toJSON(), false],\r\n [{ viewflags }, viewflags, false],\r\n [{ viewflags, viewFlags }, viewFlags.toJSON(), false],\r\n [props, defaultViewFlags, false],\r\n [{ ...props, viewflags }, viewflags, false],\r\n [{ backgroundColor: ColorDef.blue }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.from(1, 2, 3, 4) }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.blue.tbgr }, defaultViewFlags, false],\r\n [{ backgroundColor: ColorDef.from(1, 2, 3, 4).tbgr }, defaultViewFlags, false],\r\n ];\r\n\r\n let suffix = 123;\r\n for (const test of testCases) {\r\n const expected = test[0] ?? {};\r\n const styleId = DisplayStyle3d.insert(imodel2, IModel.dictionaryId, `TestStyle${suffix++}`, expected);\r\n const style = imodel2.elements.getElement<DisplayStyle3d>(styleId).toJSON();\r\n expect(style.jsonProperties.styles).not.to.be.undefined;\r\n\r\n expect(style.jsonProperties).not.to.be.undefined;\r\n expect(style.jsonProperties.styles).not.to.be.undefined;\r\n const actual = style.jsonProperties.styles!;\r\n\r\n expect(actual.viewflags).not.to.be.undefined;\r\n const expectedVf = ViewFlags.fromJSON(test[1]);\r\n const actualVf = ViewFlags.fromJSON(actual.viewflags);\r\n expect(actualVf.toJSON()).to.deep.equal(expectedVf.toJSON());\r\n\r\n const expectedBGColor = expected.backgroundColor instanceof ColorDef ? expected.backgroundColor.toJSON() : expected.backgroundColor;\r\n expect(actual.backgroundColor).to.equal(expectedBGColor);\r\n\r\n // DisplayStyleSettings constructor always initializes json.mapImagery.\r\n expect(actual.mapImagery).to.deep.equal(expected.mapImagery ?? defaultMapImagery);\r\n expect(actual.excludedElements).to.deep.equal(expected.excludedElements);\r\n expect(actual.timePoint).to.deep.equal(expected.timePoint);\r\n }\r\n });\r\n\r\n it(\"should have a valid root subject element\", () => {\r\n const rootSubject = imodel1.elements.getRootSubject();\r\n assert.exists(rootSubject);\r\n assert.isTrue(rootSubject instanceof Subject);\r\n assert.isAtLeast(rootSubject.code.value.length, 1);\r\n assert.isFalse(imodel1.elements.hasSubModel(IModel.rootSubjectId));\r\n\r\n try {\r\n imodel1.models.getSubModel(rootSubject.id); // throws error\r\n assert.fail(); // this line should be skipped\r\n } catch (error: any) {\r\n assert.isTrue(error instanceof Error);\r\n assert.isTrue(error instanceof IModelError);\r\n assert.equal(error.errorNumber, IModelStatus.NotFound);\r\n }\r\n\r\n const childIds: Id64String[] = imodel1.elements.queryChildren(rootSubject.id);\r\n assert.isAtLeast(childIds.length, 1);\r\n for (const childId of childIds) {\r\n const childElement = imodel1.elements.getElement(childId);\r\n assert.exists(childElement);\r\n assert.isTrue(childElement instanceof Element);\r\n\r\n roundtripThroughJson(childElement);\r\n assert.equal(rootSubject.id, childElement.parent!.id);\r\n\r\n const childLocalId = Id64.getLocalId(childId);\r\n const childBcId = Id64.getBriefcaseId(childId);\r\n if (childElement instanceof InformationPartitionElement) {\r\n assert.isTrue(imodel1.elements.hasSubModel(childElement.id));\r\n const childSubModel: Model = imodel1.models.getSubModel(childElement.id);\r\n assert.exists(childSubModel, \"InformationPartitionElements should have a subModel\");\r\n\r\n if (childLocalId === 16 && childBcId === 0) {\r\n assert.isTrue(childElement instanceof DefinitionPartition, \"ChildId 0x00000010 should be a DefinitionPartition\");\r\n assert.isTrue(childElement.code.value === \"BisCore.DictionaryModel\", \"Definition Partition should have code value of BisCore.DictionaryModel\");\r\n } else if (childLocalId === 14 && childBcId === 0) {\r\n assert.isTrue(childElement instanceof LinkPartition);\r\n assert.isTrue(childElement.code.value === \"BisCore.RealityDataSources\");\r\n } else if (childLocalId === 17 && childBcId === 0) {\r\n assert.isTrue(childElement instanceof LinkPartition, \"ChildId 0x000000011 should be a LinkPartition\");\r\n assert.isTrue(childElement.code.value === \"Repository Links\");\r\n }\r\n } else if (childElement instanceof Subject) {\r\n assert.isFalse(imodel1.elements.hasSubModel(childElement.id));\r\n if (childLocalId === 19 && childBcId === 0) {\r\n assert.isTrue(childElement instanceof Subject);\r\n assert.isTrue(childElement.code.value === \"DgnV8:mf3, A\", \"Subject should have code value of DgnV8:mf3, A\");\r\n assert.isTrue(childElement.jsonProperties.Subject.Job.DgnV8.V8File === \"mf3.dgn\", \"Subject should have jsonProperty Subject.Job.DgnV.V8File\");\r\n assert.isTrue(childElement.jsonProperties.Subject.Job.DgnV8.V8RootModel === \"A\", \"Subject should have jsonProperty Subject.Job.DgnV.V8RootModel\");\r\n }\r\n }\r\n }\r\n });\r\n\r\n it(\"should load a known model by Id from an existing iModel\", () => {\r\n assert.exists(imodel1.models);\r\n const model2 = imodel1.models.getModel(\"0x1c\");\r\n assert.exists(model2);\r\n const formatter = model2.getJsonProperty(\"formatter\");\r\n assert.exists(formatter, \"formatter should exist as json property\");\r\n assert.equal(formatter.fmtFlags.angMode, 1, \"fmtFlags\");\r\n assert.equal(formatter.mastUnit.label, \"m\", \"mastUnit is meters\");\r\n roundtripThroughJson(model2);\r\n let model = imodel1.models.getModel(IModel.repositoryModelId);\r\n assert.exists(model);\r\n roundtripThroughJson(model);\r\n const code1 = new Code({ spec: \"0x1d\", scope: \"0x1d\", value: \"A\" });\r\n model = imodel1.models.getSubModel(code1);\r\n // By this point, we expect the submodel's class to be in the class registry *cache*\r\n const geomModel = ClassRegistry.getClass(PhysicalModel.classFullName, imodel1);\r\n assert.exists(model);\r\n assert.isTrue(model instanceof geomModel);\r\n roundtripThroughJson(model);\r\n const modelExtents: AxisAlignedBox3d = (model as PhysicalModel).queryExtents();\r\n\r\n assert.isBelow(modelExtents.low.x, modelExtents.high.x);\r\n assert.isBelow(modelExtents.low.y, modelExtents.high.y);\r\n assert.isBelow(modelExtents.low.z, modelExtents.high.z);\r\n });\r\n\r\n it(\"should find a tile tree for a geometric model\", async () => {\r\n // Note: this is an empty model.\r\n const tree = await imodel1.tiles.requestTileTreeProps(\"0x1c\");\r\n expect(tree).not.to.be.undefined;\r\n\r\n expect(tree.id).to.equal(\"0x1c\");\r\n expect(tree.maxTilesToSkip).to.equal(1);\r\n expect(tree.rootTile).not.to.be.undefined;\r\n\r\n // Empty model => identity transform\r\n const tf = Transform.fromJSON(tree.location);\r\n expect(tf.matrix.isIdentity).to.be.true;\r\n expect(tf.origin.x).to.equal(0);\r\n expect(tf.origin.y).to.equal(0);\r\n expect(tf.origin.z).to.equal(0);\r\n\r\n expect(tree.rootTile.contentId).to.equal(\"0/0/0/0/1\");\r\n\r\n // Empty model => null range\r\n const range = Range3d.fromJSON(tree.rootTile.range);\r\n expect(range.isNull).to.be.true;\r\n\r\n expect(tree.rootTile.maximumSize).to.equal(0.0); // empty model => undisplayable root tile => size = 0.0\r\n expect(tree.rootTile.isLeaf).to.be.true; // empty model => empty tile\r\n expect(tree.rootTile.contentRange).to.be.undefined;\r\n });\r\n\r\n it(\"should throw on invalid tile requests\", async () => {\r\n using _r = new DisableNativeAssertions();\r\n let error = await getIModelError(imodel1.tiles.requestTileTreeProps(\"0x12345\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileTreeProps(\"NotAValidId\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"0/0/0/0\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x12345\", \"0/0/0/0/1\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"V/W/X/Y/Z\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n\r\n error = await getIModelError(imodel1.tiles.requestTileContent(\"0x1c\", \"NotAValidId\"));\r\n expectIModelError(IModelStatus.InvalidId, error);\r\n });\r\n\r\n // NOTE: this test can be removed when the deprecated executeQuery method is removed\r\n it(\"should produce an array of rows\", () => {\r\n const rows: any[] = IModelTestUtils.executeQuery(imodel1, `SELECT * FROM ${Category.classFullName}`);\r\n assert.exists(rows);\r\n assert.isArray(rows);\r\n assert.isAtLeast(rows.length, 1);\r\n assert.exists(rows[0].id);\r\n assert.notEqual(rows[0].id.value, \"\");\r\n });\r\n\r\n it(\"should be some categories\", () => {\r\n const categorySql = `SELECT ECInstanceId FROM ${Category.classFullName}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(categorySql, (categoryStatement: ECSqlStatement): void => {\r\n let numCategories = 0;\r\n while (DbResult.BE_SQLITE_ROW === categoryStatement.step()) {\r\n numCategories++;\r\n const categoryId = categoryStatement.getValue(0).getId();\r\n const category: Element = imodel1.elements.getElement(categoryId);\r\n assert.isTrue(category instanceof Category, \"Should be instance of Category\");\r\n\r\n // verify the default subcategory.\r\n const defaultSubCategoryId = (category as Category).myDefaultSubCategoryId();\r\n const defaultSubCategory: Element = imodel1.elements.getElement(defaultSubCategoryId);\r\n assert.isTrue(defaultSubCategory instanceof SubCategory, \"defaultSubCategory should be instance of SubCategory\");\r\n if (defaultSubCategory instanceof SubCategory) {\r\n assert.isTrue(defaultSubCategory.parent!.id === categoryId, \"defaultSubCategory id should be prescribed value\");\r\n assert.isTrue(defaultSubCategory.getSubCategoryName() === category.code.value, \"DefaultSubcategory name should match that of Category\");\r\n assert.isTrue(defaultSubCategory.isDefaultSubCategory, \"isDefaultSubCategory should return true\");\r\n }\r\n\r\n // get the subcategories\r\n const subCategorySql = `SELECT ECInstanceId FROM ${SubCategory.classFullName} WHERE Parent.Id=:parentId`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(subCategorySql, (subCategoryStatement: ECSqlStatement): void => {\r\n let numSubCategories = 0;\r\n subCategoryStatement.bindId(\"parentId\", categoryId);\r\n while (DbResult.BE_SQLITE_ROW === subCategoryStatement.step()) {\r\n numSubCategories++;\r\n const subCategoryId = subCategoryStatement.getValue(0).getId();\r\n const subCategory: Element = imodel1.elements.getElement(subCategoryId);\r\n assert.isTrue(subCategory instanceof SubCategory);\r\n assert.isTrue(subCategory.parent!.id === categoryId);\r\n }\r\n assert.isAtLeast(numSubCategories, 1, \"Expected query to find at least one SubCategory\");\r\n });\r\n }\r\n assert.isAtLeast(numCategories, 1, \"Expected query to find some categories\");\r\n });\r\n });\r\n\r\n it(\"should be some 2d elements\", () => {\r\n const sql = `SELECT ECInstanceId FROM ${DrawingGraphic.classFullName}`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(sql, (statement: ECSqlStatement): void => {\r\n let numDrawingGraphics = 0;\r\n let found25: boolean = false;\r\n let found26: boolean = false;\r\n while (DbResult.BE_SQLITE_ROW === statement.step()) {\r\n numDrawingGraphics++;\r\n const drawingGraphicId = statement.getValue(0).getId();\r\n const drawingGraphic = imodel2.elements.getElement<GeometricElement2d>({ id: drawingGraphicId, wantGeometry: true });\r\n assert.exists(drawingGraphic);\r\n assert.isTrue(drawingGraphic.className === \"DrawingGraphic\", \"Should be instance of DrawingGraphic\");\r\n assert.isTrue(drawingGraphic instanceof DrawingGraphic, \"Is instance of DrawingGraphic\");\r\n assert.isTrue(drawingGraphic instanceof GeometricElement2d, \"Is instance of GeometricElement2d\");\r\n if (Id64.getLocalId(drawingGraphic.id) === 0x25) {\r\n found25 = true;\r\n assert.isTrue(drawingGraphic.placement.origin.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.origin.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.angle.radians === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.x === 1.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.y === 1.0);\r\n assert.isDefined(drawingGraphic.geom);\r\n } else if (Id64.getLocalId(drawingGraphic.id) === 0x26) {\r\n found26 = true;\r\n assert.isTrue(drawingGraphic.placement.origin.x === 1.0);\r\n assert.isTrue(drawingGraphic.placement.origin.y === 1.0);\r\n assert.isTrue(drawingGraphic.placement.angle.radians === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.x === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.low.y === 0.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.x === 2.0);\r\n assert.isTrue(drawingGraphic.placement.bbox.high.y === 2.0);\r\n assert.isDefined(drawingGraphic.geom);\r\n }\r\n }\r\n assert.isAtLeast(numDrawingGraphics, 1, \"Expected query to find some DrawingGraphics\");\r\n assert.isTrue(found25, \"Expected to find a specific element\");\r\n assert.isTrue(found26, \"Expected to find a specific element\");\r\n });\r\n });\r\n\r\n it(\"should be able to query for ViewDefinitionProps\", () => {\r\n const viewDefinitionProps: ViewDefinitionProps[] = imodel2.views.queryViewDefinitionProps(); // query for all ViewDefinitions\r\n assert.isAtLeast(viewDefinitionProps.length, 3);\r\n assert.isTrue(viewDefinitionProps[0].classFullName.includes(\"ViewDefinition\"));\r\n assert.isFalse(viewDefinitionProps[1].isPrivate);\r\n\r\n const spatialViewDefinitionProps = imodel2.views.queryViewDefinitionProps(\"BisCore.SpatialViewDefinition\") as SpatialViewDefinitionProps[]; // limit query to SpatialViewDefinitions\r\n assert.isAtLeast(spatialViewDefinitionProps.length, 3);\r\n assert.exists(spatialViewDefinitionProps[2].modelSelectorId);\r\n });\r\n\r\n it(\"should iterate ViewDefinitions\", () => {\r\n // imodel2 contains 3 SpatialViewDefinitions and no other views.\r\n let numViews = 0;\r\n let result = imodel2.views.iterateViews(IModelDb.Views.defaultQueryParams, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return true;\r\n });\r\n\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(3);\r\n\r\n // Query specifically for spatial views\r\n numViews = 0;\r\n result = imodel2.views.iterateViews({ from: \"BisCore.SpatialViewDefinition\" }, (view: ViewDefinition) => {\r\n if (view.isSpatialView())\r\n ++numViews;\r\n\r\n return view.isSpatialView();\r\n });\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(3);\r\n\r\n // Query specifically for 2d views\r\n numViews = 0;\r\n result = imodel2.views.iterateViews({ from: \"BisCore.ViewDefinition2d\" }, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return true;\r\n });\r\n\r\n expect(result).to.be.true;\r\n expect(numViews).to.equal(0);\r\n\r\n // Terminate iteration on first view\r\n numViews = 0;\r\n result = imodel2.views.iterateViews(IModelDb.Views.defaultQueryParams, (_view: ViewDefinition) => {\r\n ++numViews;\r\n return false;\r\n });\r\n\r\n expect(result).to.be.false;\r\n expect(numViews).to.equal(1);\r\n });\r\n\r\n it(\"should be children of RootSubject\", () => {\r\n const sql = `SELECT ECInstanceId FROM ${Model.classFullName} WHERE ParentModel.Id=:parentModelId`;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(sql, (statement: ECSqlStatement): void => {\r\n statement.bindId(\"parentModelId\", IModel.repositoryModelId);\r\n let numModels = 0;\r\n while (DbResult.BE_SQLITE_ROW === statement.step()) {\r\n numModels++;\r\n const modelId = statement.getValue(0).getId();\r\n const model = imodel2.models.getModel(modelId);\r\n assert.exists(model, \"Model should exist\");\r\n assert.isTrue(model instanceof Model);\r\n\r\n // should be an element with the same Id.\r\n const modeledElement = imodel2.elements.getElement(modelId);\r\n assert.exists(modeledElement, \"Modeled Element should exist\");\r\n\r\n if (model.className === \"LinkModel\") {\r\n // expect LinkModel to be accompanied by LinkPartition\r\n assert.isTrue(modeledElement instanceof LinkPartition);\r\n continue;\r\n } else if (model.className === \"DictionaryModel\") {\r\n assert.isTrue(modeledElement instanceof DefinitionPartition);\r\n continue;\r\n } else if (model.className === \"PhysicalModel\") {\r\n assert.isTrue(modeledElement instanceof PhysicalPartition);\r\n continue;\r\n } else if (model.className === \"GroupModel\") {\r\n assert.isTrue(modeledElement instanceof GroupInformationPartition);\r\n continue;\r\n } else if (model.className === \"DocumentListModel\") {\r\n assert.isTrue(modeledElement instanceof DocumentPartition);\r\n continue;\r\n } else if (model.className === \"DefinitionModel\") {\r\n assert.isTrue(modeledElement instanceof DefinitionPartition);\r\n continue;\r\n } else {\r\n assert.isTrue(false, \"Expected a known model type\");\r\n }\r\n }\r\n assert.isAtLeast(numModels, 1, \"Expected query to find some Models\");\r\n });\r\n });\r\n\r\n it(\"should insert and update auto-handled properties\", () => {\r\n const testElem = imodel4.elements.getElement(\"0x14\");\r\n assert.isDefined(testElem);\r\n assert.equal(testElem.classFullName, \"DgnPlatformTest:TestElementWithNoHandler\");\r\n assert.isUndefined(testElem.asAny.integerProperty1);\r\n\r\n const newTestElem = roundtripThroughJson(testElem) as Element;\r\n assert.equal(newTestElem.classFullName, testElem.classFullName);\r\n newTestElem.asAny.integerProperty1 = 999;\r\n assert.isTrue(testElem.asAny.arrayOfPoint3d[0].isAlmostEqual(newTestElem.asAny.arrayOfPoint3d[0]));\r\n\r\n const loc1 = { street: \"Elm Street\", city: { name: \"Downingtown\", state: \"PA\" } };\r\n const loc2 = { street: \"Oak Street\", city: { name: \"Downingtown\", state: \"PA\" } };\r\n const loc3 = { street: \"Chestnut Street\", city: { name: \"Philadelphia\", state: \"PA\" } };\r\n const arrayOfStructs = [loc2, loc3];\r\n newTestElem.asAny.location = loc1;\r\n newTestElem.asAny.arrayOfStructs = arrayOfStructs;\r\n newTestElem.asAny.dtUtc = new Date(\"2015-03-25\");\r\n newTestElem.asAny.p3d = new Point3d(1, 2, 3);\r\n\r\n const newTestElemId = imodel4.elements.insertElement(newTestElem.toJSON());\r\n\r\n assert.isTrue(Id64.isValidId64(newTestElemId), \"insert worked\");\r\n\r\n const newTestElemFetched = imodel4.elements.getElement(newTestElemId);\r\n assert.isDefined(newTestElemFetched);\r\n assert.isTrue(newTestElemFetched.id === newTestElemId);\r\n assert.equal(newTestElemFetched.classFullName, newTestElem.classFullName);\r\n assert.isDefined(newTestElemFetched.asAny.integerProperty1);\r\n assert.equal(newTestElemFetched.asAny.integerProperty1, newTestElem.asAny.integerProperty1);\r\n assert.isTrue(newTestElemFetched.asAny.arrayOfPoint3d[0].isAlmostEqual(newTestElem.asAny.arrayOfPoint3d[0]));\r\n assert.deepEqual(newTestElemFetched.asAny.location, loc1);\r\n assert.deepEqual(newTestElem.asAny.arrayOfStructs, arrayOfStructs);\r\n // TODO: getElement must convert date ISO string to Date object assert.deepEqual(newTestElemFetched.dtUtc, newTestElem.dtUtc);\r\n assert.deepEqual(newTestElemFetched.asAny.dtUtc, newTestElem.asAny.dtUtc.toJSON());\r\n assert.isTrue(newTestElemFetched.asAny.p3d.isAlmostEqual(newTestElem.asAny.p3d));\r\n\r\n // ----------- updates ----------------\r\n const wasp3d = newTestElemFetched.asAny.p3d;\r\n const editElem = newTestElemFetched;\r\n editElem.asAny.location = loc2;\r\n try {\r\n imodel4.elements.updateElement(editElem.toJSON());\r\n } catch {\r\n assert.fail(\"Element.update failed\");\r\n }\r\n const afterUpdateElemFetched = imodel4.elements.getElement(editElem.id);\r\n assert.deepEqual(afterUpdateElemFetched.asAny.location, loc2, \" location property should be the new one\");\r\n assert.deepEqual(afterUpdateElemFetched.asAny.id, editElem.id, \" the id should not have changed.\");\r\n assert.deepEqual(afterUpdateElemFetched.asAny.p3d, wasp3d, \" p3d property should not have changed\");\r\n\r\n // Make array shorter\r\n assert.equal(afterUpdateElemFetched.asAny.arrayOfInt.length, 300);\r\n\r\n afterUpdateElemFetched.asAny.arrayOfInt = [99, 3];\r\n imodel4.elements.updateElement(afterUpdateElemFetched.toJSON());\r\n\r\n const afterShortenArray = imodel4.elements.getElement(afterUpdateElemFetched.id);\r\n assert.equal(afterUpdateElemFetched.asAny.arrayOfInt.length, 2);\r\n assert.deepEqual(afterShortenArray.asAny.arrayOfInt, [99, 3]);\r\n\r\n // Make array longer\r\n afterShortenArray.asAny.arrayOfInt = [1, 2, 3];\r\n imodel4.elements.updateElement(afterShortenArray.toJSON());\r\n const afterLengthenArray = imodel4.elements.getElement(afterShortenArray.id);\r\n assert.equal(afterLengthenArray.asAny.arrayOfInt.length, 3);\r\n assert.deepEqual(afterLengthenArray.asAny.arrayOfInt, [1, 2, 3]);\r\n\r\n // ------------ delete -----------------\r\n const elid = afterUpdateElemFetched.id;\r\n imodel4.elements.deleteElement(elid);\r\n assert.throws(() => imodel4.elements.getElement(elid), IModelError);\r\n });\r\n\r\n it(\"should handle parent and child deletion properly\", () => {\r\n const categoryId = SpatialCategory.insert(imodel4, IModel.dictionaryId, \"MyTestCategory\", new SubCategoryAppearance());\r\n const category = imodel4.elements.getElement<SpatialCategory>(categoryId);\r\n const subCategory = imodel4.elements.getElement<SubCategory>(category.myDefaultSubCategoryId());\r\n expect(() => imodel4.elements.deleteElement(categoryId)).throws(\"error deleting element\").to.have.property(\"metadata\");\r\n assert.exists(imodel4.elements.getElement(categoryId), \"Category deletes should be blocked in native code\");\r\n assert.exists(imodel4.elements.getElement(subCategory.id), \"Children should not be deleted if parent delete is blocked\");\r\n\r\n const modelId = PhysicalModel.insert(imodel4, IModel.rootSubjectId, \"MyTestPhysicalModel\");\r\n const elementProps: GeometricElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId,\r\n category: categoryId,\r\n code: Code.createEmpty(),\r\n };\r\n const parentId = imodel4.elements.insertElement(elementProps);\r\n elementProps.parent = new ElementOwnsChildElements(parentId);\r\n const childId1 = imodel4.elements.insertElement(elementProps);\r\n const childId2 = imodel4.elements.insertElement(elementProps);\r\n assert.exists(imodel4.elements.getElement(parentId));\r\n assert.exists(imodel4.elements.getElement(childId1));\r\n assert.exists(imodel4.elements.getElement(childId2));\r\n imodel4.elements.deleteElement(parentId);\r\n assert.throws(() => imodel4.elements.getElement(parentId), IModelError);\r\n assert.throws(() => imodel4.elements.getElement(childId1), IModelError);\r\n assert.throws(() => imodel4.elements.getElement(childId2), IModelError);\r\n });\r\n\r\n function checkElementMetaData(entityClass: EntityClass) {\r\n assert.isNotNull(entityClass);\r\n assert.equal(entityClass.fullName, Element.classFullName.replace(\":\", \".\"));\r\n assert.isUndefined(entityClass.baseClass);\r\n\r\n let foundClassHasHandler = false;\r\n let foundClassHasCurrentTimeStampProperty = false;\r\n if (entityClass.customAttributes !== undefined) {\r\n if (entityClass.customAttributes.has(\"BisCore.ClassHasHandler\"))\r\n foundClassHasHandler = true;\r\n if (entityClass.customAttributes.has(\"CoreCustomAttributes.ClassHasCurrentTimeStampProperty\"))\r\n foundClassHasCurrentTimeStampProperty = true;\r\n }\r\n assert.isTrue(foundClassHasHandler);\r\n assert.isTrue(foundClassHasCurrentTimeStampProperty);\r\n const federationGuid = entityClass.getPropertySync(\"federationGuid\", false);\r\n if (federationGuid !== undefined) {\r\n assert.isTrue(federationGuid.isPrimitive());\r\n assert.equal(federationGuid.propertyType, PropertyType.Binary);\r\n assert.equal((federationGuid as PrimitiveOrEnumPropertyBase).extendedTypeName, \"BeGuid\");\r\n }\r\n }\r\n\r\n it(\"should get metadata for a relationship\", async () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"relationshipMetadata.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"relationshipMetadata\" } });\r\n\r\n const partitionId = imodel.elements.insertElement({\r\n classFullName: \"BisCore:PhysicalPartition\",\r\n model: IModel.repositoryModelId,\r\n parent: {\r\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\r\n id: IModel.rootSubjectId,\r\n },\r\n code: new Code({\r\n spec: imodel.codeSpecs.getByName(BisCodeSpec.informationPartitionElement).id,\r\n scope: IModel.rootSubjectId,\r\n value: \"physical model\",\r\n }),\r\n });\r\n\r\n for await (const row of imodel.createQueryReader(`SELECT * FROM bis.Element LIMIT ${1}`)) {\r\n const relId = imodel.relationships.insertInstance({\r\n classFullName: \"BisCore:ElementHasLinks\",\r\n sourceId: partitionId,\r\n targetId: row.ECInstanceId,\r\n });\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementHasLinks\", relId);\r\n const metadata = await relationship.getMetaData();\r\n assert.isDefined(metadata, \"metadata should be defined\");\r\n }\r\n imodel.close();\r\n });\r\n\r\n it(\"should get metadata for class\", () => {\r\n const metaData = imodel1.schemaContext.getSchemaItemSync(Element.classFullName, EntityClass);\r\n assert.exists(metaData);\r\n if (metaData !== undefined)\r\n checkElementMetaData(metaData);\r\n });\r\n\r\n it(\"should iterate through metadata for a relationship\", async () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"relationshipMetadata.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"relationshipMetadata\" } });\r\n\r\n const partitionId = imodel.elements.insertElement({\r\n classFullName: \"BisCore:PhysicalPartition\",\r\n model: IModel.repositoryModelId,\r\n parent: {\r\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\r\n id: IModel.rootSubjectId,\r\n },\r\n code: new Code({\r\n spec: imodel.codeSpecs.getByName(BisCodeSpec.informationPartitionElement).id,\r\n scope: IModel.rootSubjectId,\r\n value: \"physical model\",\r\n }),\r\n });\r\n\r\n for await (const row of imodel.createQueryReader(`SELECT * FROM bis.Element LIMIT ${1}`)) {\r\n const relId = imodel.relationships.insertInstance({\r\n classFullName: \"BisCore:ElementHasLinks\",\r\n sourceId: partitionId,\r\n targetId: row.ECInstanceId,\r\n });\r\n const relationship = imodel.relationships.getInstance(\"BisCore:ElementHasLinks\", relId);\r\n relationship.forEach((propName, propMeta) => {\r\n assert.isDefined(propName, \"Property name should be defined\");\r\n assert.isDefined(propMeta, \"Property metadata should be defined\");\r\n });\r\n }\r\n\r\n imodel.close();\r\n });\r\n\r\n it(\"update the project extents\", async () => {\r\n const originalExtents = imodel1.projectExtents;\r\n const newExtents = Range3d.create(originalExtents.low, originalExtents.high);\r\n newExtents.low.x -= 50;\r\n newExtents.low.y -= 25;\r\n newExtents.low.z -= 189;\r\n newExtents.high.x += 1087;\r\n newExtents.high.y += 19;\r\n newExtents.high.z += .001;\r\n imodel1.updateProjectExtents(newExtents);\r\n\r\n const updatedProps = imodel1[_nativeDb].getIModelProps();\r\n assert.isTrue(updatedProps.hasOwnProperty(\"projectExtents\"), \"Returned property JSON object has project extents\");\r\n const updatedExtents = Range3d.fromJSON(updatedProps.projectExtents);\r\n assert.isTrue(newExtents.isAlmostEqual(updatedExtents), \"Project extents successfully updated in database\");\r\n });\r\n\r\n it(\"read view thumbnail\", () => {\r\n const viewId = \"0x24\";\r\n const thumbnail = imodel5.views.getThumbnail(viewId);\r\n assert.exists(thumbnail);\r\n if (!thumbnail)\r\n return;\r\n assert.equal(thumbnail.format, \"jpeg\");\r\n assert.equal(thumbnail.height, 768);\r\n assert.equal(thumbnail.width, 768);\r\n assert.equal(thumbnail.image.length, 18062);\r\n\r\n thumbnail.width = 100;\r\n thumbnail.height = 200;\r\n thumbnail.format = \"png\";\r\n thumbnail.image = new Uint8Array(200);\r\n thumbnail.image.fill(12);\r\n const stat = imodel5.views.saveThumbnail(viewId, thumbnail);\r\n assert.equal(stat, 0, \"save thumbnail\");\r\n\r\n const thumbnail2 = imodel5.views.getThumbnail(viewId);\r\n assert.exists(thumbnail2);\r\n if (!thumbnail2)\r\n return;\r\n assert.equal(thumbnail2.format, \"png\");\r\n assert.equal(thumbnail2.height, 200);\r\n assert.equal(thumbnail2.width, 100);\r\n assert.equal(thumbnail2.image.length, 200);\r\n assert.equal(thumbnail2.image[0], 12);\r\n });\r\n\r\n it(\"ecefLocation for iModels\", () => {\r\n assert.isTrue(imodel5.isGeoLocated);\r\n const center = { x: 289095, y: 3803860, z: 10 }; // near center of project extents, 10 meters above ground.\r\n const ecefPt = imodel5.spatialToEcef(center);\r\n const pt = { x: -3575156.3661052254, y: 3873432.0891543664, z: 3578996.012643183 };\r\n assert.isTrue(ecefPt.isAlmostEqual(pt), \"spatialToEcef\");\r\n\r\n const z2 = imodel5.ecefToSpatial(ecefPt);\r\n assert.isTrue(z2.isAlmostEqual(center), \"ecefToSpatial\");\r\n\r\n const carto = imodel5.spatialToCartographicFromEcef(center);\r\n assert.approximately(carto.longitudeDegrees, 132.70683882277805, .1); // this data is in Japan\r\n assert.approximately(carto.latitudeDegrees, 34.35462768786055, .1);\r\n const c2 = { longitude: 2.3161712773709127, latitude: 0.5996013664499733, height: 10 };\r\n assert.isTrue(carto.equalsEpsilon(c2, .001), \"spatialToCartographic\");\r\n\r\n imodel5.cartographicToSpatialFromEcef(carto, z2);\r\n assert.isTrue(z2.isAlmostEqual(center, .001), \"cartographicToSpatial\");\r\n\r\n assert.isTrue(imodel5.geographicCoordinateSystem !== undefined);\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.horizontalCRS !== undefined);\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.verticalCRS !== undefined);\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.verticalCRS!.id !== undefined);\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.horizontalCRS!.id === \"UTM84-53N\");\r\n assert.isTrue(imodel5.geographicCoordinateSystem!.verticalCRS!.id === \"ELLIPSOID\");\r\n });\r\n\r\n function checkClassHasHandlerMetaData(classToCheck: CustomAttributeClass) {\r\n assert.isDefined(classToCheck);\r\n\r\n const propertiesArray = Array.from(classToCheck.getPropertiesSync(true));\r\n assert.equal(propertiesArray.length, 1);\r\n\r\n const restrictionProperty = propertiesArray[0];\r\n assert.isDefined(restrictionProperty);\r\n assert.equal(restrictionProperty.name, \"Restrictions\");\r\n assert.equal(propertyTypeToString(restrictionProperty.propertyType), \"PrimitiveArrayProperty\");\r\n assert.equal((restrictionProperty as PrimitiveArrayProperty).minOccurs, 0);\r\n }\r\n\r\n it(\"should get metadata for CA class just as well (and we'll see a array-typed property)\", () => {\r\n const metaData = imodel1.schemaContext.getSchemaItemSync(\"BisCore.ClassHasHandler\", CustomAttributeClass);\r\n assert.exists(metaData);\r\n if (metaData !== undefined) {\r\n assert.equal(metaData.schemaItemType, SchemaItemType.CustomAttributeClass);\r\n checkClassHasHandlerMetaData(metaData);\r\n }\r\n });\r\n\r\n it(\"should exercise ECSqlStatement (backend only)\", () => {\r\n // Reject an invalid statement\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.prepareStatement(\"select no_such_property, codeValue from bis.element\", false);\r\n assert.fail(\"prepare should have failed with an exception\");\r\n } catch (err: any) {\r\n assert.isTrue(err.constructor.name === \"IModelError\");\r\n assert.notEqual(err.status, DbResult.BE_SQLITE_OK);\r\n }\r\n let lastId: string = \"\";\r\n let firstCodeValue: string = \"\";\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element\", (stmt: ECSqlStatement) => {\r\n assert.isNotNull(stmt);\r\n // Reject an attempt to bind when there are no placeholders in the statement\r\n try {\r\n stmt.bindStruct(1, { foo: 1 });\r\n assert.fail(\"bindStruct should have failed with an exception\");\r\n } catch (err2: any) {\r\n assert.isTrue(err2.constructor.name === \"IModelError\");\r\n assert.notEqual(err2.status, DbResult.BE_SQLITE_OK);\r\n }\r\n\r\n // Verify that we get a bunch of rows with the expected shape\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n const row = stmt.getRow();\r\n assert.isNotNull(row);\r\n assert.isObject(row);\r\n assert.isTrue(row.id !== undefined);\r\n assert.isTrue(Id64.isValid(Id64.fromJSON(row.id)));\r\n lastId = row.id;\r\n if (row.codeValue !== undefined)\r\n firstCodeValue = row.codeValue;\r\n count = count + 1;\r\n }\r\n assert.isTrue(count > 1);\r\n assert.notEqual(lastId, \"\");\r\n assert.notEqual(firstCodeValue, \"\");\r\n\r\n // Try iterator style\r\n let firstCodeValueIter: string = \"\";\r\n let iteratorCount = 0;\r\n let lastIterId: string = \"\";\r\n stmt.reset();\r\n for (const row of stmt) {\r\n assert.isNotNull(row);\r\n assert.isObject(row);\r\n assert.isTrue(row.id !== undefined);\r\n assert.isTrue(Id64.isValid(Id64.fromJSON(row.id)));\r\n lastIterId = row.id;\r\n iteratorCount = iteratorCount + 1;\r\n if (row.codeValue !== undefined)\r\n firstCodeValueIter = row.codeValue;\r\n }\r\n assert.equal(iteratorCount, count, \"iterator loop should find the same number of rows as the step loop\");\r\n assert.equal(lastIterId, lastId, \"iterator loop should see the same last row as the step loop\");\r\n assert.equal(firstCodeValueIter, firstCodeValue, \"iterator loop should find the first non-null code value as the step loop\");\r\n });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element WHERE (ecinstanceid=?)\", (stmt3: ECSqlStatement) => {\r\n // Now try a statement with a placeholder\r\n const idToFind = Id64.fromJSON(lastId);\r\n stmt3.bindId(1, idToFind);\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt3.step()) {\r\n count = count + 1;\r\n const row = stmt3.getRow();\r\n // Verify that we got the row that we asked for\r\n assert.isTrue(idToFind === Id64.fromJSON(row.id));\r\n }\r\n // Verify that we got the row that we asked for\r\n assert.equal(count, 1);\r\n });\r\n\r\n let firstCodeValueId: Id64String | undefined;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element WHERE (codeValue = :codevalue)\", (stmt4: ECSqlStatement) => {\r\n // Try a named placeholder\r\n const codeValueToFind = firstCodeValue;\r\n stmt4.bindString(\"codeValue\", codeValueToFind);\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt4.step()) {\r\n count = count + 1;\r\n const row = stmt4.getRow();\r\n // Verify that we got the row that we asked for\r\n assert.equal(row.codeValue, codeValueToFind);\r\n firstCodeValueId = row.id;\r\n }\r\n // Verify that we got the row that we asked for\r\n assert.equal(count, 1);\r\n });\r\n\r\n // make sure we can use parameterized values for queryEnityId (test on parameterized codevalue)\r\n const ids = imodel2.queryEntityIds({ from: \"bis.element\", where: \"codevalue=:cv\", bindings: { cv: firstCodeValue } });\r\n assert.equal(ids.values().next().value, firstCodeValueId);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid as id, codevalue from bis.element\", (stmt5: ECSqlStatement) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt5.step()) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select codevalue from bis.element where ecinstanceid=?\", (stmt6: ECSqlStatement) => {\r\n stmt6.bindId(1, stmt5.getRow().id);\r\n while (DbResult.BE_SQLITE_ROW === stmt6.step()) {\r\n assert.equal(stmt6.getRow().codevalue, stmt5.getRow().codevalue);\r\n }\r\n });\r\n }\r\n });\r\n\r\n // make sure queryEnityIds works fine when all params are specified\r\n const physicalObjectIds = imodel2.queryEntityIds({ from: \"generic.PhysicalObject\", where: \"codevalue is null\", limit: 1, offset: 1, only: true, orderBy: \"ecinstanceid desc\" });\r\n assert.equal(physicalObjectIds.size, 1);\r\n });\r\n\r\n it(\"validate BisCodeSpecs\", async () => {\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.nullCodeSpec).scopeType, CodeScopeSpec.Type.Repository);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subCategory).scopeType, CodeScopeSpec.Type.ParentElement);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.viewDefinition).scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subject).scopeReq, CodeScopeSpec.ScopeRequirement.ElementId);\r\n });\r\n\r\n it(\"should create and insert CodeSpecs\", () => {\r\n const testImodel = imodel2;\r\n const codeSpec = CodeSpec.create(testImodel, \"CodeSpec1\", CodeScopeSpec.Type.Model);\r\n const codeSpecId = testImodel.codeSpecs.insert(codeSpec); // throws in case of error\r\n assert.deepEqual(codeSpecId, codeSpec.id);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.ElementId);\r\n\r\n // Should not be able to insert a duplicate.\r\n const codeSpecDup = CodeSpec.create(testImodel, \"CodeSpec1\", CodeScopeSpec.Type.Model);\r\n assert.throws(() => testImodel.codeSpecs.insert(codeSpecDup), \"CodeSpec already exists\");\r\n\r\n // We should be able to insert another CodeSpec with a different name.\r\n const codeSpec2 = CodeSpec.create(testImodel, \"CodeSpec2\", CodeScopeSpec.Type.Model, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpec2Id = testImodel.codeSpecs.insert(codeSpec2); // throws in case of error\r\n assert.deepEqual(codeSpec2Id, codeSpec2.id);\r\n assert.notDeepEqual(codeSpec2Id, codeSpecId);\r\n\r\n // make sure CodeScopeSpec.Type.Repository works\r\n const codeSpec3 = CodeSpec.create(testImodel, \"CodeSpec3\", CodeScopeSpec.Type.Repository, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpec3Id = testImodel.codeSpecs.insert(codeSpec3); // throws in case of error\r\n assert.notDeepEqual(codeSpec2Id, codeSpec3Id);\r\n\r\n const codeSpec4 = testImodel.codeSpecs.getById(codeSpec3Id);\r\n codeSpec4.name = \"CodeSpec4\";\r\n const codeSpec4Id = testImodel.codeSpecs.insert(codeSpec4); // throws in case of error\r\n assert.notDeepEqual(codeSpec3Id, codeSpec4Id);\r\n assert.equal(codeSpec4.scopeType, CodeScopeSpec.Type.Repository);\r\n assert.equal(codeSpec4.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const copyOfCodeSpec4 = testImodel.codeSpecs.getById(codeSpec4Id);\r\n assert.deepEqual(codeSpec4, copyOfCodeSpec4);\r\n\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec1\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec2\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec3\"));\r\n assert.isTrue(testImodel.codeSpecs.hasName(\"CodeSpec4\"));\r\n assert.isFalse(testImodel.codeSpecs.hasName(\"CodeSpec5\"));\r\n\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec2.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec3.id));\r\n assert.isTrue(testImodel.codeSpecs.hasId(codeSpec4.id));\r\n assert.isFalse(testImodel.codeSpecs.hasId(Id64.invalid));\r\n });\r\n\r\n it(\"validate CodeSpec properties\", async () => {\r\n const iModelFileName: string = IModelTestUtils.prepareOutputFile(\"IModel\", \"ReadWriteCodeSpec.bim\");\r\n const codeSpecName = \"CodeSpec1\";\r\n\r\n // Write new CodeSpec to iModel\r\n if (true) {\r\n const iModelDb = IModelTestUtils.createSnapshotFromSeed(iModelFileName, IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\"));\r\n const codeSpec = CodeSpec.create(iModelDb, codeSpecName, CodeScopeSpec.Type.Model, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n const codeSpecId = iModelDb.codeSpecs.insert(codeSpec);\r\n assert.isTrue(Id64.isValidId64(codeSpec.id));\r\n assert.equal(codeSpec.id, codeSpecId);\r\n assert.equal(codeSpec.name, codeSpecName);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n iModelDb.saveChanges();\r\n iModelDb.close();\r\n }\r\n\r\n // Reopen iModel (ensure CodeSpec cache is cleared) and reconfirm CodeSpec properties\r\n if (true) {\r\n const iModelDb = SnapshotDb.openFile(iModelFileName);\r\n const codeSpec = iModelDb.codeSpecs.getByName(codeSpecName);\r\n assert.isTrue(Id64.isValidId64(codeSpec.id));\r\n assert.equal(codeSpec.name, codeSpecName);\r\n assert.equal(codeSpec.scopeType, CodeScopeSpec.Type.Model);\r\n assert.equal(codeSpec.scopeReq, CodeScopeSpec.ScopeRequirement.FederationGuid);\r\n iModelDb.close();\r\n }\r\n });\r\n\r\n it(\"snapping\", async () => {\r\n const worldToView = Matrix4d.createIdentity();\r\n const response = await imodel2.requestSnap(\"0x222\", { testPoint: { x: 1, y: 2, z: 3 }, closePoint: { x: 1, y: 2, z: 3 }, id: \"0x111\", worldToView: worldToView.toJSON() });\r\n assert.isDefined(response.status);\r\n });\r\n\r\n it(\"should import schemas\", async () => {\r\n const metaData = await imodel1.schemaContext.getSchemaItem(\"TestBim:TestDocument\", EntityClass);\r\n assert.isDefined(metaData);\r\n if (metaData !== undefined) {\r\n const property = await metaData.getProperty(\"testDocumentProperty\");\r\n assert.isDefined(property);\r\n if (property !== undefined)\r\n assert.isDefined(property.propertyType, propertyTypeToString(PropertyType.Integer));\r\n }\r\n });\r\n\r\n it(\"should do CRUD on models\", () => {\r\n\r\n const testImodel = imodel2;\r\n\r\n const [modeledElementId, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);\r\n\r\n const newModelPersist = testImodel.models.getModel(newModelId);\r\n\r\n // Check that it has the properties that we set.\r\n assert.equal(newModelPersist.classFullName, PhysicalModel.classFullName);\r\n assert.isTrue(newModelPersist.isPrivate);\r\n assert.deepEqual(newModelPersist.modeledElement.id, modeledElementId);\r\n\r\n // Update the model\r\n newModelPersist.isPrivate = false;\r\n testImodel.models.updateModel(newModelPersist.toJSON());\r\n // ... and check that it updated the model in the db\r\n const newModelPersist2 = testImodel.models.getModel(newModelId);\r\n assert.isFalse(newModelPersist2.isPrivate);\r\n\r\n // Delete the model\r\n testImodel.models.deleteModel(newModelId);\r\n\r\n // Test insertModel error handling\r\n try {\r\n testImodel.models.insertModel({\r\n classFullName: DefinitionModel.classFullName,\r\n modeledElement: { id: \"0x10000000bad\" },\r\n });\r\n } catch (error: any) {\r\n assert.isTrue(error instanceof IModelError || error.iTwinErrorId !== undefined);\r\n }\r\n\r\n });\r\n\r\n it(\"should create model with custom relationship to modeled element\", async () => {\r\n const testImodel = imodel1;\r\n\r\n assert.doesNotThrow(() => testImodel.schemaContext.getSchemaItemSync(\"TestBim:TestModelModelsElement\", EntityClass), \"TestModelModelsElement is expected to be defined in TestBim.ecschema.xml\");\r\n\r\n let newModelId1: Id64String;\r\n let newModelId2: Id64String;\r\n let relClassName1: string | undefined;\r\n let relClassName2: string | undefined;\r\n\r\n if (true) {\r\n const newPartition1 = IModelTestUtils.createAndInsertPhysicalPartition(testImodel, Code.createEmpty());\r\n relClassName1 = \"TestBim:TestModelModelsElement\";\r\n const modeledElementRef = new RelatedElement({ id: newPartition1, relClassName: relClassName1 });\r\n newModelId1 = IModelTestUtils.createAndInsertPhysicalModel(testImodel, modeledElementRef);\r\n assert.isTrue(Id64.isValidId64(newModelId1));\r\n }\r\n\r\n if (true) {\r\n [, newModelId2] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty());\r\n const newModel2 = testImodel.models.getModel(newModelId2);\r\n relClassName2 = newModel2.modeledElement.relClassName;\r\n }\r\n\r\n const model1 = testImodel.models.getModel(newModelId1);\r\n const model2 = testImodel.models.getModel(newModelId2);\r\n\r\n const foundRelClassName1 = model1.modeledElement.relClassName;\r\n const foundRelClassName2 = model2.modeledElement.relClassName;\r\n\r\n assert.equal(foundRelClassName1, relClassName1);\r\n assert.equal(foundRelClassName2, relClassName2);\r\n });\r\n\r\n it(\"should create link table relationship instances\", () => {\r\n const snapshotFile2: string = IModelTestUtils.prepareOutputFile(\"IModel\", \"CreateLinkTable.bim\");\r\n const testImodel = StandaloneDb.createEmpty(snapshotFile2, { rootSubject: { name: \"test1\" }, enableTransactions: true });\r\n const elements = testImodel.elements;\r\n\r\n // Create a new physical model\r\n const newModelId = PhysicalModel.insert(testImodel, IModel.rootSubjectId, \"TestModel\");\r\n\r\n // create a SpatialCategory\r\n const spatialCategoryId = SpatialCategory.insert(testImodel, IModel.dictionaryId, \"MySpatialCategory\", new SubCategoryAppearance({ color: ColorByName.darkRed }));\r\n\r\n // Create a couple of physical elements.\r\n const elementProps: GeometricElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: newModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n const id0 = elements.insertElement(elementProps);\r\n const id1 = elements.insertElement(elementProps);\r\n const id2 = elements.insertElement(elementProps);\r\n\r\n const geometricModel = testImodel.models.getModel<GeometricModel>(newModelId);\r\n assert.throws(() => geometricModel.queryExtents()); // no geometry\r\n\r\n // Create grouping relationships from 0 to 1 and from 0 to 2\r\n const r1 = ElementGroupsMembers.create(testImodel, id0, id1, 1);\r\n r1.insert();\r\n const r2 = ElementGroupsMembers.create(testImodel, id0, id2);\r\n r2.insert();\r\n\r\n // Look up by id\r\n const g1 = ElementGroupsMembers.getInstance<ElementGroupsMembers>(testImodel, r1.id);\r\n const g2 = ElementGroupsMembers.getInstance<ElementGroupsMembers>(testImodel, r2.id);\r\n\r\n assert.deepEqual(g1.id, r1.id);\r\n assert.equal(g1.classFullName, ElementGroupsMembers.classFullName);\r\n assert.equal(g1.memberPriority, 1, \"g1.memberPriority\");\r\n assert.deepEqual(g2.id, r2.id);\r\n assert.equal(g2.classFullName, ElementGroupsMembers.classFullName);\r\n assert.equal(g2.memberPriority, 0, \"g2.memberPriority\"); // The memberPriority parameter defaults to 0 in ElementGroupsMembers.create\r\n\r\n // Look up by source and target\r\n const g1byst = ElementGroupsMembers.getInstance<ElementGroupsMembers>(testImodel, { sourceId: r1.sourceId, targetId: r1.targetId });\r\n assert.deepEqual(g1byst, g1);\r\n\r\n // Update relationship instance property\r\n r1.asAny.memberPriority = 2;\r\n r1.update();\r\n\r\n const g11 = ElementGroupsMembers.getInstance<ElementGroupsMembers>(testImodel, r1.id);\r\n assert.equal(g11.memberPriority, 2, \"g11.memberPriority\");\r\n testImodel.saveChanges(\"step 1\");\r\n\r\n // Delete relationship instance property\r\n g11.delete();\r\n testImodel.saveChanges(\"step 2\");\r\n assert.throws(() => ElementGroupsMembers.getInstance(testImodel, r1.id), IModelError);\r\n\r\n const d0 = elements.insertElement(elementProps);\r\n const d1 = elements.insertElement(elementProps);\r\n const ede1 = ElementDrivesElement.create(testImodel, d0, d1, 0);\r\n ede1.insert();\r\n testImodel.saveChanges(\"step 3\");\r\n\r\n ede1.delete();\r\n testImodel.saveChanges(\"step 4\");\r\n testImodel.close();\r\n });\r\n\r\n it(\"should insert DefinitionSets\", () => {\r\n const iModelFileName: string = IModelTestUtils.prepareOutputFile(\"IModel\", \"DefinitionSets.bim\");\r\n const iModelDb = SnapshotDb.createEmpty(iModelFileName, { rootSubject: { name: \"DefinitionSets\" }, createClassViews: true });\r\n const definitionContainerId = DefinitionContainer.insert(iModelDb, IModel.dictionaryId, Code.createEmpty());\r\n assert.exists(iModelDb.elements.getElement<DefinitionContainer>(definitionContainerId));\r\n assert.exists(iModelDb.models.getModel<DefinitionModel>(definitionContainerId));\r\n const categoryId1 = SpatialCategory.insert(iModelDb, definitionContainerId, \"Category1\", new SubCategoryAppearance());\r\n const categoryId2 = SpatialCategory.insert(iModelDb, definitionContainerId, \"Category2\", new SubCategoryAppearance());\r\n const categoryId3 = SpatialCategory.insert(iModelDb, definitionContainerId, \"Category3\", new SubCategoryAppearance());\r\n const definitionGroupId = DefinitionGroup.create(iModelDb, definitionContainerId, Code.createEmpty()).insert();\r\n DefinitionGroupGroupsDefinitions.insert(iModelDb, definitionGroupId, categoryId1);\r\n DefinitionGroupGroupsDefinitions.insert(iModelDb, definitionGroupId, categoryId2);\r\n DefinitionGroupGroupsDefinitions.insert(iModelDb, definitionGroupId, categoryId3);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const numMembers = iModelDb.withPreparedStatement(`SELECT COUNT(*) FROM ${DefinitionGroupGroupsDefinitions.classFullName}`, (statement: ECSqlStatement): number => {\r\n return statement.step() === DbResult.BE_SQLITE_ROW ? statement.getValue(0).getInteger() : 0;\r\n });\r\n assert.equal(numMembers, 3);\r\n iModelDb.saveChanges();\r\n iModelDb.close();\r\n });\r\n\r\n it(\"should set EC properties of various types\", async () => {\r\n\r\n const testImodel = imodel1;\r\n assert.doesNotThrow(() => testImodel.schemaContext.getSchemaItemSync(\"TestBim:TestPhysicalObject\", EntityClass), \"TestPhysicalObject is expected to be defined in TestBim.ecschema.xml\");\r\n\r\n // Create a new physical model\r\n const [, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);\r\n\r\n // Find or create a SpatialCategory\r\n let spatialCategoryId = SpatialCategory.queryCategoryIdByName(testImodel, IModel.dictionaryId, \"MySpatialCategory\");\r\n if (undefined === spatialCategoryId) {\r\n spatialCategoryId = SpatialCategory.insert(testImodel, IModel.dictionaryId, \"MySpatialCategory\", new SubCategoryAppearance());\r\n }\r\n\r\n const trelClassName = \"TestBim:TestPhysicalObjectRelatedToTestPhysicalObject\";\r\n\r\n let id1: Id64String;\r\n let id2: Id64String;\r\n\r\n if (true) {\r\n // Create a couple of TestPhysicalObjects\r\n const elementProps: GeometricElementProps = {\r\n classFullName: \"TestBim:TestPhysicalObject\",\r\n model: newModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n id1 = testImodel.elements.insertElement(testImodel.elements.createElement(elementProps).toJSON());\r\n assert.isTrue(Id64.isValidId64(id1));\r\n\r\n // The second one should point to the first.\r\n elementProps.id = Id64.invalid;\r\n (elementProps as any).relatedElement = { id: id1, relClassName: trelClassName };\r\n elementProps.parent = { id: id1, relClassName: trelClassName };\r\n (elementProps as any).longProp = 4294967295; // make sure that we can save values in the range 0 ... UINT_MAX\r\n\r\n id2 = testImodel.elements.insertElement(testImodel.elements.createElement(elementProps).toJSON());\r\n assert.isTrue(Id64.isValidId64(id2));\r\n }\r\n\r\n if (true) {\r\n // Test that el2 points to el1\r\n const el2 = testImodel.elements.getElement(id2);\r\n assert.equal(el2.classFullName, \"TestBim:TestPhysicalObject\");\r\n assert.isTrue(\"relatedElement\" in el2);\r\n assert.isTrue(\"id\" in el2.asAny.relatedElement);\r\n assert.deepEqual(el2.asAny.relatedElement.id, id1);\r\n assert.equal(el2.asAny.longProp, 4294967295);\r\n\r\n // Even though I didn't set it, the platform knows the relationship class and reports it.\r\n assert.isTrue(\"relClassName\" in el2.asAny.relatedElement);\r\n assert.equal(el2.asAny.relatedElement.relClassName.replace(\".\", \":\"), trelClassName);\r\n }\r\n\r\n if (true) {\r\n // Change el2 to point to itself.\r\n const el2Modified = testImodel.elements.getElement(id2);\r\n el2Modified.asAny.relatedElement = { id: id2, relClassName: trelClassName };\r\n testImodel.elements.updateElement(el2Modified.toJSON());\r\n // Test that el2 points to itself.\r\n const el2after: Element = testImodel.elements.getElement(id2);\r\n assert.deepEqual(el2after.asAny.relatedElement.id, id2);\r\n assert.equal(el2after.asAny.relatedElement.relClassName.replace(\".\", \":\"), trelClassName);\r\n }\r\n\r\n if (true) {\r\n // Test that we can null out the navigation property\r\n const el2Modified = testImodel.elements.getElement(id2);\r\n el2Modified.asAny.relatedElement = null;\r\n testImodel.elements.updateElement(el2Modified.toJSON());\r\n // Test that el2 has no relatedElement property value\r\n const el2after: Element = testImodel.elements.getElement(id2);\r\n assert.isUndefined(el2after.asAny.relatedElement);\r\n }\r\n });\r\n\r\n it(\"should be able to create a snapshot IModel\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const iModel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot.bim\"), args);\r\n assert.equal(iModel.iModelId, args.guid);\r\n assert.equal(iModel.rootSubject.name, args.rootSubject.name);\r\n assert.equal(iModel.rootSubject.description, args.rootSubject.description);\r\n assert.equal(iModel.projectExtents.low.x, args.projectExtents.low.x);\r\n assert.equal(iModel.projectExtents.low.y, args.projectExtents.low.y);\r\n assert.equal(iModel.projectExtents.low.z, args.projectExtents.low.z);\r\n assert.equal(iModel.globalOrigin.x, args.globalOrigin.x);\r\n assert.equal(iModel.globalOrigin.y, args.globalOrigin.y);\r\n assert.equal(iModel.globalOrigin.z, 0);\r\n\r\n const client = iModel.queryFilePropertyString({ name: \"Client\", namespace: \"dgn_Db\" });\r\n assert.equal(client, args.client, \"query Client property\");\r\n\r\n const dbguid = iModel.queryFilePropertyBlob({ name: \"DbGuid\", namespace: \"be_Db\" });\r\n assert.equal(dbguid!.byteLength, 16, \"query guid property\");\r\n\r\n const myPropsStr: FilePropertyProps = { name: \"MyProp\", namespace: \"test1\", id: 1, subId: 1 };\r\n const myStrVal = \"this is a test\";\r\n iModel.saveFileProperty(myPropsStr, myStrVal);\r\n const readFromDb = iModel.queryFilePropertyString(myPropsStr);\r\n assert.equal(readFromDb, myStrVal, \"query string after save\");\r\n\r\n const myPropsBlob: FilePropertyProps = { name: \"MyBlob\", namespace: \"test1\", id: 10 };\r\n const testRange = new Uint8Array(500);\r\n testRange.fill(11);\r\n iModel.saveFileProperty(myPropsBlob, undefined, testRange);\r\n const blobFromDb = iModel.queryFilePropertyBlob(myPropsBlob);\r\n assert.deepEqual(blobFromDb, testRange, \"query blob after save\");\r\n\r\n let next = iModel.queryNextAvailableFileProperty(myPropsBlob);\r\n assert.equal(11, next, \"queryNextAvailableFileProperty blob\");\r\n\r\n next = iModel.queryNextAvailableFileProperty(myPropsStr);\r\n assert.equal(2, next, \"queryNextAvailableFileProperty str\");\r\n iModel.deleteFileProperty(myPropsStr);\r\n assert.isUndefined(iModel.queryFilePropertyString(myPropsStr), \"property was deleted\");\r\n next = iModel.queryNextAvailableFileProperty(myPropsStr);\r\n assert.equal(0, next, \"queryNextAvailableFileProperty, should return 0 when none present\");\r\n\r\n const testLocal = \"TestLocal\";\r\n const testValue = \"this is a test\";\r\n const nativeDb = iModel[_nativeDb];\r\n assert.isUndefined(nativeDb.queryLocalValue(testLocal));\r\n nativeDb.saveLocalValue(testLocal, testValue);\r\n assert.equal(nativeDb.queryLocalValue(testLocal), testValue);\r\n\r\n iModel.close();\r\n });\r\n\r\n it(\"should be able to create a snapshot IModel and set geolocation by GCS\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const gcs = new GeographicCRS({\r\n horizontalCRS: {\r\n id: \"10TM115-27\",\r\n description: \"\",\r\n source: \"Mentor Software Client\",\r\n deprecated: false,\r\n datumId: \"NAD27\",\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n centralMeridian: -115,\r\n latitudeOfOrigin: 0,\r\n scaleFactor: 0.9992,\r\n falseEasting: 0.0,\r\n falseNorthing: 0.0,\r\n },\r\n extent: {\r\n southWest: { latitude: 48, longitude: -120.5 },\r\n northEast: { latitude: 84, longitude: -109.5 },\r\n },\r\n },\r\n verticalCRS: { id: \"GEOID\" },\r\n additionalTransform: {\r\n helmert2DWithZOffset: {\r\n translationX: 10.0,\r\n translationY: 15.0,\r\n translationZ: 0.02,\r\n rotDeg: 1.2,\r\n scale: 1.0001,\r\n },\r\n },\r\n });\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot2.bim\");\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n let eventListenedTo = false;\r\n const gcsListener = (previousGCS: GeographicCRS | undefined) => {\r\n assert.equal(previousGCS, undefined);\r\n assert.isTrue(iModel.geographicCoordinateSystem !== undefined);\r\n assert.isTrue(iModel.geographicCoordinateSystem!.equals(gcs));\r\n eventListenedTo = true;\r\n };\r\n iModel.onGeographicCoordinateSystemChanged.addListener(gcsListener);\r\n\r\n assert.isTrue(iModel.geographicCoordinateSystem === undefined);\r\n\r\n assert.isFalse(eventListenedTo);\r\n\r\n iModel.geographicCoordinateSystem = gcs;\r\n\r\n assert.isTrue(eventListenedTo);\r\n\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n iModel.close();\r\n\r\n const iModel2 = SnapshotDb.openFile(testFile);\r\n\r\n assert.isTrue(iModel2.geographicCoordinateSystem !== undefined);\r\n\r\n // The reloaded gcs will be different as the datum definition will have been expanded\r\n assert.isFalse(iModel2.geographicCoordinateSystem!.equals(gcs));\r\n\r\n // But other properties will be identical\r\n assert.isTrue(iModel2.geographicCoordinateSystem !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.verticalCRS !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.verticalCRS!.equals(gcs.verticalCRS!));\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.additionalTransform !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.additionalTransform!.equals(gcs.additionalTransform!));\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.projection !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.projection!.equals(gcs.horizontalCRS!.projection!));\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.id !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.id === gcs.horizontalCRS!.id!);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.extent !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.extent!.equals(gcs.horizontalCRS!.extent!));\r\n\r\n // The following were not in initial definition but were completed after storage.\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.datum !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.datum!.additionalTransformPaths !== undefined);\r\n assert.isTrue(iModel2.geographicCoordinateSystem!.horizontalCRS!.datum!.additionalTransformPaths!.length >= 0);\r\n\r\n // When a gcs is present then the ECEF is automatically defined.\r\n assert.isTrue(iModel2.ecefLocation !== undefined);\r\n\r\n iModel2.close();\r\n });\r\n\r\n describe(\"async coordinate conversions\", () => {\r\n it(\"should output same number of points as input\", async () => {\r\n const iModelCoords: Point3d[] = [];\r\n const geoCoords: Point3d[] = [];\r\n for (let numPts = 0; numPts < 3; numPts++) {\r\n const geoResponse = await imodel5.getGeoCoordinatesFromIModelCoordinates({ target: \"WGS84\", iModelCoords });\r\n expect(geoResponse.geoCoords.length).to.equal(numPts);\r\n\r\n const iModelResponse = await imodel5.getIModelCoordinatesFromGeoCoordinates({ source: \"WGS84\", geoCoords });\r\n expect(iModelResponse.iModelCoords.length).to.equal(numPts);\r\n\r\n iModelCoords.push(new Point3d());\r\n geoCoords.push(new Point3d());\r\n }\r\n });\r\n\r\n it(\"should always have fromCache = 0\", async () => {\r\n const iModelCoords: Point3d[] = [];\r\n const geoCoords: Point3d[] = [];\r\n for (let numPts = 0; numPts < 3; numPts++) {\r\n const geoResponse = await imodel5.getGeoCoordinatesFromIModelCoordinates({ target: \"WGS84\", iModelCoords });\r\n expect(geoResponse.fromCache).to.equal(0);\r\n\r\n const iModelResponse = await imodel5.getIModelCoordinatesFromGeoCoordinates({ source: \"WGS84\", geoCoords });\r\n expect(iModelResponse.iModelCoords.length).to.equal(numPts);\r\n expect(iModelResponse.fromCache).to.equal(0);\r\n\r\n iModelCoords.push(new Point3d());\r\n geoCoords.push(new Point3d());\r\n }\r\n });\r\n });\r\n\r\n if (!ProcessDetector.isIOSAppBackend) {\r\n it(\"should be able to reproject with iModel coordinates to or from any other GeographicCRS\", async () => {\r\n const convertTest = async (fileName: string, fileGCS: GeographicCRSProps, datum: string | GeographicCRSProps, inputCoord: XYZProps, outputCoord: PointWithStatus) => {\r\n\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test project\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 0.0, y: 0.0 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n let datumOrGCS: string;\r\n if (typeof datum === \"object\")\r\n datumOrGCS = JSON.stringify(datum);\r\n else\r\n datumOrGCS = datum;\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", fileName);\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n iModel.setGeographicCoordinateSystem(fileGCS);\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n\r\n const testPoint1: XYZProps[] = [];\r\n testPoint1.push(inputCoord);\r\n const requestProps1: GeoCoordinatesRequestProps = { target: datumOrGCS, iModelCoords: testPoint1 };\r\n const response1 = await iModel.getGeoCoordinatesFromIModelCoordinates(requestProps1);\r\n\r\n expect(response1.geoCoords[0].s === outputCoord.s).to.be.true;\r\n\r\n // If success or warning we compare result\r\n if (outputCoord.s === GeoCoordStatus.Success || outputCoord.s === GeoCoordStatus.OutOfUsefulRange) {\r\n\r\n const expectedPt1 = Point3d.fromJSON(outputCoord.p);\r\n const outPt1 = Point3d.fromJSON(response1.geoCoords[0].p);\r\n\r\n expect(Geometry.isSamePoint3dXY(expectedPt1, outPt1)).to.be.true;\r\n expect(Math.abs(expectedPt1.z - outPt1.z) < 0.0001).to.be.true;\r\n\r\n // No point testing reversal when Out of useful range since reversibility is doubtful\r\n if (outputCoord.s !== GeoCoordStatus.OutOfUsefulRange) {\r\n const testPoint2: XYZProps[] = [];\r\n testPoint2.push(outputCoord.p);\r\n const requestProps2: IModelCoordinatesRequestProps = { source: datumOrGCS, geoCoords: testPoint2 };\r\n const response2 = await iModel.getIModelCoordinatesFromGeoCoordinates(requestProps2);\r\n\r\n const expectedPt2 = Point3d.fromJSON(inputCoord);\r\n const outPt2 = Point3d.fromJSON(response2.iModelCoords[0].p);\r\n\r\n expect(expectedPt2.distanceXY(outPt2) < 0.001).to.be.true;\r\n expect(Math.abs(expectedPt2.z - outPt2.z) < 0.001).to.be.true;\r\n }\r\n }\r\n\r\n iModel.close();\r\n };\r\n\r\n const EWRGCS: GeographicCRSProps = {\r\n horizontalCRS: {\r\n id: \"EPSG:27700\",\r\n description: \"OSGB 1936 / British National Grid\",\r\n source: \"EPSG V6 [Large and medium scale topographic mapping and engin]\",\r\n datumId: \"EPSG:6277\",\r\n datum: {\r\n id: \"EPSG:6277\",\r\n description: \"OSGB36 - Use OSGB-7P-2. Consider OSGB/OSTN15 instead\",\r\n deprecated: true,\r\n source: \"EPSG V6.12 operation EPSG:1314 [EPSG]\",\r\n ellipsoidId: \"EPSG:7001\",\r\n ellipsoid: {\r\n equatorialRadius: 6377563.396,\r\n polarRadius: 6356256.909237,\r\n id: \"EPSG:7001\",\r\n description: \"Airy 1830\",\r\n source: \"EPSG, Version 6 [EPSG]\",\r\n },\r\n transforms: [\r\n {\r\n method: \"PositionalVector\",\r\n sourceEllipsoid: {\r\n equatorialRadius: 6377563.396,\r\n polarRadius: 6356256.909237,\r\n id: \"EPSG:7001\",\r\n },\r\n targetEllipsoid: {\r\n equatorialRadius: 6378137,\r\n polarRadius: 6356752.3142,\r\n id: \"WGS84\",\r\n },\r\n positionalVector: {\r\n delta: {\r\n x: 446.448,\r\n y: -125.157,\r\n z: 542.06,\r\n },\r\n rotation: {\r\n x: 0.15,\r\n y: 0.247,\r\n z: 0.842,\r\n },\r\n scalePPM: -20.489,\r\n },\r\n }],\r\n },\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n falseEasting: 400000,\r\n falseNorthing: -100000,\r\n centralMeridian: -2,\r\n latitudeOfOrigin: 49,\r\n scaleFactor: 0.999601272737422,\r\n },\r\n extent: {\r\n southWest: {\r\n latitude: 49.96,\r\n longitude: -7.56,\r\n },\r\n northEast: {\r\n latitude: 60.84,\r\n longitude: 1.78,\r\n },\r\n },\r\n },\r\n verticalCRS: {\r\n id: \"ELLIPSOID\",\r\n },\r\n additionalTransform: {\r\n helmert2DWithZOffset: {\r\n translationX: 284597.3343,\r\n translationY: 79859.4651,\r\n translationZ: 0,\r\n rotDeg: 0.5263624458992088,\r\n scale: 0.9996703340508721,\r\n },\r\n },\r\n };\r\n\r\n await convertTest(\"ExtonCampus1.bim\", { horizontalCRS: { id: \"EPSG:2272\" }, verticalCRS: { id: \"NAVD88\" } }, \"WGS84\", { x: 775970.3155166894, y: 83323.24543981979, z: 130.74977547686285 }, { p: { x: -75.68712011112366, y: 40.06524845273591, z: 95.9769083 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"UTM83-10-NGVD29-10.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NAVD88\" } }, { horizontalCRS: { id: \"UTM27-10\" }, verticalCRS: { id: \"NGVD29\" } }, { x: 548296.472, y: 4179414.470, z: 0.8457 }, { p: { x: 548392.9689991799, y: 4179217.683834238, z: -0.0006774162750405877 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"BritishNatGrid-EllipsoidHelmert1.bim\", EWRGCS, \"WGS84\", { x: 199247.08883859176, y: 150141.68625139236, z: 0.0 }, { p: { x: -0.80184489371471, y: 51.978341907041205, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"BritishNatGrid-Ellipsoid1.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"\", { x: 170370.718, y: 11572.405, z: 0.0 }, { p: { x: -5.2020119082059511, y: 49.959453295440234, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"BritishNatGrid-Ellipsoid2.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"ETRF89\", { x: 170370.718, y: 11572.405, z: 0.0 }, { p: { x: -5.2030365061523707, y: 49.960007477936202, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"BritishNatGrid-Ellipsoid3.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"OSGB\", { x: 170370.718, y: 11572.405, z: 0.0 }, { p: { x: -5.2020119082059511, y: 49.959453295440234, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"GermanyDHDN-3-Ellipsoid1.bim\", { horizontalCRS: { id: \"DHDN/3.GK3d-4/EN\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"\", { x: 4360857.005, y: 5606083.067, z: 0.0 }, { p: { x: 10.035413954488630, y: 50.575070810112159, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"GermanyDHDN-3-Ellipsoid2.bim\", { horizontalCRS: { id: \"DHDN/3.GK3d-4/EN\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"DHDN/3\", { x: 4360857.005, y: 5606083.067, z: 0.0 }, { p: { x: 10.035413954488630, y: 50.575070810112159, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"GermanyDHDN-3-Ellipsoid3.bim\", { horizontalCRS: { id: \"DHDN/3.GK3d-4/EN\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"WGS84\", { x: 4360857.005, y: 5606083.067, z: 0.0 }, { p: { x: 10.034215937440818, y: 50.573862480894853, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-1.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, \"\", { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-2.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, \"NAD83\", { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: -30.12668428839329 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-3.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, \"WGS84\", { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: -30.12668428839329 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM27-10-Ellipsoid1.bim\", { horizontalCRS: { id: \"UTM27-10\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"\", { x: 623075.328, y: 4265650.532, z: 0.0 }, { p: { x: -121.58798236995744, y: 38.532616292207997, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM27-10-Ellipsoid2.bim\", { horizontalCRS: { id: \"UTM27-10\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"NAD83\", { x: 623075.328, y: 4265650.532, z: 0.0 }, { p: { x: -121.58905088839697, y: 38.532522753851708, z: 0.0 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"UTM83-10-NGVD29-4.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"LL84\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: -30.12668428839329 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"UTM83-10-NGVD29-5.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"LL84\" }, verticalCRS: { id: \"GEOID\" } }, { x: 632748.112, y: 4263868.307, z: 0.0 }, { p: { x: -121.47738265889652, y: 38.513305313793019, z: 0.7621583779125531 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-6.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"CA83-II\" }, verticalCRS: { id: \"NAVD88\" } }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.745910484422781 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-7.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"CA83-II\" }, verticalCRS: { id: \"GEOID\" } }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.745910484422781 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-8.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { id: \"CA83-II\" }, verticalCRS: { id: \"NGVD29\" } }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.0 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-9.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } }, { horizontalCRS: { epsg: 26942 }, verticalCRS: { id: \"NAVD88\" } }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.745910484422781 }, s: GeoCoordStatus.Success });\r\n await convertTest(\"UTM83-10-NGVD29-10.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NAVD88\" } }, { horizontalCRS: { id: \"UTM27-10\" }, verticalCRS: { id: \"NGVD29\" } }, { x: 548296.472, y: 4179414.470, z: 0.8457 }, { p: { x: 548392.9689991799, y: 4179217.683834238, z: -0.0006774162750405877 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"BritishNatGrid-Ellipsoid4.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"HS2_Snake_2015\" }, verticalCRS: { id: \"GEOID\" } }, { x: 473327.251, y: 257049.636, z: 0.0 }, { p: { x: 237732.58101946692, y: 364048.01547843055, z: -47.874172425966336 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"BritishNatGrid-Ellipsoid5.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } },\r\n {\r\n horizontalCRS: {\r\n id: \"HS2-MOCK\",\r\n description: \"USES CUSTOM DATUM\",\r\n source: \"Test\",\r\n deprecated: false,\r\n datumId: \"HS2SD_2015\",\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n centralMeridian: -1.5,\r\n latitudeOfOrigin: 52.30,\r\n scaleFactor: 1.0,\r\n falseEasting: 198873.0046,\r\n falseNorthing: 375064.3871,\r\n },\r\n },\r\n verticalCRS: {\r\n id: \"GEOID\",\r\n },\r\n }\r\n , { x: 473327.251, y: 257049.636, z: 0.0 }, { p: { x: 237732.58101952373, y: 364048.01548327296, z: -47.874172425966336 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"BritishNatGrid-Ellipsoid.bim\", { horizontalCRS: { id: \"BritishNatGrid\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"OSGB-GPS-2015\" }, verticalCRS: { id: \"GEOID\" } }, { x: 473327.251, y: 257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.Success });\r\n\r\n await convertTest(\"UTM83-10-NGVD29-12.bim\", { horizontalCRS: { id: \"UTM83-10\" }, verticalCRS: { id: \"NGVD29\" } },\r\n {\r\n horizontalCRS: {\r\n id: \"California2\",\r\n description: \"USES CUSTOM DATUM\",\r\n source: \"Test\",\r\n deprecated: false,\r\n datumId: \"NAD83\",\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"LambertConformalConicTwoParallels\",\r\n longitudeOfOrigin: -122,\r\n latitudeOfOrigin: 37.66666666667,\r\n standardParallel1: 39.833333333333336,\r\n standardParallel2: 38.333333333333336,\r\n falseEasting: 2000000.0,\r\n falseNorthing: 500000.0,\r\n },\r\n extent: {\r\n southWest: {\r\n latitude: 35,\r\n longitude: -125,\r\n },\r\n northEast: {\r\n latitude: 39.1,\r\n longitude: -120.45,\r\n },\r\n },\r\n },\r\n verticalCRS: {\r\n id: \"GEOID\",\r\n },\r\n }, { x: 569024.940, y: 4386341.752, z: 0.0 }, { p: { x: 1983192.529823256, y: 717304.0311293667, z: 0.745910484422781 }, s: GeoCoordStatus.Success });\r\n\r\n // Do some test that return errors\r\n // First test uses one GCS in Eastern USA and the other in UK. This will produce a hard domain error\r\n await convertTest(\"Error1.bim\", { horizontalCRS: { id: \"UTM84-17N\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"OSGB-GPS-2015\" }, verticalCRS: { id: \"GEOID\" } }, { x: 1473327.251, y: 1257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.OutOfMathematicalDomain });\r\n\r\n // This test performs conversion in a region outside normal use of GCS but still mathematically valid (soft domain error)\r\n await convertTest(\"Error2.bim\", { horizontalCRS: { id: \"DanishS34-S99\" }, verticalCRS: { id: \"ELLIPSOID\" } }, \"\", { x: -6618.5925260757449, y: 36058.097489683532, z: 0.0 }, { p: { x: 13.53250346041385, y: 54.71216475341563, z: 0.0 }, s: GeoCoordStatus.OutOfUsefulRange });\r\n // -6618.5925260757449, 36058.097489683532\r\n // { x: -221748.034, y: -10012.784, z: 0.0 } { p: { x: 10.36481105, y: 54.38462506, z: 0.0 }\r\n // This test makes use of a GCS using a grid file that does not even exist and will return a datum conversion error.\r\n const userGCSWithinexistentGridFile: GeographicCRSProps = {\r\n horizontalCRS: {\r\n id: \"User1\",\r\n datumId: \"UserDatum1\",\r\n datum: {\r\n id: \"UserDatum1\",\r\n ellipsoidId: \"CLRK66\",\r\n transforms: [\r\n {\r\n method: \"GridFiles\",\r\n sourceEllipsoid: {\r\n id: \"CLRK66\",\r\n equatorialRadius: 6378160.0,\r\n polarRadius: 6356774.719195306,\r\n },\r\n targetEllipsoid: {\r\n id: \"WGS84\",\r\n equatorialRadius: 6378160.0,\r\n polarRadius: 6356774.719195306,\r\n },\r\n gridFile: {\r\n files: [\r\n { fileName: \"./user/inexistent.gdc\", format: \"NTv2\", direction: \"Direct\" },\r\n ],\r\n },\r\n },\r\n ],\r\n },\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n centralMeridian: -115,\r\n latitudeOfOrigin: 0,\r\n scaleFactor: 0.9992,\r\n falseEasting: 1.0,\r\n falseNorthing: 2.0,\r\n },\r\n extent: {\r\n southWest: { latitude: 48, longitude: -120.5 },\r\n northEast: { latitude: 84, longitude: -109.5 },\r\n },\r\n }, verticalCRS: { id: \"ELLIPSOID\" },\r\n };\r\n\r\n await convertTest(\"Error3.bim\", userGCSWithinexistentGridFile, \"WGS84\", { x: 1473327.251, y: 1257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.NoDatumConverter });\r\n\r\n // The model GCS is not valid\r\n await convertTest(\"Error4.bim\", { horizontalCRS: { id: \"badfood\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"OSGB-GPS-2015\" }, verticalCRS: { id: \"GEOID\" } }, { x: 1473327.251, y: 1257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.NoGCSDefined });\r\n\r\n // The given GCS is not valid\r\n await convertTest(\"Error5.bim\", { horizontalCRS: { id: \"UTM84-17N\" }, verticalCRS: { id: \"ELLIPSOID\" } }, { horizontalCRS: { id: \"badfood\" }, verticalCRS: { id: \"GEOID\" } }, { x: 1473327.251, y: 1257049.636, z: 0.0 }, { p: { x: 473325.6830048648, y: 257049.77062273448, z: -47.87643904264457 }, s: GeoCoordStatus.NoGCSDefined });\r\n\r\n });\r\n }\r\n\r\n it(\"should be able to create a snapshot IModel and set geolocation by ECEF\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const ecef = new EcefLocation({\r\n origin: [42, 21, 0],\r\n orientation: { yaw: 1, pitch: 1, roll: -1 },\r\n });\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot3.bim\");\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n assert.isTrue(iModel.ecefLocation === undefined);\r\n\r\n iModel.ecefLocation = ecef;\r\n\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n iModel.close();\r\n\r\n const iModel2 = SnapshotDb.openFile(testFile);\r\n\r\n assert.isTrue(iModel2.ecefLocation !== undefined);\r\n assert.isTrue(iModel2.ecefLocation!.isAlmostEqual(ecef));\r\n\r\n iModel2.close();\r\n });\r\n\r\n it(\"should be able to create a snapshot IModel and set geolocation by ECEF with 0,0,0 rotation\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const ecef = new EcefLocation({\r\n origin: [42, 21, 0],\r\n orientation: { yaw: 0, pitch: 0, roll: 0 },\r\n });\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot3_000.bim\");\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n assert.isTrue(iModel.ecefLocation === undefined);\r\n\r\n iModel.ecefLocation = ecef;\r\n\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n iModel.close();\r\n\r\n const iModel2 = SnapshotDb.openFile(testFile);\r\n\r\n assert.isTrue(iModel2.ecefLocation !== undefined);\r\n assert.isTrue(iModel2.ecefLocation!.isAlmostEqual(ecef));\r\n\r\n iModel2.close();\r\n });\r\n\r\n it(\"presence of a GCS imposes the ecef value\", async () => {\r\n const args = {\r\n rootSubject: { name: \"TestSubject\", description: \"test iTwin\" },\r\n client: \"ABC Engineering\",\r\n globalOrigin: { x: 10, y: 10 },\r\n projectExtents: { low: { x: -300, y: -300, z: -20 }, high: { x: 500, y: 500, z: 400 } },\r\n guid: Guid.createValue(),\r\n };\r\n\r\n const gcs = new GeographicCRS({\r\n horizontalCRS: {\r\n id: \"10TM115-27\",\r\n description: \"\",\r\n source: \"Mentor Software Client\",\r\n deprecated: false,\r\n datumId: \"NAD27\",\r\n unit: \"Meter\",\r\n projection: {\r\n method: \"TransverseMercator\",\r\n centralMeridian: -115,\r\n latitudeOfOrigin: 0,\r\n scaleFactor: 0.9992,\r\n falseEasting: 0.0,\r\n falseNorthing: 0.0,\r\n },\r\n extent: {\r\n southWest: { latitude: 48, longitude: -120.5 },\r\n northEast: { latitude: 84, longitude: -109.5 },\r\n },\r\n },\r\n verticalCRS: { id: \"GEOID\" },\r\n additionalTransform: {\r\n helmert2DWithZOffset: {\r\n translationX: 10.0,\r\n translationY: 15.0,\r\n translationZ: 0.02,\r\n rotDeg: 1.2,\r\n scale: 1.0001,\r\n },\r\n },\r\n });\r\n\r\n const ecef = new EcefLocation({\r\n origin: [42, 21, 0],\r\n orientation: { yaw: 1, pitch: 1, roll: -1 },\r\n });\r\n\r\n const testFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"TestSnapshot4.bim\");\r\n\r\n const iModel = SnapshotDb.createEmpty(testFile, args);\r\n\r\n iModel.ecefLocation = ecef;\r\n\r\n iModel.updateIModelProps();\r\n iModel.saveChanges();\r\n iModel.close();\r\n\r\n const iModel2 = SnapshotDb.openForApplyChangesets(testFile);\r\n\r\n assert.isTrue(iModel2.ecefLocation !== undefined);\r\n assert.isTrue(iModel2.ecefLocation!.isAlmostEqual(ecef));\r\n\r\n assert.isTrue(iModel2.geographicCoordinateSystem === undefined);\r\n\r\n iModel2.geographicCoordinateSystem = gcs;\r\n\r\n iModel2.updateIModelProps();\r\n iModel2.saveChanges();\r\n iModel2.close();\r\n\r\n const iModel3 = SnapshotDb.openFile(testFile);\r\n\r\n assert.isTrue(iModel3.geographicCoordinateSystem !== undefined);\r\n\r\n // When a gcs is present then ecef value is imposed by the gcs disregarding previous value.\r\n assert.isTrue(iModel3.ecefLocation !== undefined);\r\n assert.isFalse(iModel3.ecefLocation!.isAlmostEqual(ecef));\r\n\r\n iModel3.close();\r\n });\r\n\r\n it(\"should be able to open checkpoints for RPC\", async () => {\r\n const changeset: ChangesetIdWithIndex = { id: \"fakeChangeSetId\", index: 10 };\r\n const iTwinId = \"fakeIModelId\";\r\n const iModelId = \"fakeIModelId\";\r\n const cloudContainer = { accessToken: \"sas\" };\r\n const fakeSnapshotDb: any =\r\n {\r\n cloudContainer,\r\n isReadonly: () => true,\r\n isOpen: () => true,\r\n getIModelId: () => iModelId,\r\n getITwinId: () => iTwinId,\r\n getCurrentChangeset: () => changeset,\r\n setIModelDb: () => { },\r\n closeFile: () => { },\r\n clearECDbCache: () => { },\r\n };\r\n\r\n const errorLogStub = sinon.stub(Logger, \"logError\").callsFake(() => { });\r\n const infoLogStub = sinon.stub(Logger, \"logInfo\").callsFake(() => { });\r\n\r\n // Mock iModelHub\r\n const mockCheckpointV2: V2CheckpointAccessProps = {\r\n accountName: \"testAccount\",\r\n containerId: \"imodelblocks-123\",\r\n sasToken: \"testSAS\",\r\n dbName: \"testDb\",\r\n storageType: \"azure?sas=1\",\r\n };\r\n\r\n sinon.stub(IModelHost, _hubAccess).get(() => HubMock);\r\n sinon.stub(V2CheckpointManager, \"attach\").callsFake(async () => {\r\n return { dbName: \"fakeDb\", container: { accessToken: \"sas\" } as any };\r\n });\r\n const queryStub = sinon.stub(IModelHost[_hubAccess], \"queryV2Checkpoint\").callsFake(async () => mockCheckpointV2);\r\n\r\n const openDgnDbStub = sinon.stub(SnapshotDb, \"openDgnDb\").returns(fakeSnapshotDb);\r\n sinon.stub(IModelDb.prototype, \"initializeIModelDb\" as any);\r\n sinon.stub(IModelDb.prototype, \"loadIModelSettings\" as any);\r\n\r\n const accessToken = \"token\";\r\n const checkpoint = await SnapshotDb.openCheckpointFromRpc({ accessToken, iTwinId, iModelId, changeset });\r\n expect(openDgnDbStub.calledOnce).to.be.true;\r\n expect(openDgnDbStub.firstCall.firstArg.path).to.equal(\"fakeDb\");\r\n\r\n const props = checkpoint.getRpcProps();\r\n assert.equal(props.iModelId, iModelId);\r\n assert.equal(props.iTwinId, iTwinId);\r\n assert.equal(props.changeset?.id, changeset.id);\r\n assert.equal(errorLogStub.callCount, 1);\r\n assert.include(errorLogStub.args[0][1], \"attached with timestamp that expires before\");\r\n\r\n errorLogStub.resetHistory();\r\n expect(cloudContainer.accessToken).equal(\"sas\");\r\n await checkpoint.refreshContainerForRpc(accessToken);\r\n expect(cloudContainer.accessToken).equal(\"testSAS\");\r\n\r\n assert.equal(errorLogStub.callCount, 1);\r\n assert.include(errorLogStub.args[0][1], \"attached with timestamp that expires before\");\r\n assert.equal(infoLogStub.callCount, 2);\r\n assert.include(infoLogStub.args[0][1], \"attempting to refresh\");\r\n assert.include(infoLogStub.args[1][1], \"refreshed checkpoint\");\r\n\r\n errorLogStub.resetHistory();\r\n queryStub.callsFake(async () => {\r\n throw new Error(\"no checkpoint\");\r\n });\r\n await expect(checkpoint.refreshContainerForRpc(accessToken)).to.eventually.be.rejectedWith(\"no checkpoint\");\r\n\r\n checkpoint.close();\r\n });\r\n\r\n it(\"should throw for missing/invalid checkpoint in hub\", async () => {\r\n process.env.CHECKPOINT_CACHE_DIR = \"/foo/\";\r\n sinon.stub(IModelHost, _hubAccess).get(() => HubMock);\r\n sinon.stub(IModelHost[_hubAccess], \"queryV2Checkpoint\").callsFake(async () => undefined);\r\n\r\n const accessToken = \"token\";\r\n const error = await getIModelError(SnapshotDb.openCheckpointFromRpc({ accessToken, iTwinId: Guid.createValue(), iModelId: Guid.createValue(), changeset: IModelTestUtils.generateChangeSetId() }));\r\n expectIModelError(IModelStatus.NotFound, error);\r\n });\r\n\r\n it(\"attempting to re-attach a non-checkpoint snapshot should be a no-op\", async () => {\r\n process.env.CHECKPOINT_CACHE_DIR = \"/foo/\";\r\n const accessToken = \"token\";\r\n await imodel1.refreshContainerForRpc(accessToken);\r\n });\r\n\r\n function hasClassView(db: IModelDb, name: string): boolean {\r\n try {\r\n return db.withSqliteStatement(`SELECT ECInstanceId FROM [${name}]`, (): boolean => true, false);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n it(\"Check busyTimeout option\", () => {\r\n const standaloneFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"StandaloneReadWrite.bim\");\r\n const tryOpen = (fileName: string, options?: SnapshotDbOpenArgs) => {\r\n const start = performance.now();\r\n let didThrow = false;\r\n try {\r\n StandaloneDb.openFile(fileName, OpenMode.ReadWrite, options);\r\n } catch (e: any) {\r\n assert.strictEqual(e.errorNumber, DbResult.BE_SQLITE_BUSY, \"Expect error 'Db is busy'\");\r\n didThrow = true;\r\n }\r\n assert.isTrue(didThrow);\r\n return performance.now() - start;\r\n };\r\n const seconds = (s: number) => s * 1000;\r\n\r\n const db = StandaloneDb.createEmpty(standaloneFile, { rootSubject: { name: \"Standalone\" } });\r\n db.saveChanges();\r\n // lock db so another connection cannot write to it.\r\n db.saveFileProperty({ name: \"test\", namespace: \"test\" }, \"\");\r\n\r\n assert.isAtMost(tryOpen(standaloneFile, { busyTimeout: seconds(0) }), seconds(1), \"open should fail with busy error instantly\");\r\n assert.isAtLeast(tryOpen(standaloneFile, { busyTimeout: seconds(1) }), seconds(1), \"open should fail with atleast 1 sec delay due to retry\");\r\n assert.isAtLeast(tryOpen(standaloneFile, { busyTimeout: seconds(2) }), seconds(2), \"open should fail with atleast 2 sec delay due to retry\");\r\n assert.isAtLeast(tryOpen(standaloneFile, { busyTimeout: seconds(3) }), seconds(3), \"open should fail with atleast 3 sec delay due to retry\");\r\n\r\n db.abandonChanges();\r\n db.close();\r\n });\r\n\r\n it(\"Cache cleared on abandonChanges\", () => {\r\n const standaloneFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"StandaloneReadWrite.bim\");\r\n const db = StandaloneDb.createEmpty(standaloneFile, { rootSubject: { name: \"Standalone\" } });\r\n db.saveChanges();\r\n\r\n const code = Code.createEmpty();\r\n code.value = \"foo\";\r\n const props: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n const id = db.elements.insertElement(props);\r\n const element1 = db.elements.getElementProps(id);\r\n db.abandonChanges();\r\n\r\n code.value = \"bar\";\r\n const props2: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n const id2 = db.elements.insertElement(props2);\r\n expect(id2).to.equal(id);\r\n const element2 = db.elements.getElementProps(id2);\r\n expect(element2).to.not.equal(element1);\r\n\r\n // Make sure that the statement caches are not cleared\r\n expect((db as any)._sqliteStatementCache.size).to.be.greaterThan(0);\r\n expect((db as any)._statementCache.size).to.be.greaterThan(0);\r\n\r\n db.abandonChanges();\r\n db.close();\r\n });\r\n\r\n it(\"Only instance caches should be cleared with clearCaches instanceCachesOnly parameter\", () => {\r\n const standaloneFile = IModelTestUtils.prepareOutputFile(\"IModel\", \"StandaloneReadWrite.bim\");\r\n const db = StandaloneDb.createEmpty(standaloneFile, { rootSubject: { name: \"Standalone\" } });\r\n db.saveChanges();\r\n\r\n const code = Code.createEmpty();\r\n code.value = \"foo\";\r\n const props: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n const id = db.elements.insertElement(props);\r\n db.elements.getElementProps(id);\r\n db.models.getModelProps(IModel.dictionaryId);\r\n\r\n expect(db.elements[_cache].size).to.be.greaterThan(0);\r\n expect(db.models[_cache].size).to.be.greaterThan(0);\r\n expect(db.elements[_instanceKeyCache].size).to.be.greaterThan(0);\r\n expect(db.models[_instanceKeyCache].size).to.be.greaterThan(0);\r\n\r\n db.clearCaches({ instanceCachesOnly: true });\r\n\r\n expect(db.elements[_cache].size).to.equal(0);\r\n expect(db.models[_cache].size).to.equal(0);\r\n expect(db.elements[_instanceKeyCache].size).to.equal(0);\r\n expect(db.models[_instanceKeyCache].size).to.equal(0);\r\n\r\n // Make sure that the statement caches are not cleared\r\n expect((db as any)._sqliteStatementCache.size).to.be.greaterThan(0);\r\n expect((db as any)._statementCache.size).to.be.greaterThan(0);\r\n\r\n db.abandonChanges();\r\n db.close();\r\n });\r\n\r\n it(\"Standalone iModel properties\", () => {\r\n const standaloneRootSubjectName = \"Standalone\";\r\n const standaloneFile1 = IModelTestUtils.prepareOutputFile(\"IModel\", \"Standalone1.bim\");\r\n const ecefLocation = new EcefLocation({ origin: [1, 2, 3], orientation: { yaw: 0, pitch: 0, roll: 0 } })\r\n const geographicCoordinateSystem = {\r\n horizontalCRS: { id: \"10TM115-27\" },\r\n }\r\n let standaloneDb1 = StandaloneDb.createEmpty(standaloneFile1, { rootSubject: { name: standaloneRootSubjectName }, ecefLocation, geographicCoordinateSystem });\r\n assert.isTrue(standaloneDb1.isStandaloneDb());\r\n assert.isTrue(standaloneDb1.isStandalone);\r\n assert.isFalse(standaloneDb1.isReadonly, \"Expect standalone iModels to be read-write during create\");\r\n assert.equal(standaloneDb1.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(standaloneDb1.pathName, standaloneFile1);\r\n assert.equal(standaloneDb1, StandaloneDb.tryFindByKey(standaloneDb1.key), \"Should be in the list of open StandaloneDbs\");\r\n assert.equal(standaloneDb1.elements.getRootSubject().code.value, standaloneRootSubjectName);\r\n assert.isTrue(standaloneDb1.isOpen);\r\n assert.isTrue(Guid.isV4Guid(standaloneDb1.iModelId));\r\n assert.equal(standaloneDb1.iTwinId, Guid.empty);\r\n assert.strictEqual(\"\", standaloneDb1.changeset.id);\r\n assert.strictEqual(0, standaloneDb1.changeset.index);\r\n assert.deepEqual(standaloneDb1.ecefLocation?.origin, ecefLocation.origin, \"standalone ecefLocation should be set\");\r\n assert.strictEqual(standaloneDb1.geographicCoordinateSystem?.horizontalCRS?.id, \"10TM115-27\", \"standalone coordinate system should be set\");\r\n assert.equal(standaloneDb1.openMode, OpenMode.ReadWrite);\r\n standaloneDb1.close();\r\n assert.isFalse(standaloneDb1.isOpen);\r\n standaloneDb1.close(); // calling `close()` a second time is a no-op\r\n assert.isUndefined(StandaloneDb.tryFindByKey(standaloneDb1.key));\r\n standaloneDb1 = StandaloneDb.openFile(standaloneFile1);\r\n assert.equal(standaloneDb1, StandaloneDb.tryFindByKey(standaloneDb1.key));\r\n assert.isFalse(standaloneDb1.isReadonly, \"By default, StandaloneDbs are opened read/write\");\r\n standaloneDb1.close();\r\n assert.isUndefined(StandaloneDb.tryFindByKey(standaloneDb1.key));\r\n });\r\n\r\n it(\"Snapshot iModel properties\", async () => {\r\n const snapshotRootSubjectName = \"Snapshot\";\r\n const snapshotFile1 = IModelTestUtils.prepareOutputFile(\"IModel\", \"Snapshot1.bim\");\r\n const snapshotFile2 = IModelTestUtils.prepareOutputFile(\"IModel\", \"Snapshot2.bim\");\r\n const snapshotFile3 = IModelTestUtils.prepareOutputFile(\"IModel\", \"Snapshot3.bim\");\r\n const imodel = await generateTestSnapshot(\"test_for_snapshot.bim\", \"test.bim\");\r\n const ecefLocation = new EcefLocation({ origin: [1, 2, 3], orientation: { yaw: 0, pitch: 0, roll: 0 } })\r\n const geographicCoordinateSystem = {\r\n horizontalCRS: { id: \"10TM115-27\" },\r\n }\r\n let snapshotDb1 = SnapshotDb.createEmpty(snapshotFile1, { rootSubject: { name: snapshotRootSubjectName }, createClassViews: true, ecefLocation, geographicCoordinateSystem });\r\n let snapshotDb2 = SnapshotDb.createFrom(snapshotDb1, snapshotFile2);\r\n let snapshotDb3 = SnapshotDb.createFrom(imodel, snapshotFile3, { createClassViews: true });\r\n assert.isTrue(snapshotDb1.isSnapshotDb());\r\n assert.isTrue(snapshotDb2.isSnapshotDb());\r\n assert.isTrue(snapshotDb3.isSnapshotDb());\r\n assert.isTrue(snapshotDb1.isSnapshot);\r\n assert.isTrue(snapshotDb2.isSnapshot);\r\n assert.isTrue(snapshotDb3.isSnapshot);\r\n assert.isFalse(snapshotDb1.isReadonly, \"Expect snapshots to be read-write during create\");\r\n assert.isFalse(snapshotDb2.isReadonly, \"Expect snapshots to be read-write during create\");\r\n assert.isFalse(snapshotDb3.isReadonly, \"Expect snapshots to be read-write during create\");\r\n assert.equal(snapshotDb1.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(snapshotDb2.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(snapshotDb3.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(imodel.getBriefcaseId(), BriefcaseIdValue.Unassigned);\r\n assert.equal(snapshotDb1.pathName, snapshotFile1);\r\n assert.equal(snapshotDb2.pathName, snapshotFile2);\r\n assert.equal(snapshotDb3.pathName, snapshotFile3);\r\n assert.equal(snapshotDb1, SnapshotDb.tryFindByKey(snapshotDb1.key));\r\n assert.equal(snapshotDb2, SnapshotDb.tryFindByKey(snapshotDb2.key));\r\n assert.equal(snapshotDb3, SnapshotDb.tryFindByKey(snapshotDb3.key));\r\n const iModelGuid1: GuidString = snapshotDb1.iModelId;\r\n const iModelGuid2: GuidString = snapshotDb2.iModelId;\r\n const iModelGuid3: GuidString = snapshotDb3.iModelId;\r\n assert.notEqual(iModelGuid1, iModelGuid2, \"Expect different iModel GUIDs for each snapshot\");\r\n assert.notEqual(iModelGuid2, iModelGuid3, \"Expect different iModel GUIDs for each snapshot\");\r\n const rootSubjectName1 = snapshotDb1.elements.getRootSubject().code.value;\r\n const rootSubjectName2 = snapshotDb2.elements.getRootSubject().code.value;\r\n const rootSubjectName3 = snapshotDb3.elements.getRootSubject().code.value;\r\n const imodelRootSubjectName = imodel.elements.getRootSubject().code.value;\r\n assert.equal(rootSubjectName1, snapshotRootSubjectName);\r\n assert.equal(rootSubjectName1, rootSubjectName2, \"Expect a snapshot to maintain the root Subject name from its seed\");\r\n assert.equal(rootSubjectName3, imodelRootSubjectName, \"Expect a snapshot to maintain the root Subject name from its seed\");\r\n assert.isTrue(snapshotDb1.isOpen);\r\n assert.isTrue(snapshotDb2.isOpen);\r\n assert.isTrue(snapshotDb3.isOpen);\r\n assert.deepEqual(snapshotDb1.ecefLocation?.origin, ecefLocation.origin, \"snapshot ecefLocation should be set\");\r\n assert.strictEqual(snapshotDb1.geographicCoordinateSystem?.horizontalCRS?.id, \"10TM115-27\", \"snapshot coordinate system should be set\");\r\n snapshotDb1.close();\r\n snapshotDb2.close();\r\n snapshotDb3.close();\r\n assert.isFalse(snapshotDb1.isOpen);\r\n assert.isFalse(snapshotDb2.isOpen);\r\n assert.isFalse(snapshotDb3.isOpen);\r\n snapshotDb1.close(); // calling `close()` a second time is a no-op\r\n snapshotDb2.close(); // calling `close()` a second time is a no-op\r\n snapshotDb3.close(); // calling `close()` a second time is a no-op\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb1.key));\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb2.key));\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb3.key));\r\n snapshotDb1 = SnapshotDb.openFile(snapshotFile1);\r\n snapshotDb2 = SnapshotDb.openFile(snapshotFile2);\r\n snapshotDb3 = SnapshotDb.openFile(snapshotFile3);\r\n assert.equal(snapshotDb1, SnapshotDb.tryFindByKey(snapshotDb1.key));\r\n assert.equal(snapshotDb2, SnapshotDb.tryFindByKey(snapshotDb2.key));\r\n assert.equal(snapshotDb3, SnapshotDb.tryFindByKey(snapshotDb3.key));\r\n assert.equal(snapshotDb3, SnapshotDb.findByKey(snapshotDb3.key));\r\n assert.equal(snapshotDb3, IModelDb.findByKey(snapshotDb3.key));\r\n assert.throws(() => BriefcaseDb.findByKey(snapshotDb1.key)); // lookup of key for SnapshotDb via BriefcaseDb should throw\r\n assert.throws(() => StandaloneDb.findByKey(snapshotDb1.key)); // likewise for StandaloneDb\r\n assert.isTrue(snapshotDb1.isReadonly, \"Expect snapshots to be read-only after open\");\r\n assert.isTrue(snapshotDb2.isReadonly, \"Expect snapshots to be read-only after open\");\r\n assert.isTrue(snapshotDb3.isReadonly, \"Expect snapshots to be read-only after open\");\r\n assert.isTrue(hasClassView(snapshotDb1, \"bis.Element\"));\r\n assert.isTrue(hasClassView(snapshotDb1, \"bis.ElementAspect\"));\r\n assert.isTrue(hasClassView(snapshotDb1, \"bis.Model\"));\r\n assert.isTrue(hasClassView(snapshotDb1, \"bis.ElementRefersToElements\"));\r\n assert.isFalse(hasClassView(snapshotDb2, \"bis.Element\"));\r\n assert.isTrue(hasClassView(snapshotDb3, \"bis.Element\"));\r\n\r\n imodel.close();\r\n snapshotDb1.close();\r\n snapshotDb2.close();\r\n snapshotDb3.close();\r\n\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb1.key));\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb2.key));\r\n assert.isUndefined(SnapshotDb.tryFindByKey(snapshotDb3.key));\r\n });\r\n\r\n it(\"upgrade the domain schema in a StandaloneDb\", async () => {\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"UpgradeIModel\", \"testImodel.bim\");\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"testImodel.bim\");\r\n IModelJsFs.copySync(seedFileName, testFileName);\r\n\r\n let iModel = StandaloneDb.openFile(testFileName, OpenMode.ReadWrite);\r\n const beforeVersion = iModel.querySchemaVersion(\"BisCore\");\r\n assert.isTrue(semver.satisfies(beforeVersion!, \"= 1.0.0\"));\r\n iModel.close();\r\n\r\n const schemaState: SchemaState = StandaloneDb.validateSchemas(testFileName, true);\r\n assert.strictEqual(schemaState, SchemaState.UpgradeRecommended);\r\n\r\n StandaloneDb.upgradeStandaloneSchemas(testFileName);\r\n\r\n iModel = StandaloneDb.openFile(testFileName, OpenMode.ReadWrite);\r\n const afterVersion = iModel.querySchemaVersion(\"BisCore\");\r\n assert.isTrue(semver.satisfies(afterVersion!, \">= 1.0.10\"));\r\n iModel.close();\r\n });\r\n\r\n it(\"Run plain SQL\", () => {\r\n imodel1.withPreparedSqliteStatement(\"CREATE TABLE Test(Id INTEGER PRIMARY KEY, Name TEXT NOT NULL, Code INTEGER)\", (stmt: SqliteStatement) => {\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(1, \"Dummy 1\");\r\n stmt.bindValue(2, 100);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\r\n stmt.bindValues([\"Dummy 2\", 200]);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(\":p1\", \"Dummy 3\");\r\n stmt.bindValue(\":p2\", 300);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\r\n stmt.bindValues({ \":p1\": \"Dummy 4\", \":p2\": 400 });\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.saveChanges();\r\n\r\n imodel1.withPreparedSqliteStatement(\"SELECT Id,Name,Code FROM Test ORDER BY Id\", (stmt: SqliteStatement) => {\r\n for (let i: number = 1; i <= 4; i++) {\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\r\n assert.equal(stmt.getColumnCount(), 3);\r\n const val0: SqliteValue = stmt.getValue(0);\r\n assert.equal(val0.columnName, \"Id\");\r\n assert.equal(val0.type, SqliteValueType.Integer);\r\n assert.isFalse(val0.isNull);\r\n assert.equal(val0.getInteger(), i);\r\n\r\n const val1: SqliteValue = stmt.getValue(1);\r\n assert.equal(val1.columnName, \"Name\");\r\n assert.equal(val1.type, SqliteValueType.String);\r\n assert.isFalse(val1.isNull);\r\n assert.equal(val1.getString(), `Dummy ${i}`);\r\n\r\n const val2: SqliteValue = stmt.getValue(2);\r\n assert.equal(val2.columnName, \"Code\");\r\n assert.equal(val2.type, SqliteValueType.Integer);\r\n assert.isFalse(val2.isNull);\r\n assert.equal(val2.getInteger(), i * 100);\r\n\r\n const row: any = stmt.getRow();\r\n assert.equal(row.id, i);\r\n assert.equal(row.name, `Dummy ${i}`);\r\n assert.equal(row.code, i * 100);\r\n }\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"SELECT 1 FROM ec_CustomAttribute WHERE ContainerId=? AND Instance LIKE '<IsMixin%' COLLATE NOCASE\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(1, \"0x1f\");\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n });\r\n\r\n it(\"Run plain SQL against readonly connection\", () => {\r\n let iModel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"sqlitesqlreadonlyconnection.bim\"), { rootSubject: { name: \"test\" } });\r\n const iModelPath = iModel.pathName;\r\n iModel.close();\r\n iModel = SnapshotDb.openFile(iModelPath);\r\n\r\n iModel.withPreparedSqliteStatement(\"SELECT Name,StrData FROM be_Prop WHERE Namespace='ec_Db'\", (stmt: SqliteStatement) => {\r\n let rowCount: number = 0;\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n rowCount++;\r\n assert.equal(stmt.getColumnCount(), 2);\r\n const nameVal: SqliteValue = stmt.getValue(0);\r\n assert.equal(nameVal.columnName, \"Name\");\r\n assert.equal(nameVal.type, SqliteValueType.String);\r\n assert.isFalse(nameVal.isNull);\r\n const name: string = nameVal.getString();\r\n\r\n const versionVal: SqliteValue = stmt.getValue(1);\r\n assert.equal(versionVal.columnName, \"StrData\");\r\n assert.equal(versionVal.type, SqliteValueType.String);\r\n assert.isFalse(versionVal.isNull);\r\n const profileVersion: any = JSON.parse(versionVal.getString());\r\n\r\n assert.isTrue(name === \"SchemaVersion\" || name === \"InitialSchemaVersion\");\r\n if (name === \"SchemaVersion\") {\r\n assert.equal(profileVersion.major, 4);\r\n assert.equal(profileVersion.minor, 0);\r\n assert.equal(profileVersion.sub1, 0);\r\n assert.isAtLeast(profileVersion.sub2, 1);\r\n } else if (name === \"InitialSchemaVersion\") {\r\n assert.equal(profileVersion.major, 4);\r\n assert.equal(profileVersion.minor, 0);\r\n assert.equal(profileVersion.sub1, 0);\r\n assert.isAtLeast(profileVersion.sub2, 1);\r\n }\r\n }\r\n assert.equal(rowCount, 2);\r\n });\r\n iModel.close();\r\n });\r\n\r\n it(\"tryPrepareStatement\", () => {\r\n const sql = `SELECT * FROM ${Element.classFullName} LIMIT 1`;\r\n const invalidSql = \"SELECT * FROM InvalidSchemaName:InvalidClassName LIMIT 1\";\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.throws(() => imodel1.prepareStatement(invalidSql, false));\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.isUndefined(imodel1.tryPrepareStatement(invalidSql));\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n using statement: ECSqlStatement | undefined = imodel1.tryPrepareStatement(sql);\r\n assert.isDefined(statement);\r\n assert.isTrue(statement?.isPrepared);\r\n });\r\n\r\n it(\"containsClass\", () => {\r\n assert.isTrue(imodel1.containsClass(Element.classFullName));\r\n assert.isTrue(imodel1.containsClass(\"BisCore:Element\"));\r\n assert.isTrue(imodel1.containsClass(\"BisCore.Element\"));\r\n assert.isTrue(imodel1.containsClass(\"biscore:element\"));\r\n assert.isTrue(imodel1.containsClass(\"biscore.element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis:Element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis.Element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis:element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis.element\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore:Element:InvalidExtra\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore\"));\r\n assert.isFalse(imodel1.containsClass(\":Element\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore:InvalidClassName\"));\r\n assert.isFalse(imodel1.containsClass(\"InvalidSchemaName:Element\"));\r\n });\r\n\r\n it(\"should update Element code\", () => {\r\n const elementId = imodel4.elements.insertElement({\r\n classFullName: \"DgnPlatformTest:TestInformationRecord\",\r\n model: IModel.repositoryModelId,\r\n code: Code.createEmpty(),\r\n });\r\n let element = imodel4.elements.getElement<InformationRecordElement>(elementId, InformationRecordElement);\r\n assert.isTrue(Code.isValid(element.code));\r\n assert.isTrue(Code.isEmpty(element.code));\r\n const codeSpecId = imodel4.codeSpecs.insert(\"TestCodeSpec\", CodeScopeSpec.Type.Model);\r\n const codeValue = `${element.className}-1`;\r\n element.code = new Code({ spec: codeSpecId, scope: IModel.repositoryModelId, value: codeValue });\r\n element.update();\r\n element = imodel4.elements.getElement<InformationRecordElement>(elementId, InformationRecordElement);\r\n assert.isTrue(Code.isValid(element.code));\r\n assert.isFalse(Code.isEmpty(element.code));\r\n assert.equal(element.code.value, codeValue);\r\n });\r\n\r\n it(\"should update UserLabel\", () => {\r\n // type coercion reminder!\r\n const s: string = \"\";\r\n assert.isTrue(s === \"\");\r\n assert.isFalse(s ? true : false);\r\n\r\n // insert element with an undefined UserLabel\r\n const elementProps: DefinitionElementProps = {\r\n classFullName: SpatialCategory.classFullName,\r\n model: IModel.dictionaryId,\r\n code: SpatialCategory.createCode(imodel1, IModel.dictionaryId, \"TestCategoryForClearUserLabel\"),\r\n };\r\n const elementId = imodel1.elements.insertElement(elementProps);\r\n let element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.isUndefined(element.userLabel);\r\n\r\n // update element with a defined userLabel\r\n element.userLabel = \"UserLabel\";\r\n element.update();\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.equal(element.userLabel, \"UserLabel\");\r\n\r\n // make sure userLabel is not updated when not part of the specified ElementProps\r\n imodel1.elements.updateElement({\r\n id: element.id,\r\n classFullName: element.classFullName,\r\n model: element.model,\r\n code: element.code,\r\n });\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.equal(element.userLabel, \"UserLabel\"); // NOTE: userLabel is not modified when userLabel is not part of the input ElementProps\r\n\r\n const elProps = imodel1.elements.getElementProps({ id: elementId, onlyBaseProperties: true });\r\n expect(elProps.userLabel).equal(element.userLabel);\r\n expect(elProps.classFullName).equal(SpatialCategory.classFullName);\r\n expect(elProps.model).equal(element.model);\r\n expect(elProps.code.value).equal(element.code.value);\r\n expect(elProps.code.scope).equal(element.code.scope);\r\n expect(elProps.code.spec).equal(element.code.spec);\r\n expect(elProps.federationGuid).equal(element.federationGuid);\r\n expect((elProps as any).isPrivate).to.be.oneOf([false, undefined]);\r\n expect((elProps as any).isInstanceOfEntity).undefined;\r\n\r\n // remove userlabel by setting it to the blank string\r\n element.userLabel = \"\";\r\n element.update();\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.isUndefined(element.userLabel); // NOTE: userLabel is cleared when the empty string is specified\r\n });\r\n\r\n it(\"should update FederationGuid\", () => {\r\n // insert element with an undefined FederationGuid\r\n const elementProps: DefinitionElementProps = {\r\n classFullName: SpatialCategory.classFullName,\r\n model: IModel.dictionaryId,\r\n federationGuid: Guid.empty,\r\n code: SpatialCategory.createCode(imodel1, IModel.dictionaryId, \"TestCategoryForClearFederationGuid\"),\r\n };\r\n const elementId = imodel1.elements.insertElement(elementProps);\r\n let element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.isUndefined(element.federationGuid);\r\n assert.isFalse(element.isPrivate);\r\n\r\n // update element with a defined FederationGuid\r\n const federationGuid = Guid.createValue();\r\n element.federationGuid = federationGuid;\r\n element.isPrivate = true;\r\n element.update();\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.equal(element.federationGuid, federationGuid);\r\n assert.isTrue(element.isPrivate);\r\n\r\n // make sure FederationGuid is not updated when not part of the specified ElementProps\r\n imodel1.elements.updateElement({\r\n id: element.id,\r\n classFullName: element.classFullName,\r\n model: element.model,\r\n code: element.code,\r\n });\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.equal(element.federationGuid, federationGuid);\r\n assert.isTrue(element.isPrivate);\r\n\r\n // remove federationGuid by setting it to undefined in ElementProps\r\n const elProps = element.toJSON();\r\n elProps.federationGuid = undefined;\r\n imodel1.elements.updateElement(elProps);\r\n element = imodel1.elements.getElement<SpatialCategory>(elementId);\r\n assert.isUndefined(element.federationGuid);\r\n\r\n // ensure that update doesn't change federationGuid from an element immediately after insert (toJSON should remove undefined value)\r\n const subject5 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject5\");\r\n const s5Id = subject5.insert();\r\n const s5pre = imodel1.elements.getElement<Subject>(s5Id);\r\n subject5.description = \"new descr\";\r\n subject5.update();\r\n const s5post = imodel1.elements.getElement<Subject>(s5Id);\r\n expect(s5pre.federationGuid).equal(s5post.federationGuid);\r\n expect(s5post.description).equal(subject5.description);\r\n });\r\n\r\n it(\"should support partial update\", () => {\r\n // Insert Subject elements - initializing Description and UserLabel to similar values\r\n let subject1 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject1\", \"Description1\");\r\n let subject2 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject2\", \"Description2\");\r\n let subject3 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject3\", \"\");\r\n let subject4 = Subject.create(imodel1, IModel.rootSubjectId, \"Subject4\");\r\n subject1.userLabel = \"UserLabel1\";\r\n subject2.userLabel = \"UserLabel2\";\r\n subject3.userLabel = \"\";\r\n subject4.userLabel = undefined;\r\n const federationGuid1 = Guid.createValue();\r\n const federationGuid2 = Guid.createValue();\r\n subject1.federationGuid = federationGuid1;\r\n subject2.federationGuid = federationGuid2;\r\n subject3.federationGuid = \"\";\r\n subject4.federationGuid = Guid.empty;\r\n const subjectId1 = subject1.insert();\r\n const subjectId2 = subject2.insert();\r\n const subjectId3 = subject3.insert();\r\n const subjectId4 = subject4.insert();\r\n subject1 = imodel1.elements.getElement<Subject>(subjectId1, Subject);\r\n subject2 = imodel1.elements.getElement<Subject>(subjectId2, Subject);\r\n subject3 = imodel1.elements.getElement<Subject>(subjectId3, Subject);\r\n subject4 = imodel1.elements.getElement<Subject>(subjectId4, Subject);\r\n\r\n // Subject.Description is an auto-handled property\r\n assert.equal(subject1.description, \"Description1\");\r\n assert.equal(subject2.description, \"Description2\");\r\n assert.equal(subject3.description, \"\"); // NOTE: different behavior between auto-handled and custom-handled\r\n assert.isUndefined(subject4.description);\r\n\r\n // Test toJSON\r\n assert.equal(subject1.toJSON().description, \"Description1\");\r\n assert.equal(subject2.toJSON().description, \"Description2\");\r\n assert.equal(subject3.toJSON().description, \"\");\r\n assert.isUndefined(subject4.toJSON().description);\r\n\r\n // Element.UserLabel is a custom-handled property\r\n assert.equal(subject1.userLabel, \"UserLabel1\");\r\n assert.equal(subject2.userLabel, \"UserLabel2\");\r\n assert.isUndefined(subject3.userLabel); // NOTE: different behavior between auto-handled and custom-handled\r\n assert.isUndefined(subject4.userLabel);\r\n\r\n // Element.FederationGuid is a custom-handled property\r\n assert.equal(subject1.federationGuid, federationGuid1);\r\n assert.equal(subject2.federationGuid, federationGuid2);\r\n assert.isUndefined(subject4.federationGuid);\r\n\r\n // test partial update of Description (auto-handled)\r\n imodel1.elements.updateElement<SubjectProps>({ id: subject1.id, description: \"Description1-Updated\" });\r\n subject1 = imodel1.elements.getElement<Subject>(subjectId1, Subject);\r\n assert.equal(subject1.description, \"Description1-Updated\"); // should have been updated\r\n assert.isDefined(subject1.model);\r\n assert.isDefined(subject1.parent);\r\n assert.equal(subject1.code.value, \"Subject1\"); // should not have changed\r\n assert.equal(subject1.userLabel, \"UserLabel1\"); // should not have changed\r\n assert.equal(subject1.federationGuid, federationGuid1); // should not have changed\r\n\r\n // test partial update of UserLabel (custom-handled)\r\n imodel1.elements.updateElement<SubjectProps>({ id: subject2.id, userLabel: \"UserLabel2-Updated\" });\r\n subject2 = imodel1.elements.getElement<Subject>(subjectId2, Subject);\r\n assert.isDefined(subject2.model);\r\n assert.isDefined(subject2.parent);\r\n assert.equal(subject2.userLabel, \"UserLabel2-Updated\"); // should have been updated\r\n assert.equal(subject2.code.value, \"Subject2\"); // should not have changed\r\n assert.equal(subject2.description, \"Description2\"); // should not have changed\r\n assert.equal(subject2.federationGuid, federationGuid2); // should not have changed\r\n\r\n // Update Subject elements - setting Description and UserLabel to similar values\r\n subject1.description = undefined;\r\n subject2.description = \"\";\r\n subject3.description = \"Description3\";\r\n subject4.description = \"Description4\";\r\n subject2.userLabel = \"\";\r\n subject3.userLabel = \"UserLabel3\";\r\n subject4.userLabel = \"UserLabel4\";\r\n subject1.update();\r\n subject2.update();\r\n subject3.update();\r\n subject4.update();\r\n subject1 = imodel1.elements.getElement<Subject>(subjectId1, Subject);\r\n subject2 = imodel1.elements.getElement<Subject>(subjectId2, Subject);\r\n subject3 = imodel1.elements.getElement<Subject>(subjectId3, Subject);\r\n subject4 = imodel1.elements.getElement<Subject>(subjectId4, Subject);\r\n\r\n // Subject.Description is an auto-handled property\r\n assert.isUndefined(subject1.description);\r\n assert.equal(subject2.description, \"\"); // NOTE: different behavior between auto-handled and custom-handled\r\n assert.equal(subject3.description, \"Description3\");\r\n assert.equal(subject4.description, \"Description4\");\r\n\r\n // Element.UserLabel is a custom-handled property\r\n assert.isUndefined(subject2.userLabel); // NOTE: different behavior between auto-handled and custom-handled\r\n assert.equal(subject3.userLabel, \"UserLabel3\");\r\n assert.equal(subject4.userLabel, \"UserLabel4\");\r\n\r\n // test partial update of Description to undefined\r\n const s3Fed = subject3.federationGuid;\r\n imodel1.elements.updateElement<SubjectProps>({ id: subject3.id, description: undefined });\r\n subject3 = imodel1.elements.getElement<Subject>(subjectId3, Subject);\r\n assert.isUndefined(subject3.description); // should have been updated\r\n assert.isDefined(subject3.model);\r\n assert.isDefined(subject3.parent);\r\n assert.equal(subject3.code.value, \"Subject3\"); // should not have changed\r\n assert.equal(subject3.userLabel, \"UserLabel3\"); // should not have changed\r\n assert.equal(subject3.federationGuid, s3Fed); // should not have changed\r\n\r\n // test partial update of UserLabel to undefined\r\n imodel1.elements.updateElement<SubjectProps>({ id: subject4.id, userLabel: undefined });\r\n subject4 = imodel1.elements.getElement<Subject>(subjectId4, Subject);\r\n assert.isDefined(subject4.model);\r\n assert.isDefined(subject4.parent);\r\n // assert.isUndefined(subject4.userLabel); // should have been updated - WIP WIP WIP\r\n assert.equal(subject4.code.value, \"Subject4\"); // should not have changed\r\n assert.equal(subject4.description, \"Description4\"); // should not have changed\r\n assert.isUndefined(subject4.federationGuid); // should not have changed\r\n\r\n });\r\n\r\n it('should allow untrimmed codes when using \"exact\" codeValueBehavior', () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"codeValueBehavior.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"codeValueBehaviors\" } });\r\n\r\n const getNumberedCodeValAndProps = (n: number) => {\r\n const trimmedCodeVal = `CodeValue${n}`;\r\n const untrimmedCodeVal = `${trimmedCodeVal}\\xa0`;\r\n const spec = imodel.codeSpecs.getByName(SpatialCategory.getCodeSpecName()).id;\r\n const props: ElementProps = {\r\n // the [[Code]] class still (as it always has) trims unicode space, so avoid it\r\n code: { spec, scope: IModelDb.dictionaryId, value: untrimmedCodeVal },\r\n model: IModelDb.dictionaryId,\r\n classFullName: SpatialCategory.classFullName,\r\n };\r\n return { trimmedCodeVal, untrimmedCodeVal, props };\r\n };\r\n\r\n expect(imodel.codeValueBehavior).to.equal(\"trim-unicode-whitespace\");\r\n\r\n const code1 = getNumberedCodeValAndProps(1);\r\n const categ1Id = imodel.elements.insertElement(code1.props);\r\n const categ1 = imodel.elements.getElementProps({ id: categ1Id });\r\n expect(categ1.code.value).to.equal(code1.trimmedCodeVal);\r\n\r\n imodel.codeValueBehavior = \"exact\";\r\n const code2 = getNumberedCodeValAndProps(2);\r\n const categ2Id = imodel.elements.insertElement(code2.props);\r\n const categ2 = imodel.elements.getElementProps({ id: categ2Id });\r\n expect(categ2.code.value).to.equal(code2.untrimmedCodeVal);\r\n\r\n imodel.codeValueBehavior = \"trim-unicode-whitespace\";\r\n const code3 = getNumberedCodeValAndProps(3);\r\n const categ3Id = imodel.elements.insertElement(code3.props);\r\n const categ3 = imodel.elements.getElement({ id: categ3Id });\r\n expect(categ3.code.value).to.equal(code3.trimmedCodeVal);\r\n\r\n imodel.close();\r\n });\r\n\r\n it(\"should throw iTwinErrors on element CRUD opertion fails\", async () => {\r\n const code = Code.createEmpty();\r\n code.value = \"foo\";\r\n\r\n const props: TypeDefinitionElementProps = {\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n imodel1.elements.insertElement(props);\r\n\r\n expect(() => imodel1.elements.insertElement(props)).throws(\"Error inserting element [duplicate code]\").to.have.property(\"iTwinErrorId\");\r\n const updateProps: TypeDefinitionElementProps = {\r\n id: Id64.fromString(\"0x111111\"),\r\n classFullName: GenericGraphicalType2d.classFullName,\r\n model: IModel.dictionaryId,\r\n code,\r\n };\r\n expect(() => imodel1.elements.updateElement(updateProps)).throws(`Error updating element [missing id], id: ${updateProps.id}`).to.have.property(\"iTwinErrorId\");\r\n expect(() => imodel1.elements.deleteElement(updateProps.id!)).throws(`Error deleting element [missing id], id: ${updateProps.id}`).to.have.property(\"iTwinErrorId\");\r\n\r\n expect(() => imodel1.models.insertModel({ classFullName: DefinitionModel.classFullName, modeledElement: { id: \"0x10000000bad\" } })).throws(\"Error inserting model [error=10004], class=BisCore:DefinitionModel\").to.have.property(\"iTwinErrorId\");\r\n expect(() => imodel1.models.updateModel({\r\n id: Id64.fromString(\"0x111111\"),\r\n modeledElement: { id: Id64.fromString(\"0x111111\") },\r\n classFullName: \"\"\r\n })).throws(`Error updating model [missing id], id: ${Id64.fromString(\"0x111111\")}`).to.have.property(\"iTwinErrorId\");\r\n expect(() => imodel1.models.deleteModel(Id64.fromString(\"0x111111\"))).throws(`Error deleting model [missing id], id: ${Id64.fromString(\"0x111111\")}`).to.have.property(\"iTwinErrorId\");\r\n });\r\n\r\n it(\"throws NotFound when attempting to access element props after closing the iModel\", () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"accessAfterClose.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"accessAfterClose\" } });\r\n\r\n const elem = imodel.elements.getElement<Subject>(IModel.rootSubjectId);\r\n expect(elem.id).to.equal(IModel.rootSubjectId);\r\n\r\n imodel.close();\r\n\r\n expect(() => imodel.elements.getElement<Subject>(IModel.rootSubjectId)).to.throw(IModelError, \"Element=0x1\", \"Not Found\");\r\n });\r\n\r\n it(\"should throw \\\"constraint failed (BE_SQLITE_CONSTRAINT_UNIQUE)\\\" when inserting a relationsip instance with the same prop twice\", () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"insertDuplicateInstance.bim\");\r\n const imodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"insertDuplicateInstance\" } });\r\n const elements = imodel.elements;\r\n\r\n // Create a new physical model\r\n const newModelId = PhysicalModel.insert(imodel, IModel.rootSubjectId, \"TestModel\");\r\n\r\n // create a SpatialCategory\r\n const spatialCategoryId = SpatialCategory.insert(imodel, IModel.dictionaryId, \"MySpatialCategory\", new SubCategoryAppearance({ color: ColorByName.darkRed }));\r\n\r\n // Create a couple of physical elements.\r\n const elementProps: GeometricElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: newModelId,\r\n category: spatialCategoryId,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n const id0 = elements.insertElement(elementProps);\r\n const id1 = elements.insertElement(elementProps);\r\n\r\n const props: ElementGroupsMembersProps = {\r\n classFullName: \"BisCore:ElementGroupsMembers\",\r\n sourceId: id0,\r\n targetId: id1,\r\n memberPriority: 1,\r\n };\r\n\r\n imodel.relationships.insertInstance(props)\r\n expect(() => imodel.relationships.insertInstance(props)).to.throw(`Failed to insert relationship [${imodelPath}]: rc=2067, constraint failed (BE_SQLITE_CONSTRAINT_UNIQUE)`);\r\n\r\n imodel.close();\r\n });\r\n\r\n function createElemProps(_imodel: IModelDb, modId: Id64String, catId: Id64String, className: string): GeometricElementProps {\r\n // Create props\r\n const elementProps: GeometricElementProps = {\r\n classFullName: className,\r\n model: modId,\r\n category: catId,\r\n code: Code.createEmpty(),\r\n };\r\n return elementProps;\r\n }\r\n\r\n function insertElement(imodel: IModelDb, mId: Id64String, cId: Id64String, cName: string, propName: string): Id64String {\r\n const elementProps = createElemProps(imodel, mId, cId, cName);\r\n const geomElement = imodel.elements.createElement(elementProps);\r\n (geomElement as any).name = propName; // Add a custom property to the element\r\n const id = imodel.elements.insertElement(geomElement.toJSON());\r\n assert.isTrue(Id64.isValidId64(id), \"insert failed\");\r\n return id;\r\n }\r\n\r\n function validateADrivesBRowCount(imodel: IModelDb, expectedRows: number): void {\r\n const reader = IModelTestUtils.executeQuery(imodel, `select * from trs.ADrivesB`);\r\n assert.strictEqual(reader.length, expectedRows, `Expected ${expectedRows} rows in trs.ADrivesB table`);\r\n }\r\n\r\n function validateNavProp(imodel: IModelDb, expectedNavPropValue: any): void {\r\n const reader = IModelTestUtils.executeQuery(imodel, `select NavPropChildB from trs.ChildA`);\r\n assert.strictEqual(reader.length, 1);\r\n assert.deepEqual(reader[0].navPropChildB, expectedNavPropValue, `Expected NavPropChildB to be \"${expectedNavPropValue}\"`);\r\n }\r\n\r\n it(\"Validate invalid relationship classes being inserted/updated\", async () => {\r\n const imodelPath = IModelTestUtils.prepareOutputFile(\"IModel\", \"invalidRelationshipClass.bim\");\r\n\r\n if (IModelJsFs.existsSync(imodelPath))\r\n IModelJsFs.unlinkSync(imodelPath);\r\n\r\n const testImodel = SnapshotDb.createEmpty(imodelPath, { rootSubject: { name: \"invalidRelationshipClass\" } });\r\n\r\n await testImodel.importSchemaStrings([\r\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestRelationSchema\" alias=\"trs\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"TestElement\">\r\n <BaseClass>bis:PhysicalElement</BaseClass>\r\n <ECProperty propertyName=\"Name\" typeName=\"string\" />\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"ChildA\" >\r\n <BaseClass>TestElement</BaseClass>\r\n <ECNavigationProperty propertyName=\"NavPropChildB\" relationshipName=\"ADrivesB\" direction=\"Forward\" readOnly=\"True\">\r\n </ECNavigationProperty>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"ChildB\" >\r\n <BaseClass>TestElement</BaseClass>\r\n </ECEntityClass>\r\n\r\n <ECRelationshipClass typeName=\"ADrivesB\" strengthDirection=\"Backward\" strength=\"referencing\" modifier=\"Sealed\">\r\n <Source multiplicity=\"(0..*)\" polymorphic=\"true\" roleLabel=\"drives\">\r\n <Class class=\"ChildA\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..1)\" polymorphic=\"true\" roleLabel=\"is driven by\">\r\n <Class class=\"ChildB\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n\r\n <ECEntityClass typeName=\"ChildC\">\r\n <BaseClass>TestElement</BaseClass>\r\n </ECEntityClass>\r\n\r\n <ECEntityClass typeName=\"ChildD\">\r\n <BaseClass>TestElement</BaseClass>\r\n </ECEntityClass>\r\n\r\n <ECRelationshipClass typeName=\"CIsRelatedToD\" strength=\"referencing\" modifier=\"Sealed\">\r\n <BaseClass>bis:ElementRefersToElements</BaseClass>\r\n <Source multiplicity=\"(0..*)\" roleLabel=\"IsRelatedTo\" polymorphic=\"true\">\r\n <Class class=\"ChildC\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..*)\" roleLabel=\"IsRelatedTo (Reversed)\" polymorphic=\"true\">\r\n <Class class=\"ChildD\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n </ECSchema>`]);\r\n\r\n // Enable ECSQL write validation and verify it's set\r\n const pragmaRows = IModelTestUtils.executeQuery(testImodel, `PRAGMA validate_ecsql_writes=true`);\r\n assert.exists(pragmaRows);\r\n assert.strictEqual(pragmaRows[0].validate_ecsql_writes, true);\r\n\r\n // Ensure ADrivesB table is empty before test\r\n validateADrivesBRowCount(testImodel, 0);\r\n\r\n // Create a physical model and spatial category if needed\r\n const [, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);\r\n let spatialCategoryId = SpatialCategory.queryCategoryIdByName(testImodel, IModel.dictionaryId, \"MySpatialCategory\");\r\n if (!spatialCategoryId) {\r\n spatialCategoryId = SpatialCategory.insert(\r\n testImodel,\r\n IModel.dictionaryId,\r\n \"MySpatialCategory\",\r\n new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() })\r\n );\r\n }\r\n\r\n // Insert a ChildB element to be referenced by ChildA\r\n const idB = insertElement(testImodel, newModelId, spatialCategoryId, \"TestRelationSchema:ChildB\", \"ChildBElement\");\r\n assert.isTrue(Id64.isValidId64(idB), \"Insert ChildBElement failed\");\r\n\r\n testImodel.saveChanges();\r\n\r\n // Prepare base props for ChildA\r\n const elementProps = createElemProps(testImodel, newModelId, spatialCategoryId, \"TestRelationSchema:ChildA\");\r\n\r\n // Test various relationship class names for navigation property\r\n const testCases = [\r\n { name: \"trs:ADrivesB\", shouldSucceed: true, expectedRows: 1 },\r\n { name: \"trs.FakeClass\", shouldSucceed: true, expectedRows: 0 },\r\n { name: \"trs:ChildA\", shouldSucceed: false, expectedRows: 0 },\r\n { name: \"trs:ChildB\", shouldSucceed: false, expectedRows: 0 },\r\n { name: \"trs:CIsRelatedToD\", shouldSucceed: false, expectedRows: 0 },\r\n ];\r\n\r\n for (const { name, shouldSucceed, expectedRows } of testCases) {\r\n const elemRef = new RelatedElement({ id: idB, relClassName: name });\r\n (elementProps as any).navPropChildB = elemRef;\r\n (elementProps as any).name = \"ChildAElement\";\r\n const geomElement = testImodel.elements.createElement(elementProps);\r\n\r\n let idA: Id64String | undefined;\r\n try {\r\n idA = testImodel.elements.insertElement(geomElement.toJSON());\r\n if (shouldSucceed)\r\n assert.isTrue(Id64.isValidId64(idA), `Insert should have succeeded for ${name}.`);\r\n else\r\n assert.fail(`Insert should have failed for ${name}.`);\r\n } catch (err: any) {\r\n if (shouldSucceed)\r\n assert.fail(`Insert should have succeeded for ${name}. Error: ${err.message}`);\r\n\r\n // If should not succeed, error is expected\r\n }\r\n\r\n // Validate row count in ADrivesB table\r\n validateADrivesBRowCount(testImodel, expectedRows);\r\n\r\n // If insert succeeded, test update and delete scenarios\r\n if (expectedRows === 1 && idA !== undefined) {\r\n validateNavProp(testImodel, { id: idB, relClassName: \"TestRelationSchema.ADrivesB\" });\r\n\r\n const editElem: any = testImodel.elements.getElement(idA);\r\n editElem.navPropChildB = new RelatedElement({ id: idB, relClassName: \"trs.FakeClass\" });\r\n editElem.name = \"ChildAElementUpdated\";\r\n testImodel.elements.updateElement(editElem);\r\n\r\n validateADrivesBRowCount(testImodel, 1);\r\n validateNavProp(testImodel, { id: idB, relClassName: \"TestRelationSchema.ADrivesB\" });\r\n\r\n const editedElem: any = testImodel.elements.getElement(idA);\r\n assert.equal(editedElem.name, \"ChildAElementUpdated\", `Expected name to be \"ChildAElementUpdated\" after update, but got \"${editedElem.name}\"`);\r\n assert.strictEqual(editedElem.navPropChildB.relClassName, \"TestRelationSchema.ADrivesB\", `Expected navPropChildB to be \"TestRelationSchema.ADrivesB\" after update, but got \"${editedElem.navPropChildB}\"`);\r\n\r\n // Set the nav prop value to null\r\n editElem.name = \"ChildAElementNulled\";\r\n editElem.navPropChildB = null;\r\n testImodel.elements.updateElement(editElem);\r\n\r\n validateADrivesBRowCount(testImodel, 0);\r\n const nulledElem: any = testImodel.elements.getElement(idA);\r\n assert.equal(nulledElem.name, \"ChildAElementNulled\", `Expected name to be \"ChildAElementNulled\" after nulling, but got \"${nulledElem.name}\"`);\r\n assert.isUndefined(nulledElem.navPropChildB, `Expected navPropChildB to be undefined after nulling, but got \"${nulledElem.navPropChildB}\"`);\r\n\r\n if (shouldSucceed) {\r\n // Delete the element\r\n testImodel.elements.deleteElement(idA);\r\n assert.isUndefined(testImodel.elements.tryGetElement(idA), `Expected element with id ${idA} to be deleted, but it still exists.`);\r\n }\r\n }\r\n\r\n testImodel.abandonChanges();\r\n }\r\n testImodel.close();\r\n });\r\n\r\n it(\"should update codeValues that are switched between elements\", async () => {\r\n const dbFileName = IModelTestUtils.prepareOutputFile(\"IModel\", \"change-codeValues.bim\");\r\n const imodelDb = SnapshotDb.createEmpty(dbFileName, {\r\n rootSubject: { name: \"change-codeValues\" },\r\n });\r\n let categoryA = SpatialCategory.create(\r\n imodelDb,\r\n IModel.dictionaryId,\r\n \"A\"\r\n );\r\n let categoryB = SpatialCategory.create(\r\n imodelDb,\r\n IModel.dictionaryId,\r\n \"B\"\r\n );\r\n categoryA.userLabel = \"A\";\r\n categoryB.userLabel = \"B\";\r\n categoryA.insert();\r\n categoryB.insert();\r\n imodelDb.saveChanges();\r\n\r\n categoryA = imodelDb.elements.getElement(\r\n SpatialCategory.createCode(imodelDb, IModel.dictionaryId, \"A\")\r\n );\r\n categoryB = imodelDb.elements.getElement(\r\n SpatialCategory.createCode(imodelDb, IModel.dictionaryId, \"B\")\r\n );\r\n categoryA.code.value = \"temp\";\r\n categoryA.update();\r\n categoryB.code.value = \"A\";\r\n categoryB.update();\r\n categoryA.code.value = \"B\";\r\n categoryA.update();\r\n imodelDb.saveChanges();\r\n\r\n categoryA = imodelDb.elements.getElement(\r\n SpatialCategory.createCode(imodelDb, IModel.dictionaryId, \"A\")\r\n );\r\n categoryB = imodelDb.elements.getElement(\r\n SpatialCategory.createCode(imodelDb, IModel.dictionaryId, \"B\")\r\n );\r\n\r\n expect(categoryA.userLabel).to.equal(\"B\", `categoryA.userLabel mismatch in ${imodelDb.name}`);\r\n expect(categoryB.userLabel).to.equal(\"A\", `categoryB.userLabel mismatch in ${imodelDb.name}`);\r\n imodelDb.close();\r\n });\r\n\r\n it(\"should provide meaningful error when querying a closed iModel\", () => {\r\n const testImodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"QueryingClosedImodel.bim\"), { rootSubject: { name: \"QueryClosedTest\" } });\r\n assert.isTrue(testImodel.isOpen);\r\n\r\n // Close the iModel for the tests\r\n testImodel.close();\r\n assert.isFalse(testImodel.isOpen);\r\n\r\n const closedDbError = \"Cannot query a closed Db\";\r\n expect(() => testImodel.withPreparedSqliteStatement(\"SELECT 1\", () => { })).to.throw(closedDbError);\r\n expect(() => testImodel.withPreparedSqliteStatement(\"SELECT 1\", () => { })).to.throw(closedDbError);\r\n expect(() => testImodel.prepareSqliteStatement(\"SELECT 1\")).to.throw(closedDbError);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n expect(() => testImodel.prepareStatement(\"SELECT 1\")).to.throw(closedDbError);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n expect(() => testImodel.withPreparedStatement(\"SELECT ECInstanceId FROM BisCore:Element LIMIT 1\", () => { })).to.throw(closedDbError);\r\n expect(() => testImodel.elements.queryChildren(IModel.rootSubjectId)).to.throw(closedDbError);\r\n expect(() => testImodel.elements.getAspects(\"0x1\", \"WrongSchema:WrongClass\")).to.throw(\"db is not open\");\r\n expect(() => testImodel.createQueryReader(\"SELECT 1\")).to.throw(\"db not open\");\r\n });\r\n\r\n describe(\"Delete relationship instances\", () => {\r\n let testImodel: SnapshotDb;\r\n const relationshipClasses = [\r\n \"BisCore:ElementGroupsMembers\",\r\n \"BisCore:ElementDrivesElement\",\r\n \"BisCore:ElementRefersToDocuments\"\r\n ];\r\n\r\n afterEach(() => {\r\n if (testImodel !== undefined) {\r\n const iModelPath = testImodel.pathName;\r\n if (testImodel.isOpen)\r\n testImodel.close();\r\n IModelJsFs.unlinkSync(iModelPath);\r\n }\r\n });\r\n\r\n function setupRelationships(numOfRelationships: number, multipleClasses: boolean = false): RelationshipProps[] {\r\n testImodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"DeleteRelationshipInstances.bim\"), { rootSubject: { name: \"DeleteRelationshipInstances\" } });\r\n assert.isTrue(testImodel.isOpen);\r\n\r\n const [, newModelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(testImodel, Code.createEmpty(), true);\r\n let spatialCategoryId = SpatialCategory.queryCategoryIdByName(testImodel, IModel.dictionaryId, \"MySpatialCategory\");\r\n if (!spatialCategoryId) {\r\n spatialCategoryId = SpatialCategory.insert(testImodel, IModel.dictionaryId, \"MySpatialCategory\", new SubCategoryAppearance());\r\n }\r\n\r\n const relationships: RelationshipProps[] = [];\r\n for (let i = 0; i < numOfRelationships; ++i) {\r\n const sourceProps = createElemProps(testImodel, newModelId, spatialCategoryId, \"Generic:PhysicalObject\");\r\n const sourceId = testImodel.elements.insertElement(sourceProps);\r\n\r\n const targetProps = createElemProps(testImodel, newModelId, spatialCategoryId, \"Generic:PhysicalObject\");\r\n const targetId = testImodel.elements.insertElement(targetProps);\r\n\r\n let relationshipClass = \"BisCore:ElementGroupsMembers\";\r\n if (multipleClasses)\r\n relationshipClass = relationshipClasses[i % relationshipClasses.length];\r\n\r\n const relationshipProps: RelationshipProps = {\r\n classFullName: relationshipClass,\r\n sourceId,\r\n targetId,\r\n };\r\n\r\n relationshipProps.id = testImodel.relationships.insertInstance(relationshipProps);\r\n relationships.push(relationshipProps);\r\n }\r\n testImodel.saveChanges();\r\n return relationships;\r\n }\r\n\r\n async function getRelationshipCount(iModel: IModelDb, relationshipClass: string): Promise<number> {\r\n const reader = iModel.createQueryReader(`SELECT COUNT(*) AS [count] FROM ${relationshipClass}`);\r\n await reader.step();\r\n return reader.current.count;\r\n }\r\n\r\n it(\"deleteInstances with an empty array\", async () => {\r\n const relationships = setupRelationships(10);\r\n assert.equal(relationships.length, await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\"));\r\n\r\n testImodel.relationships.deleteInstances([]);\r\n testImodel.saveChanges();\r\n\r\n assert.equal(relationships.length, await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\"));\r\n });\r\n\r\n it(\"deleteInstances with a single relationship instance\", async () => {\r\n const relationships = setupRelationships(10);\r\n assert.equal(relationships.length, await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\"), \"Should delete exactly one relationship\");\r\n\r\n // Delete just one relationship using deleteInstances method\r\n testImodel.relationships.deleteInstances([relationships[0]]);\r\n testImodel.saveChanges();\r\n\r\n const remainingCount = await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\");\r\n assert.equal(remainingCount, relationships.length - 1, \"Should delete exactly one relationship\");\r\n });\r\n\r\n it(\"deleteInstances with different relationship classes\", async () => {\r\n const relationships = setupRelationships(500, true);\r\n\r\n // Verify relationships were created across different classes\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\") >= Math.floor(relationships.length / 3));\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementDrivesElement\") >= Math.floor(relationships.length / 3));\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementRefersToDocuments\") >= Math.floor(relationships.length / 3));\r\n\r\n // Test deleteInstances with mixed relationship classes\r\n testImodel.relationships.deleteInstances(relationships);\r\n testImodel.saveChanges();\r\n\r\n // Verify all relationships were deleted regardless of their class\r\n assert.equal(0, await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\"), \"All ElementGroupsMembers relationships should be deleted\");\r\n assert.equal(0, await getRelationshipCount(testImodel, \"BisCore.ElementDrivesElement\"), \"All ElementDrivesElement relationships should be deleted\");\r\n assert.equal(0, await getRelationshipCount(testImodel, \"BisCore.ElementRefersToDocuments\"), \"All ElementRefersToDocuments relationships should be deleted\");\r\n });\r\n\r\n it(\"deleteInstances for random relationship instances\", async () => {\r\n const relationships = setupRelationships(1000, true);\r\n\r\n // Verify relationships exist before deletion\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementGroupsMembers\") >= Math.floor(relationships.length / 3));\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementDrivesElement\") >= Math.floor(relationships.length / 3));\r\n assert.isTrue(await getRelationshipCount(testImodel, \"BisCore.ElementRefersToDocuments\") >= Math.floor(relationships.length / 3));\r\n\r\n // Create a subset of random relationship entries to delete\r\n const relationshipsToDelete: RelationshipProps[] = [];\r\n for (let i = 0; i < 250; ++i) {\r\n relationshipsToDelete.push(relationships[Math.floor(Math.random() * relationships.length)]);\r\n }\r\n\r\n testImodel.relationships.deleteInstances(relationshipsToDelete);\r\n testImodel.saveChanges();\r\n\r\n // Verify all relationships were deleted\r\n for (const relClass of relationshipsToDelete) {\r\n const reader = testImodel.createQueryReader(`SELECT ECInstanceId FROM ${relClass.classFullName} WHERE SourceECInstanceId=? AND TargetECInstanceId=?`, new QueryBinder().bindId(1, relClass.sourceId).bindId(2, relClass.targetId));\r\n assert.isFalse(await reader.step(), `Relationship ${relClass.id} should be deleted`); // No row should be returned\r\n }\r\n });\r\n });\r\n});\r\n\r\ndescribe(\"IModelDb.requireMinimumSchemaVersion\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => imodel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"MinSchemaVer.bim\"), { rootSubject: { name: \"MinSchemaVer\" } }));\r\n after(() => imodel.close());\r\n\r\n it(\"throws if the schema does not exist\", () => {\r\n expect(\r\n () => imodel.requireMinimumSchemaVersion(\"FakeSchema\", new ECVersion(1, 0, 0), \"Scrobbles\")\r\n ).to.throw(\"Scrobbles requires FakeSchema v01.00.00 or newer\");\r\n });\r\n\r\n it(\"throws IFF the schema version is older than the minimum\", () => {\r\n function test(minVer: ECVersion, expectError: boolean): void {\r\n expect(imodel.meetsMinimumSchemaVersion(\"BisCore\", minVer)).to.equal(!expectError);\r\n const require = () => imodel.requireMinimumSchemaVersion(\"BisCore\", minVer, \"Scrobbles\");\r\n if (expectError) {\r\n expect(require).to.throw(`Scrobbles requires BisCore v${minVer.toString()} or newer`);\r\n } else {\r\n require();\r\n }\r\n }\r\n\r\n const bisVer = imodel.querySchemaVersionNumbers(\"BisCore\")!;\r\n expect(bisVer.read).to.equal(1);\r\n expect(bisVer.write).to.equal(0);\r\n expect(bisVer.minor).to.least(24);\r\n\r\n test(bisVer, false);\r\n test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor - 1), false);\r\n test(new ECVersion(0, 0, 1), false);\r\n\r\n test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor + 1), true);\r\n test(new ECVersion(bisVer.read, bisVer.write, bisVer.minor + 1), true);\r\n test(new ECVersion(bisVer.read + 1, bisVer.write + 1, bisVer.minor), true);\r\n });\r\n});\r\n"]}
|