@itwin/core-backend 5.14.0 → 5.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -1
- package/lib/cjs/ECSqlRowExecutor.d.ts +3 -3
- package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.js +2 -2
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
- package/lib/cjs/ECSqlStatement.d.ts +5 -0
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +15 -2
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js +2 -2
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/Element.d.ts +29 -2
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +38 -2
- package/lib/cjs/Element.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.d.ts +3 -3
- package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
- package/lib/esm/ECSqlRowExecutor.js +2 -2
- package/lib/esm/ECSqlRowExecutor.js.map +1 -1
- package/lib/esm/ECSqlStatement.d.ts +5 -0
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +15 -2
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/esm/ECSqlSyncReader.js +3 -3
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/Element.d.ts +29 -2
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +41 -5
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +140 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/element/ElementSubModelInsert.test.d.ts +2 -0
- package/lib/esm/test/element/ElementSubModelInsert.test.d.ts.map +1 -0
- package/lib/esm/test/element/ElementSubModelInsert.test.js +183 -0
- package/lib/esm/test/element/ElementSubModelInsert.test.js.map +1 -0
- package/lib/esm/test/hubaccess/CodeSwap.test.js +78 -0
- package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -1
- package/lib/esm/test/imodel/IModelGeolocation.test.js +3 -3
- package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -1
- package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts +2 -0
- package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SessionApplyIndirect.test.js +211 -0
- package/lib/esm/test/standalone/SessionApplyIndirect.test.js.map +1 -0
- package/package.json +16 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeSwap.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/CodeSwap.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\n\r\nimport * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { Suite } from \"mocha\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { Code, CodeScopeSpec, GeometricElement2dProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\r\nimport { BriefcaseDb, ChannelControl, DrawingCategory } from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\nchai.use(chaiAsPromised);\r\n\r\ndescribe(\"Code value management: null, swap, undo/redo, and cross-briefcase pull\", function (this: Suite) {\r\n this.timeout(60000);\r\n\r\n it(\"swap codeValues between two elements sharing the same codeSpec and codeScope, verify undo/redo in a single transaction\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap2\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"insert two elements with same codeSpecId and codeScopeId, null first code, swap codes, undo/redo, push\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Step 1 (txn1): Set codeValue of elem1 to empty (null-equivalent) ---\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"set elem1 code to null\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n });\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n\r\n // --- Step 2 (txn2): Swap codeValues — elem1 gets CODE_B, elem2 gets CODE_A ---\r\n // elem1's intermediate empty code value avoids a uniqueness conflict while assigning CODE_A to elem2.\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"null elem1 code and swap code values\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final swapped code values after pulling\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"delete element with existing code and insert new element with same code, verify undo/redo, push, and b2 sees final state after pull\", async () => {\r\n HubMock.startup(\"CodeDeleteInsertTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeDeleteInsertTest\",\r\n description: \"CodeDeleteInsertTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert an element with a code ---\r\n let elem1Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert element with CODE_A\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert element with CODE_A\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Delete elem1 and insert a new element with the same code ---\r\n let newElemId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"delete elem1 and insert new element with same code\", (txn) => {\r\n txn.deleteElement(elem1Id!);\r\n\r\n const newElemProps: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n newElemId = txn.insertElement(newElemProps);\r\n });\r\n\r\n b1.clearCaches();\r\n\r\n // Verify after delete + insert\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const newElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(newElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse the delete + insert) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(() => b1!.elements.getElementProps(newElemId!)).to.throw();\r\n\r\n // --- Redo (reinstate the delete + insert) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const redoneElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(redoneElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"delete elem1 and insert new element with same code\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final state after pulling\r\n chai.expect(() => b2!.elements.getElementProps(elem1Id!)).to.throw();\r\n const b2NewElem = b2.elements.getElementProps(newElemId!);\r\n chai.expect(b2NewElem.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n\r\n it(\"single-transaction code swap reverts to old behaviour (swap not applied) when noUpdateLoop is true\", async () => {\r\n HubMock.startup(\"CodeSwapNoUpdateLoopTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapNoUpdateLoopTest\",\r\n description: \"CodeSwapNoUpdateLoopTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // --- Single-transaction swap: null elem1, then swap codes ---\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"single-txn swap\", (txn) => {\r\n // Step 1: null out elem1's code to free the uniqueness slot\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n // Step 2: assign CODE_A to elem2, CODE_B to elem1\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n\r\n // Verify b1 has the swapped state\r\n b1.clearCaches();\r\n const b1e1 = b1.elements.getElementProps(elem1Id!);\r\n const b1e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(b1e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b1e2.code.value).to.equal(\"CODE_A\");\r\n\r\n await b1.pushChanges({ description: \"single-txn code swap\" });\r\n\r\n // Pull with noUpdateLoop: true — this uses the old (pre-fix) apply path.\r\n // The unique-index conflict handler skips the intermediate null step,\r\n // so the swap is silently dropped and b2 retains the original codes.\r\n // noUpdateLoop is intentionally not in the public PullChangesArgs type.\r\n type InternalPullArgs = Parameters<BriefcaseDb[\"pullChanges\"]>[0] & { noUpdateLoop?: boolean };\r\n await b2.pullChanges({ noUpdateLoop: true } as InternalPullArgs);\r\n\r\n b2.clearCaches();\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n // Old behaviour: swap did NOT land — b2 still sees the original codes\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_B\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"CodeSwap.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/CodeSwap.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\n\r\nimport * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { Suite } from \"mocha\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { Code, CodeScopeSpec, GeometricElement2dProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\r\nimport { BriefcaseDb, ChannelControl, DrawingCategory } from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\nchai.use(chaiAsPromised);\r\n\r\ndescribe(\"Code value management: null, swap, undo/redo, and cross-briefcase pull\", function (this: Suite) {\r\n this.timeout(60000);\r\n\r\n it(\"swap codeValues between two elements sharing the same codeSpec and codeScope, verify undo/redo in a single transaction\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap2\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"insert two elements with same codeSpecId and codeScopeId, null first code, swap codes, undo/redo, push\", async () => {\r\n HubMock.startup(\"CodeSwapTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapTest\",\r\n description: \"CodeSwapTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String; // will be the drawing model\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert two elements with same codeSpecId/codeScopeId but different codeValues ---\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n let e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(e2.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e2.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Step 1 (txn1): Set codeValue of elem1 to empty (null-equivalent) ---\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"set elem1 code to null\", (txn) => {\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n });\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n\r\n // --- Step 2 (txn2): Swap codeValues — elem1 gets CODE_B, elem2 gets CODE_A ---\r\n // elem1's intermediate empty code value avoids a uniqueness conflict while assigning CODE_A to elem2.\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!] });\r\n withEditTxn(b1, \"swap code values\", (txn) => {\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n b1.clearCaches();\r\n // Verify after swap\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse txn2: the swap) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.satisfy((v: string | undefined) => v === undefined || v === \"\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_B\");\r\n\r\n // --- Redo (reinstate txn2: the swap) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(e2.code.value).to.equal(\"CODE_A\");\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"null elem1 code and swap code values\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final swapped code values after pulling\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n it(\"delete element with existing code and insert new element with same code, verify undo/redo, push, and b2 sees final state after pull\", async () => {\r\n HubMock.startup(\"CodeDeleteInsertTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeDeleteInsertTest\",\r\n description: \"CodeDeleteInsertTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // --- Create a drawing model + category and a CodeSpec ---\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n // --- Insert an element with a code ---\r\n let elem1Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert element with CODE_A\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert element with CODE_A\" });\r\n await b2.pullChanges();\r\n\r\n // Verify initial state\r\n let e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.spec).to.equal(codeSpecId!);\r\n chai.expect(e1.code.scope).to.equal(codeScopeId!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Delete elem1 and insert a new element with the same code ---\r\n let newElemId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ exclusive: [elem1Id!] });\r\n withEditTxn(b1, \"delete elem1 and insert new element with same code\", (txn) => {\r\n txn.deleteElement(elem1Id!);\r\n\r\n const newElemProps: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n newElemId = txn.insertElement(newElemProps);\r\n });\r\n\r\n b1.clearCaches();\r\n\r\n // Verify after delete + insert\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const newElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(newElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Undo (reverse the delete + insert) ---\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n b1.txns.reverseTxns(1);\r\n\r\n e1 = b1.elements.getElementProps(elem1Id!);\r\n chai.expect(e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(() => b1!.elements.getElementProps(newElemId!)).to.throw();\r\n\r\n // --- Redo (reinstate the delete + insert) ---\r\n chai.expect(b1.txns.isRedoPossible).to.be.true;\r\n b1.txns.reinstateTxn();\r\n\r\n chai.expect(() => b1!.elements.getElementProps(elem1Id!)).to.throw();\r\n const redoneElem = b1.elements.getElementProps(newElemId!);\r\n chai.expect(redoneElem.code.value).to.equal(\"CODE_A\");\r\n\r\n // --- Push changes ---\r\n await b1.pushChanges({ description: \"delete elem1 and insert new element with same code\" });\r\n await b2.pullChanges();\r\n\r\n // No local txns remain after push\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // Verify b2 sees the final state after pulling\r\n chai.expect(() => b2!.elements.getElementProps(elem1Id!)).to.throw();\r\n const b2NewElem = b2.elements.getElementProps(newElemId!);\r\n chai.expect(b2NewElem.code.value).to.equal(\"CODE_A\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n\r\n // Regression for iTwin/itwinjs-backlog#2435: rebasing a code swap must not cascade-delete derived-class rows.\r\n it(\"preserves both drawing graphics when rebasing a local code swap over an unrelated incoming change\", async () => {\r\n HubMock.startup(\"CodeSwapRebaseCascadeTest\", KnownTestLocations.outputDir);\r\n let far: BriefcaseDb | undefined;\r\n let local: BriefcaseDb | undefined;\r\n\r\n try {\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"far-user\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapRebaseCascadeTest\",\r\n description: \"CodeSwapRebaseCascadeTest\",\r\n });\r\n const source = far = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"far-user\", iTwinId: HubMock.iTwinId, iModelId });\r\n source.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n await source.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n const { drawingModelId, drawingCategoryId, codeSpecId } = withEditTxn(source, \"setup code swap rebase\", (txn) => {\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, IModelTestUtils.getUniqueModelCode(source, \"DrawingModel\"));\r\n const categoryId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n const specId = source.codeSpecs.insert(txn, \"CodeSwapRebaseCascadeCodeSpec\", CodeScopeSpec.Type.Model);\r\n return { drawingModelId: modelId, drawingCategoryId: categoryId, codeSpecId: specId };\r\n });\r\n await source.pushChanges({ description: \"setup\" });\r\n\r\n const target = local = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"local-user\", iTwinId: HubMock.iTwinId, iModelId });\r\n target.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const codeA = new Code({ spec: codeSpecId, scope: drawingModelId, value: \"CODE_A\" });\r\n const codeB = new Code({ spec: codeSpecId, scope: drawingModelId, value: \"CODE_B\" });\r\n\r\n await source.locks.acquireLocks({ shared: drawingModelId });\r\n const { elementA, elementB, unrelatedId } = withEditTxn(source, \"insert code swap elements\", (txn) => {\r\n const props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId,\r\n category: drawingCategoryId,\r\n code: Code.createEmpty(),\r\n };\r\n return {\r\n elementA: txn.insertElement({ ...props, code: codeA }),\r\n elementB: txn.insertElement({ ...props, code: codeB }),\r\n unrelatedId: txn.insertElement(props),\r\n };\r\n });\r\n await source.pushChanges({ description: \"insert code swap elements\" });\r\n await target.pullChanges();\r\n\r\n await target.locks.acquireLocks({ exclusive: [elementA, elementB] });\r\n withEditTxn(target, \"local code swap\", (txn) => {\r\n // The session captures only the net swap, discarding this temporary value.\r\n txn.updateElement({ id: elementA, code: new Code({ spec: codeSpecId, scope: drawingModelId, value: \"CODE_TEMP\" }) });\r\n txn.updateElement({ id: elementB, code: codeA });\r\n txn.updateElement({ id: elementA, code: codeB });\r\n });\r\n chai.expect(target.txns.hasPendingTxns).to.be.true;\r\n\r\n // Force a genuine rebase of the local swap, rather than a fast-forward pull.\r\n await source.locks.acquireLocks({ exclusive: unrelatedId });\r\n withEditTxn(source, \"unrelated incoming change\", (txn) => {\r\n txn.updateElement({ id: unrelatedId, userLabel: \"remote update\" });\r\n });\r\n await source.pushChanges({ description: \"unrelated incoming change\" });\r\n\r\n let rebaseCount = 0;\r\n target.txns.rebaser.onRebaseBegin.addListener(() => { ++rebaseCount; });\r\n await target.pullChanges();\r\n chai.expect(rebaseCount).to.equal(1);\r\n chai.expect(target.txns.hasPendingTxns).to.be.true;\r\n target.clearCaches();\r\n\r\n const a = target.elements.getElementProps<GeometricElement2dProps>(elementA);\r\n const b = target.elements.getElementProps<GeometricElement2dProps>(elementB);\r\n chai.expect(a.code).to.deep.equal(codeB.toJSON());\r\n chai.expect(b.code).to.deep.equal(codeA.toJSON());\r\n chai.expect(a.category).to.equal(drawingCategoryId);\r\n chai.expect(b.category).to.equal(drawingCategoryId);\r\n chai.expect(a.model).to.equal(drawingModelId);\r\n chai.expect(b.model).to.equal(drawingModelId);\r\n chai.expect(target.elements.getElementProps(unrelatedId).userLabel).to.equal(\"remote update\");\r\n } finally {\r\n far?.close();\r\n local?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n\r\n it(\"single-transaction code swap reverts to old behaviour (swap not applied) when noUpdateLoop is true\", async () => {\r\n HubMock.startup(\"CodeSwapNoUpdateLoopTest\", KnownTestLocations.outputDir);\r\n let b1: BriefcaseDb | undefined;\r\n let b2: BriefcaseDb | undefined;\r\n\r\n try {\r\n // --- Setup iModel ---\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: \"user1\",\r\n iTwinId: HubMock.iTwinId,\r\n iModelName: \"CodeSwapNoUpdateLoopTest\",\r\n description: \"CodeSwapNoUpdateLoopTest\",\r\n });\r\n\r\n b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user1\", iTwinId: HubMock.iTwinId, iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: \"user2\", iTwinId: HubMock.iTwinId, iModelId });\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n let drawingModelId: Id64String;\r\n let drawingCategoryId: Id64String;\r\n let codeSpecId: Id64String;\r\n let codeScopeId: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n withEditTxn(b1, \"setup model, category, codeSpec\", (txn) => {\r\n const modelCode = IModelTestUtils.getUniqueModelCode(b1!, \"DrawingModel\");\r\n const [, modelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(txn, modelCode);\r\n drawingModelId = modelId;\r\n\r\n let catId = DrawingCategory.queryCategoryIdByName(b1!, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === catId)\r\n catId = DrawingCategory.insert(txn, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n drawingCategoryId = catId;\r\n\r\n codeSpecId = b1!.codeSpecs.insert(txn, \"MyCodeSpec\", CodeScopeSpec.Type.Model);\r\n codeScopeId = drawingModelId;\r\n });\r\n\r\n await b1.pushChanges({ description: \"setup\" });\r\n await b2.pullChanges();\r\n\r\n let elem1Id: Id64String;\r\n let elem2Id: Id64String;\r\n\r\n await b1.locks.acquireLocks({ shared: drawingModelId! });\r\n withEditTxn(b1, \"insert two coded elements\", (txn) => {\r\n const elem1Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" }),\r\n };\r\n const elem2Props: GeometricElement2dProps = {\r\n classFullName: \"BisCore:DrawingGraphic\",\r\n model: drawingModelId!,\r\n category: drawingCategoryId!,\r\n code: new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" }),\r\n };\r\n elem1Id = txn.insertElement(elem1Props);\r\n elem2Id = txn.insertElement(elem2Props);\r\n });\r\n\r\n await b1.pushChanges({ description: \"insert two elements with CODE_A and CODE_B\" });\r\n await b2.pullChanges();\r\n\r\n // --- Single-transaction swap: null elem1, then swap codes ---\r\n await b1.locks.acquireLocks({ exclusive: [elem2Id!, elem1Id!] });\r\n withEditTxn(b1, \"single-txn swap\", (txn) => {\r\n // Step 1: null out elem1's code to free the uniqueness slot\r\n const props = b1!.elements.getElementProps(elem1Id!);\r\n props.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"\" });\r\n txn.updateElement(props);\r\n\r\n // Step 2: assign CODE_A to elem2, CODE_B to elem1\r\n const props1 = b1!.elements.getElementProps(elem1Id!);\r\n const props2 = b1!.elements.getElementProps(elem2Id!);\r\n props2.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_A\" });\r\n props1.code = new Code({ spec: codeSpecId!, scope: codeScopeId!, value: \"CODE_B\" });\r\n txn.updateElement(props2);\r\n txn.updateElement(props1);\r\n });\r\n\r\n // Verify b1 has the swapped state\r\n b1.clearCaches();\r\n const b1e1 = b1.elements.getElementProps(elem1Id!);\r\n const b1e2 = b1.elements.getElementProps(elem2Id!);\r\n chai.expect(b1e1.code.value).to.equal(\"CODE_B\");\r\n chai.expect(b1e2.code.value).to.equal(\"CODE_A\");\r\n\r\n await b1.pushChanges({ description: \"single-txn code swap\" });\r\n\r\n // Pull with noUpdateLoop: true — this uses the old (pre-fix) apply path.\r\n // The unique-index conflict handler skips the intermediate null step,\r\n // so the swap is silently dropped and b2 retains the original codes.\r\n // noUpdateLoop is intentionally not in the public PullChangesArgs type.\r\n type InternalPullArgs = Parameters<BriefcaseDb[\"pullChanges\"]>[0] & { noUpdateLoop?: boolean };\r\n await b2.pullChanges({ noUpdateLoop: true } as InternalPullArgs);\r\n\r\n b2.clearCaches();\r\n const b2e1 = b2.elements.getElementProps(elem1Id!);\r\n const b2e2 = b2.elements.getElementProps(elem2Id!);\r\n // Old behaviour: swap did NOT land — b2 still sees the original codes\r\n chai.expect(b2e1.code.value).to.equal(\"CODE_A\");\r\n chai.expect(b2e2.code.value).to.equal(\"CODE_B\");\r\n\r\n } finally {\r\n b1?.close();\r\n b2?.close();\r\n HubMock.shutdown();\r\n }\r\n });\r\n});\r\n"]}
|
|
@@ -188,7 +188,7 @@ describe("iModel geolocation", () => {
|
|
|
188
188
|
const expectedPt1 = Point3d.fromJSON(outputCoord.p);
|
|
189
189
|
const outPt1 = Point3d.fromJSON(response1.geoCoords[0].p);
|
|
190
190
|
expect(Geometry.isSamePoint3dXY(expectedPt1, outPt1, 0.001)).to.be.true;
|
|
191
|
-
expect(Math.abs(expectedPt1.z - outPt1.z)
|
|
191
|
+
expect(Math.abs(expectedPt1.z - outPt1.z), fileName).to.be.lessThan(0.0001);
|
|
192
192
|
// No point testing reversal when Out of useful range since reversibility is doubtful
|
|
193
193
|
if (outputCoord.s !== GeoCoordStatus.OutOfUsefulRange) {
|
|
194
194
|
const testPoint2 = [];
|
|
@@ -285,7 +285,7 @@ describe("iModel geolocation", () => {
|
|
|
285
285
|
},
|
|
286
286
|
};
|
|
287
287
|
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 });
|
|
288
|
-
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.
|
|
288
|
+
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.000392204716569311 }, s: GeoCoordStatus.Success });
|
|
289
289
|
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 });
|
|
290
290
|
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 });
|
|
291
291
|
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 });
|
|
@@ -304,7 +304,7 @@ describe("iModel geolocation", () => {
|
|
|
304
304
|
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 });
|
|
305
305
|
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 });
|
|
306
306
|
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 });
|
|
307
|
-
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.
|
|
307
|
+
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.000392204716569311 }, s: GeoCoordStatus.Success });
|
|
308
308
|
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 });
|
|
309
309
|
await convertTest("BritishNatGrid-Ellipsoid5.bim", { horizontalCRS: { id: "BritishNatGrid" }, verticalCRS: { id: "ELLIPSOID" } }, {
|
|
310
310
|
horizontalCRS: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelGeolocation.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModelGeolocation.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 { Guid } from \"@itwin/core-bentley\";\r\nimport {\r\n EcefLocation, GeoCoordinatesRequestProps, GeoCoordStatus, GeographicCRS, GeographicCRSProps, IModelCoordinatesRequestProps, PointWithStatus,\r\n} from \"@itwin/core-common\";\r\nimport { Geometry, Point3d, XYZProps } from \"@itwin/core-geometry\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\nimport { SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { closeIfOpen, openReadonlySeedCopy } from \"./IModelTestFixtures\";\r\n\r\n\r\ndescribe(\"iModel geolocation\", () => {\r\n let mirukuruReadonly: SnapshotDb;\r\n let originalEnv: any;\r\n\r\n before(async () => {\r\n originalEnv = { ...process.env };\r\n\r\n await TestUtils.shutdownBackend();\r\n await TestUtils.startBackend({ loadGcsWorkspaces: true });\r\n\r\n IModelTestUtils.registerTestBimSchema();\r\n\r\n mirukuruReadonly = await openReadonlySeedCopy(\"geolocation-mirukuru.ibim\", \"mirukuru.ibim\");\r\n });\r\n\r\n after(async () => {\r\n process.env = originalEnv;\r\n\r\n closeIfOpen(mirukuruReadonly);\r\n\r\n await TestUtils.shutdownBackend();\r\n await TestUtils.startBackend();\r\n });\r\n\r\n it(\"ecefLocation for iModels\", () => {\r\n assert.isTrue(mirukuruReadonly.isGeoLocated);\r\n const center = { x: 289095, y: 3803860, z: 10 }; // near center of project extents, 10 meters above ground.\r\n const ecefPt = mirukuruReadonly.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 = mirukuruReadonly.ecefToSpatial(ecefPt);\r\n assert.isTrue(z2.isAlmostEqual(center), \"ecefToSpatial\");\r\n\r\n const carto = mirukuruReadonly.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 mirukuruReadonly.cartographicToSpatialFromEcef(carto, z2);\r\n assert.isTrue(z2.isAlmostEqual(center, .001), \"cartographicToSpatial\");\r\n\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem !== undefined);\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.horizontalCRS !== undefined);\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.verticalCRS !== undefined);\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.verticalCRS!.id !== undefined);\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.horizontalCRS!.id === \"UTM84-53N\");\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.verticalCRS!.id === \"ELLIPSOID\");\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 withEditTxn(iModel, (txn) => {\r\n txn.updateIModelProps();\r\n });\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 mirukuruReadonly.getGeoCoordinatesFromIModelCoordinates({ target: \"WGS84\", iModelCoords });\r\n expect(geoResponse.geoCoords.length).to.equal(numPts);\r\n\r\n const iModelResponse = await mirukuruReadonly.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 mirukuruReadonly.getGeoCoordinatesFromIModelCoordinates({ target: \"WGS84\", iModelCoords });\r\n expect(geoResponse.fromCache).to.equal(0);\r\n\r\n const iModelResponse = await mirukuruReadonly.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 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 withEditTxn(iModel, (txn) => {\r\n iModel.setGeographicCoordinateSystem(fileGCS);\r\n txn.updateIModelProps();\r\n });\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, 0.001)).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 withEditTxn(iModel, (txn) => {\r\n txn.updateIModelProps();\r\n });\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 withEditTxn(iModel, (txn) => {\r\n txn.updateIModelProps();\r\n });\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 withEditTxn(iModel, (txn) => {\r\n txn.updateIModelProps();\r\n });\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 withEditTxn(iModel2, (txn) => {\r\n txn.updateIModelProps();\r\n });\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"]}
|
|
1
|
+
{"version":3,"file":"IModelGeolocation.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModelGeolocation.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 { Guid } from \"@itwin/core-bentley\";\r\nimport {\r\n EcefLocation, GeoCoordinatesRequestProps, GeoCoordStatus, GeographicCRS, GeographicCRSProps, IModelCoordinatesRequestProps, PointWithStatus,\r\n} from \"@itwin/core-common\";\r\nimport { Geometry, Point3d, XYZProps } from \"@itwin/core-geometry\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\nimport { SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { closeIfOpen, openReadonlySeedCopy } from \"./IModelTestFixtures\";\r\n\r\n\r\ndescribe(\"iModel geolocation\", () => {\r\n let mirukuruReadonly: SnapshotDb;\r\n let originalEnv: any;\r\n\r\n before(async () => {\r\n originalEnv = { ...process.env };\r\n\r\n await TestUtils.shutdownBackend();\r\n await TestUtils.startBackend({ loadGcsWorkspaces: true });\r\n\r\n IModelTestUtils.registerTestBimSchema();\r\n\r\n mirukuruReadonly = await openReadonlySeedCopy(\"geolocation-mirukuru.ibim\", \"mirukuru.ibim\");\r\n });\r\n\r\n after(async () => {\r\n process.env = originalEnv;\r\n\r\n closeIfOpen(mirukuruReadonly);\r\n\r\n await TestUtils.shutdownBackend();\r\n await TestUtils.startBackend();\r\n });\r\n\r\n it(\"ecefLocation for iModels\", () => {\r\n assert.isTrue(mirukuruReadonly.isGeoLocated);\r\n const center = { x: 289095, y: 3803860, z: 10 }; // near center of project extents, 10 meters above ground.\r\n const ecefPt = mirukuruReadonly.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 = mirukuruReadonly.ecefToSpatial(ecefPt);\r\n assert.isTrue(z2.isAlmostEqual(center), \"ecefToSpatial\");\r\n\r\n const carto = mirukuruReadonly.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 mirukuruReadonly.cartographicToSpatialFromEcef(carto, z2);\r\n assert.isTrue(z2.isAlmostEqual(center, .001), \"cartographicToSpatial\");\r\n\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem !== undefined);\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.horizontalCRS !== undefined);\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.verticalCRS !== undefined);\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.verticalCRS!.id !== undefined);\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.horizontalCRS!.id === \"UTM84-53N\");\r\n assert.isTrue(mirukuruReadonly.geographicCoordinateSystem!.verticalCRS!.id === \"ELLIPSOID\");\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 withEditTxn(iModel, (txn) => {\r\n txn.updateIModelProps();\r\n });\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 mirukuruReadonly.getGeoCoordinatesFromIModelCoordinates({ target: \"WGS84\", iModelCoords });\r\n expect(geoResponse.geoCoords.length).to.equal(numPts);\r\n\r\n const iModelResponse = await mirukuruReadonly.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 mirukuruReadonly.getGeoCoordinatesFromIModelCoordinates({ target: \"WGS84\", iModelCoords });\r\n expect(geoResponse.fromCache).to.equal(0);\r\n\r\n const iModelResponse = await mirukuruReadonly.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 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 withEditTxn(iModel, (txn) => {\r\n iModel.setGeographicCoordinateSystem(fileGCS);\r\n txn.updateIModelProps();\r\n });\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, 0.001)).to.be.true;\r\n expect(Math.abs(expectedPt1.z - outPt1.z), fileName).to.be.lessThan(0.0001);\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.000392204716569311 }, 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.000392204716569311 }, 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 withEditTxn(iModel, (txn) => {\r\n txn.updateIModelProps();\r\n });\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 withEditTxn(iModel, (txn) => {\r\n txn.updateIModelProps();\r\n });\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 withEditTxn(iModel, (txn) => {\r\n txn.updateIModelProps();\r\n });\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 withEditTxn(iModel2, (txn) => {\r\n txn.updateIModelProps();\r\n });\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"]}
|