blob: 736ce9f1675f98649e8d0b381f5825f181a4c3cf [file] [log] [blame]
/**
* Copyright (c) 2007, 2009 Borland Software Corporation
*
* 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:
* bblajer - initial API and implementation
*/
package org.eclipse.gmf.tests.xpand;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.gmf.internal.xpand.BufferOutput;
import org.eclipse.gmf.internal.xpand.expression.SyntaxConstants;
import org.eclipse.gmf.internal.xpand.expression.TypeNameUtil;
import org.eclipse.gmf.internal.xpand.expression.Variable;
import org.eclipse.gmf.internal.xpand.model.XpandDefinition;
import org.eclipse.gmf.internal.xpand.model.XpandExecutionContext;
import org.eclipse.gmf.internal.xpand.util.ContextFactory;
import org.eclipse.gmf.internal.xpand.util.ParserException;
import org.eclipse.gmf.internal.xpand.util.ResourceManagerImpl;
import junit.framework.TestCase;
public class CompositeResourcesTest extends TestCase {
private XpandExecutionContext myContext;
private StringBuilder myBuffer;
private TestResourceManager myResourceManager;
@Override
protected void setUp() throws Exception {
super.setUp();
myBuffer = new StringBuilder();
myResourceManager = new TestResourceManager();
myContext = ContextFactory.createXpandContext(myResourceManager, new BufferOutput(myBuffer), Collections.<Variable>emptyList());
myContext = myContext.cloneWithVariable(new Variable("this", ""));
}
public void testOverrideXtend() {
myResourceManager.setPrefixes((String) null);
XpandDefinition definition = myContext.findDefinition(qualify("Overridable::test1"), EcorePackage.eINSTANCE.getEString(), new EClassifier[0]);
definition.evaluate(myContext);
assertEquals("1", myBuffer.toString());
myBuffer.delete(0, myBuffer.length());
myResourceManager.setPrefixes("override1", null);
definition = myContext.findDefinition(qualify("Overridable::test1"), EcorePackage.eINSTANCE.getEString(), new EClassifier[0]);
definition.evaluate(myContext);
assertEquals("2", myBuffer.toString());
}
public void testAutomaticAdviceLoad() {
myResourceManager.setPrefixes("override2", null);
XpandDefinition definition = myContext.findDefinition(qualify("Overridable::test1"), EcorePackage.eINSTANCE.getEString(), new EClassifier[0]);
definition.evaluate(myContext);
assertEquals("1added", myBuffer.toString());
myBuffer.delete(0, myBuffer.length());
myResourceManager.setPrefixes("override2", "override1", null);
definition = myContext.findDefinition(qualify("Overridable::test1"), EcorePackage.eINSTANCE.getEString(), new EClassifier[0]);
definition.evaluate(myContext);
assertEquals("2added", myBuffer.toString());
}
/**
* Tests that DEFINE statements are effectively the same as AROUND without targetDef.proceed()
*/
public void testRedefineInAspect() {
myResourceManager.setPrefixes((String) null);
XpandDefinition definition = myContext.findDefinition(qualify("Overridable::testRedefineInAspect"), EcorePackage.eINSTANCE.getEString(), new EClassifier[0]);
definition.evaluate(myContext);
assertEquals("testRedefineOriginal", myBuffer.toString());
myBuffer.delete(0, myBuffer.length());
myResourceManager.setPrefixes("override2", null);
definition = myContext.findDefinition(qualify("Overridable::testRedefineInAspect"), EcorePackage.eINSTANCE.getEString(), new EClassifier[0]);
definition.evaluate(myContext);
assertEquals("testRedefineRedefined", myBuffer.toString());
}
public void testOverrideXpand() {
myResourceManager.setPrefixes((String) null);
XpandDefinition definition = myContext.findDefinition(qualify("Overridable::test2"), EcorePackage.eINSTANCE.getEString(), new EClassifier[0]);
definition.evaluate(myContext);
assertEquals("<test4>", myBuffer.toString());
myBuffer.delete(0, myBuffer.length());
myResourceManager.setPrefixes("override3", null);
definition = myContext.findDefinition(qualify("Overridable::test2"), EcorePackage.eINSTANCE.getEString(), new EClassifier[0]);
definition.evaluate(myContext);
assertEquals("<test3>", myBuffer.toString());
}
private static String qualify(String unqualified) {
return "org::eclipse::gmf::tests::xpand::evaluate::" + unqualified;
}
private static class TestResourceManager extends ResourceManagerImpl {
private String[] mySuffixes;
public void setPrefixes(String... prefixes) {
mySuffixes = prefixes;
forgetAll();
}
@Override
protected boolean shouldCache() {
return true;
}
@Override
protected String getAspectsTemplateName(String fullyQualifiedName) {
return fullyQualifiedName + "_Aspects";
}
public Reader[] resolveMultiple(String fullyQualifiedName, String extension) throws IOException {
ArrayList<Reader> result = new ArrayList<Reader>(mySuffixes.length);
for (int i = 0; i < mySuffixes.length; i++) {
String templateName = TypeNameUtil.getLastSegment(fullyQualifiedName) + "." + extension;
String path = TypeNameUtil.withoutLastSegment(fullyQualifiedName).replaceAll(SyntaxConstants.NS_DELIM, "/");
if (mySuffixes[i] != null && mySuffixes[i].length() > 0) {
path += "/" + mySuffixes[i];
}
path += "/" + templateName;
Reader reader = getReader(path);
if (reader != null) {
result.add(reader);
}
}
if (result.isEmpty()) {
throw new FileNotFoundException();
}
return result.toArray(new Reader[result.size()]);
}
protected Reader getReader(String path) {
InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(path);
if (resourceAsStream == null) {
return null;
}
return new InputStreamReader(resourceAsStream, Charset.forName("ISO-8859-1"));
}
@Override
protected void handleParserException(ParserException ex) {
fail(ex.getClass().getName());
}
}
}