blob: 99d03f3eeb9d9903161c0df5e7aea05cd5ccd669 [file] [log] [blame]
/*******************************************************************************
* 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"))
// }
}