c9-core/plugins/c9.ide.language.core/complete_test.js

729 wiersze
37 KiB
JavaScript

/*global describe it before after beforeEach onload*/
"use client";
var base = require("plugins/c9.ide.language/test_base");
base.setup(function(err, imports, helpers) {
if (err) throw err;
var language = imports.language;
var chai = require("lib/chai/chai");
var expect = chai.expect;
var assert = require("assert");
var tabs = imports.tabManager;
var complete = imports["language.complete"];
var afterNoCompleteOpen = helpers.afterNoCompleteOpen;
var afterCompleteDocOpen = helpers.afterCompleteDocOpen;
var afterCompleteOpen = helpers.afterCompleteOpen;
var isCompleterOpen = helpers.isCompleterOpen;
var getCompletionCalls = helpers.getCompletionCalls;
describe("analysis", function() {
var jsTab;
var jsSession;
// Setup
beforeEach(function(done) {
tabs.getTabs().forEach(function(tab) {
tab.close(true);
});
// tab.close() isn't quite synchronous, wait for it :(
complete.closeCompletionBox();
setTimeout(function() {
tabs.openFile("/language.js", function(err, tab) {
if (err) return done(err);
jsTab = tab;
jsSession = jsTab.document.getSession().session;
expect(jsSession).to.not.equal(null);
setTimeout(function() {
complete.closeCompletionBox();
done();
});
});
}, 0);
});
it('shows a word completer popup on keypress', function(done) {
jsSession.setValue("conny; con");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("n");
afterCompleteOpen(function(el) {
expect.html(el).text(/conny/);
done();
});
});
it('shows a word completer popup for things in comments', function(done) {
jsSession.setValue("// conny\nco");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("n");
afterCompleteOpen(function(el) {
expect.html(el).text(/conny/);
done();
});
});
it('shows an inference completer popup on keypress', function(done) {
jsSession.setValue("console.");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("l");
afterCompleteOpen(function(el) {
expect.html(el).text(/log\(/);
done();
});
});
it('always does dot completion', function(done) {
language.setContinuousCompletionEnabled(false);
jsSession.setValue("console");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput(".");
afterCompleteOpen(function(el) {
expect.html(el).text(/log\(/);
language.setContinuousCompletionEnabled(true);
done();
});
});
it('shows a documentation popup in completion', function(done) {
jsSession.setValue("console.");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("l");
afterCompleteDocOpen(function(el) {
expect.html(el).text(/Outputs a message/);
done();
});
});
it('shows a word completer in an immediate tab', function(done) {
tabs.open(
{
active: true,
editorType: "immediate"
},
function(err, tab) {
if (err) return done(err);
// We get a tab, but it's not done yet, so we wait
setTimeout(function() {
expect(!isCompleterOpen());
tab.editor.ace.onTextInput("conny con");
expect(!isCompleterOpen());
tab.editor.ace.onTextInput("n");
afterCompleteOpen(function(el) {
expect.html(el).text(/conny/);
done();
});
});
}
);
});
it('shows an immediate completer in an immediate tab', function(done) {
tabs.open(
{
active: true,
editorType: "immediate"
},
function(err, tab) {
if (err) return done(err);
// We get a tab, but it's not done yet, so we wait
setTimeout(function() {
tab.editor.ace.onTextInput("window.a");
tab.editor.ace.onTextInput("p");
afterCompleteOpen(function(el) {
expect.html(el).text(/applicationCache/);
done();
});
});
}
);
});
it("doesn't show a word completer when there are contextual completions", function(done) {
jsSession.setValue("// logaritm\nconsole.");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("l");
afterCompleteOpen(function(el) {
assert(!el.textContent.match(/logarithm/));
done();
});
});
it("completes with parentheses insertion", function(done) {
jsSession.setValue("// logaritm\nconsole.");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("l");
afterCompleteOpen(function(el) {
jsTab.editor.ace.keyBinding.onCommandKey({ preventDefault: function() {} }, 0, 13);
setTimeout(function() {
assert(jsSession.getValue().match(/console.log\(\)/));
done();
});
});
});
it("completes local functions with parentheses insertion", function(done) {
jsSession.setValue('function foobar() {}\nfoo');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("b");
afterCompleteOpen(function(el) {
jsTab.editor.ace.keyBinding.onCommandKey({ preventDefault: function() {} }, 0, 13);
setTimeout(function() {
assert(jsSession.getValue().match(/foobar\(\)/));
done();
});
});
});
it("completes without parentheses insertion in strings", function(done) {
jsSession.setValue('function foobar() {}\n\"foo');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("b");
afterCompleteOpen(function(el) {
jsTab.editor.ace.keyBinding.onCommandKey({ preventDefault: function() {} }, 0, 13);
setTimeout(function() {
assert(jsSession.getValue().match(/"foobar/));
assert(!jsSession.getValue().match(/"foobar\(\)/));
done();
});
});
});
it("completes following local dependencies", function(done) {
jsSession.setValue('var test2 = require\("./test2.js");\ntest2.');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("h");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/hoi/));
done();
});
});
it("completes following local with absolute paths", function(done) {
jsSession.setValue('var ext = require\("plugins/c9.dummy/dep");\next.');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("e");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/export3/));
assert(el.textContent.match(/export4/));
done();
});
});
it("completes following local dependencies with absolute paths and common js style exports", function(done) {
jsSession.setValue('var ext = require\("plugins/c9.dummy/dep-define");\next.');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("e");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/export1/));
assert(el.textContent.match(/export2/));
done();
});
});
it("doesn't show default browser properties like onabort for global completions", function(done) {
jsSession.setValue('// function onlyShowMe() {}; \no');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("n");
afterCompleteOpen(function(el) {
assert(!el.textContent.match(/onabort/));
done();
});
});
it("shows default browser properties like onabort when 3 characters were typed", function(done) {
jsSession.setValue('// function onlyShowMeAndMore() {};\non');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("a");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/onabort/));
done();
});
});
it("shows no self-completion for 'var bre'", function(done) {
jsSession.setValue('var ');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("bre");
afterCompleteOpen(function(el) {
assert(!el.textContent.match(/bre\b/));
assert(el.textContent.match(/break/));
done();
});
});
it("shows word completion for 'var b'", function(done) {
jsSession.setValue('// blie\nvar ');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("b");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/blie/));
done();
});
});
it("shows word completion for 'var bre'", function(done) {
jsSession.setValue('// breedbeeld\nvar ');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("bre");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/breedbeeld/));
done();
});
});
it("shows no self-completion for 'function blie'", function(done) {
jsSession.setValue('function bli');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("e");
afterNoCompleteOpen(done);
});
it("shows no completion for 'function blie(param'", function(done) {
jsSession.setValue('function blie(para');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("m");
afterNoCompleteOpen(done);
});
it.skip("shows word completion for 'function blie(param'", function(done) {
jsSession.setValue('function parametric() {}\nfunction blie(para');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("m");
afterCompleteOpen(function(el) {
assert(!el.textContent.match(/parapara/));
assert(el.textContent.match(/parametric/));
done();
});
});
it("shows no self-completion for 'x={ prop'", function(done) {
jsSession.setValue('x={ pro');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("p");
afterNoCompleteOpen(done);
});
it("shows no function completion for 'x={ prop: 2 }'", function(done) {
jsSession.setValue('function propAccess() {}\nx={ pro: 2 }');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 7 }, end: { row: 1, column: 7 }});
jsTab.editor.ace.onTextInput("p");
afterCompleteOpen(function(el) {
assert(!el.textContent.match(/propAccess\(\)/));
assert(el.textContent.match(/propAccess/));
done();
});
});
it("shows completion for '{ prop: fo'", function(done) {
jsSession.setValue('function foo() {}\n{ prop: f');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 2, column: 0 }, end: { row: 2, column: 0 }});
jsTab.editor.ace.onTextInput("o");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/foo\(\)/));
done();
});
});
it("extracts types from comments", function(done) {
jsSession.setValue('/**\ndocs be here\n@param {String} text\n*/\nfunction foo(text) {}\nf');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 10, column: 0 }, end: { row: 10, column: 0 }});
jsTab.editor.ace.onTextInput("o");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/foo\(text\)/));
afterCompleteDocOpen(function(el) {
assert(el.textContent.match(/string/i));
assert(el.textContent.match(/docs/i));
done();
});
});
});
it("caches across expression prefixes", function(done) {
jsSession.setValue("_collin; _c");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("o");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
complete.closeCompletionBox();
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("rry _co");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
// Normally typing "_corry _c" would show "_corry" in the completion,
// but since JavaScript is supposed to have a getCacheCompletionRegex set,
// a cached results should be used that doesn't have "_corry" yet
assert(!el.textContent.match(/_corry/));
assert(el.textContent.match(/_collin/));
done();
});
});
});
it("caches across expression prefixes, including 'if(' and 'if ('", function(done) {
jsSession.setValue("b_collin; b_c");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("o");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
complete.closeCompletionBox();
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("rry if(if (b_co");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
assert(el.textContent.match(/b_corry/)); // local_completer secretly ran a second time
assert(el.textContent.match(/b_collin/));
done();
});
});
});
it("doesn't cache across expression prefixes in assigments", function(done) {
jsSession.setValue("_collin; _c");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("o");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
complete.closeCompletionBox();
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("rry=_co");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 2);
assert(el.textContent.match(/_corry/));
assert(el.textContent.match(/_collin/));
done();
});
});
});
it("doesn't cache with expression prefixes based on function names or params", function(done) {
jsSession.setValue("ffarg; function ");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("ff");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
assert(el.textContent.match(/ffarg/));
complete.closeCompletionBox();
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("oo(ff");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 2);
// cache got cleared so we have farg here now
assert(el.textContent.match(/ffoo/));
assert(el.textContent.match(/ffarg/));
complete.closeCompletionBox();
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("ort) ff");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 3);
// cache got cleared so we have fort here now
assert(el.textContent.match(/ffoo/));
assert(el.textContent.match(/ffort/));
assert(el.textContent.match(/ffarg/));
done();
});
});
});
});
it("doesn't do prefix-caching outside of a function context", function(done) {
jsSession.setValue("function foo() { ");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("f");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
complete.closeCompletionBox();
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("} f");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 2);
done();
});
});
});
it("doesn't do prefix-caching after property access", function(done) {
jsSession.setValue("console.l");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("o");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
complete.closeCompletionBox();
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("g c");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/console/), el.textContent);
assert.equal(getCompletionCalls(), 2, "Should refetch after property access: " + getCompletionCalls());
done();
});
});
});
it.skip('predicts console.log() when typing just consol', function(done) {
jsSession.setValue("conso");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("l");
imports.worker.once("complete_predict_called", function() {
assert.equal(getCompletionCalls(), 1);
afterCompleteOpen(function retry(el) {
assert.equal(getCompletionCalls(), 1);
if (!el.textContent.match(/log/))
return afterCompleteOpen(retry);
done();
});
});
});
it('shows the current identifier as the top result', function(done) {
jsSession.setValue("concat; conso; cons");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("o");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
assert(el.textContent.match(/conso(?!l).*console/));
done();
});
});
it('shows the current identifier as the top result, and removes it as you keep typing', function(done) {
jsSession.setValue("2; concat; conso; cons");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("o");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
assert(el.textContent.match(/conso(?!l).*console/));
complete.closeCompletionBox();
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("l");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
assert(!el.textContent.match(/conso(?!l)/));
assert(el.textContent.match(/console/));
done();
});
});
});
it("doesn't assume undeclared vars are functions", function(done) {
jsSession.setValue('window[imUndefined] = function(json) {};\n\
var unassigned;\n\
');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 10, column: 0 }, end: { row: 10, column: 0 }});
jsTab.editor.ace.onTextInput("u");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/unassigned/));
assert(!el.textContent.match(/unassigned\(/));
done();
});
});
it("doesn't assume arrays are optional", function(done) {
jsSession.setValue('function myFun(arr){}\nvar a = []\nmyFun(a)\nmyF');
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 10, column: 0 }, end: { row: 10, column: 0 }});
jsTab.editor.ace.onTextInput("u");
afterCompleteDocOpen(function(el) {
assert(el.textContent.match(/myFun\(arr.*Array/));
done();
});
});
it.skip("completes php variables in short php escapes", function(done) {
tabs.openFile("/test_broken.php", function(err, _tab) {
if (err) return done(err);
var tab = _tab;
tabs.focusTab(tab);
var session = tab.document.getSession().session;
session.setValue("<?php $foo = 1; ?>");
tab.editor.ace.selection.setSelectionRange({ start: { row: 0, column: 16 }, end: { row: 0, column: 16 }});
tab.editor.ace.onTextInput("$");
afterCompleteOpen(function(el) {
complete.closeCompletionBox();
tab.editor.ace.onTextInput("f");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/foo/));
done();
});
});
});
});
it.skip("completes php variables in long files", function(done) {
tabs.openFile("/test_broken.php", function(err, _tab) {
if (err) return done(err);
var tab = _tab;
tabs.focusTab(tab);
var session = tab.document.getSession().session;
var value = "<?php\n\n";
for (var i = 0; i < 1000; i++) {
value += "$foo_" + i + " = 42;\n";
}
value = value + "?>";
session.setValue(value);
tab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
tab.editor.ace.onTextInput("$");
afterCompleteOpen(function(el) {
complete.closeCompletionBox();
tab.editor.ace.onTextInput("foo_99");
afterCompleteOpen(function(el) {
assert(el.textContent.match(/foo_991/));
done();
});
});
});
});
it('starts predicting a completion immediately after an assignment', function(done) {
// We expect this behavior as infer_completer's predictNextCompletion()
// tells worker we need completion here.
jsSession.setValue("foo ");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("=");
imports.testHandler.once("complete_called", function() {
assert.equal(getCompletionCalls(), 1);
jsTab.editor.ace.onTextInput(" ");
// Wait and see if this triggers anything
setTimeout(function() {
jsTab.editor.ace.onTextInput("f");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
assert(el.textContent.match(/foo/));
done();
});
}, 5);
});
});
it.skip('just invokes completion once for "v1 + 1 == v2 + v"', function(done) {
jsSession.setValue("var v1; ");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("v");
afterCompleteOpen(function(el) {
complete.closeCompletionBox();
jsTab.editor.ace.onTextInput("1");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("+");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("1");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("=");
jsTab.editor.ace.onTextInput("=");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("v");
afterCompleteOpen(function(el) {
complete.closeCompletionBox();
jsTab.editor.ace.onTextInput("2");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("+");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("v");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
done();
});
});
});
});
it.skip('just invokes completion once for "x1 + 1 == x2 + x", with some timeouts', function(done) {
jsSession.setValue("var x1; ");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("x");
afterCompleteOpen(function(el) {
jsTab.editor.ace.onTextInput("1");
jsTab.editor.ace.onTextInput(" ");
// Allow prediction to be triggered
setTimeout(function() {
jsTab.editor.ace.onTextInput("+");
// Allow prediction to be triggered
setTimeout(function() {
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("1");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("=");
jsTab.editor.ace.onTextInput("=");
// Allow prediction to be triggered
setTimeout(function() {
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("x");
afterCompleteOpen(function(el) {
complete.closeCompletionBox();
jsTab.editor.ace.onTextInput("2");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("+");
jsTab.editor.ace.onTextInput(" ");
jsTab.editor.ace.onTextInput("x");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 1);
done();
});
});
}, 5);
}, 5);
}, 5);
});
});
it('calls completion twice for "var y; ...", "var v; ..."', function(done) {
jsSession.setValue("var y1; ");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("y");
afterCompleteOpen(function(el) {
complete.closeCompletionBox();
jsSession.setValue("var v1; ");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("v");
afterCompleteOpen(function(el) {
assert.equal(getCompletionCalls(), 2);
done();
});
});
});
it("doesn't start predicting completion immediately after a newline", function(done) {
// We expect this behavior as infer_completer's predictNextCompletion()
// tells worker we need completion here.
jsSession.setValue("var foo;");
jsTab.editor.ace.selection.setSelectionRange({ start: { row: 1, column: 0 }, end: { row: 1, column: 0 }});
jsTab.editor.ace.onTextInput("\n");
setTimeout(function() {
jsTab.editor.ace.onTextInput("\nf");
imports.testHandler.once("complete_called", function() {
assert.equal(getCompletionCalls(), 1);
done();
});
}, 50);
});
it("completes python", function(done) {
tabs.openFile("/python/test_user.py", function(err, _tab) {
if (err) return done(err);
var tab = _tab;
tabs.focusTab(tab);
var session = tab.document.getSession().session;
session.setValue("import os; os");
tab.editor.ace.selection.setSelectionRange({ start: { row: 0, column: 16 }, end: { row: 0, column: 16 }});
imports.worker.once("python_completer_ready", function() {
tab.editor.ace.onTextInput(".");
afterCompleteOpen(function(el) {
complete.closeCompletionBox();
assert(el.textContent.match(/abort/));
done();
});
});
});
});
});
});