Path: blob/main/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as nls from '../../../../nls.js';6import assert from 'assert';7import { mock } from '../../../../base/test/common/mock.js';8import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';9import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js';10import { TestInstantiationService } from '../../../../platform/instantiation/test/common/instantiationServiceMock.js';11import { NullLogService } from '../../../../platform/log/common/log.js';12import { TestNotificationService } from '../../../../platform/notification/test/common/testNotificationService.js';13import { Registry } from '../../../../platform/registry/common/platform.js';14import { MainThreadTreeViews } from '../../browser/mainThreadTreeViews.js';15import { ExtHostTreeViewsShape } from '../../common/extHost.protocol.js';16import { CustomTreeView } from '../../../browser/parts/views/treeView.js';17import { Extensions, ITreeItem, ITreeView, ITreeViewDescriptor, IViewContainersRegistry, IViewDescriptorService, IViewsRegistry, TreeItemCollapsibleState, ViewContainer, ViewContainerLocation } from '../../../common/views.js';18import { IExtHostContext } from '../../../services/extensions/common/extHostCustomers.js';19import { ExtensionHostKind } from '../../../services/extensions/common/extensionHostKind.js';20import { ViewDescriptorService } from '../../../services/views/browser/viewDescriptorService.js';21import { TestViewsService, workbenchInstantiationService } from '../../../test/browser/workbenchTestServices.js';22import { TestExtensionService } from '../../../test/common/workbenchTestServices.js';2324suite('MainThreadHostTreeView', function () {25const testTreeViewId = 'testTreeView';26const customValue = 'customValue';27const ViewsRegistry = Registry.as<IViewsRegistry>(Extensions.ViewsRegistry);2829interface CustomTreeItem extends ITreeItem {30customProp: string;31}3233class MockExtHostTreeViewsShape extends mock<ExtHostTreeViewsShape>() {34override async $getChildren(treeViewId: string, treeItemHandle?: string[]): Promise<(number | ITreeItem)[][]> {35return [[0, <CustomTreeItem>{ handle: 'testItem1', collapsibleState: TreeItemCollapsibleState.Expanded, customProp: customValue }]];36}3738override async $hasResolve(): Promise<boolean> {39return false;40}4142override $setVisible(): void { }43}4445let container: ViewContainer;46let mainThreadTreeViews: MainThreadTreeViews;47let extHostTreeViewsShape: MockExtHostTreeViewsShape;4849teardown(() => {50ViewsRegistry.deregisterViews(ViewsRegistry.getViews(container), container);51});5253const disposables = ensureNoDisposablesAreLeakedInTestSuite();5455setup(async () => {56const instantiationService: TestInstantiationService = workbenchInstantiationService(undefined, disposables);57const viewDescriptorService = disposables.add(instantiationService.createInstance(ViewDescriptorService));58instantiationService.stub(IViewDescriptorService, viewDescriptorService);59container = Registry.as<IViewContainersRegistry>(Extensions.ViewContainersRegistry).registerViewContainer({ id: 'testContainer', title: nls.localize2('test', 'test'), ctorDescriptor: new SyncDescriptor(<any>{}) }, ViewContainerLocation.Sidebar);60const viewDescriptor: ITreeViewDescriptor = {61id: testTreeViewId,62ctorDescriptor: null!,63name: nls.localize2('Test View 1', 'Test View 1'),64treeView: disposables.add(instantiationService.createInstance(CustomTreeView, 'testTree', 'Test Title', 'extension.id')),65};66ViewsRegistry.registerViews([viewDescriptor], container);6768const testExtensionService = new TestExtensionService();69extHostTreeViewsShape = new MockExtHostTreeViewsShape();70mainThreadTreeViews = disposables.add(new MainThreadTreeViews(71new class implements IExtHostContext {72remoteAuthority = '';73extensionHostKind = ExtensionHostKind.LocalProcess;74dispose() { }75assertRegistered() { }76set(v: any): any { return null; }77getProxy(): any {78return extHostTreeViewsShape;79}80drain(): any { return null; }81}, new TestViewsService(), new TestNotificationService(), testExtensionService, new NullLogService()));82mainThreadTreeViews.$registerTreeViewDataProvider(testTreeViewId, { showCollapseAll: false, canSelectMany: false, dropMimeTypes: [], dragMimeTypes: [], hasHandleDrag: false, hasHandleDrop: false, manuallyManageCheckboxes: false });83await testExtensionService.whenInstalledExtensionsRegistered();84});8586test('getChildren keeps custom properties', async () => {87const treeView: ITreeView = (<ITreeViewDescriptor>ViewsRegistry.getView(testTreeViewId)).treeView;88const children = await treeView.dataProvider?.getChildren({ handle: 'root', collapsibleState: TreeItemCollapsibleState.Expanded });89assert(children!.length === 1, 'Exactly one child should be returned');90assert((<CustomTreeItem>children![0]).customProp === customValue, 'Tree Items should keep custom properties');91});929394});959697