Skip to content

Commit

Permalink
Initial tests for compile/instantiate/execute
Browse files Browse the repository at this point in the history
Change-Id: I80c4469caeee91cb642d3f8af8afb74da9cab86e
  • Loading branch information
LorenzoBettini committed Nov 4, 2016
1 parent 374d78a commit a53b0c4
Show file tree
Hide file tree
Showing 2 changed files with 176 additions and 1 deletion.
3 changes: 2 additions & 1 deletion dsl/org.eclipse.emf.parsley.dsl.tests/META-INF/MANIFEST.MF
Expand Up @@ -19,7 +19,8 @@ Require-Bundle: org.eclipse.emf.parsley.dsl,
org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional,
org.eclipse.emf.parsley.generator.common,
org.eclipse.emf.parsley.dsl.additional.builder,
org.eclipse.pde.core;bundle-version="3.7.1"
org.eclipse.pde.core;bundle-version="3.7.1",
org.eclipse.emf.parsley.junit4
Import-Package: org.apache.log4j,
org.apache.log4j.spi,
org.hamcrest.core,
Expand Down
@@ -0,0 +1,174 @@
/*******************************************************************************
* 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.tests

import com.google.common.base.Joiner
import com.google.inject.Guice
import com.google.inject.Inject
import com.google.inject.Module
import org.eclipse.emf.ecore.resource.impl.ResourceImpl
import org.eclipse.emf.parsley.dsl.tests.util.EmfParsleyDslInjectorProviderCustom
import org.eclipse.emf.parsley.examples.library.EXTLibraryFactory
import org.eclipse.emf.parsley.junit4.AbstractEmfParsleyShellBasedTest
import org.eclipse.emf.parsley.viewers.ViewerFactory
import org.eclipse.jface.viewers.ILabelProvider
import org.eclipse.jface.viewers.TreeViewer
import org.eclipse.ui.plugin.AbstractUIPlugin
import org.eclipse.xtext.diagnostics.Severity
import org.eclipse.xtext.junit4.InjectWith
import org.eclipse.xtext.junit4.TemporaryFolder
import org.eclipse.xtext.junit4.XtextRunner
import org.eclipse.xtext.util.Wrapper
import org.eclipse.xtext.xbase.compiler.CompilationTestHelper
import org.eclipse.xtext.xbase.compiler.CompilationTestHelper.Result
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

import static extension org.junit.Assert.*

@RunWith(typeof(XtextRunner))
@InjectWith(typeof(EmfParsleyDslInjectorProviderCustom))
class EmfParsleyDslExecutionTests extends AbstractEmfParsleyShellBasedTest {

@Rule
@Inject public TemporaryFolder temporaryFolder

@Inject extension CompilationTestHelper

val libraryFactory = EXTLibraryFactory.eINSTANCE

@Test def void testLabelProvider() {
val labelProvider = '''
import org.eclipse.emf.parsley.examples.library.Book
import org.eclipse.emf.parsley.examples.library.BookOnTape
import org.eclipse.emf.parsley.examples.library.Borrower
import org.eclipse.emf.parsley.examples.library.Lendable
import org.eclipse.emf.parsley.examples.library.Library
import org.eclipse.emf.parsley.examples.library.Writer
import org.eclipse.swt.graphics.ImageData
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
module my.empty extends org.eclipse.emf.parsley.EmfParsleyJavaGuiceModule {
labelProvider {
text {
Library -> 'foo' // constant
Writer writer -> writer.getName() // explicit param
Book -> "Title: " + (title ?: "no title") // implit 'it' param
}
image {
Library -> 'library.jpeg' // constant
Writer writer ->
if (writer.name.nullOrEmpty)
"noname.gif"
else
new ImageData("writer.jpeg")
}
font {
Library -> JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT)
}
foreground {
Library -> Display.getCurrent().getSystemColor(SWT.COLOR_BLUE)
}
background {
Library -> Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)
}
}
}
'''.compileInstantiate(ILabelProvider)

"foo".assertEquals(labelProvider.getText(libraryFactory.createLibrary))
"Title: no title".assertEquals(labelProvider.getText(libraryFactory.createBook))
"Title: Foo".assertEquals(labelProvider.getText(libraryFactory.createBook => [title = "Foo"]))
}

@Test def void testContentProvider() {
val viewerFactory = '''
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.emf.parsley.examples.library.Book
import org.eclipse.emf.parsley.examples.library.Library
import org.eclipse.emf.parsley.examples.library.Writer
module my.empty extends org.eclipse.emf.parsley.EmfParsleyJavaGuiceModule {
viewerContentProvider {
elements {
Resource -> allContents.filter(Library)
}
children {
Library -> books + writers
Writer writer -> writer.books
Book -> author // implit 'it' param
}
}
}
'''.compileInstantiate(ViewerFactory)
val tree = new TreeViewer(shell)

val resource = new ResourceImpl => [ res |
res.contents += libraryFactory.createLibrary => [
books += libraryFactory.createBook => [
title = "a book"
]
books += libraryFactory.createBook => [
title = "another book"
]
writers += libraryFactory.createWriter => [
name = "an author"
]
// this won't be shown by the content provider
borrowers += libraryFactory.createBorrower
]
]

viewerFactory.initialize(tree, resource)
tree.expandAll
assertAllLabels(tree,
'''
Library
Book a book
Book another book
Writer an author
'''
)
}

def private <T> T compileInstantiate(CharSequence input, Class<T> clazz) {
val instantiated = Wrapper.forType(clazz)
input.compile [
assertNoValidationErrors
val moduleClassName = "my.empty.EmptyEmfParsleyGuiceModule"
val moduleClass = getCompiledClass(moduleClassName)
val cons = moduleClass.getConstructor(AbstractUIPlugin)
val module = cons.newInstance(#[null]) as Module
val injector = Guice.createInjector(module)
val instance = injector.getInstance(clazz)
instantiated.set(instance)
]
return instantiated.get
}

private def assertNoValidationErrors(Result it) {
val allErrors = getErrorsAndWarnings.filter[severity == Severity.ERROR]
if (!allErrors.empty) {
throw new IllegalStateException(
"One or more resources contained errors : " + Joiner.on(',').join(allErrors)
);
}
}

}

0 comments on commit a53b0c4

Please sign in to comment.