Skip to content

Commit 59d039d

Browse files
committed
Move integration test to performance tests
1 parent 146bf78 commit 59d039d

File tree

4 files changed

+69
-34
lines changed

4 files changed

+69
-34
lines changed

apps/performance-tests/src/tree-widget/ModelsTree.test.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,67 @@ describe("models tree", () => {
7272
},
7373
});
7474

75+
run<{
76+
iModel: SnapshotDb;
77+
idsCache: ModelsTreeIdsCache;
78+
imodelAccess: IModelAccess;
79+
viewport: Viewport;
80+
handler: HierarchyVisibilityHandler & Disposable;
81+
provider: HierarchyProvider & Disposable;
82+
elementsModel: Id64String;
83+
}>({
84+
testName: "validates categories visibility for imodel with 50k categories",
85+
setup: async () => {
86+
const { iModelConnection, iModel } = TestIModelConnection.openFile(Datasets.getIModelPath("50k categories"));
87+
const imodelAccess = StatelessHierarchyProvider.createIModelAccess(iModel, "unbounded");
88+
const visibilityTargets = await getVisibilityTargets(imodelAccess);
89+
const testData = createTestDataForInitialDisplay({ visibilityTargets, visible: false });
90+
91+
const viewport = await createViewport({
92+
iModelConnection,
93+
testData,
94+
});
95+
setupInitialDisplayState({
96+
viewport,
97+
...testData,
98+
});
99+
const idsCache = new ModelsTreeIdsCache(imodelAccess, defaultModelsTreeHierarchyConfiguration);
100+
const handler = createModelsTreeVisibilityHandler({ idsCache, viewport, imodelAccess });
101+
const provider = createIModelHierarchyProvider({
102+
hierarchyDefinition: new ModelsTreeDefinition({ idsCache, imodelAccess, hierarchyConfig: defaultModelsTreeHierarchyConfiguration }),
103+
imodelAccess,
104+
});
105+
await validateHierarchyVisibility({
106+
ignoreChildren: (node) => !!node.extendedData?.isCategory,
107+
provider,
108+
handler,
109+
viewport,
110+
expectations: "all-hidden",
111+
});
112+
const elementsModel = iModel.elements.getElementProps(visibilityTargets.elements[0]).model;
113+
return { iModel, imodelAccess, viewport, provider, handler, elementsModel, idsCache };
114+
},
115+
cleanup: async (props) => {
116+
props.iModel.close();
117+
props.viewport[Symbol.dispose]();
118+
props.handler[Symbol.dispose]();
119+
props.provider[Symbol.dispose]();
120+
props.idsCache[Symbol.dispose]();
121+
},
122+
test: async ({ viewport, handler, provider, elementsModel }) => {
123+
// Add one element to always draw set to trigger additional queries
124+
viewport.setAlwaysDrawn(new Set([elementsModel]));
125+
await handler.changeVisibility(createModelHierarchyNode(elementsModel), true);
126+
await validateHierarchyVisibility({
127+
ignoreChildren: (node) => !!node.extendedData?.isCategory,
128+
provider,
129+
handler,
130+
viewport,
131+
expectations: "all-visible",
132+
});
133+
},
134+
});
135+
75136
run<{
76137
iModel: SnapshotDb;
77138
idsCache: ModelsTreeIdsCache;

apps/performance-tests/src/tree-widget/VisibilityUtilities.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import type { IModelConnection, Viewport } from "@itwin/core-frontend";
2222
type Visibility = "visible" | "hidden" | "partial";
2323

2424
export interface ValidateNodeProps {
25+
ignoreChildren?: (node: HierarchyNode) => boolean;
2526
handler: HierarchyVisibilityHandler;
2627
viewport: Viewport;
2728
expectations:
@@ -44,7 +45,7 @@ async function validateNodeVisibility({ node, handler, expectations }: ValidateN
4445
expect(actualVisibility.state).to.eq(expectations === "all-hidden" ? "hidden" : "visible");
4546
return;
4647
}
47-
const idInExpectations = ids.find((id) => id in expectations.instances)
48+
const idInExpectations = ids.find((id) => id in expectations.instances);
4849
if (idInExpectations) {
4950
const expectedVisibility = expectations.instances[idInExpectations];
5051
expect(actualVisibility.state).to.eq(expectedVisibility);
@@ -55,14 +56,15 @@ async function validateNodeVisibility({ node, handler, expectations }: ValidateN
5556

5657
export async function validateHierarchyVisibility({
5758
provider,
59+
ignoreChildren,
5860
...props
5961
}: ValidateNodeProps & {
6062
provider: HierarchyProvider;
6163
}) {
6264
await toVoidPromise(
6365
from(provider.getNodes({ parentNode: undefined })).pipe(
64-
expand((node) => (node.children ? provider.getNodes({ parentNode: node }) : EMPTY)),
65-
mergeMap(async (node) => waitFor(async () => validateNodeVisibility({ ...props, node }))),
66+
expand((node) => (node.children && (!ignoreChildren || !ignoreChildren(node)) ? provider.getNodes({ parentNode: node }) : EMPTY), 1000),
67+
mergeMap(async (node) => waitFor(async () => validateNodeVisibility({ ...props, node })), 1000),
6668
),
6769
);
6870
}

apps/performance-tests/src/util/TestReporter.cts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import asTable from "as-table";
77
import fs from "fs";
88
import Mocha from "mocha";
99
import { LOGGER } from "./Logging.cjs";
10-
import { MainThreadBlocksDetector, Summary } from "./MainThreadBlocksDetector.cjs";
10+
import { MainThreadBlocksDetector } from "./MainThreadBlocksDetector.cjs";
11+
12+
import type { Summary } from "./MainThreadBlocksDetector.cjs";
1113

1214
interface TestInfo {
1315
test: Mocha.Runnable;

packages/itwin/tree-widget/src/test/trees/models-tree/internal/ModelsTreeVisibilityHandler.test.ts

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2196,36 +2196,6 @@ describe("ModelsTreeVisibilityHandler", () => {
21962196
});
21972197
});
21982198

2199-
it.skip("validates visibility for large iModel", async function () {
2200-
await using buildIModelResult = await buildIModel(this, async (builder) => {
2201-
const modelsToTurnOn = new Array<string>();
2202-
let elementId = "";
2203-
for (let i = 0; i < 3; ++i) {
2204-
const model = insertPhysicalModelWithPartition({ builder, partitionParentId: IModel.rootSubjectId, codeValue: `model${i}` }).id;
2205-
modelsToTurnOn.push(model);
2206-
for (let j = 0; j < 1000; ++j) {
2207-
const categoryId = insertSpatialCategory({ builder, codeValue: `category${i}-${j}` }).id;
2208-
elementId = insertPhysicalElement({ builder, modelId: model, categoryId }).id;
2209-
}
2210-
}
2211-
return { modelsToTurnOn, elementId };
2212-
});
2213-
2214-
const { imodel, ...ids } = buildIModelResult;
2215-
using visibilityTestData = createVisibilityTestData({ imodel });
2216-
const { handler, provider, viewport } = visibilityTestData;
2217-
await Promise.all(ids.modelsToTurnOn.map(async (modelId) => handler.changeVisibility(createModelHierarchyNode(modelId), true)));
2218-
viewport.setAlwaysDrawn(new Set([ids.elementId]));
2219-
viewport.renderFrame();
2220-
await validateHierarchyVisibility({
2221-
provider,
2222-
handler,
2223-
viewport,
2224-
visibilityExpectations: VisibilityExpectations.all("visible"),
2225-
waitForOptions: { timeout: 2000 },
2226-
});
2227-
});
2228-
22292199
it("showing model makes it, all its categories and elements visible and doesn't affect other models", async function () {
22302200
await using buildIModelResult = await buildIModel(this, async (builder) => {
22312201
const categoryId = insertSpatialCategory({ builder, codeValue: "category" }).id;

0 commit comments

Comments
 (0)