// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.collide.client.code.autocomplete.codegraph;
import static com.google.collide.client.code.autocomplete.TestUtils.CTRL_SPACE;
import static com.google.collide.codemirror2.TokenType.NULL;
import com.google.collide.client.code.autocomplete.AbstractTrie;
import com.google.collide.client.code.autocomplete.AutocompleteProposal;
import com.google.collide.client.code.autocomplete.AutocompleteProposals.Context;
import com.google.collide.client.code.autocomplete.AutocompleteProposals.ProposalWithContext;
import com.google.collide.client.code.autocomplete.AutocompleteResult;
import com.google.collide.client.code.autocomplete.DefaultAutocompleteResult;
import com.google.collide.client.code.autocomplete.MockAutocompleterEnvironment;
import com.google.collide.client.code.autocomplete.PrefixIndex;
import com.google.collide.client.code.autocomplete.TestUtils;
import com.google.collide.client.documentparser.DocumentParser;
import com.google.collide.client.documentparser.ParseResult;
import com.google.collide.client.editor.selection.SelectionModel;
import com.google.collide.client.testutil.SynchronousTestCase;
import com.google.collide.client.util.PathUtil;
import com.google.collide.client.util.collections.SkipListStringBag;
import com.google.collide.codemirror2.State;
import com.google.collide.codemirror2.SyntaxType;
import com.google.collide.codemirror2.Token;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.json.shared.JsonStringSet;
import com.google.collide.shared.util.JsonCollections;
/**
* Tests for JavaScript autocompletion.
*
*/
public class CodeGraphAutocompleterTest extends SynchronousTestCase {
/**
* The simplest completion context implementation.
*/
static class MockProposalBuilder extends ProposalBuilder<State> {
@Override
public CompletionContext<State> buildContext(
SelectionModel selection, DocumentParser parser) {
JsonArray<Token> tokens = JsonCollections.createArray();
State state = TestUtils.createMockState();
tokens.add(new Token(null, NULL, ""));
ParseResult<State> parseResult = new ParseResult<State>(tokens, state) {};
return buildContext(
new ParseUtils.ExtendedParseResult<State>(parseResult, ParseUtils.Context.IN_CODE));
}
public MockProposalBuilder() {
super(State.class);
}
@Override
protected void addShortcutsTo(CompletionContext<State> context, JsonStringSet prefixes) {
}
@Override
protected JsonArray<String> getLocalVariables(ParseResult<State> stateParseResult) {
return JsonCollections.createArray();
}
@Override
protected PrefixIndex<TemplateProposal> getTemplatesIndex() {
return new AbstractTrie<TemplateProposal>();
}
@Override
protected boolean checkIsThisPrefix(String prefix) {
return "zis.".equals(prefix);
}
}
private PathUtil path;
private MockAutocompleterEnvironment helper;
private CodeGraphAutocompleter autocompleter;
@Override
public String getModuleName() {
return "com.google.collide.client.TestCode";
}
@Override
public void gwtSetUp() throws Exception {
super.gwtSetUp();
path = new PathUtil("/test.none");
helper = new MockAutocompleterEnvironment();
SkipListStringBag localPrefixIndexStorage = new SkipListStringBag();
LimitedContextFilePrefixIndex contextFilePrefixIndex = new LimitedContextFilePrefixIndex(
10, localPrefixIndexStorage);
autocompleter = new CodeGraphAutocompleter(SyntaxType.JS, new MockProposalBuilder(),
helper.cubeClient, contextFilePrefixIndex, new ExplicitAutocompleter());
helper.specificAutocompleter = autocompleter;
}
public void testFullFunctionCompletion() {
helper.setup(path, "get", 0, 3, false);
autocompleter.findAutocompletions(helper.editor.getSelection(), CTRL_SPACE);
AutocompleteProposal functionProposal = new CodeGraphProposal("getFoo",
path, true);
AutocompleteResult commonResult = autocompleter.computeAutocompletionResult(
new ProposalWithContext(SyntaxType.NONE, functionProposal, new Context("get")));
assertTrue("result type", commonResult instanceof DefaultAutocompleteResult);
DefaultAutocompleteResult result = (DefaultAutocompleteResult) commonResult;
assertEquals("jump length", 7, result.getJumpLength());
assertEquals("autocompletion text", "getFoo()", result.getAutocompletionText());
}
/*
* TODO: Write test that tests proposals update when updater
* fires notification
*/
public void testFullPropertyCompletion() {
helper.setup(path, "g", 0, 1, false);
autocompleter.findAutocompletions(helper.editor.getSelection(), CTRL_SPACE);
AutocompleteProposal propertyProposal = new CodeGraphProposal("gender",
path, false);
AutocompleteResult commonResult = autocompleter.computeAutocompletionResult(
new ProposalWithContext(SyntaxType.NONE, propertyProposal, new Context("get")));
assertTrue("result type", commonResult instanceof DefaultAutocompleteResult);
DefaultAutocompleteResult result = (DefaultAutocompleteResult) commonResult;
assertEquals("jump length", 6, result.getJumpLength());
assertEquals("autocompletion text", "gender", result.getAutocompletionText());
}
public void testTemplateProcessing() {
helper.setup(path, "", 0, 0, false);
autocompleter.findAutocompletions(helper.editor.getSelection(), CTRL_SPACE);
AutocompleteProposal proposal = new TemplateProposal("simple", "simple (%c) <%i%n>");
AutocompleteResult commonResult = autocompleter.computeAutocompletionResult(
new ProposalWithContext(SyntaxType.NONE, proposal, new Context("")));
assertTrue("result type", commonResult instanceof DefaultAutocompleteResult);
DefaultAutocompleteResult result = (DefaultAutocompleteResult) commonResult;
assertEquals("autocompletion text", "simple () <\n \n>", result.getAutocompletionText());
assertEquals("jump length", 8, result.getJumpLength());
assertEquals("backspace count", 0, result.getBackspaceCount());
}
}