1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
import { VDomModel, VDomRenderer } from '@jupyterlab/ui-components';
import { framePromise } from '@jupyterlab/testing';
import { Widget } from '@lumino/widgets';
import * as React from 'react';
class TestModel extends VDomModel {
get value(): string {
return this._value;
}
set value(newValue: string) {
this._value = newValue;
this.stateChanged.emit(void 0);
}
private _value = '';
}
class TestWidget extends VDomRenderer<TestModel> {
protected render(): React.ReactElement<any> {
return React.createElement('span', null, this.model.value);
}
}
class TestWidgetNoModel extends VDomRenderer {
protected render(): React.ReactElement<any> {
return React.createElement('span', null, 'No model!');
}
}
describe('@jupyterlab/ui-components', () => {
describe('VDomModel', () => {
describe('#constructor()', () => {
it('should create a VDomModel', () => {
const model = new VDomModel();
expect(model).toBeInstanceOf(VDomModel);
});
it('should create a TestModel', () => {
const model = new TestModel();
expect(model).toBeInstanceOf(TestModel);
});
it('should be properly disposed', () => {
const model = new TestModel();
model.dispose();
expect(model.isDisposed).toBe(true);
});
});
describe('#stateChanged()', () => {
it('should fire the stateChanged signal on a change', () => {
const model = new TestModel();
let changed = false;
model.stateChanged.connect(() => {
changed = true;
});
model.value = 'newvalue';
expect(changed).toBe(true);
});
});
});
describe('VDomRenderer', () => {
describe('#constructor()', () => {
it('should create a TestWidget', () => {
const widget = new TestWidget(new TestModel());
expect(widget).toBeInstanceOf(TestWidget);
});
it('should be properly disposed', () => {
const widget = new TestWidget(new TestModel());
widget.dispose();
expect(widget.isDisposed).toBe(true);
});
});
describe('#modelChanged()', () => {
it('should fire the stateChanged signal on a change', async () => {
const model = new TestModel();
const widget = new TestWidget(new TestModel());
let changed = false;
widget.modelChanged.connect(() => {
changed = true;
});
widget.model = model;
expect(changed).toBe(true);
});
});
describe('#render()', () => {
it('should render the contents after a model change', async () => {
const widget = new TestWidget(new TestModel());
const model = new TestModel();
Widget.attach(widget, document.body);
widget.model = model;
model.value = 'foo';
await framePromise();
await widget.renderPromise;
await framePromise();
const span = widget.node.firstChild as HTMLElement;
expect(span.textContent).toBe('foo');
});
});
describe('#noModel()', () => {
it('should work with a null model', async () => {
const widget = new TestWidgetNoModel();
Widget.attach(widget, document.body);
await framePromise();
await widget.renderPromise;
const span = widget.node.firstChild as HTMLElement;
expect(span.textContent).toBe('No model!');
});
});
});
});
|