kopia lustrzana https://github.com/c9/core
305 wiersze
12 KiB
JavaScript
305 wiersze
12 KiB
JavaScript
|
/*global describe it before after bar =*/
|
||
|
|
||
|
"use client";
|
||
|
|
||
|
require(["lib/architect/architect", "lib/chai/chai", "/vfs-root"], function (architect, chai, baseProc) {
|
||
|
var expect = chai.expect;
|
||
|
|
||
|
expect.setupArchitectTest([
|
||
|
{
|
||
|
packagePath: "plugins/c9.core/c9",
|
||
|
workspaceId: "johndoe/dev",
|
||
|
startdate: new Date(),
|
||
|
debug: true,
|
||
|
hosted: true,
|
||
|
local: false,
|
||
|
davPrefix: "/"
|
||
|
},
|
||
|
|
||
|
"plugins/c9.core/ext",
|
||
|
"plugins/c9.core/http-xhr",
|
||
|
"plugins/c9.core/util",
|
||
|
"plugins/c9.ide.ui/lib_apf",
|
||
|
{
|
||
|
packagePath: "plugins/c9.core/settings",
|
||
|
testing: true
|
||
|
},
|
||
|
"plugins/c9.core/api.js",
|
||
|
{
|
||
|
packagePath: "plugins/c9.ide.ui/ui",
|
||
|
staticPrefix: "plugins/c9.ide.ui"
|
||
|
},
|
||
|
"plugins/c9.ide.editors/document",
|
||
|
"plugins/c9.ide.editors/undomanager",
|
||
|
"plugins/c9.ide.editors/editors",
|
||
|
"plugins/c9.ide.editors/editor",
|
||
|
"plugins/c9.ide.editors/tabmanager",
|
||
|
"plugins/c9.ide.ui/focus",
|
||
|
"plugins/c9.ide.editors/pane",
|
||
|
"plugins/c9.ide.editors/tab",
|
||
|
"plugins/c9.ide.terminal/terminal",
|
||
|
"plugins/c9.ide.preferences/preferences",
|
||
|
"plugins/c9.ide.ui/forms",
|
||
|
{
|
||
|
packagePath: "plugins/c9.fs/proc",
|
||
|
tmuxName: "cloud9test"
|
||
|
},
|
||
|
"plugins/c9.vfs.client/vfs_client",
|
||
|
"plugins/c9.vfs.client/endpoint",
|
||
|
"plugins/c9.ide.auth/auth",
|
||
|
{
|
||
|
packagePath: "plugins/c9.fs/fs",
|
||
|
baseProc: baseProc
|
||
|
},
|
||
|
|
||
|
// Mock plugins
|
||
|
{
|
||
|
consumes: ["apf", "ui", "Plugin"],
|
||
|
provides: [
|
||
|
"commands", "menus", "commands", "layout", "watcher",
|
||
|
"save", "anims", "clipboard", "dialog.alert", "auth.bootstrap",
|
||
|
"info", "dialog.error"
|
||
|
],
|
||
|
setup: expect.html.mocked
|
||
|
},
|
||
|
{
|
||
|
consumes: ["tabManager", "proc", "terminal"],
|
||
|
provides: [],
|
||
|
setup: main
|
||
|
}
|
||
|
], architect);
|
||
|
|
||
|
function main(options, imports, register) {
|
||
|
var tabs = imports.tabManager;
|
||
|
var proc = imports.proc;
|
||
|
|
||
|
expect.html.setConstructor(function(tab) {
|
||
|
if (typeof tab == "object")
|
||
|
return tab.pane.aml.getPage("editor::" + tab.editorType).$ext;
|
||
|
});
|
||
|
|
||
|
describe('terminal', function() {
|
||
|
before(function(done) {
|
||
|
apf.config.setProperty("allow-select", false);
|
||
|
apf.config.setProperty("allow-blur", false);
|
||
|
|
||
|
bar.$ext.style.background = "rgba(220, 220, 220, 0.93)";
|
||
|
bar.$ext.style.position = "fixed";
|
||
|
bar.$ext.style.left = "20px";
|
||
|
bar.$ext.style.right = "20px";
|
||
|
bar.$ext.style.bottom = "20px";
|
||
|
bar.$ext.style.height = "33%";
|
||
|
|
||
|
document.body.style.marginBottom = "33%";
|
||
|
|
||
|
proc.execFile("~/.c9/bin/tmux", { args: ["-L", "cloud9test", "kill-server"] }, function(err) {
|
||
|
tabs.once("ready", function(){
|
||
|
tabs.getPanes()[0].focus();
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("open", function(){
|
||
|
this.timeout(15000);
|
||
|
|
||
|
var sessId;
|
||
|
it('should open a pane with just an editor', function(done) {
|
||
|
tabs.openEditor("terminal", function(err, tab) {
|
||
|
expect(tabs.getTabs()).length(1);
|
||
|
|
||
|
var doc = tab.document;
|
||
|
doc.on("setTitle", function c1(){
|
||
|
expect(doc.title)
|
||
|
.match(new RegExp("^bash - "));
|
||
|
|
||
|
sessId = doc.getSession().id;
|
||
|
|
||
|
doc.off("setTitle", c1);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
// @todo Test mouse
|
||
|
// @todo Test menu
|
||
|
|
||
|
it('should reconnect when the connection has been lost', function(done) {
|
||
|
var doc = tabs.focussedTab.document;
|
||
|
var session = doc.getSession();
|
||
|
|
||
|
session.once("connected", function(){
|
||
|
doc.once("setTitle", function(){
|
||
|
expect(doc.title).to.match(/^bash - /);
|
||
|
expect(session.id).to.equal(sessId);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// Kill connection
|
||
|
session.pty.kill();
|
||
|
});
|
||
|
|
||
|
it('should reconnect when the session has been lost', function(done) {
|
||
|
var doc = tabs.focussedTab.document;
|
||
|
var session = doc.getSession();
|
||
|
|
||
|
proc.execFile("tmux", {
|
||
|
args: ["kill-session", "-t", session.id]
|
||
|
}, function(err) {
|
||
|
// Ignore errors for now
|
||
|
if (err)
|
||
|
throw err.message;
|
||
|
});
|
||
|
|
||
|
session.on("connected", function c0(){
|
||
|
doc.on("setTitle", function c1(){
|
||
|
expect(session.id).to.not.equal(sessId);
|
||
|
doc.off("setTitle", c1);
|
||
|
done();
|
||
|
});
|
||
|
session.off("connected", c0);
|
||
|
})
|
||
|
});
|
||
|
|
||
|
it('should handle multiple terminals in the same pane', function(done) {
|
||
|
tabs.openEditor("terminal", function(err, tab) {
|
||
|
expect(tabs.getTabs()).length(2);
|
||
|
|
||
|
tab.activate();
|
||
|
|
||
|
var doc = tab.document;
|
||
|
doc.on("setTitle", function c1(){
|
||
|
expect(doc.title)
|
||
|
.match(new RegExp("^bash - "));
|
||
|
|
||
|
doc.off("setTitle", c1);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe("clear(), getState() and setState()", function(){
|
||
|
this.timeout(10000);
|
||
|
|
||
|
var state, info = {};
|
||
|
before(function(done) {
|
||
|
tabs.getTabs()[0].activate();
|
||
|
tabs.focussedTab.editor.write("ls -l\r");
|
||
|
setTimeout(done, 5000);
|
||
|
})
|
||
|
|
||
|
it('should retrieve the state', function(done) {
|
||
|
state = tabs.getState();
|
||
|
info.pages = tabs.getTabs().map(function(tab) {
|
||
|
return tab.path || tab.id;
|
||
|
});
|
||
|
done();
|
||
|
});
|
||
|
it('should clear all tabs and pages', function(done) {
|
||
|
tabs.getPanes()[0];
|
||
|
var pages = tabs.getTabs();
|
||
|
pages.forEach(function(tab) {
|
||
|
tab.document.getSession().disregard();
|
||
|
})
|
||
|
tabs.clear(true, true); //Soft clear, not unloading the pages
|
||
|
expect(tabs.getTabs(), "pages").length(0);
|
||
|
expect(tabs.getPanes(), "tabManager").length(0);
|
||
|
//expect(pane.getTabs(), "aml").length(0);
|
||
|
done();
|
||
|
});
|
||
|
it('should restore the state', function(done) {
|
||
|
tabs.setState(state, false, function(err) {
|
||
|
if (err) throw err.message;
|
||
|
});
|
||
|
var l = info.pages.length;
|
||
|
expect(tabs.getTabs()).length(l);
|
||
|
expect(tabs.getPanes()[0].getTabs()).length(l);
|
||
|
expect(tabs.focussedTab.pane.getTabs()).length(l);
|
||
|
|
||
|
expect(tabs.getTabs().map(function(tab) {
|
||
|
return tab.path || tab.id;
|
||
|
})).to.deep.equal(info.pages);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
describe("split(), kill-server, pane.unload()", function(){
|
||
|
this.timeout(30000);
|
||
|
it('should split a pane horizontally, making the existing pane the left one', function(done) {
|
||
|
var pane = tabs.focussedTab.pane;
|
||
|
var righttab = pane.hsplit(true);
|
||
|
tabs.focussedTab.attachTo(righttab);
|
||
|
|
||
|
setTimeout(function(){
|
||
|
done();
|
||
|
}, 2000);
|
||
|
});
|
||
|
if (!onload.remain) {
|
||
|
it('should reconnect both terminals when doing kill-server', function(done) {
|
||
|
var count = 0;
|
||
|
tabs.getTabs().forEach(function(tab) {
|
||
|
var session = tab.document.getSession();
|
||
|
session.on("connected", function c0(){
|
||
|
if (++count == 2)
|
||
|
done();
|
||
|
|
||
|
session.off("connected", c0);
|
||
|
});
|
||
|
})
|
||
|
|
||
|
tabs.focussedTab.editor.write(String.fromCharCode(2) + ":kill-server\r");
|
||
|
});
|
||
|
}
|
||
|
it('should remove the left pane from a horizontal split', function(done) {
|
||
|
var pane = tabs.getPanes()[0];
|
||
|
var tab = tabs.getPanes()[1].getTab();
|
||
|
pane.unload();
|
||
|
expect(tabs.getPanes()).length(1);
|
||
|
expect(tabs.getTabs()).length(2);
|
||
|
tabs.focusTab(tab);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("pageUnload()", function(){
|
||
|
this.timeout(10000)
|
||
|
|
||
|
it('should terminate tmux session when tab is unloaded', function(done) {
|
||
|
var doc = tabs.focussedTab.document;
|
||
|
var session = doc.getSession();
|
||
|
var id = session.id;
|
||
|
|
||
|
tabs.focussedTab.unload();
|
||
|
|
||
|
setTimeout(function(){
|
||
|
proc.execFile("tmux", {
|
||
|
args: ["list-sessions"]
|
||
|
}, function(err, stdout, stderr) {
|
||
|
// Ignore errors for now
|
||
|
if (err)
|
||
|
throw err.message;
|
||
|
|
||
|
expect(id).is.ok
|
||
|
expect(stdout.indexOf(id) > -1).is.not.ok;
|
||
|
done();
|
||
|
});
|
||
|
}, 3000);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// @todo test split api and menu
|
||
|
|
||
|
if (!onload.remain) {
|
||
|
after(function(done) {
|
||
|
tabs.unload();
|
||
|
bar.destroy(true, true);
|
||
|
|
||
|
document.body.style.marginBottom = "";
|
||
|
done();
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
onload && onload();
|
||
|
}
|
||
|
});
|