| /******************************************************************************* |
| * Copyright (c) 2013 RCP Vision (http://www.rcp-vision.com) 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: |
| * Lorenzo Bettini - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.emf.parsley.dsl.ui.tests |
| |
| import org.eclipse.core.runtime.NullProgressMonitor |
| import org.eclipse.emf.ecore.resource.ResourceSet |
| import org.eclipse.emf.parsley.EmfParsleyGuiceModule |
| import org.eclipse.emf.parsley.EmfParsleyJavaGuiceModule |
| import org.eclipse.emf.parsley.dsl.tests.util.ui.PluginProjectHelper |
| import org.eclipse.emf.parsley.dsl.ui.internal.DslActivator |
| import org.eclipse.emf.parsley.tests.pde.utils.PDETargetPlatformUtils |
| import org.eclipse.emf.parsley.views.EmfParsleyViewsActivator |
| import org.eclipse.jdt.core.IJavaProject |
| import org.eclipse.xtext.junit4.InjectWith |
| import org.eclipse.xtext.junit4.XtextRunner |
| import org.eclipse.xtext.junit4.ui.ContentAssistProcessorTestBuilder |
| import org.eclipse.xtext.xbase.junit.ui.AbstractContentAssistTest |
| import org.junit.AfterClass |
| import org.junit.BeforeClass |
| import org.junit.Test |
| import org.junit.runner.RunWith |
| |
| import static org.junit.Assert.* |
| |
| /** |
| * @author Lorenzo Bettini |
| */ |
| @RunWith(typeof(XtextRunner)) |
| @InjectWith(typeof(EmfParsleyDslUiInjectorProvider)) |
| class EmfParsleyDslContentAssistTest extends AbstractContentAssistTest { |
| |
| static IJavaProject pluginJavaProject |
| |
| val static PROJECT_NAME = "customPluginProject" |
| |
| @BeforeClass |
| def static void setUp() { |
| PDETargetPlatformUtils.setTargetPlatform(); |
| |
| val injector = DslActivator.getInstance().getInjector |
| (DslActivator.ORG_ECLIPSE_EMF_PARSLEY_DSL_EMFPARSLEYDSL); |
| |
| val projectHelper = injector.getInstance(PluginProjectHelper) |
| |
| pluginJavaProject = projectHelper.createJavaPluginProject |
| (PROJECT_NAME, newArrayList( |
| "org.eclipse.core.runtime", |
| "org.eclipse.ui", |
| EmfParsleyViewsActivator.PLUGIN_ID, |
| "org.eclipse.xtext.xbase.lib")) |
| } |
| |
| @AfterClass |
| def static void tearDown() { |
| pluginJavaProject.project.delete(true, new NullProgressMonitor) |
| } |
| |
| override getJavaProject(ResourceSet resourceSet) { |
| pluginJavaProject |
| } |
| |
| @Test def void testImportCompletion() { |
| newBuilder.append('import java.util.Da').assertText('java.util.Date') |
| } |
| |
| @Test def void testImportCompletion_1() { |
| newBuilder.append('import LinkedHashSet').assertText('java.util.LinkedHashSet') |
| } |
| |
| @Test def void testTypeCompletionInsertsImport() { |
| appendAndApplyProposalAndExpectContent( |
| ''' |
| module my.parsley.project { |
| |
| labelProvider { |
| text { |
| LinkedHashSet''', |
| 'java.util.LinkedHashSet', |
| ''' |
| import java.util.LinkedHashSet |
| |
| module my.parsley.project { |
| |
| labelProvider { |
| text { |
| LinkedHashSet''' |
| ) |
| } |
| |
| @Test def void testEmfFeatureForFeatureProvider() { |
| newBuilder.append( |
| ''' |
| import java.util.List |
| |
| module my.test.proj { |
| |
| featuresProvider { |
| features { |
| List -> ''' |
| ).assertText('class', 'empty') |
| // these correspond to getClass and isEmpty |
| } |
| |
| @Test def void testEmfFeatureForPropertyDescriptionProvider() { |
| newBuilder.append( |
| ''' |
| import java.util.List |
| |
| module my.test.proj { |
| |
| featureCaptionProvider { |
| text { |
| List : ''' |
| ).assertText('class', 'empty') |
| // these correspond to getClass and isEmpty |
| } |
| |
| @Test def void testEmfFeatureForFormControlFactory() { |
| newBuilder.append( |
| ''' |
| import java.util.List |
| |
| module my.test.proj { |
| |
| formControlFactory { |
| control { |
| List : ''' |
| ).assertText('class', 'empty') |
| // these correspond to getClass and isEmpty |
| } |
| |
| @Test def void testEmfFeatureForProposalSpecification() { |
| newBuilder.append( |
| ''' |
| import java.util.List |
| |
| module my.test.proj { |
| |
| proposals { |
| List : ''' |
| ).assertText('class', 'empty') |
| // these correspond to getClass and isEmpty |
| } |
| |
| @Test def void testProposalsForModuleExtends() { |
| newBuilder.append( |
| '''module my.test.proj extends ''' |
| ).assertText( |
| EmfParsleyGuiceModule.canonicalName, |
| EmfParsleyJavaGuiceModule.canonicalName |
| ) |
| // these are the the only possible completions in this test |
| } |
| |
| @Test def void testProposalForTypeInViewSpecification() { |
| newBuilder.append( |
| ''' |
| module my.test.proj { |
| |
| parts { |
| viewpart id { |
| viewname "View Name" |
| viewclass ''' |
| ).assertProposalSolutions( |
| "View", "E4PartWrapper", "ContentOutline", "PropertySheet" |
| ) |
| // only IViewPart sutypes |
| } |
| |
| @Test def void testProposalForFeatureSpecification() { |
| newBuilder.append( |
| ''' |
| module my.test.proj { |
| |
| featuresProvider { |
| features { ''' |
| ).assertProposalSolutions( |
| "emf.ecore", "emf.edit.tree" |
| ) |
| // only EObject sutypes |
| } |
| |
| @Test def void testProposalForControlFactoryFeatureSpecification() { |
| newBuilder.append( |
| ''' |
| module my.test.proj { |
| |
| formControlFactory { |
| control { ''' |
| ).assertProposalSolutions( |
| "emf.ecore", "emf.edit.tree" |
| ) |
| // only EObject sutypes |
| } |
| |
| @Test def void testProposalForFeatureAssociatedExpression() { |
| newBuilder.append( |
| ''' |
| module my.test.proj { |
| |
| featureCaptionProvider { |
| text { ''' |
| ).assertProposalSolutions( |
| "emf.ecore", "emf.edit.tree" |
| ) |
| // only EObject sutypes |
| } |
| |
| @Test def void testApplyProposalForValueBindingAlsoInsertsImport() { |
| appendAndApplyProposalAndExpectContent( |
| ''' |
| module my.test.proj { |
| |
| bindings { |
| value valueT''', |
| '''List<Integer> TableColumnWeights''', |
| ''' |
| import java.util.List |
| |
| module my.test.proj { |
| |
| bindings { |
| value List<Integer> TableColumnWeights''' |
| ) |
| } |
| |
| @Test def void testProposalForValueBindingType() { |
| newBuilder.append( |
| ''' |
| module my.test.proj { |
| |
| bindings { |
| value EObje<|>''' |
| ).assertProposalAtCursor( |
| '''org.eclipse.emf.ecore.EObject''' |
| ).apply.expectContent( |
| ''' |
| import org.eclipse.emf.ecore.EObject |
| |
| module my.test.proj { |
| |
| bindings { |
| value EObject<|>''' |
| ) |
| } |
| |
| @Test def void testProposalForTypeBinding() { |
| appendAndApplyProposalAndExpectContent( |
| ''' |
| module my.test.proj { |
| |
| bindings { |
| type bindILa''', |
| '''ILabelProvider''', |
| ''' |
| import org.eclipse.jface.viewers.ILabelProvider |
| |
| module my.test.proj { |
| |
| bindings { |
| type ILabelProvider''' |
| ) |
| } |
| |
| @Test def void testProposalForProviderBinding() { |
| appendAndApplyProposalAndExpectContent( |
| ''' |
| module my.test.proj { |
| |
| bindings { |
| provide provideAda''', |
| '''AdapterFactoryEditingDomain''', |
| ''' |
| import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain |
| |
| module my.test.proj { |
| |
| bindings { |
| provide AdapterFactoryEditingDomain''' |
| ) |
| } |
| |
| @Test def void testProposalForXFeatureCall_Feature() { |
| appendAndApplyProposalAndExpectContent( |
| ''' |
| import org.eclipse.emf.ecore.EClass |
| |
| module my.test.proj { |
| |
| labelProvider { |
| text { |
| EClass e -> { e.''', |
| '''eAdapters''', |
| ''' |
| import org.eclipse.emf.ecore.EClass |
| |
| module my.test.proj { |
| |
| labelProvider { |
| text { |
| EClass e -> { e.eAdapters''' |
| ) |
| } |
| |
| def private assertProposalSolutions(ContentAssistProcessorTestBuilder builder, String...acceptableParts) { |
| for (p : builder.computeCompletionProposals) { |
| assertTrue( |
| "proposal not expected: " + p.displayString, |
| acceptableParts.exists[p.displayString.contains(it)] |
| ) |
| } |
| } |
| |
| def private appendAndApplyProposalAndExpectContent(String model, String proposal, String expectedContent) { |
| // we must use appendAndApplyProposal and NOT assertProposal.apply because the ContentAssistProcessorTestBuilder |
| // will recreate an XtextDocument, and some ICompletionProposal proposals, like the one we use, |
| // ImportOrganizingProposal and ReplacingAppendable, don't use the passed document (ReplacingAppendable |
| // uses its internal stored document) and this would make our tests fail |
| newBuilder. |
| append(model). |
| appendAndApplyProposal( |
| "", // appendAndApplyProposals looks buggy: it does not append the passed String |
| // before computing the proposals, so we first append it and then pass an empty string |
| proposal |
| ).expectContent(expectedContent) |
| } |
| |
| // def private assertProposals(ContentAssistProcessorTestBuilder builder, CharSequence expected) { |
| // builder.assertText(expected.toString.split("\\r?\\n")) |
| // } |
| } |