@itwin/core-backend 5.7.0-dev.1 → 5.7.0-dev.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +37 -14
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +54 -23
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +57 -2
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/StashManager.d.ts +1 -2
- package/lib/cjs/StashManager.d.ts.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +76 -55
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +116 -29
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +37 -14
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +54 -23
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +57 -2
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/StashManager.d.ts +1 -2
- package/lib/esm/StashManager.d.ts.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +76 -55
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +116 -29
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +201 -12
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +72 -2
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +9 -9
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +89 -0
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/package.json +13 -13
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { assert } from "chai";
|
|
6
6
|
import * as path from "path";
|
|
7
|
+
import * as fs from "fs";
|
|
7
8
|
import { Code } from "@itwin/core-common";
|
|
8
|
-
import { DefinitionElement, Element, InformationContentElement, RepositoryLink, SpatialViewDefinition, UrlLink, ViewDefinition3d, } from "../../core-backend";
|
|
9
|
+
import { DefinitionElement, ECDb, Element, IModelHost, IModelJsFs, InformationContentElement, RepositoryLink, SpatialViewDefinition, UrlLink, ViewDefinition3d, } from "../../core-backend";
|
|
9
10
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
10
11
|
import { KnownTestLocations } from "../KnownTestLocations";
|
|
11
|
-
import { SchemaKey } from "@itwin/ecschema-metadata";
|
|
12
|
+
import { EntityClass, SchemaContext, SchemaJsonLocater, SchemaKey, SchemaMatchType } from "@itwin/ecschema-metadata";
|
|
12
13
|
describe("IModel Schema Context", () => {
|
|
13
14
|
let imodel;
|
|
14
15
|
before(() => {
|
|
@@ -92,4 +93,73 @@ describe("IModel Schema Context", () => {
|
|
|
92
93
|
assert.isDefined(expectedString);
|
|
93
94
|
});
|
|
94
95
|
});
|
|
96
|
+
// --- Reproduction Test for Issue #8047 ---
|
|
97
|
+
describe("getDerivedClasses returns only loaded schemas", () => {
|
|
98
|
+
const outputDir = path.join(__dirname, "output_8047");
|
|
99
|
+
const ecdbPath = path.join(outputDir, "test_8047.ecdb");
|
|
100
|
+
before(async () => {
|
|
101
|
+
// Ensure IModelHost is startup (idempotent check)
|
|
102
|
+
if (!IModelHost.isValid) {
|
|
103
|
+
await IModelHost.startup();
|
|
104
|
+
}
|
|
105
|
+
if (!fs.existsSync(outputDir)) {
|
|
106
|
+
fs.mkdirSync(outputDir);
|
|
107
|
+
}
|
|
108
|
+
if (fs.existsSync(ecdbPath)) {
|
|
109
|
+
IModelJsFs.unlinkSync(ecdbPath);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
after(async () => {
|
|
113
|
+
if (fs.existsSync(outputDir)) {
|
|
114
|
+
IModelJsFs.removeSync(outputDir);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
it("should find derived classes in referencing schemas ONLY if referencing schema is loaded", async () => {
|
|
118
|
+
const ecdb = new ECDb();
|
|
119
|
+
ecdb.createDb(ecdbPath);
|
|
120
|
+
// 1. Create Schema 1 (The Parent)
|
|
121
|
+
const schemaXml1 = `<?xml version="1.0" encoding="UTF-8"?>
|
|
122
|
+
<ECSchema schemaName="TestSchema1" alias="Test1" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
|
|
123
|
+
<ECEntityClass typeName="ParentClass" />
|
|
124
|
+
</ECSchema>`;
|
|
125
|
+
const schemaPath1 = path.join(outputDir, "TestSchema1.01.00.00.xml");
|
|
126
|
+
fs.writeFileSync(schemaPath1, schemaXml1);
|
|
127
|
+
ecdb.importSchema(schemaPath1);
|
|
128
|
+
// 2. Create Schema 2 (The Child) - References Schema 1
|
|
129
|
+
const schemaXml2 = `<?xml version="1.0" encoding="UTF-8"?>
|
|
130
|
+
<ECSchema schemaName="TestSchema2" alias="Test2" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
|
|
131
|
+
<ECSchemaReference name="TestSchema1" version="01.00.00" alias="t1" />
|
|
132
|
+
<ECEntityClass typeName="ChildClass">
|
|
133
|
+
<BaseClass>t1:ParentClass</BaseClass>
|
|
134
|
+
</ECEntityClass>
|
|
135
|
+
</ECSchema>`;
|
|
136
|
+
const schemaPath2 = path.join(outputDir, "TestSchema2.01.00.00.xml");
|
|
137
|
+
fs.writeFileSync(schemaPath2, schemaXml2);
|
|
138
|
+
ecdb.importSchema(schemaPath2);
|
|
139
|
+
ecdb.saveChanges();
|
|
140
|
+
// 3. Setup the Context
|
|
141
|
+
const context = new SchemaContext();
|
|
142
|
+
const locater = new SchemaJsonLocater((name) => ecdb.getSchemaProps(name));
|
|
143
|
+
context.addLocater(locater);
|
|
144
|
+
// 4. Get the Parent Class
|
|
145
|
+
const testSchema1 = await context.getSchema(new SchemaKey("TestSchema1"), SchemaMatchType.Latest);
|
|
146
|
+
if (!testSchema1)
|
|
147
|
+
throw new Error("Failed to load TestSchema1");
|
|
148
|
+
const parentClass = await testSchema1.getItem("ParentClass", EntityClass);
|
|
149
|
+
if (!parentClass)
|
|
150
|
+
throw new Error("Failed to load ParentClass");
|
|
151
|
+
// TEST CASE A: Verify it returns 0 when Schema 2 is unloaded (Reproducing the "Bug")
|
|
152
|
+
let derivedClasses = await parentClass.getDerivedClasses();
|
|
153
|
+
const countUnloaded = derivedClasses ? derivedClasses.length : 0;
|
|
154
|
+
assert.equal(countUnloaded, 0, "Should verify that 0 classes are found when referencing schema is unloaded");
|
|
155
|
+
// TEST CASE B: Verify the workaround (Load Schema 2)
|
|
156
|
+
await context.getSchema(new SchemaKey("TestSchema2"), SchemaMatchType.Latest);
|
|
157
|
+
derivedClasses = await parentClass.getDerivedClasses();
|
|
158
|
+
// This confirms the system works as intended IF you load the schema
|
|
159
|
+
assert.isDefined(derivedClasses);
|
|
160
|
+
assert.equal(derivedClasses.length, 1, "Should find 1 derived class after referencing schema is loaded");
|
|
161
|
+
assert.equal(derivedClasses[0].name, "ChildClass");
|
|
162
|
+
ecdb.closeDb();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
95
165
|
//# sourceMappingURL=IModelSchemaContext.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelSchemaContext.test.js","sourceRoot":"","sources":["../../../../src/test/schema/IModelSchemaContext.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 } from \"chai\";\r\nimport * as path from \"path\";\r\nimport { Code } from \"@itwin/core-common\";\r\nimport {\r\n DefinitionElement,\r\n Element,\r\n InformationContentElement,\r\n RepositoryLink,\r\n SnapshotDb, SpatialViewDefinition, UrlLink, ViewDefinition3d,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { SchemaKey } from \"@itwin/ecschema-metadata\";\r\n\r\ndescribe(\"IModel Schema Context\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"IModelSchemaContext\", \"IModelSchemaContext.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n assert.exists(imodel);\r\n });\r\n\r\n after(() => {\r\n imodel?.close();\r\n });\r\n\r\n it(\"should verify the Entity metadata of known element subclasses\", async () => {\r\n const code1 = new Code({ spec: \"0x10\", scope: \"0x11\", value: \"RF1.dgn\" });\r\n const el = imodel.elements.getElement(code1);\r\n assert.exists(el);\r\n if (el) {\r\n const ecClass = await el.getMetaData();\r\n assert.exists(ecClass);\r\n assert.equal(ecClass.schema.name, el.schemaName);\r\n assert.equal(ecClass.name, el.className);\r\n\r\n // I happen to know that this is a BisCore:RepositoryLink\r\n assert.equal(ecClass.fullName, RepositoryLink.schemaItemKey.fullName);\r\n // Check the metadata on the class itself\r\n const baseClass = await ecClass.baseClass;\r\n assert.exists(ecClass.baseClass);\r\n if (undefined === baseClass)\r\n return;\r\n\r\n assert.equal(baseClass.fullName, UrlLink.schemaItemKey.fullName);\r\n assert.exists(ecClass.customAttributes);\r\n assert.isTrue(ecClass.customAttributes?.has(\"BisCore.ClassHasHandler\"));\r\n // Check the metadata on the one property that RepositoryLink defines, RepositoryGuid\r\n const property = await ecClass.getProperty(\"repositoryGuid\");\r\n assert.exists(property);\r\n if (undefined === property)\r\n return;\r\n\r\n if(!property.isPrimitive())\r\n assert.fail(\"Property is not primitive\");\r\n\r\n assert.equal(property.extendedTypeName, \"BeGuid\");\r\n assert.isTrue(property.customAttributes?.has(\"CoreCustomAttributes.HiddenProperty\"));\r\n }\r\n const el2 = imodel.elements.getElement(\"0x34\");\r\n assert.exists(el2);\r\n if (el2) {\r\n const metaData = await el2.getMetaData();\r\n assert.exists(metaData);\r\n if (undefined === metaData)\r\n return;\r\n assert.equal(metaData.fullName, el2.schemaItemKey.fullName);\r\n // I happen to know that this is a BisCore.SpatialViewDefinition\r\n assert.equal(metaData.fullName, SpatialViewDefinition.schemaItemKey.fullName);\r\n\r\n const baseClass = await metaData.baseClass;\r\n assert.exists(metaData.baseClass);\r\n if (undefined === baseClass)\r\n return;\r\n\r\n assert.equal(baseClass.fullName, ViewDefinition3d.schemaItemKey.fullName);\r\n const prop = metaData.getPropertySync(\"modelSelector\");\r\n assert.isDefined(prop);\r\n if(!prop?.isNavigation())\r\n assert.fail(\"Property is not navigation property\");\r\n\r\n assert.equal((await prop.relationshipClass).fullName, \"BisCore.SpatialViewDefinitionUsesModelSelector\");\r\n }\r\n });\r\n\r\n it(\"should verify Entity metadata with both base class and mixin properties\", async () => {\r\n const schemaPathname = path.join(KnownTestLocations.assetsDir, \"TestDomain.ecschema.xml\");\r\n await imodel.importSchemas([schemaPathname]); // will throw an exception if import fails\r\n\r\n const testDomain = await imodel.schemaContext.getSchema(new SchemaKey(\"TestDomain\", 1,0,0));\r\n const testDomainClass = await testDomain!.getEntityClass(\"TestDomainClass\");\r\n const baseClassFullNames = Array.from(testDomainClass!.getAllBaseClassesSync() ?? []).map(baseClass => baseClass.fullName);\r\n assert.equal(baseClassFullNames.length, 4);\r\n assert.equal(baseClassFullNames[0], DefinitionElement.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[1], InformationContentElement.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[2], Element.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[3], \"TestDomain.IMixin\");\r\n\r\n // Verify that the forEach method which is called when constructing an entity\r\n // is picking up all expected properties.\r\n const properties = Array.from(await testDomainClass!.getProperties());\r\n const testData = properties.map(property => property.name);\r\n const expectedString = testData.find((testString: string) => {\r\n return testString === \"TestMixinProperty\";\r\n });\r\n\r\n assert.isDefined(expectedString);\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"IModelSchemaContext.test.js","sourceRoot":"","sources":["../../../../src/test/schema/IModelSchemaContext.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 } from \"chai\";\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { Code } from \"@itwin/core-common\";\r\nimport {\r\n DefinitionElement,\r\n ECDb,\r\n Element,\r\n IModelHost,\r\n IModelJsFs,\r\n InformationContentElement,\r\n RepositoryLink,\r\n SnapshotDb, SpatialViewDefinition, UrlLink, ViewDefinition3d,\r\n} from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { EntityClass, SchemaContext, SchemaJsonLocater, SchemaKey, SchemaMatchType } from \"@itwin/ecschema-metadata\";\r\n\r\ndescribe(\"IModel Schema Context\", () => {\r\n let imodel: SnapshotDb;\r\n\r\n before(() => {\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"IModelSchemaContext\", \"IModelSchemaContext.bim\");\r\n imodel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n assert.exists(imodel);\r\n });\r\n\r\n after(() => {\r\n imodel?.close();\r\n });\r\n\r\n it(\"should verify the Entity metadata of known element subclasses\", async () => {\r\n const code1 = new Code({ spec: \"0x10\", scope: \"0x11\", value: \"RF1.dgn\" });\r\n const el = imodel.elements.getElement(code1);\r\n assert.exists(el);\r\n if (el) {\r\n const ecClass = await el.getMetaData();\r\n assert.exists(ecClass);\r\n assert.equal(ecClass.schema.name, el.schemaName);\r\n assert.equal(ecClass.name, el.className);\r\n\r\n // I happen to know that this is a BisCore:RepositoryLink\r\n assert.equal(ecClass.fullName, RepositoryLink.schemaItemKey.fullName);\r\n // Check the metadata on the class itself\r\n const baseClass = await ecClass.baseClass;\r\n assert.exists(ecClass.baseClass);\r\n if (undefined === baseClass)\r\n return;\r\n\r\n assert.equal(baseClass.fullName, UrlLink.schemaItemKey.fullName);\r\n assert.exists(ecClass.customAttributes);\r\n assert.isTrue(ecClass.customAttributes?.has(\"BisCore.ClassHasHandler\"));\r\n // Check the metadata on the one property that RepositoryLink defines, RepositoryGuid\r\n const property = await ecClass.getProperty(\"repositoryGuid\");\r\n assert.exists(property);\r\n if (undefined === property)\r\n return;\r\n\r\n if(!property.isPrimitive())\r\n assert.fail(\"Property is not primitive\");\r\n\r\n assert.equal(property.extendedTypeName, \"BeGuid\");\r\n assert.isTrue(property.customAttributes?.has(\"CoreCustomAttributes.HiddenProperty\"));\r\n }\r\n const el2 = imodel.elements.getElement(\"0x34\");\r\n assert.exists(el2);\r\n if (el2) {\r\n const metaData = await el2.getMetaData();\r\n assert.exists(metaData);\r\n if (undefined === metaData)\r\n return;\r\n assert.equal(metaData.fullName, el2.schemaItemKey.fullName);\r\n // I happen to know that this is a BisCore.SpatialViewDefinition\r\n assert.equal(metaData.fullName, SpatialViewDefinition.schemaItemKey.fullName);\r\n\r\n const baseClass = await metaData.baseClass;\r\n assert.exists(metaData.baseClass);\r\n if (undefined === baseClass)\r\n return;\r\n\r\n assert.equal(baseClass.fullName, ViewDefinition3d.schemaItemKey.fullName);\r\n const prop = metaData.getPropertySync(\"modelSelector\");\r\n assert.isDefined(prop);\r\n if(!prop?.isNavigation())\r\n assert.fail(\"Property is not navigation property\");\r\n\r\n assert.equal((await prop.relationshipClass).fullName, \"BisCore.SpatialViewDefinitionUsesModelSelector\");\r\n }\r\n });\r\n\r\n it(\"should verify Entity metadata with both base class and mixin properties\", async () => {\r\n const schemaPathname = path.join(KnownTestLocations.assetsDir, \"TestDomain.ecschema.xml\");\r\n await imodel.importSchemas([schemaPathname]); // will throw an exception if import fails\r\n\r\n const testDomain = await imodel.schemaContext.getSchema(new SchemaKey(\"TestDomain\", 1,0,0));\r\n const testDomainClass = await testDomain!.getEntityClass(\"TestDomainClass\");\r\n const baseClassFullNames = Array.from(testDomainClass!.getAllBaseClassesSync() ?? []).map(baseClass => baseClass.fullName);\r\n assert.equal(baseClassFullNames.length, 4);\r\n assert.equal(baseClassFullNames[0], DefinitionElement.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[1], InformationContentElement.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[2], Element.schemaItemKey.fullName);\r\n assert.equal(baseClassFullNames[3], \"TestDomain.IMixin\");\r\n\r\n // Verify that the forEach method which is called when constructing an entity\r\n // is picking up all expected properties.\r\n const properties = Array.from(await testDomainClass!.getProperties());\r\n const testData = properties.map(property => property.name);\r\n const expectedString = testData.find((testString: string) => {\r\n return testString === \"TestMixinProperty\";\r\n });\r\n\r\n assert.isDefined(expectedString);\r\n });\r\n});\r\n\r\n// --- Reproduction Test for Issue #8047 ---\r\ndescribe(\"getDerivedClasses returns only loaded schemas\", () => {\r\n const outputDir = path.join(__dirname, \"output_8047\");\r\n const ecdbPath = path.join(outputDir, \"test_8047.ecdb\");\r\n\r\n before(async () => {\r\n // Ensure IModelHost is startup (idempotent check)\r\n if (!IModelHost.isValid) {\r\n await IModelHost.startup();\r\n }\r\n if (!fs.existsSync(outputDir)) {\r\n fs.mkdirSync(outputDir);\r\n }\r\n if (fs.existsSync(ecdbPath)) {\r\n IModelJsFs.unlinkSync(ecdbPath);\r\n }\r\n });\r\n\r\n after(async () => {\r\n if (fs.existsSync(outputDir)) {\r\n IModelJsFs.removeSync(outputDir);\r\n }\r\n });\r\n\r\n it(\"should find derived classes in referencing schemas ONLY if referencing schema is loaded\", async () => {\r\n const ecdb = new ECDb();\r\n ecdb.createDb(ecdbPath);\r\n\r\n // 1. Create Schema 1 (The Parent)\r\n const schemaXml1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestSchema1\" alias=\"Test1\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECEntityClass typeName=\"ParentClass\" />\r\n </ECSchema>`;\r\n const schemaPath1 = path.join(outputDir, \"TestSchema1.01.00.00.xml\");\r\n fs.writeFileSync(schemaPath1, schemaXml1);\r\n ecdb.importSchema(schemaPath1);\r\n\r\n // 2. Create Schema 2 (The Child) - References Schema 1\r\n const schemaXml2 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestSchema2\" alias=\"Test2\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"TestSchema1\" version=\"01.00.00\" alias=\"t1\" />\r\n <ECEntityClass typeName=\"ChildClass\">\r\n <BaseClass>t1:ParentClass</BaseClass>\r\n </ECEntityClass>\r\n </ECSchema>`;\r\n const schemaPath2 = path.join(outputDir, \"TestSchema2.01.00.00.xml\");\r\n fs.writeFileSync(schemaPath2, schemaXml2);\r\n ecdb.importSchema(schemaPath2);\r\n ecdb.saveChanges();\r\n\r\n // 3. Setup the Context\r\n const context = new SchemaContext();\r\n const locater = new SchemaJsonLocater((name: string) => ecdb.getSchemaProps(name));\r\n context.addLocater(locater);\r\n\r\n // 4. Get the Parent Class\r\n const testSchema1 = await context.getSchema(new SchemaKey(\"TestSchema1\"), SchemaMatchType.Latest);\r\n if (!testSchema1) throw new Error(\"Failed to load TestSchema1\");\r\n const parentClass = await testSchema1.getItem(\"ParentClass\", EntityClass);\r\n if (!parentClass) throw new Error(\"Failed to load ParentClass\");\r\n\r\n // TEST CASE A: Verify it returns 0 when Schema 2 is unloaded (Reproducing the \"Bug\")\r\n let derivedClasses = await parentClass.getDerivedClasses();\r\n const countUnloaded = derivedClasses ? derivedClasses.length : 0;\r\n assert.equal(countUnloaded, 0, \"Should verify that 0 classes are found when referencing schema is unloaded\");\r\n\r\n // TEST CASE B: Verify the workaround (Load Schema 2)\r\n await context.getSchema(new SchemaKey(\"TestSchema2\"), SchemaMatchType.Latest);\r\n\r\n derivedClasses = await parentClass.getDerivedClasses();\r\n\r\n // This confirms the system works as intended IF you load the schema\r\n assert.isDefined(derivedClasses);\r\n assert.equal(derivedClasses!.length, 1, \"Should find 1 derived class after referencing schema is loaded\");\r\n assert.equal(derivedClasses![0].name, \"ChildClass\");\r\n\r\n ecdb.closeDb();\r\n });\r\n});\r\n"]}
|
|
@@ -8,7 +8,7 @@ import * as chai from "chai";
|
|
|
8
8
|
import { assert } from "chai";
|
|
9
9
|
import * as chaiAsPromised from "chai-as-promised";
|
|
10
10
|
import { HubWrappers, KnownTestLocations } from "..";
|
|
11
|
-
import { ChannelControl, IModelHost, SpatialCategory, SqliteChangesetReader } from "../../core-backend";
|
|
11
|
+
import { ChannelControl, IModelHost, SpatialCategory, SqliteChangesetReader, } from "../../core-backend";
|
|
12
12
|
import { HubMock } from "../../internal/HubMock";
|
|
13
13
|
import { IModelTestUtils, TestUserType } from "../IModelTestUtils";
|
|
14
14
|
import { Point3d } from "@itwin/core-geometry";
|
|
@@ -90,18 +90,18 @@ describe("Change merge method", () => {
|
|
|
90
90
|
const events = new Map();
|
|
91
91
|
const b1 = await ctx.openB1();
|
|
92
92
|
events.set(b1.briefcaseId, []);
|
|
93
|
-
b1.txns.onRebaseTxnBegin.addListener((args) => {
|
|
93
|
+
b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {
|
|
94
94
|
events.get(b1.briefcaseId)?.push({ args, event: "onRebaseTxnBegin" });
|
|
95
95
|
});
|
|
96
|
-
b1.txns.onRebaseTxnEnd.addListener((args) => {
|
|
96
|
+
b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {
|
|
97
97
|
events.get(b1.briefcaseId)?.push({ args, event: "onRebaseTxnEnd" });
|
|
98
98
|
});
|
|
99
99
|
const b2 = await ctx.openB2();
|
|
100
100
|
events.set(b2.briefcaseId, []);
|
|
101
|
-
b2.txns.onRebaseTxnBegin.addListener((args) => {
|
|
101
|
+
b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {
|
|
102
102
|
events.get(b2.briefcaseId)?.push({ args, event: "onRebaseTxnBegin" });
|
|
103
103
|
});
|
|
104
|
-
b2.txns.onRebaseTxnEnd.addListener((args) => {
|
|
104
|
+
b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {
|
|
105
105
|
events.get(b2.briefcaseId)?.push({ args, event: "onRebaseTxnEnd" });
|
|
106
106
|
});
|
|
107
107
|
const e1 = await insertPhysicalObject(b1);
|
|
@@ -219,18 +219,18 @@ describe("Change merge method", () => {
|
|
|
219
219
|
const events = new Map();
|
|
220
220
|
const b1 = await ctx.openB1();
|
|
221
221
|
events.set(b1.briefcaseId, []);
|
|
222
|
-
b1.txns.onRebaseTxnBegin.addListener((args) => {
|
|
222
|
+
b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {
|
|
223
223
|
events.get(b1.briefcaseId)?.push({ args, event: "onRebaseTxnBegin" });
|
|
224
224
|
});
|
|
225
|
-
b1.txns.onRebaseTxnEnd.addListener((args) => {
|
|
225
|
+
b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {
|
|
226
226
|
events.get(b1.briefcaseId)?.push({ args, event: "onRebaseTxnEnd" });
|
|
227
227
|
});
|
|
228
228
|
const b2 = await ctx.openB2();
|
|
229
229
|
events.set(b2.briefcaseId, []);
|
|
230
|
-
b2.txns.onRebaseTxnBegin.addListener((args) => {
|
|
230
|
+
b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {
|
|
231
231
|
events.get(b2.briefcaseId)?.push({ args, event: "onRebaseTxnBegin" });
|
|
232
232
|
});
|
|
233
|
-
b2.txns.onRebaseTxnEnd.addListener((args) => {
|
|
233
|
+
b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {
|
|
234
234
|
events.get(b2.briefcaseId)?.push({ args, event: "onRebaseTxnEnd" });
|
|
235
235
|
});
|
|
236
236
|
const e1 = await insertPhysicalObject(b1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeMerge.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeMerge.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 { DbConflictResolution, Guid } from \"@itwin/core-bentley\";\r\nimport {\r\n IModel,\r\n PhysicalElementProps,\r\n SubCategoryAppearance\r\n} from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport { assert } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { HubWrappers, KnownTestLocations } from \"..\";\r\nimport {\r\n BriefcaseDb,\r\n ChannelControl,\r\n DictionaryModel,\r\n IModelHost,\r\n SpatialCategory,\r\n SqliteChangesetReader,\r\n TxnProps\r\n} from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { RebaseChangesetConflictArgs } from \"../../internal/ChangesetConflictArgs\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nchai.use(chaiAsPromised);\r\n\r\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\r\n try {\r\n await test();\r\n } catch (e) {\r\n if (e instanceof Error && msg) {\r\n assert.equal(e.message, msg);\r\n }\r\n return;\r\n }\r\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\r\n}\r\n\r\n\r\nasync function updatePhysicalObject(b: BriefcaseDb, el1: string, federationGuid: string) {\r\n await b.locks.acquireLocks({ exclusive: el1 });\r\n const props = b.elements.getElement(el1);\r\n props.federationGuid = federationGuid;\r\n b.elements.updateElement(props.toJSON());\r\n}\r\n\r\ndescribe(\"Change merge method\", () => {\r\n const ctx = {\r\n accessTokens: {\r\n user1: \"\",\r\n user2: \"\",\r\n user3: \"\",\r\n },\r\n iModelId: \"\",\r\n iTwinId: \"\",\r\n modelId: \"\",\r\n spatialCategoryId: \"\",\r\n iModelName: \"TestIModel\",\r\n rootSubject: \"TestSubject\",\r\n openBriefcase: async (user: \"user1\" | \"user2\" | \"user3\", noLock?: true) => {\r\n const b = await HubWrappers.downloadAndOpenBriefcase({ accessToken: ctx.accessTokens[user], iTwinId: ctx.iTwinId, iModelId: ctx.iModelId, noLock });\r\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n return b;\r\n },\r\n openB1: async (noLock?: true) => { return ctx.openBriefcase(\"user1\", noLock); },\r\n openB2: async (noLock?: true) => { return ctx.openBriefcase(\"user2\", noLock); },\r\n openB3: async (noLock?: true) => { return ctx.openBriefcase(\"user3\", noLock); },\r\n }\r\n\r\n async function insertPhysicalObject(b: BriefcaseDb,) {\r\n await b.locks.acquireLocks({ shared: ctx.modelId });\r\n return b.elements.insertElement(IModelTestUtils.createPhysicalObject(b, ctx.modelId, ctx.spatialCategoryId).toJSON());\r\n }\r\n\r\n before(async () => {\r\n await IModelHost.startup();\r\n HubMock.startup(\"PullMergeMethod\", KnownTestLocations.outputDir);\r\n });\r\n\r\n after(async () => {\r\n HubMock.shutdown()\r\n //await IModelHost.shutdown();\r\n });\r\n\r\n beforeEach(async () => {\r\n ctx.iTwinId = HubMock.iTwinId;\r\n ctx.accessTokens.user1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n ctx.accessTokens.user2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n ctx.accessTokens.user3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n ctx.iModelId = await HubMock.createNewIModel({ accessToken: ctx.accessTokens.user1, iTwinId: ctx.iTwinId, iModelName: ctx.iModelName, description: ctx.rootSubject });\r\n assert.isNotEmpty(ctx.iModelId);\r\n const b1 = await ctx.openB1();\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n [, ctx.modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n ctx.spatialCategoryId = SpatialCategory.insert(\r\n dictionary.iModel,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"\" });\r\n b1.close();\r\n });\r\n\r\n it(\"rebase events (noFastForward:true)\", async () => {\r\n /**\r\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\r\n * In this test we will test rebase events when noFastForward is set to true. Which mean rebase is required to merge changes.\r\n */\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward has no effect its a deprecated flag\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x40000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x40000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b1.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b1.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1, e3, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1, e4, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2, e1, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2, e2, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2, e5, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2, e6, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 8);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"update physical object [id=0x30000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[2].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.props?.description, \"update physical object [id=0x30000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[4].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.id, \"0x100000002\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.props?.description, \"update physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[6].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.id, \"0x100000003\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.props?.description, \"update physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.type, \"Data\");\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase events (noFastForward:false/default)\", async () => {\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1, e3, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1, e4, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2, e1, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2, e2, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2, e5, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2, e6, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]` });\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase with be_props (insert conflict)\", async () => {\r\n const b1 = await ctx.openB1();\r\n const b2 = await ctx.openB2();\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2.saveChanges(\"test2\");\r\n\r\n await assertThrowsAsync(\r\n async () => b2.pushChanges({ description: \"test2\" }),\r\n \"PRIMARY KEY insert conflict. Aborting rebase.\");\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1\");\r\n\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n\r\n chai.expect(() => b2.saveChanges(\"test1\")).throws(\"Could not save changes (test1)\");\r\n b2.abandonChanges();\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Conflict\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Inserted\") {\r\n chai.expect(args.getColumnNames()).to.be.deep.equal([\"Namespace\", \"Name\", \"Id\", \"SubId\", \"TxnMode\", \"StrData\", \"RawSize\", \"Data\"]);\r\n chai.expect(args.txn.id).to.be.equal(\"0x100000000\");\r\n chai.expect(args.txn.descr).to.be.equal(\"test2\");\r\n chai.expect(args.txn.type).to.be.equal(\"Data\");\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incoming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n // resume rebase see if it resolve the conflict\r\n await b2.txns.rebaser.resume();\r\n\r\n // use changeset api to read txn directly\r\n const reader = SqliteChangesetReader.openTxn({ db: b2, txnId: \"0x100000000\" });\r\n chai.expect(reader.step()).to.be.true;\r\n chai.expect(reader.tableName).to.be.equal(\"be_Prop\");\r\n chai.expect(reader.getColumnNames(reader.tableName)[5]).to.be.equal(\"StrData\");\r\n // note the operation changed from insert to update\r\n chai.expect(reader.op).to.be.equal(\"Updated\");\r\n // note this old value is from master branch after changeset was recomputed\r\n chai.expect(reader.getChangeValueText(5, \"Old\")).to.be.equal(\"test1\");\r\n // note this new value is from local branch after merger.\r\n chai.expect(reader.getChangeValueText(5, \"New\")).to.be.equal(\"test1 + test2\");\r\n reader.close();\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n\r\n\r\n await b2.pushChanges({ description: \"test2\" });\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n\r\n it(\"rebase with be_props (data conflict) \", async () => {\r\n const b1 = await ctx.openB1();\r\n const b2 = await ctx.openB2();\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n await b2.pullChanges();\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2.saveChanges(\"test2\");\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Data\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Updated\") {\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incomming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n await b2.pushChanges({ description: \"test\" });\r\n await b2.pullChanges();\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"should keep element deleted when local delete conflicts with remote update\", async () => {\r\n const b1 = await ctx.openB1(true /* = noLock */);\r\n const b2 = await ctx.openB2(true /* = noLock */);\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n await b2.pullChanges();\r\n\r\n const eb1 = b1.elements.getElementProps<PhysicalElementProps>(e1);\r\n eb1.userLabel = \"test1\";\r\n eb1.placement = { origin: { x: 1, y: 1, z: 1 }, angles: { yaw: 1, pitch: 1, roll: 1 } };\r\n eb1.geom = IModelTestUtils.createBox(Point3d.create(3, 3, 3));\r\n\r\n b1.elements.updateElement(eb1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `update physical object [id=${e1}]` });\r\n\r\n b2.elements.deleteElement(e1);\r\n b2.saveChanges();\r\n await b2.pullChanges();\r\n\r\n const eb2 = b2.elements.tryGetElementProps<PhysicalElementProps>(e1);\r\n\r\n // when placement is changed the element is not deleted after pullChanges();\r\n assert.isUndefined(eb2);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"ChangeMerge.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeMerge.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 { DbConflictResolution, Guid } from \"@itwin/core-bentley\";\r\nimport {\r\n IModel,\r\n PhysicalElementProps,\r\n SubCategoryAppearance,\r\n TxnProps\r\n} from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport { assert } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { HubWrappers, KnownTestLocations } from \"..\";\r\nimport {\r\n BriefcaseDb,\r\n ChannelControl,\r\n DictionaryModel,\r\n IModelHost,\r\n SpatialCategory,\r\n SqliteChangesetReader,\r\n} from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { RebaseChangesetConflictArgs } from \"../../internal/ChangesetConflictArgs\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nchai.use(chaiAsPromised);\r\n\r\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\r\n try {\r\n await test();\r\n } catch (e) {\r\n if (e instanceof Error && msg) {\r\n assert.equal(e.message, msg);\r\n }\r\n return;\r\n }\r\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\r\n}\r\n\r\n\r\nasync function updatePhysicalObject(b: BriefcaseDb, el1: string, federationGuid: string) {\r\n await b.locks.acquireLocks({ exclusive: el1 });\r\n const props = b.elements.getElement(el1);\r\n props.federationGuid = federationGuid;\r\n b.elements.updateElement(props.toJSON());\r\n}\r\n\r\ndescribe(\"Change merge method\", () => {\r\n const ctx = {\r\n accessTokens: {\r\n user1: \"\",\r\n user2: \"\",\r\n user3: \"\",\r\n },\r\n iModelId: \"\",\r\n iTwinId: \"\",\r\n modelId: \"\",\r\n spatialCategoryId: \"\",\r\n iModelName: \"TestIModel\",\r\n rootSubject: \"TestSubject\",\r\n openBriefcase: async (user: \"user1\" | \"user2\" | \"user3\", noLock?: true) => {\r\n const b = await HubWrappers.downloadAndOpenBriefcase({ accessToken: ctx.accessTokens[user], iTwinId: ctx.iTwinId, iModelId: ctx.iModelId, noLock });\r\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n return b;\r\n },\r\n openB1: async (noLock?: true) => { return ctx.openBriefcase(\"user1\", noLock); },\r\n openB2: async (noLock?: true) => { return ctx.openBriefcase(\"user2\", noLock); },\r\n openB3: async (noLock?: true) => { return ctx.openBriefcase(\"user3\", noLock); },\r\n }\r\n\r\n async function insertPhysicalObject(b: BriefcaseDb,) {\r\n await b.locks.acquireLocks({ shared: ctx.modelId });\r\n return b.elements.insertElement(IModelTestUtils.createPhysicalObject(b, ctx.modelId, ctx.spatialCategoryId).toJSON());\r\n }\r\n\r\n before(async () => {\r\n await IModelHost.startup();\r\n HubMock.startup(\"PullMergeMethod\", KnownTestLocations.outputDir);\r\n });\r\n\r\n after(async () => {\r\n HubMock.shutdown()\r\n //await IModelHost.shutdown();\r\n });\r\n\r\n beforeEach(async () => {\r\n ctx.iTwinId = HubMock.iTwinId;\r\n ctx.accessTokens.user1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n ctx.accessTokens.user2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n ctx.accessTokens.user3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n ctx.iModelId = await HubMock.createNewIModel({ accessToken: ctx.accessTokens.user1, iTwinId: ctx.iTwinId, iModelName: ctx.iModelName, description: ctx.rootSubject });\r\n assert.isNotEmpty(ctx.iModelId);\r\n const b1 = await ctx.openB1();\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n [, ctx.modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n ctx.spatialCategoryId = SpatialCategory.insert(\r\n dictionary.iModel,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"\" });\r\n b1.close();\r\n });\r\n\r\n it(\"rebase events (noFastForward:true)\", async () => {\r\n /**\r\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\r\n * In this test we will test rebase events when noFastForward is set to true. Which mean rebase is required to merge changes.\r\n */\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward has no effect its a deprecated flag\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x40000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x40000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b1.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b1.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1, e3, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1, e4, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2, e1, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2, e2, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2, e5, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2, e6, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 8);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"update physical object [id=0x30000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[2].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.props?.description, \"update physical object [id=0x30000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[4].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.id, \"0x100000002\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.props?.description, \"update physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[6].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.id, \"0x100000003\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.props?.description, \"update physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.type, \"Data\");\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase events (noFastForward:false/default)\", async () => {\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2);\r\n b2.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1);\r\n b1.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1, e3, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1, e4, Guid.createValue());\r\n b1.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2, e1, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2, e2, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2, e5, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2, e6, Guid.createValue());\r\n b2.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]` });\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase with be_props (insert conflict)\", async () => {\r\n const b1 = await ctx.openB1();\r\n const b2 = await ctx.openB2();\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2.saveChanges(\"test2\");\r\n\r\n await assertThrowsAsync(\r\n async () => b2.pushChanges({ description: \"test2\" }),\r\n \"PRIMARY KEY insert conflict. Aborting rebase.\");\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1\");\r\n\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n\r\n chai.expect(() => b2.saveChanges(\"test1\")).throws(\"Could not save changes (test1)\");\r\n b2.abandonChanges();\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Conflict\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Inserted\") {\r\n chai.expect(args.getColumnNames()).to.be.deep.equal([\"Namespace\", \"Name\", \"Id\", \"SubId\", \"TxnMode\", \"StrData\", \"RawSize\", \"Data\"]);\r\n chai.expect(args.txn.id).to.be.equal(\"0x100000000\");\r\n chai.expect(args.txn.descr).to.be.equal(\"test2\");\r\n chai.expect(args.txn.type).to.be.equal(\"Data\");\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incoming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n // resume rebase see if it resolve the conflict\r\n await b2.txns.rebaser.resume();\r\n\r\n // use changeset api to read txn directly\r\n const reader = SqliteChangesetReader.openTxn({ db: b2, txnId: \"0x100000000\" });\r\n chai.expect(reader.step()).to.be.true;\r\n chai.expect(reader.tableName).to.be.equal(\"be_Prop\");\r\n chai.expect(reader.getColumnNames(reader.tableName)[5]).to.be.equal(\"StrData\");\r\n // note the operation changed from insert to update\r\n chai.expect(reader.op).to.be.equal(\"Updated\");\r\n // note this old value is from master branch after changeset was recomputed\r\n chai.expect(reader.getChangeValueText(5, \"Old\")).to.be.equal(\"test1\");\r\n // note this new value is from local branch after merger.\r\n chai.expect(reader.getChangeValueText(5, \"New\")).to.be.equal(\"test1 + test2\");\r\n reader.close();\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n\r\n\r\n await b2.pushChanges({ description: \"test2\" });\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n\r\n it(\"rebase with be_props (data conflict) \", async () => {\r\n const b1 = await ctx.openB1();\r\n const b2 = await ctx.openB2();\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n await b2.pullChanges();\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2.saveChanges(\"test2\");\r\n\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n b1.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Data\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Updated\") {\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incomming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n await b2.pushChanges({ description: \"test\" });\r\n await b2.pullChanges();\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"should keep element deleted when local delete conflicts with remote update\", async () => {\r\n const b1 = await ctx.openB1(true /* = noLock */);\r\n const b2 = await ctx.openB2(true /* = noLock */);\r\n\r\n const e1 = await insertPhysicalObject(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n await b2.pullChanges();\r\n\r\n const eb1 = b1.elements.getElementProps<PhysicalElementProps>(e1);\r\n eb1.userLabel = \"test1\";\r\n eb1.placement = { origin: { x: 1, y: 1, z: 1 }, angles: { yaw: 1, pitch: 1, roll: 1 } };\r\n eb1.geom = IModelTestUtils.createBox(Point3d.create(3, 3, 3));\r\n\r\n b1.elements.updateElement(eb1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `update physical object [id=${e1}]` });\r\n\r\n b2.elements.deleteElement(e1);\r\n b2.saveChanges();\r\n await b2.pullChanges();\r\n\r\n const eb2 = b2.elements.tryGetElementProps<PhysicalElementProps>(e1);\r\n\r\n // when placement is changed the element is not deleted after pullChanges();\r\n assert.isUndefined(eb2);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n});\r\n"]}
|
|
@@ -379,6 +379,27 @@ describe("exportGraphics", () => {
|
|
|
379
379
|
// Sorting since output order is arbitrary
|
|
380
380
|
assert.deepStrictEqual([infos[0].elementId, infos[1].elementId].sort(), [id0, id1].sort());
|
|
381
381
|
});
|
|
382
|
+
it("process multiple elements simultaneously using separate async calls", async () => {
|
|
383
|
+
const builder0 = new GeometryStreamBuilder();
|
|
384
|
+
builder0.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));
|
|
385
|
+
const id0 = insertPhysicalElement(builder0.geometryStream);
|
|
386
|
+
const builder1 = new GeometryStreamBuilder();
|
|
387
|
+
builder1.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(-1, 0, 0), Point3d.create(-1, -1, 0), Point3d.create(0, -1, 0)]));
|
|
388
|
+
const id1 = insertPhysicalElement(builder1.geometryStream);
|
|
389
|
+
const infos = [];
|
|
390
|
+
const onGraphics = (info) => infos.push(info);
|
|
391
|
+
const promises = [id0, id1].map(async (id) => iModel.exportGraphicsAsync({
|
|
392
|
+
elementIdArray: [id],
|
|
393
|
+
onGraphics,
|
|
394
|
+
}));
|
|
395
|
+
// onGraphics should not be called yet
|
|
396
|
+
assert.strictEqual(infos.length, 0);
|
|
397
|
+
await Promise.all(promises);
|
|
398
|
+
// once both promises are resolved, the results are available.
|
|
399
|
+
assert.strictEqual(infos.length, 2);
|
|
400
|
+
// Sorting since output order is arbitrary
|
|
401
|
+
assert.deepStrictEqual([infos[0].elementId, infos[1].elementId].sort(), [id0, id1].sort());
|
|
402
|
+
});
|
|
382
403
|
it("produces expected indices, points, normals, params in smoketest", () => {
|
|
383
404
|
const builder = new GeometryStreamBuilder();
|
|
384
405
|
builder.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));
|
|
@@ -692,6 +713,74 @@ describe("exportGraphics", () => {
|
|
|
692
713
|
assert.deepStrictEqual(Array.from(partInfos[0].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);
|
|
693
714
|
assert.deepStrictEqual(Array.from(partInfos[0].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);
|
|
694
715
|
});
|
|
716
|
+
it("exports multiple parts simultaneously with exportPartGraphicsAsync", async () => {
|
|
717
|
+
const partBuilder = new GeometryStreamBuilder();
|
|
718
|
+
partBuilder.appendGeometry(Loop.createPolygon([Point3d.createZero(), Point3d.create(1, 0, 0), Point3d.create(1, 1, 0), Point3d.create(0, 1, 0)]));
|
|
719
|
+
const partProps = {
|
|
720
|
+
classFullName: GeometryPart.classFullName,
|
|
721
|
+
model: IModel.dictionaryId,
|
|
722
|
+
code: Code.createEmpty(),
|
|
723
|
+
geom: partBuilder.geometryStream,
|
|
724
|
+
};
|
|
725
|
+
// Add two parts
|
|
726
|
+
const partId1 = iModel.elements.insertElement(partProps);
|
|
727
|
+
const partId2 = iModel.elements.insertElement(partProps);
|
|
728
|
+
const partInstanceBuilder = new GeometryStreamBuilder();
|
|
729
|
+
partInstanceBuilder.appendGeometryPart3d(partId1, Point3d.create(7, 8, 9));
|
|
730
|
+
partInstanceBuilder.appendGeometryPart3d(partId2, Point3d.create(10, 11, 12));
|
|
731
|
+
const partInstanceId = insertPhysicalElement(partInstanceBuilder.geometryStream);
|
|
732
|
+
const infos = [];
|
|
733
|
+
const partInstanceArray = [];
|
|
734
|
+
const exportGraphicsOptions = {
|
|
735
|
+
elementIdArray: [partInstanceId],
|
|
736
|
+
onGraphics: (info) => infos.push(info),
|
|
737
|
+
partInstanceArray,
|
|
738
|
+
};
|
|
739
|
+
await iModel.exportGraphicsAsync(exportGraphicsOptions);
|
|
740
|
+
assert.strictEqual(infos.length, 0);
|
|
741
|
+
assert.strictEqual(partInstanceArray.length, 2);
|
|
742
|
+
assert.isTrue(partInstanceArray[0].partId === partId1 || partInstanceArray[1].partId === partId1);
|
|
743
|
+
assert.isTrue(partInstanceArray[0].partId === partId2 || partInstanceArray[1].partId === partId2);
|
|
744
|
+
assert.isTrue(partInstanceArray[0].partId !== partInstanceArray[1].partId);
|
|
745
|
+
assert.strictEqual(partInstanceArray[0].partInstanceId, partInstanceId);
|
|
746
|
+
assert.strictEqual(partInstanceArray[1].partInstanceId, partInstanceId);
|
|
747
|
+
assert.isDefined(partInstanceArray[0].transform);
|
|
748
|
+
assert.deepStrictEqual(Array.from(partInstanceArray[0].transform), [1, 0, 0, 7, 0, 1, 0, 8, 0, 0, 1, 9]);
|
|
749
|
+
assert.isDefined(partInstanceArray[1].transform);
|
|
750
|
+
assert.deepStrictEqual(Array.from(partInstanceArray[1].transform), [1, 0, 0, 10, 0, 1, 0, 11, 0, 0, 1, 12]);
|
|
751
|
+
const partInfos = [];
|
|
752
|
+
const onPartGraphics = (partInfo) => partInfos.push(partInfo);
|
|
753
|
+
const promises = partInstanceArray.map(async (partInstance) => iModel.exportPartGraphicsAsync({
|
|
754
|
+
elementId: partInstance.partId,
|
|
755
|
+
displayProps: partInstance.displayProps,
|
|
756
|
+
onPartGraphics,
|
|
757
|
+
}));
|
|
758
|
+
// onPartGraphics should not be called yet
|
|
759
|
+
assert.strictEqual(partInfos.length, 0);
|
|
760
|
+
await Promise.all(promises);
|
|
761
|
+
// once both promises are resolved, the results are available.
|
|
762
|
+
assert.strictEqual(partInfos.length, 2);
|
|
763
|
+
// The ordering of these values is arbitrary, but should be consistent between runs.
|
|
764
|
+
// Baselines may need to be updated if native GeomLibs is refactored, but:
|
|
765
|
+
// * Lengths of all fields should remain the same
|
|
766
|
+
// * Actual point, normal and param values should remain the same
|
|
767
|
+
assert.strictEqual(partInfos[0].mesh.indices.length, 6);
|
|
768
|
+
assert.strictEqual(partInfos[0].mesh.points.length, 12);
|
|
769
|
+
assert.strictEqual(partInfos[0].mesh.normals.length, 12);
|
|
770
|
+
assert.strictEqual(partInfos[0].mesh.params.length, 8);
|
|
771
|
+
assert.strictEqual(partInfos[1].mesh.indices.length, 6);
|
|
772
|
+
assert.strictEqual(partInfos[1].mesh.points.length, 12);
|
|
773
|
+
assert.strictEqual(partInfos[1].mesh.normals.length, 12);
|
|
774
|
+
assert.strictEqual(partInfos[1].mesh.params.length, 8);
|
|
775
|
+
assert.deepStrictEqual(Array.from(partInfos[0].mesh.indices), [0, 1, 2, 1, 0, 3]);
|
|
776
|
+
assert.deepStrictEqual(Array.from(partInfos[0].mesh.points), [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0]);
|
|
777
|
+
assert.deepStrictEqual(Array.from(partInfos[0].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);
|
|
778
|
+
assert.deepStrictEqual(Array.from(partInfos[0].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);
|
|
779
|
+
assert.deepStrictEqual(Array.from(partInfos[1].mesh.indices), [0, 1, 2, 1, 0, 3]);
|
|
780
|
+
assert.deepStrictEqual(Array.from(partInfos[1].mesh.points), [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0]);
|
|
781
|
+
assert.deepStrictEqual(Array.from(partInfos[1].mesh.normals), [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);
|
|
782
|
+
assert.deepStrictEqual(Array.from(partInfos[1].mesh.params), [1, 0, 0, 1, 0, 0, 1, 1]);
|
|
783
|
+
});
|
|
695
784
|
it("handles single geometryClass in GeometryStream", () => {
|
|
696
785
|
const builder = new GeometryStreamBuilder();
|
|
697
786
|
const geometryParams = new GeometryParams(seedCategory);
|