// 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.codemirror; import static com.google.collide.client.code.autocomplete.TestUtils.CTRL_SPACE; import com.google.collide.client.code.autocomplete.AutocompleteProposals; import com.google.collide.client.code.autocomplete.MockAutocompleterEnvironment; import com.google.collide.client.code.autocomplete.codegraph.CompletionContext; import com.google.collide.client.code.autocomplete.codegraph.py.PyProposalBuilder; import com.google.collide.client.testutil.CodeMirrorTestCase; import com.google.collide.client.util.PathUtil; import com.google.collide.codemirror2.PyState; import com.google.collide.codemirror2.Token; import com.google.collide.codemirror2.TokenType; import com.google.collide.json.shared.JsonArray; /** * Test for PY autocompletion cases, when codemirror parser is used. * */ public class PyCodemirrorTest extends CodeMirrorTestCase { @Override public String getModuleName() { return "com.google.collide.client.TestCode"; } public void testNoProposalsInCommentsAndStrings() { // 0 1 2 // 01234567890123456789012345 String text = "a = 'Hello Kitty' # Funny?"; checkHasProposals(text, 0, true, "global"); checkHasProposals(text, 4, true, "before string"); checkHasProposals(text, 5, false, "string began"); checkHasProposals(text, 11, false, "in string after space"); checkHasProposals(text, 15, false, "in string"); checkHasProposals(text, 17, true, "after string"); checkHasProposals(text, 18, true, "before comment"); checkHasProposals(text, 20, false, "in comment after space"); checkHasProposals(text, 23, false, "in comment"); } private void checkHasProposals(String text, int column, boolean expectHasProposals, String message) { MockAutocompleterEnvironment helper = new MockAutocompleterEnvironment(); helper.setup(new PathUtil("foo.py"), text, 0, column, true); AutocompleteProposals proposals = helper.autocompleter.pyAutocompleter.findAutocompletions( helper.editor.getSelection(), CTRL_SPACE); assertEquals(message, expectHasProposals, proposals.size() > 0); } public void testContextBuilding() { MockAutocompleterEnvironment helper = new MockAutocompleterEnvironment(); String text = "a .bc.de .f"; helper.setup(new PathUtil("foo.py"), text, 0, text.length(), true); PyProposalBuilder proposalBuilder = new PyProposalBuilder(); CompletionContext<PyState> completionContext = proposalBuilder .buildContext(helper.editor.getSelection(), helper.parser); assertEquals("previous context", "a.bc.de.", completionContext.getPreviousContext()); assertEquals("triggering string", "f", completionContext.getTriggeringString()); } public void testTemplateProposalsInGlobal() { MockAutocompleterEnvironment helper = new MockAutocompleterEnvironment(); helper.setup(new PathUtil("foo.py"), "con", 0, 3, true); AutocompleteProposals autocompletions = helper.autocompleter.pyAutocompleter.findAutocompletions( helper.editor.getSelection(), CTRL_SPACE); AutocompleteProposals.ProposalWithContext proposal = autocompletions.select(0); assertEquals("proposal name", "continue", proposal.getItem().getName()); helper.autocompleter.reallyFinishAutocompletion(proposal); String text = helper.editor.getDocument().getFirstLine().getText(); assertEquals("resulting text", "continue\n", text); } public void testOperatorKeywords() { MockAutocompleterEnvironment helper = new MockAutocompleterEnvironment(); String text = "if a is not None:"; helper.setup(new PathUtil("foo.py"), text, 0, text.length(), true); JsonArray<Token> tokens = helper.parser .parseLineSync(helper.editor.getDocument().getFirstLine()); assertEquals("4-th token == 'is'", "is", tokens.get(4).getValue()); assertEquals("4-th token is keyword", TokenType.KEYWORD, tokens.get(4).getType()); assertEquals("6-th token == 'not'", "not", tokens.get(6).getValue()); assertEquals("6-th token is keyword", TokenType.KEYWORD, tokens.get(6).getType()); } }