/*******************************************************************************
* Copyright (c) 2017 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.ws.ui.bot.test.websocket;
import static org.jboss.tools.ws.ui.bot.test.utils.ProjectHelper.*;
import static org.jboss.tools.ws.ui.bot.test.websocket.NameBindingTest.Constants.*;
import static org.jboss.tools.ws.ui.bot.test.websocket.WebSocketHelper.*;
import static org.junit.Assert.*;
import org.jboss.reddeer.jface.text.contentassist.ContentAssistant;
import org.jboss.reddeer.requirements.autobuilding.AutoBuildingRequirement.AutoBuilding;
import org.jboss.reddeer.workbench.impl.editor.TextEditor;
import org.jboss.tools.common.reddeer.requirements.JavaFoldingRequirement.JavaFolding;
import org.jboss.tools.ws.ui.bot.test.WSTestBase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* Tests hyperlinks with custom NameBinding annotation.
*
* @author Jan Novak
*/
@JavaFolding(false)
@AutoBuilding(false)
public class NameBindingTest extends WSTestBase {
private TextEditor appEditor;
private TextEditor filterEditor;
private TextEditor annotationEditor;
@Before
public void setup() {
setWsProjectName(PROJECT_NAME);
if (!projectExists(getWsProjectName()))
createProject(getWsProjectName());
else
throw new IllegalStateException("There is an unexpected project " + getWsProjectName());
//prepare classes
annotationEditor = prepareCustomAnnotationEditor(getWsProjectName());
appEditor = prepareAppEditor(getWsProjectName());
filterEditor = prepareFilterEditor(getWsProjectName());
enableJAXRSSupport(getWsProjectName());
}
@After
public void tearDown() {
deleteAllProjects();
}
@Test
public void test() {
cleanAllProjects();
assertProposals(appEditor, PROPOSAL_FILTER, PROPOSAL_APP);
assertProposals(filterEditor, PROPOSAL_APP, PROPOSAL_FILTER);
assertProposals(annotationEditor, Arrays.asList(PROPOSAL_APP, PROPOSAL_FILTER), new ArrayList<String>());
}
@Test
public void duplicatedFilterTest() {
TextEditor duplicateFilterEditor =
duplicateClass(filterEditor, CLASS_NAME_FILTER, CLASS_NAME_FILTER_DUPLICATED);
cleanAllProjects();
assertProposals(appEditor,
Arrays.asList(PROPOSAL_FILTER, PROPOSAL_FILTER_DUPLICATED),
Arrays.asList(PROPOSAL_APP));
assertProposals(filterEditor,
Arrays.asList(PROPOSAL_APP, PROPOSAL_FILTER_DUPLICATED),
Arrays.asList(PROPOSAL_FILTER));
assertProposals(duplicateFilterEditor,
Arrays.asList(PROPOSAL_FILTER, PROPOSAL_APP),
Arrays.asList(PROPOSAL_FILTER_DUPLICATED));
assertProposals(annotationEditor,
Arrays.asList(PROPOSAL_APP, PROPOSAL_FILTER, PROPOSAL_FILTER_DUPLICATED),
new ArrayList<String>());
}
@Test
public void annotationRemoveTest() {
TextEditor duplicateFilterEditor =
duplicateClass(filterEditor, CLASS_NAME_FILTER, CLASS_NAME_FILTER_DUPLICATED);
//remove CUSTOM_NAME_BINDING_ANNOTATION from original filter
filterEditor.activate();
filterEditor.setText(filterEditor.getText().replaceAll(CUSTOM_NAME_BINDING_ANNOTATION, ""));
filterEditor.save();
cleanAllProjects();
assertProposals(appEditor,
Arrays.asList(PROPOSAL_FILTER_DUPLICATED),
Arrays.asList(PROPOSAL_FILTER, PROPOSAL_APP));
assertProposals(duplicateFilterEditor,
Arrays.asList(PROPOSAL_APP),
Arrays.asList(PROPOSAL_FILTER, PROPOSAL_FILTER_DUPLICATED));
assertProposals(annotationEditor,
Arrays.asList(PROPOSAL_APP, PROPOSAL_FILTER_DUPLICATED),
Arrays.asList(PROPOSAL_FILTER));
}
private void assertProposals(TextEditor editor, String expected, String unexpected) {
assertProposals(editor, Arrays.asList(expected), Arrays.asList(unexpected));
}
private void assertProposals(TextEditor editor, Collection<String> expected, Collection<String> unexpected) {
List<String> proposals = getAnnotationsProposals(editor, CLASS_NAME_ANNOTATION);
assertTrue("There are not all expected proposals!" + proposals + expected,
proposals.containsAll(expected));
assertTrue("There are unexpected proposals!" + proposals + unexpected,
Collections.disjoint(proposals, unexpected));
}
private TextEditor duplicateClass(TextEditor editor, String originalClassName, String newClassName) {
editor.activate();
String originalSource = editor.getText();
String replacedSource = originalSource.replaceAll(originalClassName, newClassName);
TextEditor newClassEditor = createClass(getWsProjectName(), PROJECT_PACKAGE, newClassName);
newClassEditor.activate();
newClassEditor.setText(replacedSource);
newClassEditor.save();
return newClassEditor;
}
private List<String> getAnnotationsProposals(TextEditor editor, String annotation) {
editor.activate();
int y = editor.getLineOfText(annotation);
int x = editor.getTextAtLine(y).indexOf(annotation) + annotation.length() / 2;
editor.setCursorPosition(y, x);
ContentAssistant assistant = editor.openOpenOnAssistant();
List<String> proposals = assistant.getProposals();
if (assistant != null)
assistant.close();
return proposals;
}
static class Constants {
static final String PROJECT_NAME = "nameBindingTestProject";
static final String PROJECT_PACKAGE = "org.websocket.test";
static final String CLASS_NAME_ANNOTATION = "CustomNameBinding";
static final String CLASS_NAME_APP = "RestApplication";
static final String CLASS_NAME_FILTER = "CustomResponseFilterWithBinding";
static final String CLASS_NAME_FILTER_DUPLICATED = CLASS_NAME_FILTER + "Duplicated";
static final String PROPOSAL_APP = "Open " + PROJECT_PACKAGE + "." + CLASS_NAME_APP;
static final String PROPOSAL_FILTER = "Open " + PROJECT_PACKAGE + "." + CLASS_NAME_FILTER;
static final String PROPOSAL_FILTER_DUPLICATED = "Open " + PROJECT_PACKAGE + "." + CLASS_NAME_FILTER_DUPLICATED;
static final String CUSTOM_NAME_BINDING_ANNOTATION = "@" + CLASS_NAME_ANNOTATION;
}
}