/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { IServerInstance } from '../jupyter/common'; import { Session, Kernel, KernelMessage, ServerConnection } from '@jupyterlab/services'; import { ISignal } from '@phosphor/signaling'; export class JupyterServerInstanceStub implements IServerInstance { public get port(): string { return undefined; } public get uri(): vscode.Uri { return undefined; } public configure(): Promise { throw new Error('Method not implemented.'); } public start(): Promise { throw new Error('Method not implemented.'); } stop(): Promise { throw new Error('Method not implemented.'); } } //#region sesion and kernel stubs (long) export class SessionStub implements Session.ISession { public get terminated(): ISignal { throw new Error('Method not implemented.'); } public get kernelChanged(): ISignal { throw new Error('Method not implemented.'); } public get statusChanged(): ISignal { throw new Error('Method not implemented.'); } public get propertyChanged(): ISignal { throw new Error('Method not implemented.'); } public get iopubMessage(): ISignal { throw new Error('Method not implemented.'); } public get unhandledMessage(): ISignal { throw new Error('Method not implemented.'); } public get anyMessage(): ISignal { throw new Error('Method not implemented.'); } public get id(): string { throw new Error('Method not implemented.'); } public get path(): string { throw new Error('Method not implemented.'); } public get name(): string { throw new Error('Method not implemented.'); } public get type(): string { throw new Error('Method not implemented.'); } public get serverSettings(): ServerConnection.ISettings { throw new Error('Method not implemented.'); } public get model(): Session.IModel { throw new Error('Method not implemented.'); } public get kernel(): Kernel.IKernelConnection { throw new Error('Method not implemented.'); } public get status(): Kernel.Status { throw new Error('Method not implemented.'); } public get isDisposed(): boolean { throw new Error('Method not implemented.'); } setPath(path: string): Promise { throw new Error('Method not implemented.'); } setName(name: string): Promise { throw new Error('Method not implemented.'); } setType(type: string): Promise { throw new Error('Method not implemented.'); } changeKernel(options: Partial): Promise { throw new Error('Method not implemented.'); } shutdown(): Promise { throw new Error('Method not implemented.'); } dispose(): void { throw new Error('Method not implemented.'); } } export class KernelStub implements Kernel.IKernel { get terminated(): ISignal { throw new Error('Method not implemented.'); } get statusChanged(): ISignal { throw new Error('Method not implemented.'); } get iopubMessage(): ISignal { throw new Error('Method not implemented.'); } get unhandledMessage(): ISignal { throw new Error('Method not implemented.'); } get anyMessage(): ISignal { throw new Error('Method not implemented.'); } get serverSettings(): ServerConnection.ISettings { throw new Error('Method not implemented.'); } get id(): string { throw new Error('Method not implemented.'); } get name(): string { throw new Error('Method not implemented.'); } get model(): Kernel.IModel { throw new Error('Method not implemented.'); } get username(): string { throw new Error('Method not implemented.'); } get clientId(): string { throw new Error('Method not implemented.'); } get status(): Kernel.Status { throw new Error('Method not implemented.'); } get info(): KernelMessage.IInfoReply { throw new Error('Method not implemented.'); } get isReady(): boolean { throw new Error('Method not implemented.'); } get ready(): Promise { throw new Error('Method not implemented.'); } get isDisposed(): boolean { throw new Error('Method not implemented.'); } shutdown(): Promise { throw new Error('Method not implemented.'); } getSpec(): Promise { throw new Error('Method not implemented.'); } sendShellMessage(msg: KernelMessage.IShellMessage, expectReply?: boolean, disposeOnDone?: boolean): Kernel.IFuture { throw new Error('Method not implemented.'); } reconnect(): Promise { throw new Error('Method not implemented.'); } interrupt(): Promise { throw new Error('Method not implemented.'); } restart(): Promise { throw new Error('Method not implemented.'); } requestKernelInfo(): Promise { throw new Error('Method not implemented.'); } requestComplete(content: KernelMessage.ICompleteRequest): Promise { throw new Error('Method not implemented.'); } requestInspect(content: KernelMessage.IInspectRequest): Promise { throw new Error('Method not implemented.'); } requestHistory(content: KernelMessage.IHistoryRequest): Promise { throw new Error('Method not implemented.'); } requestExecute(content: KernelMessage.IExecuteRequest, disposeOnDone?: boolean): Kernel.IFuture { throw new Error('Method not implemented.'); } requestIsComplete(content: KernelMessage.IIsCompleteRequest): Promise { throw new Error('Method not implemented.'); } requestCommInfo(content: KernelMessage.ICommInfoRequest): Promise { throw new Error('Method not implemented.'); } sendInputReply(content: KernelMessage.IInputReply): void { throw new Error('Method not implemented.'); } connectToComm(targetName: string, commId?: string): Kernel.IComm { throw new Error('Method not implemented.'); } registerCommTarget(targetName: string, callback: (comm: Kernel.IComm, msg: KernelMessage.ICommOpenMsg) => void | PromiseLike): void { throw new Error('Method not implemented.'); } removeCommTarget(targetName: string, callback: (comm: Kernel.IComm, msg: KernelMessage.ICommOpenMsg) => void | PromiseLike): void { throw new Error('Method not implemented.'); } registerMessageHook(msgId: string, hook: (msg: KernelMessage.IIOPubMessage) => boolean | PromiseLike): void { throw new Error('Method not implemented.'); } removeMessageHook(msgId: string, hook: (msg: KernelMessage.IIOPubMessage) => boolean | PromiseLike): void { throw new Error('Method not implemented.'); } dispose(): void { throw new Error('Method not implemented.'); } } export class FutureStub implements Kernel.IFuture { get msg(): KernelMessage.IShellMessage { throw new Error('Method not implemented.'); } get done(): Promise { throw new Error('Method not implemented.'); } get isDisposed(): boolean { throw new Error('Method not implemented.'); } get onReply(): (msg: KernelMessage.IShellMessage) => void | PromiseLike { throw new Error('Method not implemented.'); } set onReply(handler: (msg: KernelMessage.IShellMessage) => void | PromiseLike) { throw new Error('Method not implemented.'); } get onStdin(): (msg: KernelMessage.IStdinMessage) => void | PromiseLike { throw new Error('Method not implemented.'); } set onStdin(handler: (msg: KernelMessage.IStdinMessage) => void | PromiseLike) { throw new Error('Method not implemented.'); } get onIOPub(): (msg: KernelMessage.IIOPubMessage) => void | PromiseLike { throw new Error('Method not implemented.'); } set onIOPub(handler: (msg: KernelMessage.IIOPubMessage) => void | PromiseLike) { throw new Error('Method not implemented.'); } registerMessageHook(hook: (msg: KernelMessage.IIOPubMessage) => boolean | PromiseLike): void { throw new Error('Method not implemented.'); } removeMessageHook(hook: (msg: KernelMessage.IIOPubMessage) => boolean | PromiseLike): void { throw new Error('Method not implemented.'); } sendInputReply(content: KernelMessage.IInputReply): void { throw new Error('Method not implemented.'); } dispose(): void { throw new Error('Method not implemented.'); } } export class TestKernel implements azdata.nb.IKernel { constructor( private _isReady = false, private _supportsIntellisense = false, private _matches = ['firstMatch', 'secondMatch', 'thirdMatch'], private _status_override: 'ok' | 'error' = 'ok' ) { } get id(): string { throw new Error('Method not implemented.'); } get name(): string { throw new Error('Method not implemented.'); } get supportsIntellisense(): boolean { return this._supportsIntellisense; } get isReady(): boolean { return this._isReady; } get ready(): Thenable { throw new Error('Method not implemented.'); } get info(): azdata.nb.IInfoReply { throw new Error('Method not implemented.'); } getSpec(): Thenable { throw new Error('Method not implemented.'); } requestExecute(content: azdata.nb.IExecuteRequest, disposeOnDone?: boolean): azdata.nb.IFuture { throw new Error('Method not implemented.'); } requestComplete(content: azdata.nb.ICompleteRequest): Thenable { let msg: azdata.nb.ICompleteReplyMsg = { channel: 'shell', content: { cursor_end: 0, cursor_start: 0, matches: this._matches, metadata: undefined, status: this._status_override }, header: undefined, metadata: undefined, parent_header: undefined, type: undefined }; return Promise.resolve(msg); } interrupt(): Thenable { throw new Error('Method not implemented.'); } restart(): Thenable { throw new Error('Method not implemented.'); } } //#endregion //#region test modelView components class TestComponentBase implements azdata.Component { id: string = ''; updateProperties(properties: { [key: string]: any; }): Thenable { Object.assign(this, properties); return Promise.resolve(); } updateProperty(key: string, value: any): Thenable { throw new Error('Method not implemented'); } updateCssStyles(cssStyles: azdata.CssStyles): Thenable { throw new Error('Method not implemented'); } onValidityChanged: vscode.Event = undefined; valid: boolean = true; validate(): Thenable { return Promise.resolve(true); } focus(): Thenable { return Promise.resolve(); } } export class TestDropdownComponent extends TestComponentBase implements azdata.DropDownComponent { constructor(private onClick: vscode.EventEmitter) { super(); } onValueChanged: vscode.Event = this.onClick.event; } class TestDeclarativeTableComponent extends TestComponentBase implements azdata.DeclarativeTableComponent { constructor(private onClick: vscode.EventEmitter) { super(); } onDataChanged: vscode.Event = this.onClick.event; onRowSelected: vscode.Event = this.onClick.event; setFilter: undefined; data: any[][]; columns: azdata.DeclarativeTableColumn[]; setDataValues: undefined; } class TestButtonComponent extends TestComponentBase implements azdata.ButtonComponent { constructor(private onClick: vscode.EventEmitter) { super(); } onDidClick: vscode.Event = this.onClick.event; } class TestRadioButtonComponent extends TestComponentBase implements azdata.RadioButtonComponent { constructor(private onClick: vscode.EventEmitter, private onChange: vscode.EventEmitter) { super(); } onDidClick: vscode.Event = this.onClick.event; onDidChangeCheckedState: vscode.Event = this.onChange.event; } class TestTextComponent extends TestComponentBase implements azdata.TextComponent { } class TestLoadingComponent extends TestComponentBase implements azdata.LoadingComponent { loading: boolean; component: azdata.Component; } class TestFormContainer extends TestComponentBase implements azdata.FormContainer { items: azdata.Component[] = []; clearItems(): void { } addItems(itemConfigs: azdata.Component[], itemLayout?: azdata.FormItemLayout): void { } addItem(component: azdata.Component, itemLayout?: azdata.FormItemLayout): void { } insertItem(component: azdata.Component, index: number, itemLayout?: azdata.FormItemLayout): void { } removeItem(component: azdata.Component): boolean { return true; } setLayout(layout: azdata.FormLayout): void { } setItemLayout(component: azdata.Component, layout: azdata.FormItemLayout): void { } } class TestDivContainer extends TestComponentBase implements azdata.DivContainer { onDidClick: vscode.Event; items: azdata.Component[] = []; clearItems(): void { } addItems(itemConfigs: azdata.Component[], itemLayout?: azdata.DivItemLayout): void { } addItem(component: azdata.Component, itemLayout?: azdata.DivItemLayout): void { } insertItem(component: azdata.Component, index: number, itemLayout?: azdata.DivItemLayout): void { } removeItem(component: azdata.Component): boolean { return true; } setLayout(layout: azdata.DivLayout): void { } setItemLayout(component: azdata.Component, layout: azdata.DivItemLayout): void { } } class TestFlexContainer extends TestComponentBase implements azdata.FlexContainer { items: azdata.Component[] = []; clearItems(): void { } addItems(itemConfigs: azdata.Component[], itemLayout?: azdata.FlexItemLayout): void { } addItem(component: azdata.Component, itemLayout?: azdata.FlexItemLayout): void { } insertItem(component: azdata.Component, index: number, itemLayout?: azdata.FlexItemLayout): void { } removeItem(component: azdata.Component): boolean { return true; } setLayout(layout: azdata.FlexLayout): void { } setItemLayout(component: azdata.Component, layout: azdata.FlexItemLayout): void { } } class TestComponentBuilder implements azdata.ComponentBuilder { constructor(private _component: T) { } component(): T { return this._component; } withProperties(properties: U): azdata.ComponentBuilder { void this._component.updateProperties(properties); return this; } withValidation(validation: (component: T) => boolean): azdata.ComponentBuilder { return this; } withProps(properties: TPropertyBag): azdata.ComponentBuilder { void this._component.updateProperties(properties); return this; } } class TestLoadingBuilder extends TestComponentBuilder implements azdata.LoadingComponentBuilder { withItem(component: azdata.Component): azdata.LoadingComponentBuilder { this.component().component = component; return this; } } export function createViewContext(): TestContext { let onClick: vscode.EventEmitter = new vscode.EventEmitter(); let onChange: vscode.EventEmitter = new vscode.EventEmitter(); let form: azdata.FormContainer = new TestFormContainer(); let textBuilder: azdata.ComponentBuilder = new TestComponentBuilder(new TestTextComponent()); let buttonBuilder: azdata.ComponentBuilder = new TestComponentBuilder(new TestButtonComponent(onClick)); let radioButtonBuilder: azdata.ComponentBuilder = new TestComponentBuilder(new TestRadioButtonComponent(onClick, onChange)); let declarativeTableBuilder: azdata.ComponentBuilder = new TestComponentBuilder(new TestDeclarativeTableComponent(onClick)); let loadingBuilder: azdata.LoadingComponentBuilder = new TestLoadingBuilder(new TestLoadingComponent()); let dropdownBuilder: azdata.ComponentBuilder = new TestComponentBuilder(new TestDropdownComponent(onClick)); let formBuilder: azdata.FormBuilder = Object.assign({}, { component: () => form, addFormItem: () => { }, insertFormItem: () => { }, removeFormItem: () => true, addFormItems: () => { }, withFormItems: () => formBuilder, withProperties: () => formBuilder, withValidation: () => formBuilder, withItems: () => formBuilder, withLayout: () => formBuilder, withProps: () => formBuilder }); let div: azdata.DivContainer = new TestDivContainer(); let divBuilder: azdata.DivBuilder = Object.assign({}, { component: () => div, addFormItem: () => { }, insertFormItem: () => { }, removeFormItem: () => true, addFormItems: () => { }, withFormItems: () => divBuilder, withProperties: () => divBuilder, withValidation: () => divBuilder, withItems: () => divBuilder, withLayout: () => divBuilder, withProps: () => divBuilder }); let flex: azdata.FlexContainer = new TestFlexContainer(); let flexBuilder: azdata.FlexBuilder = Object.assign({}, { component: () => flex, addFormItem: () => { }, insertFormItem: () => { }, removeFormItem: () => true, addFormItems: () => { }, withFormItems: () => flexBuilder, withProperties: () => flexBuilder, withValidation: () => flexBuilder, withItems: () => flexBuilder, withLayout: () => flexBuilder, withProps: () => flexBuilder }); let view: azdata.ModelView = { onClosed: undefined!, connection: undefined!, serverInfo: undefined!, valid: true, onValidityChanged: undefined!, validate: undefined!, initializeModel: () => { return Promise.resolve(); }, modelBuilder: { radioButton: () => radioButtonBuilder, text: () => textBuilder, button: () => buttonBuilder, dropDown: () => dropdownBuilder, declarativeTable: () => declarativeTableBuilder, formContainer: () => formBuilder, loadingComponent: () => loadingBuilder, divContainer: () => divBuilder, flexContainer: () => flexBuilder } }; return { view: view, onClick: onClick, }; } export interface TestContext { view: azdata.ModelView; onClick: vscode.EventEmitter; } export class TestButton implements azdata.window.Button { label: string; enabled: boolean; hidden: boolean; constructor(private onClickEmitter: vscode.EventEmitter) { } onClick: vscode.Event = this.onClickEmitter.event; } //#endregion