blob: 60263e2a7c41ba7d25f6c6c10ddfb304c9fefbbf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.sling.ide.test.impl.ui.sightly;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assume.assumeThat;
import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.concurrent.Callable;
import org.apache.sling.ide.test.impl.helpers.ProjectAdapter;
import org.apache.sling.ide.test.impl.helpers.TemporaryProject;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEclipseEditor;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SWTBotJunit4ClassRunner.class)
public class SightlyAutocompletionTest {
private static SWTWorkbenchBot bot;
@Rule
public TemporaryProject projectRule = new TemporaryProject();
@BeforeClass
public static void closeWelcomeView() throws Exception {
bot = new SWTWorkbenchBot();
if ( bot.activeView().getTitle().equals("Welcome") ) {
bot.activeView().close();
}
}
@Test
public void tagNameAutocompletion() throws Exception {
assumeThat(System.getProperty("os.name"), not(containsString("Windows"))); // TODO - SLING-7596
List<String> proposals = new AutocompletionCallable() {
@Override
protected void prepareEditor(SWTBotEclipseEditor editor) {
editor.insertText("<html>\n\n</html>");
editor.navigateTo(1, 0);
}
}.call();
// validate auto-completion proposals
assertThat("proposal list does not contain 'sly'", proposals, hasItem("sly"));
}
@Test
public void attributeAutocompletion() throws Exception {
assumeThat(System.getProperty("os.name"), not(containsString("Windows"))); // TODO - SLING-7596
List<String> proposals = new AutocompletionCallable() {
@Override
protected void prepareEditor(SWTBotEclipseEditor editor) {
editor.insertText("<html>\n<div ></div>\n</html>");
editor.navigateTo(1, 5);
}
}.call();
// validate auto-completion proposals
assertThat("proposal list does not contain 'data-sly-test'", proposals, hasItem("data-sly-test"));
}
abstract class AutocompletionCallable implements Callable<List<String>> {
@Override
public List<String> call() throws Exception {
// create faceted project
final IProject contentProject = projectRule.getProject();
ProjectAdapter project = new ProjectAdapter(contentProject);
project.addNatures(JavaCore.NATURE_ID, "org.eclipse.wst.common.project.facet.core.nature");
// install facets
project.installFacet("sling.content", "1.0");
project.installFacet("sightly", "1.1");
// create basic html file
project.createOrUpdateFile(Path.fromOSString("jcr_root/index.html"), new ByteArrayInputStream("".getBytes()));
// ensure that we get the tree from the project explorer
SWTBotView projectExplorer = bot.viewByTitle("Project Explorer");
projectExplorer.setFocus();
final SWTBotTree explorerTree = projectExplorer.bot().tree();
// wait until the project is displayed in the project explorer
bot.waitUntil(new DefaultCondition() {
@Override
public boolean test() throws Exception {
SWTBotTreeItem[] treeItems = explorerTree.getAllItems();
for (SWTBotTreeItem treeItem : treeItems) {
if ( contentProject.getName().equals(treeItem.getText()) ) {
return true;
}
}
return false;
}
@Override
public String getFailureMessage() {
return "No project named '" + contentProject.getName() + "' found in the Project Explorer.";
}
});
// open editor
SWTBotTreeItem projectItem = explorerTree.expandNode(contentProject.getName());
// it seems that two 'jcr_root' nodes confuse SWTBot so we expand and navigate manually
SWTBotTreeItem folderNode = projectItem.getItems()[0].expand();
folderNode.getItems()[0].select().doubleClick();
// generate auto-completion proposals
SWTBotEclipseEditor editor = bot.editorByTitle("index.html").toTextEditor();
prepareEditor(editor);
// gather proposals
List<String> proposals = editor.getAutoCompleteProposals("");
// close editor, otherwise cleanup can hang due to the dialog
editor.saveAndClose();
return proposals;
}
/**
* Prepare the editor by adding text and positioning the cursor
*
* <p>After this method is executed the editor must be ready to generate
* the autocompletions expected by the test</p>
*
* @param editor the editor instance, never <code>null</code>
*/
protected abstract void prepareEditor(SWTBotEclipseEditor editor);
}
}