// 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.css;
import static com.google.collide.client.code.autocomplete.TestUtils.CTRL_SPACE;
import static com.google.collide.client.code.autocomplete.css.CssTrie.findAndFilterAutocompletions;
import com.google.collide.client.code.autocomplete.AbstractTrie;
import com.google.collide.client.code.autocomplete.AutocompleteProposal;
import com.google.collide.client.code.autocomplete.AutocompleteProposals;
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.TestUtils;
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.json.client.JsoArray;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.shared.util.JsonCollections;
import com.google.common.base.Joiner;
/**
* Tests for css autocompletion.
*
*/
public class CssAutocompleteTest extends SynchronousTestCase {
private CssAutocompleter cssAutocompleter;
private MockAutocompleterEnvironment helper;
@Override
public String getModuleName() {
return "com.google.cofllide.client.TestCode";
}
@Override
public void gwtSetUp() throws Exception {
super.gwtSetUp();
cssAutocompleter = CssAutocompleter.create();
helper = new MockAutocompleterEnvironment();
}
public void testFindAndFilterAutocompletions() {
AbstractTrie<AutocompleteProposal> cssTrie = CssTrie.createTrie();
JsonArray<String> completedProps = JsonCollections.createArray();
JsonArray<AutocompleteProposal> proposals;
proposals = findAndFilterAutocompletions(cssTrie, "clea", completedProps);
assertEquals(1, proposals.size());
assertEquals("clear", proposals.get(0).getName());
proposals = findAndFilterAutocompletions(cssTrie, "clear", completedProps);
assertEquals(1, proposals.size());
assertEquals("clear", proposals.get(0).getName());
proposals = findAndFilterAutocompletions(cssTrie, "hiybbprqag", completedProps);
assertEquals(0, proposals.size());
proposals = findAndFilterAutocompletions(cssTrie, "", completedProps);
assertEquals(115, proposals.size());
completedProps.add("clear");
proposals = findAndFilterAutocompletions(cssTrie, "", completedProps);
assertEquals(114, proposals.size());
}
/**
* Tests getting the context.
*/
public void testAttributeNameFullAutocompletion() {
String text = Joiner.on("").join(new String[]{
".something {\n",
"cur\n",
"color: black;\n",
"fake: ;\n",
"}\n"
});
helper.setup(new PathUtil("test.css"), text, 1, 3, false);
SelectionModel selection = helper.editor.getSelection();
AutocompleteProposals completions = cssAutocompleter.findAutocompletions(selection, CTRL_SPACE);
assertEquals(1, completions.size());
AutocompleteResult commonResult = cssAutocompleter.computeAutocompletionResult(
completions.select(0));
assertTrue("result type", commonResult instanceof DefaultAutocompleteResult);
DefaultAutocompleteResult result = (DefaultAutocompleteResult) commonResult;
assertEquals(8, result.getJumpLength());
assertEquals("cursor: ;", result.getAutocompletionText());
CssCompletionQuery query = cssAutocompleter.updateOrCreateQuery(
null, selection.getCursorPosition());
JsoArray<String> completedProperties = query.getCompletedProperties();
assertEquals(2, completedProperties.size());
assertEquals("color", completedProperties.get(0));
assertEquals("fake", completedProperties.get(1));
}
/**
* Tests getting the context.
*/
public void testAttributeValueFullAutocompletion() {
String text = Joiner.on("").join(new String[]{
".something {\n",
"azimuth: \n",
});
helper.setup(new PathUtil("/some.css"), text, 1, 9, false);
AutocompleteProposals completions = cssAutocompleter.findAutocompletions(
helper.editor.getSelection(), CTRL_SPACE);
assertEquals(14, completions.size());
ProposalWithContext leftSideProposal = TestUtils.selectProposalByName(completions, "left-side");
assertNotNull(leftSideProposal);
AutocompleteResult commonResult = cssAutocompleter.computeAutocompletionResult(
leftSideProposal);
assertTrue("result type", commonResult instanceof DefaultAutocompleteResult);
DefaultAutocompleteResult result = (DefaultAutocompleteResult) commonResult;
assertEquals(9, result.getJumpLength());
}
/**
* Tests filtering out properties that appear after.
*/
public void testFilterPropertiesAfter() {
CssCompletionQuery cssCompletionQuery =
new CssCompletionQuery("back", "color: blue;\nfake: ;\nbackground-color: blue;");
JsonArray<AutocompleteProposal> proposals =
findAndFilterAutocompletions(CssTrie.createTrie(), cssCompletionQuery.getTriggeringString(),
cssCompletionQuery.getCompletedProperties());
// Notably, the list does not contain background-color.
assertEquals(5, proposals.size());
assertEquals("background", proposals.get(0).getName());
assertEquals("background-attachment", proposals.get(1).getName());
assertEquals("background-image", proposals.get(2).getName());
assertEquals("background-position", proposals.get(3).getName());
assertEquals("background-repeat", proposals.get(4).getName());
}
/**
* Tests filtering out properties that appear after.
*/
public void testFilterExistingValuesAfter() {
CssCompletionQuery cssCompletionQuery = new CssCompletionQuery(
"background: ", "black;\ncolor: blue;\nfake: ;\nbackground-color: blue;");
JsoArray<AutocompleteProposal> proposals =
CssPartialParser.getInstance().getAutocompletions(cssCompletionQuery.getProperty(),
cssCompletionQuery.getValuesBefore(), cssCompletionQuery.getTriggeringString(),
cssCompletionQuery.getValuesAfter());
// Notably, the list does not contain colors.
assertEquals(2, proposals.size());
assertEquals("transparent", proposals.get(0).getName());
assertEquals("inherit", proposals.get(1).getName());
}
/**
* Tests filtering out properties that appear before.
*/
public void testFilterExistingValuesBefore() {
CssCompletionQuery cssCompletionQuery = new CssCompletionQuery(
"background: black ", "\ncolor: blue;\nfake: ;\nbackground-color: blue;");
JsoArray<AutocompleteProposal> proposals =
CssPartialParser.getInstance().getAutocompletions(cssCompletionQuery.getProperty(),
cssCompletionQuery.getValuesBefore(), cssCompletionQuery.getTriggeringString(),
cssCompletionQuery.getValuesAfter());
// Notably, the list does not contain colors.
assertEquals(3, proposals.size());
assertEquals("<uri>", proposals.get(0).getName());
assertEquals("none", proposals.get(1).getName());
assertEquals("inherit", proposals.get(2).getName());
}
/**
* Tests that for some properties values can be repeated, so they are proposed
* again.
*/
public void testRepeatingProperties() {
CssCompletionQuery cssCompletionQuery = new CssCompletionQuery(
"padding: 19px ", "\ncolor: blue;\nfake: ;\nbackground-color: blue;");
JsoArray<AutocompleteProposal> proposals =
CssPartialParser.getInstance().getAutocompletions(cssCompletionQuery.getProperty(),
cssCompletionQuery.getValuesBefore(), cssCompletionQuery.getTriggeringString(),
cssCompletionQuery.getValuesAfter());
// Notably, the list does not contain colors.
assertEquals(10, proposals.size());
assertEquals("<number>em", proposals.get(0).getName());
assertEquals("<number>ex", proposals.get(1).getName());
assertEquals("<number>in", proposals.get(2).getName());
assertEquals("<number>cm", proposals.get(3).getName());
assertEquals("<number>mm", proposals.get(4).getName());
assertEquals("<number>pt", proposals.get(5).getName());
assertEquals("<number>pc", proposals.get(6).getName());
assertEquals("<number>px", proposals.get(7).getName());
assertEquals("<number>%", proposals.get(8).getName());
assertEquals("inherit", proposals.get(9).getName());
}
/**
* Tests that number proposals come up first for the property 'border'.
*/
public void testBorder() {
CssCompletionQuery cssCompletionQuery =
new CssCompletionQuery("border: ", "\ncolor: blue;\nfake: ;\nbackground-color: blue;");
JsoArray<AutocompleteProposal> proposals =
CssPartialParser.getInstance().getAutocompletions(cssCompletionQuery.getProperty(),
cssCompletionQuery.getValuesBefore(), cssCompletionQuery.getTriggeringString(),
cssCompletionQuery.getValuesAfter());
// Notably, number proposals are first.
assertEquals(43, proposals.size());
assertEquals("<number>em", proposals.get(0).getName());
}
/**
* Tests filtering out properties that appear after 'border'.
*/
public void testBorderWithExistingValue() {
CssCompletionQuery cssCompletionQuery =
new CssCompletionQuery("border: 1px ", "color: blue;\nfake: ;\nbackground-color: blue;");
JsoArray<AutocompleteProposal> proposals =
CssPartialParser.getInstance().getAutocompletions(cssCompletionQuery.getProperty(),
cssCompletionQuery.getValuesBefore(), cssCompletionQuery.getTriggeringString(),
cssCompletionQuery.getValuesAfter());
// Notably, the list does not contain background-color.
assertEquals(15, proposals.size());
}
public void testQueryType() {
CssCompletionQuery query = new CssCompletionQuery("clea", "");
assertEquals(CompletionType.PROPERTY, query.getCompletionType());
}
}