| /******************************************************************************* |
| * Copyright (c) 2004, 2012 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are 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 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.jsp.ui.tests.contentassist; |
| |
| import java.io.File; |
| |
| import junit.framework.TestCase; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.jface.text.IDocument; |
| import org.eclipse.jface.text.contentassist.ICompletionProposal; |
| import org.eclipse.jst.jsp.ui.internal.contentassist.JSPELContentAssistProcessor; |
| import org.eclipse.jst.jsp.ui.tests.util.FileUtil; |
| import org.eclipse.jst.jsp.ui.tests.util.ProjectUnzipUtility; |
| import org.eclipse.osgi.service.datalocation.Location; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.part.FileEditorInput; |
| import org.eclipse.wst.sse.ui.StructuredTextEditor; |
| import org.eclipse.wst.sse.ui.internal.StructuredTextViewer; |
| |
| public class JSPELContentAssistTest extends TestCase { |
| private static final String WTP_AUTOTEST_NONINTERACTIVE = "wtp.autotest.noninteractive"; |
| private String previousWTPAutoTestNonINteractivePropValue = null; |
| |
| private static final String TEST_PROJECT_NAME = "testJSPELContentAssist"; |
| private static final String CONTENT_DIR = "WebContent"; |
| |
| private static final String STRUCTURED_EDITOR_TYPE = "org.eclipse.wst.sse.ui.StructuredTextEditor.test"; |
| |
| private static final String FILE_0_PATH = CONTENT_DIR + IPath.SEPARATOR + "Test0.jsp"; |
| private static final String FILE_1_PATH = CONTENT_DIR + IPath.SEPARATOR + "Test1.jsp"; |
| private static final String FILE_2_PATH = CONTENT_DIR + IPath.SEPARATOR + "Test2.jsp"; |
| |
| private static final String[] TEST_0_EXPECTED_PROPS = { |
| "errorData", "exception", "expressionEvaluator", "out", "page", "request", "response", |
| "servletConfig", "servletContext", "session", "variableResolver"}; |
| private static final String[] TEST_1_EXPECTED_PROPS = {"request", "response"}; |
| private static final String[] TEST_2_EXPECTED_PROPS = {"request"}; |
| |
| private static final int TEST_0_DOC_LOC = 371; |
| private static final int TEST_1_DOC_LOC = 372; |
| private static final int TEST_2_DOC_LOC = 374; |
| |
| private IProject project; |
| private IWorkbenchPage page; |
| |
| public JSPELContentAssistTest() { |
| super("JSP EL Content Assist Tests"); |
| } |
| |
| public JSPELContentAssistTest(String name) { |
| super(name); |
| } |
| |
| /** |
| * Do set up, ignore all pop ups during test |
| */ |
| protected void setUp() throws Exception { |
| super.setUp(); |
| initializeResource(); |
| String noninteractive = System.getProperty(WTP_AUTOTEST_NONINTERACTIVE); |
| |
| if (noninteractive != null) { |
| previousWTPAutoTestNonINteractivePropValue = noninteractive; |
| } else { |
| previousWTPAutoTestNonINteractivePropValue = "false"; |
| } |
| System.setProperty(WTP_AUTOTEST_NONINTERACTIVE, "true"); |
| } |
| |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| if (previousWTPAutoTestNonINteractivePropValue != null) { |
| System.setProperty(WTP_AUTOTEST_NONINTERACTIVE, previousWTPAutoTestNonINteractivePropValue); |
| } |
| } |
| |
| /** |
| * Set up the project and workbench |
| * |
| * @throws Exception |
| */ |
| private void initializeResource() throws Exception { |
| ProjectUnzipUtility fProjUtil = new ProjectUnzipUtility(); |
| // root of workspace directory |
| Location platformLocation = Platform.getInstanceLocation(); |
| // platform location may be null -- depends on "mode" of platform |
| IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); |
| this.project = root.getProject(TEST_PROJECT_NAME); |
| |
| if (platformLocation != null && (project == null || !project.isAccessible())) { |
| File zipFile = FileUtil.makeFileFor( |
| ProjectUnzipUtility.PROJECT_ZIPS_FOLDER, |
| TEST_PROJECT_NAME + ProjectUnzipUtility.ZIP_EXTENSION, |
| ProjectUnzipUtility.PROJECT_ZIPS_FOLDER); |
| fProjUtil.unzipAndImport(zipFile, platformLocation.getURL().getPath()); |
| fProjUtil.initJavaProject(TEST_PROJECT_NAME); |
| |
| this.project = root.getProject(TEST_PROJECT_NAME); |
| } |
| IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| this.page = workbenchWindow.getActivePage(); |
| } |
| |
| public void testELProposals_0() throws Exception { |
| ICompletionProposal[] props = getCompletionProposals(FILE_0_PATH, TEST_0_DOC_LOC); |
| verifyProposals(props, TEST_0_EXPECTED_PROPS); |
| } |
| |
| public void testELProposals_1() throws Exception { |
| ICompletionProposal[] props = getCompletionProposals(FILE_1_PATH, TEST_1_DOC_LOC); |
| verifyProposals(props, TEST_1_EXPECTED_PROPS); |
| } |
| |
| public void testELProposals_2() throws Exception { |
| ICompletionProposal[] props = getCompletionProposals(FILE_2_PATH, TEST_2_DOC_LOC); |
| verifyProposals(props, TEST_2_EXPECTED_PROPS); |
| } |
| |
| public void testELChosenProposalCompletion() throws Exception { |
| IFile file = getFile(FILE_1_PATH); |
| ICompletionProposal[] props = getCompletionProposals(file, TEST_1_DOC_LOC); |
| verifyProposals(props, TEST_1_EXPECTED_PROPS); |
| |
| StructuredTextEditor editor = getEditor(file); |
| StructuredTextViewer viewer = editor.getTextViewer(); |
| IDocument document = viewer.getDocument(); |
| props[0].apply(document); |
| |
| String inserted = document.get(TEST_1_DOC_LOC-1, TEST_1_EXPECTED_PROPS[0].length()); |
| assertEquals( |
| "The completed proposal " + inserted + " does not match the expected completion " + TEST_1_EXPECTED_PROPS[0], |
| TEST_1_EXPECTED_PROPS[0], inserted); |
| editor.getSite().getPage().saveEditor(editor, false); |
| } |
| |
| /** |
| * Get a file contained in the project |
| * |
| * @param filePath |
| * @return |
| */ |
| private IFile getFile(String filePath) { |
| IFile retFile = this.project.getFile(filePath); |
| |
| assertTrue(retFile + " testing file does not exist.", retFile.exists()); |
| |
| return retFile; |
| } |
| |
| /** |
| * use a viewer and document location to generate completion proposals for that location in the viewer |
| * |
| * @param filePath |
| * @param documentLocation |
| * @return |
| * @throws PartInitException |
| */ |
| private ICompletionProposal[] getCompletionProposals(String filePath, int documentLocation) throws PartInitException { |
| IFile file = getFile(filePath); |
| StructuredTextEditor editor = getEditor(file); |
| StructuredTextViewer viewer = editor.getTextViewer(); |
| return getCompletionProposals(viewer, documentLocation); |
| } |
| |
| |
| /** |
| * use a viewer and document location to generate completion proposals for that location in the viewer |
| * |
| * @param file |
| * @param documentLocation |
| * @return |
| * @throws PartInitException |
| */ |
| private ICompletionProposal[] getCompletionProposals(IFile file, int documentLocation) throws PartInitException { |
| StructuredTextEditor editor = getEditor(file); |
| StructuredTextViewer viewer = editor.getTextViewer(); |
| return getCompletionProposals(viewer, documentLocation); |
| } |
| |
| /** |
| * use a viewer and document location to generate completion proposals for that location in the viewer |
| * |
| * @param viewer |
| * @param documentLocation |
| * @return |
| * @throws PartInitException |
| */ |
| private ICompletionProposal[] getCompletionProposals(StructuredTextViewer viewer, int documentLocation) throws PartInitException { |
| JSPELContentAssistProcessor processor = new JSPELContentAssistProcessor(); |
| ICompletionProposal[] props = processor.computeCompletionProposals(viewer, documentLocation); |
| |
| return props; |
| } |
| |
| /** |
| * Given a file returns a viewer for that file |
| * |
| * @param file |
| * @return |
| * @throws PartInitException |
| */ |
| private StructuredTextEditor getEditor(IFile file) throws PartInitException { |
| IEditorInput input = new FileEditorInput(file); |
| IEditorPart part = this.page.openEditor(input, STRUCTURED_EDITOR_TYPE, true); |
| |
| assertTrue("Unable to open structured text editor", part instanceof StructuredTextEditor); |
| |
| return (StructuredTextEditor) part; |
| } |
| |
| /** |
| * Given generated proposals be sure that all of the epxted proposals are contained in the generated ones |
| * @param props |
| * @param expectedProps |
| */ |
| private void verifyProposals(ICompletionProposal[] props, String[] expectedProps) { |
| for(int i = 0; i < expectedProps.length; ++i) { |
| assertTrue("The expected proposal \"" + expectedProps[i] + "\" was not given", |
| findPropsoal(props, expectedProps[i])); |
| } |
| } |
| |
| /** |
| * Given an expected proposal string check to be sure it exists in the given proposals |
| * |
| * @param props |
| * @param expectedProp |
| * @return |
| */ |
| private boolean findPropsoal(ICompletionProposal[] props, String expectedProp) { |
| boolean found = false; |
| |
| for(int i = 0; i < props.length && !found; ++i) { |
| found = props[i].getDisplayString().startsWith(expectedProp); |
| } |
| |
| return found; |
| } |
| } |