Path: blob/main/src/vs/workbench/test/browser/componentFixtures/imageCarousel.fixture.ts
13401 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 { Dimension } from '../../../../base/browser/dom.js';6import { mainWindow } from '../../../../base/browser/window.js';7import { VSBuffer } from '../../../../base/common/buffer.js';8import { CancellationToken } from '../../../../base/common/cancellation.js';9import { mock } from '../../../../base/test/common/mock.js';10import { IEditorGroup } from '../../../services/editor/common/editorGroupsService.js';11import { ImageCarouselEditor } from '../../../contrib/imageCarousel/browser/imageCarouselEditor.js';12import { ImageCarouselEditorInput } from '../../../contrib/imageCarousel/browser/imageCarouselEditorInput.js';13import { ICarouselImage, IImageCarouselCollection } from '../../../contrib/imageCarousel/browser/imageCarouselTypes.js';14import { ComponentFixtureContext, createEditorServices, defineComponentFixture, defineThemedFixtureGroup } from './fixtureUtils.js';15import '../../../contrib/imageCarousel/browser/media/imageCarousel.css';16import { IFileService } from '../../../../platform/files/common/files.js';17import { NullFileSystemProvider } from '../../../../platform/files/test/common/nullFileSystemProvider.js';18import { FileService } from '../../../../platform/files/common/fileService.js';19import { NullLogService } from '../../../../platform/log/common/log.js';20import { Schemas } from '../../../../base/common/network.js';21import { IWebviewService } from '../../../contrib/webview/browser/webview.js';2223function createSolidPng(r: number, g: number, b: number, width: number = 64, height: number = 64): VSBuffer {24const canvas = mainWindow.document.createElement('canvas');25canvas.width = width;26canvas.height = height;27const ctx = canvas.getContext('2d')!;28ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;29ctx.fillRect(0, 0, width, height);3031const dataUrl = canvas.toDataURL('image/png');32const base64 = dataUrl.split(',')[1];33return VSBuffer.wrap(Uint8Array.from(atob(base64), c => c.charCodeAt(0)));34}3536function createTestImages(): ICarouselImage[] {37return [38{ id: 'img-1', name: 'Red', mimeType: 'image/png', data: createSolidPng(220, 50, 50), caption: 'A red image' },39{ id: 'img-2', name: 'Green', mimeType: 'image/png', data: createSolidPng(50, 180, 50), caption: 'A green image' },40{ id: 'img-3', name: 'Blue', mimeType: 'image/png', data: createSolidPng(50, 80, 220) },41{ id: 'img-4', name: 'Yellow', mimeType: 'image/png', data: createSolidPng(230, 210, 50), caption: 'A yellow image' },42{ id: 'img-5', name: 'Purple', mimeType: 'image/png', data: createSolidPng(150, 50, 200) },43];44}4546function createMockEditorGroup(): IEditorGroup {47return new class extends mock<IEditorGroup>() {48override windowId = mainWindow.vscodeWindowId;49}();50}5152async function renderCarousel(context: ComponentFixtureContext, collection: IImageCarouselCollection, startIndex: number = 0): Promise<void> {53const { container, disposableStore, theme } = context;5455container.style.width = '600px';56container.style.height = '500px';5758const instantiationService = createEditorServices(disposableStore, {59colorTheme: theme,60additionalServices: ({ defineInstance }) => {61const fileService = new FileService(new NullLogService());62fileService.registerProvider(Schemas.file, new NullFileSystemProvider());63disposableStore.add(fileService);64defineInstance(IFileService, fileService);65defineInstance(IWebviewService, new class extends mock<IWebviewService>() { }());66},67});6869const editor = disposableStore.add(70instantiationService.createInstance(ImageCarouselEditor, createMockEditorGroup())71);72editor.create(container);73editor.layout(new Dimension(600, 500));7475const input = new ImageCarouselEditorInput(collection, startIndex);76await editor.setInput(input, undefined, {}, CancellationToken.None);77}7879function singleSectionCollection(): IImageCarouselCollection {80return {81id: 'fixture-single',82title: 'Test Carousel',83sections: [{ title: 'All Images', images: createTestImages() }],84};85}8687function multiSectionCollection(): IImageCarouselCollection {88const images = createTestImages();89return {90id: 'fixture-multi',91title: 'Multi-Section Carousel',92sections: [93{ title: 'Warm Colors', images: [images[0], images[3]] },94{ title: 'Cool Colors', images: [images[2], images[4]] },95{ title: 'Nature', images: [images[1]] },96],97};98}99100function singleImageCollection(): IImageCarouselCollection {101const images = createTestImages();102return {103id: 'fixture-single-image',104title: 'Single Image',105sections: [{ title: '', images: [images[0]] }],106};107}108109export default defineThemedFixtureGroup({ path: 'imageCarousel/' }, {110SingleSection: defineComponentFixture({111render: ctx => renderCarousel(ctx, singleSectionCollection()),112}),113SingleSectionMiddleImage: defineComponentFixture({114render: ctx => renderCarousel(ctx, singleSectionCollection(), 2),115}),116MultipleSections: defineComponentFixture({117render: ctx => renderCarousel(ctx, multiSectionCollection()),118}),119SingleImage: defineComponentFixture({120render: ctx => renderCarousel(ctx, singleImageCollection()),121}),122});123124125