Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/test/browser/componentFixtures/imageCarousel.fixture.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Dimension } from '../../../../base/browser/dom.js';
7
import { mainWindow } from '../../../../base/browser/window.js';
8
import { VSBuffer } from '../../../../base/common/buffer.js';
9
import { CancellationToken } from '../../../../base/common/cancellation.js';
10
import { mock } from '../../../../base/test/common/mock.js';
11
import { IEditorGroup } from '../../../services/editor/common/editorGroupsService.js';
12
import { ImageCarouselEditor } from '../../../contrib/imageCarousel/browser/imageCarouselEditor.js';
13
import { ImageCarouselEditorInput } from '../../../contrib/imageCarousel/browser/imageCarouselEditorInput.js';
14
import { ICarouselImage, IImageCarouselCollection } from '../../../contrib/imageCarousel/browser/imageCarouselTypes.js';
15
import { ComponentFixtureContext, createEditorServices, defineComponentFixture, defineThemedFixtureGroup } from './fixtureUtils.js';
16
import '../../../contrib/imageCarousel/browser/media/imageCarousel.css';
17
import { IFileService } from '../../../../platform/files/common/files.js';
18
import { NullFileSystemProvider } from '../../../../platform/files/test/common/nullFileSystemProvider.js';
19
import { FileService } from '../../../../platform/files/common/fileService.js';
20
import { NullLogService } from '../../../../platform/log/common/log.js';
21
import { Schemas } from '../../../../base/common/network.js';
22
import { IWebviewService } from '../../../contrib/webview/browser/webview.js';
23
24
function createSolidPng(r: number, g: number, b: number, width: number = 64, height: number = 64): VSBuffer {
25
const canvas = mainWindow.document.createElement('canvas');
26
canvas.width = width;
27
canvas.height = height;
28
const ctx = canvas.getContext('2d')!;
29
ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;
30
ctx.fillRect(0, 0, width, height);
31
32
const dataUrl = canvas.toDataURL('image/png');
33
const base64 = dataUrl.split(',')[1];
34
return VSBuffer.wrap(Uint8Array.from(atob(base64), c => c.charCodeAt(0)));
35
}
36
37
function createTestImages(): ICarouselImage[] {
38
return [
39
{ id: 'img-1', name: 'Red', mimeType: 'image/png', data: createSolidPng(220, 50, 50), caption: 'A red image' },
40
{ id: 'img-2', name: 'Green', mimeType: 'image/png', data: createSolidPng(50, 180, 50), caption: 'A green image' },
41
{ id: 'img-3', name: 'Blue', mimeType: 'image/png', data: createSolidPng(50, 80, 220) },
42
{ id: 'img-4', name: 'Yellow', mimeType: 'image/png', data: createSolidPng(230, 210, 50), caption: 'A yellow image' },
43
{ id: 'img-5', name: 'Purple', mimeType: 'image/png', data: createSolidPng(150, 50, 200) },
44
];
45
}
46
47
function createMockEditorGroup(): IEditorGroup {
48
return new class extends mock<IEditorGroup>() {
49
override windowId = mainWindow.vscodeWindowId;
50
}();
51
}
52
53
async function renderCarousel(context: ComponentFixtureContext, collection: IImageCarouselCollection, startIndex: number = 0): Promise<void> {
54
const { container, disposableStore, theme } = context;
55
56
container.style.width = '600px';
57
container.style.height = '500px';
58
59
const instantiationService = createEditorServices(disposableStore, {
60
colorTheme: theme,
61
additionalServices: ({ defineInstance }) => {
62
const fileService = new FileService(new NullLogService());
63
fileService.registerProvider(Schemas.file, new NullFileSystemProvider());
64
disposableStore.add(fileService);
65
defineInstance(IFileService, fileService);
66
defineInstance(IWebviewService, new class extends mock<IWebviewService>() { }());
67
},
68
});
69
70
const editor = disposableStore.add(
71
instantiationService.createInstance(ImageCarouselEditor, createMockEditorGroup())
72
);
73
editor.create(container);
74
editor.layout(new Dimension(600, 500));
75
76
const input = new ImageCarouselEditorInput(collection, startIndex);
77
await editor.setInput(input, undefined, {}, CancellationToken.None);
78
}
79
80
function singleSectionCollection(): IImageCarouselCollection {
81
return {
82
id: 'fixture-single',
83
title: 'Test Carousel',
84
sections: [{ title: 'All Images', images: createTestImages() }],
85
};
86
}
87
88
function multiSectionCollection(): IImageCarouselCollection {
89
const images = createTestImages();
90
return {
91
id: 'fixture-multi',
92
title: 'Multi-Section Carousel',
93
sections: [
94
{ title: 'Warm Colors', images: [images[0], images[3]] },
95
{ title: 'Cool Colors', images: [images[2], images[4]] },
96
{ title: 'Nature', images: [images[1]] },
97
],
98
};
99
}
100
101
function singleImageCollection(): IImageCarouselCollection {
102
const images = createTestImages();
103
return {
104
id: 'fixture-single-image',
105
title: 'Single Image',
106
sections: [{ title: '', images: [images[0]] }],
107
};
108
}
109
110
export default defineThemedFixtureGroup({ path: 'imageCarousel/' }, {
111
SingleSection: defineComponentFixture({
112
render: ctx => renderCarousel(ctx, singleSectionCollection()),
113
}),
114
SingleSectionMiddleImage: defineComponentFixture({
115
render: ctx => renderCarousel(ctx, singleSectionCollection(), 2),
116
}),
117
MultipleSections: defineComponentFixture({
118
render: ctx => renderCarousel(ctx, multiSectionCollection()),
119
}),
120
SingleImage: defineComponentFixture({
121
render: ctx => renderCarousel(ctx, singleImageCollection()),
122
}),
123
});
124
125