package com.sap.furcas.runtime.parser.incremental;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Collection;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.junit.BeforeClass;
import org.junit.Test;
import com.sap.furcas.metamodel.FURCAS.TCS.LiteralRef;
import com.sap.furcas.metamodel.FURCAS.TCS.Property;
import com.sap.furcas.metamodel.FURCAS.textblocks.AbstractToken;
import com.sap.furcas.metamodel.FURCAS.textblocks.DocumentNode;
import com.sap.furcas.metamodel.FURCAS.textblocks.LexedToken;
import com.sap.furcas.metamodel.FURCAS.textblocks.TextBlock;
import com.sap.furcas.parsergenerator.TCSSyntaxContainerBean;
import com.sap.furcas.runtime.parser.impl.DefaultPartitionAssignmentHandlerImpl;
import com.sap.furcas.runtime.parser.incremental.testbase.GeneratedParserAndFactoryBasedTest;
import com.sap.furcas.runtime.parser.incremental.testbase.GeneratedParserAndFactoryTestConfiguration;
import com.sap.furcas.runtime.parser.testbase.ClassLookup;
import com.sap.furcas.runtime.textblocks.model.TextBlocksModel;
import com.sap.furcas.runtime.textblocks.modifcation.TbChangeUtil;
import com.sap.furcas.runtime.textblocks.testutils.EMFTextBlocksModelElementFactory;
import com.sap.furcas.runtime.textblocks.testutils.TestSourceTextBlockCreator;
import com.sap.furcas.test.fixture.FeatureFixtureData;
import com.sap.furcas.test.testutils.ResourceTestHelper;
import com.sap.ide.cts.parser.errorhandling.SemanticParserException;
import com.sap.ide.cts.parser.incremental.IncrementalParserFacade;
/**
* A test for the use of the separator PArg..
*
* @author Thomas Goldschmidt
*/
public class TestSeparatorPArg extends GeneratedParserAndFactoryBasedTest {
private static final String LANGUAGE = "SeparatorFeatureTestSyntax";
private static final File TCS = FeatureFixtureData.PARG_SEPARATOR_TCS;
private static final File METAMODEL = FeatureFixtureData.PARG_SEPARATOR_METAMODEL;
private static ResourceSet resourceSet;
private static IncrementalParserFacade incrementalParserFacade;
@BeforeClass
public static void setupParser() throws Exception {
GeneratedParserAndFactoryTestConfiguration testConfig =
new GeneratedParserAndFactoryTestConfiguration(LANGUAGE, TCS, METAMODEL);
resourceSet = testConfig.getSourceConfiguration().getResourceSet();
TCSSyntaxContainerBean syntaxBean = parseSyntax(testConfig);
incrementalParserFacade = generateParserAndParserFactoryForLanguage(syntaxBean, testConfig,
resourceSet, new DefaultPartitionAssignmentHandlerImpl(), new ClassLookup() {
@Override
public Class<?> loadClass(String className)
throws ClassNotFoundException {
return Class.forName(className);
}});
}
private EObject rootElement;
private EMFTextBlocksModelElementFactory modelFactory;
private Resource transientParsingResource;
private TextBlock rootTextBlock;
/**
* The sequence elements of the separator and the property for which the separator is defined
* should be correctly set.
*/
@Test
public void testSeparatorSequenceElements() throws Exception {
setupModelFromTextToParse(
"PropertyArgument_Separator.sam", FeatureFixtureData.EXAMPLE_FOLDER);
//
Collection<?> usages = (Collection<?>) rootElement.eGet(rootElement.eClass().getEStructuralFeature("usages"));
for (Object object : usages) {
EObject usage = (EObject) object;
assertTrue(usage.eIsSet(usage.eClass().getEStructuralFeature("name")));
}
//Make sure sequence elements where correctly set.
assertTrue(rootTextBlock != null);
assertTrue(rootTextBlock.getType() != null);
for (DocumentNode dn : rootTextBlock.getSubNodes()) {
if(dn instanceof TextBlock) {
assertTrue(dn.getSequenceElement() instanceof Property);
} else if(dn instanceof LexedToken && ((LexedToken)dn).getValue().equals(",")) {
assertTrue(dn.getSequenceElement() instanceof LiteralRef);
}
}
}
protected void setupModelFromTextToParse(String textToParse, String sampleDir) throws SemanticParserException, IOException {
rootElement = parseFile(textToParse, sampleDir);
}
protected EObject parseFile(String dslSampleFile, String sampleDir) throws SemanticParserException, IOException {
InputStream in = new FileInputStream(new File(sampleDir + dslSampleFile));
InputStreamReader isr = new InputStreamReader(in);
Reader reader = new BufferedReader(isr);
StringBuilder s = new StringBuilder();
char buffer[] = new char[2048];
int size;
while((size = reader.read(buffer)) > 0) {
s.append(buffer, 0, size);
}
modelFactory = new EMFTextBlocksModelElementFactory();
transientParsingResource = ResourceTestHelper.createTransientResource(resourceSet);
AbstractToken content = modelFactory.createToken("");
rootTextBlock = TestSourceTextBlockCreator.initialiseTextBlocksWithContentToken(modelFactory, content);
transientParsingResource.getContents().add(rootTextBlock);
TextBlocksModel tbModel = new TextBlocksModel(rootTextBlock);
tbModel.replace(0, 0, s.toString());
TextBlock currentVersionTb = incrementalParserFacade.parseIncrementally(rootTextBlock);
rootTextBlock = (TextBlock) TbChangeUtil.cleanUp(currentVersionTb);
EObject result = currentVersionTb.getCorrespondingModelElements().iterator().next();
return result;
}
}