提交 a8b78649 编写于 作者: B Benjamin Pasero

tests for editor actions and fixes for it

上级 466d6549
...@@ -23,6 +23,7 @@ export interface IEditorGroup { ...@@ -23,6 +23,7 @@ export interface IEditorGroup {
getEditors(mru?: boolean): EditorInput[]; getEditors(mru?: boolean): EditorInput[];
openEditor(editor: EditorInput, options?: IEditorOpenOptions): void; openEditor(editor: EditorInput, options?: IEditorOpenOptions): void;
closeEditor(editor: EditorInput): void;
setActive(editor: EditorInput): void; setActive(editor: EditorInput): void;
isActive(editor: EditorInput): boolean; isActive(editor: EditorInput): boolean;
isPreview(editor: EditorInput): boolean; isPreview(editor: EditorInput): boolean;
...@@ -137,7 +138,7 @@ export class EditorGroup implements IEditorGroup { ...@@ -137,7 +138,7 @@ export class EditorGroup implements IEditorGroup {
} }
public isActive(editor: EditorInput): boolean { public isActive(editor: EditorInput): boolean {
return this.active && this.active.matches(editor); return !!this.active && this.active.matches(editor);
} }
public get previewEditor(): EditorInput { public get previewEditor(): EditorInput {
...@@ -145,16 +146,17 @@ export class EditorGroup implements IEditorGroup { ...@@ -145,16 +146,17 @@ export class EditorGroup implements IEditorGroup {
} }
public isPreview(editor: EditorInput): boolean { public isPreview(editor: EditorInput): boolean {
return this.preview && this.preview.matches(editor); return !!this.preview && this.preview.matches(editor);
} }
public openEditor(editor: EditorInput, options?: IEditorOpenOptions): void { public openEditor(editor: EditorInput, options?: IEditorOpenOptions): void {
const index = this.indexOf(editor); const index = this.indexOf(editor);
const indexOfActive = this.indexOf(this.active); const indexOfActive = this.indexOf(this.active);
const indexOfPreview = this.indexOf(this.preview); const indexOfPreview = this.indexOf(this.preview);
let oldPreviewToClose: EditorInput;
const makeActive = options && options.active; const oldPreviewIsActive = this.preview && this.preview.matches(this.activeEditor);
const makeActive = (options && options.active) || !this.activeEditor; // make active if this is the first editor to open
const makePinned = options && options.pinned; const makePinned = options && options.pinned;
// New editor // New editor
...@@ -175,9 +177,9 @@ export class EditorGroup implements IEditorGroup { ...@@ -175,9 +177,9 @@ export class EditorGroup implements IEditorGroup {
} }
} }
// Otherwise replace preview one // Handle preview
else { if (!makePinned) {
oldPreviewToClose = this.preview; this.closeEditor(this.preview);
this.preview = editor; this.preview = editor;
this.splice(indexOfPreview, true, editor); this.splice(indexOfPreview, true, editor);
} }
...@@ -185,13 +187,10 @@ export class EditorGroup implements IEditorGroup { ...@@ -185,13 +187,10 @@ export class EditorGroup implements IEditorGroup {
// Event // Event
this._onEditorOpened.fire(editor); this._onEditorOpened.fire(editor);
// Make active // Handle active
if (makeActive) { if (makeActive || oldPreviewIsActive) {
this.setActive(editor); this.setActive(editor);
} }
// Close old preview editor if any
this.closeEditor(oldPreviewToClose);
} }
// Existing editor // Existing editor
...@@ -309,7 +308,11 @@ export class EditorGroup implements IEditorGroup { ...@@ -309,7 +308,11 @@ export class EditorGroup implements IEditorGroup {
private splice(index: number, del: boolean, editor?: EditorInput): void { private splice(index: number, del: boolean, editor?: EditorInput): void {
// Perform on editors array // Perform on editors array
this.editors.splice(index, del ? 1 : 0, editor); const args:any[] = [index, del];
if (editor) {
args.push(editor);
}
this.editors.splice.apply(this.editors, args);
// Add: make it LRU editor // Add: make it LRU editor
if (!del && editor) { if (!del && editor) {
......
...@@ -7,36 +7,71 @@ ...@@ -7,36 +7,71 @@
import * as assert from 'assert'; import * as assert from 'assert';
import {EditorStacksModel, IEditorStacksModel, IEditorGroup} from 'vs/workbench/common/editor/editorStacksModel'; import {EditorStacksModel, IEditorStacksModel, IEditorGroup} from 'vs/workbench/common/editor/editorStacksModel';
import {EditorInput} from 'vs/workbench/common/editor';
function create(): IEditorStacksModel { function create(): IEditorStacksModel {
return new EditorStacksModel(); return new EditorStacksModel();
} }
interface GroupEvents { interface ModelEvents {
opened: IEditorGroup[]; opened: IEditorGroup[];
activated: IEditorGroup[]; activated: IEditorGroup[];
closed: IEditorGroup[]; closed: IEditorGroup[];
} }
function groupListener(model: IEditorStacksModel): GroupEvents { interface GroupEvents {
const groupEvents = { opened: EditorInput[];
activated: EditorInput[];
closed: EditorInput[];
pinned: EditorInput[];
unpinned: EditorInput[];
}
function modelListener(model: IEditorStacksModel): ModelEvents {
const modelEvents = {
opened: [], opened: [],
activated: [], activated: [],
closed: [] closed: []
}; };
model.onGroupOpened(g => groupEvents.opened.push(g)); model.onGroupOpened(g => modelEvents.opened.push(g));
model.onGroupActivated(g => groupEvents.activated.push(g)); model.onGroupActivated(g => modelEvents.activated.push(g));
model.onGroupClosed(g => groupEvents.closed.push(g)); model.onGroupClosed(g => modelEvents.closed.push(g));
return modelEvents;
}
function groupListener(group: IEditorGroup): GroupEvents {
const groupEvents = {
opened: [],
closed: [],
activated: [],
pinned: [],
unpinned: []
};
group.onEditorOpened(e => groupEvents.opened.push(e));
group.onEditorClosed(e => groupEvents.closed.push(e));
group.onEditorActivated(e => groupEvents.activated.push(e));
group.onEditorPinned(e => groupEvents.pinned.push(e));
group.onEditorUnpinned(e => groupEvents.unpinned.push(e));
return groupEvents; return groupEvents;
} }
class TestEditorInput extends EditorInput {
}
function input(): EditorInput {
return new TestEditorInput();
}
suite('Editor Stacks Model', () => { suite('Editor Stacks Model', () => {
test('Groups', function () { test('Groups', function () {
const model = create(); const model = create();
const events = groupListener(model); const events = modelListener(model);
assert.equal(model.groups.length, 0); assert.equal(model.groups.length, 0);
assert.ok(!model.activeGroup); assert.ok(!model.activeGroup);
...@@ -75,4 +110,136 @@ suite('Editor Stacks Model', () => { ...@@ -75,4 +110,136 @@ suite('Editor Stacks Model', () => {
model.closeGroup(fourth); model.closeGroup(fourth);
assert.equal(second, model.activeGroup); assert.equal(second, model.activeGroup);
}); });
test('Stack - One Editor', function () {
const model = create();
const group = model.openGroup('first');
const events = groupListener(group);
assert.equal(group.getEditors().length, 0);
assert.equal(group.getEditors(true).length, 0);
// Active && Pinned
const input1 = input();
group.openEditor(input1, { active: true, pinned: true });
assert.equal(group.getEditors().length, 1);
assert.equal(group.getEditors(true).length, 1);
assert.equal(group.activeEditor, input1);
assert.equal(group.isActive(input1), true);
assert.equal(group.isPreview(input1), false);
assert.equal(group.isPinned(input1), true);
assert.equal(events.opened[0], input1);
assert.equal(events.activated[0], input1);
group.closeEditor(input1);
assert.equal(group.getEditors().length, 0);
assert.equal(group.getEditors(true).length, 0);
assert.equal(group.activeEditor, void 0);
assert.equal(events.closed[0], input1);
// Active && Preview
const input2 = input();
group.openEditor(input2, { active: true, pinned: false });
assert.equal(group.getEditors().length, 1);
assert.equal(group.getEditors(true).length, 1);
assert.equal(group.activeEditor, input2);
assert.equal(group.isActive(input2), true);
assert.equal(group.isPreview(input2), true);
assert.equal(group.isPinned(input2), false);
assert.equal(events.opened[1], input2);
assert.equal(events.activated[1], input2);
group.closeEditor(input2);
assert.equal(group.getEditors().length, 0);
assert.equal(group.getEditors(true).length, 0);
assert.equal(group.activeEditor, void 0);
assert.equal(events.closed[1], input2);
group.closeEditor(input2);
assert.equal(group.getEditors().length, 0);
assert.equal(group.getEditors(true).length, 0);
assert.equal(group.activeEditor, void 0);
assert.equal(events.closed[1], input2);
// Nonactive && Pinned => gets active because its first editor
const input3 = input();
group.openEditor(input3, { active: false, pinned: true });
assert.equal(group.getEditors().length, 1);
assert.equal(group.getEditors(true).length, 1);
assert.equal(group.activeEditor, input3);
assert.equal(group.isActive(input3), true);
assert.equal(group.isPreview(input3), false);
assert.equal(group.isPinned(input3), true);
assert.equal(events.opened[2], input3);
assert.equal(events.activated[2], input3);
group.closeEditor(input3);
assert.equal(group.getEditors().length, 0);
assert.equal(group.getEditors(true).length, 0);
assert.equal(group.activeEditor, void 0);
assert.equal(events.closed[2], input3);
assert.equal(events.opened[2], input3);
assert.equal(events.activated[2], input3);
group.closeEditor(input3);
assert.equal(group.getEditors().length, 0);
assert.equal(group.getEditors(true).length, 0);
assert.equal(group.activeEditor, void 0);
assert.equal(events.closed[2], input3);
// Nonactive && Preview => gets active because its first editor
const input4 = input();
group.openEditor(input4);
assert.equal(group.getEditors().length, 1);
assert.equal(group.getEditors(true).length, 1);
assert.equal(group.activeEditor, input4);
assert.equal(group.isActive(input4), true);
assert.equal(group.isPreview(input4), true);
assert.equal(group.isPinned(input4), false);
assert.equal(events.opened[3], input4);
assert.equal(events.activated[3], input4);
group.closeEditor(input4);
assert.equal(group.getEditors().length, 0);
assert.equal(group.getEditors(true).length, 0);
assert.equal(group.activeEditor, void 0);
assert.equal(events.closed[3], input4);
});
test('Stack - Multiple Editors - Preview gets overwritten', function () {
const model = create();
const group = model.openGroup('first');
const events = groupListener(group);
const input1 = input();
const input2 = input();
const input3 = input();
// Non active, preview
group.openEditor(input1); // becomes active, preview
group.openEditor(input2); // overwrites preview
group.openEditor(input3); // overwrites preview
assert.equal(group.getEditors().length, 1);
assert.equal(group.getEditors(true).length, 1);
assert.equal(group.activeEditor, input3);
assert.equal(group.isActive(input3), true);
assert.equal(group.isPinned(input3), false);
assert.equal(group.isPreview(input3), true);
assert.equal(events.opened[0], input1);
assert.equal(events.opened[1], input2);
assert.equal(events.opened[2], input3);
assert.equal(events.closed[0], input1);
assert.equal(events.closed[1], input2);
});
}); });
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册