package com.sap.furcas.ide.editor.test.utils;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.io.InputStream;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import com.sap.furcas.metamodel.FURCAS.textblocks.AbstractToken;
import com.sap.furcas.metamodel.FURCAS.textblocks.LexedToken;
import com.sap.furcas.metamodel.FURCAS.textblocks.TextBlock;
import com.sap.furcas.metamodel.FURCAS.textblocks.Version;
import com.sap.furcas.runtime.common.exceptions.ParserInstantiationException;
import com.sap.furcas.runtime.parser.ParsingError;
import com.sap.furcas.runtime.parser.incremental.testbase.GeneratedParserAndFactoryBasedTest;
import com.sap.furcas.runtime.parser.incremental.testbase.TcsTestHelper;
import com.sap.furcas.runtime.textblocks.model.TextBlocksModel;
import com.sap.furcas.runtime.textblocks.modifcation.TbChangeUtil;
import com.sap.furcas.runtime.textblocks.modifcation.TbVersionUtil;
import com.sap.furcas.runtime.textblocks.testutils.EMFTextBlocksModelElementFactory;
import com.sap.furcas.runtime.textblocks.testutils.TestSourceTextBlockCreator;
import com.sap.furcas.runtime.textblocks.testutils.TextBlocksModelElementFactory;
import com.sap.ide.cts.parser.errorhandling.SemanticParserException;
import com.sap.ide.cts.parser.incremental.IncrementalParserFacade;
public abstract class GeneratedTextblocksBasedTest extends GeneratedParserAndFactoryBasedTest {
protected TextBlocksModel tbModel;
public void initTbModel(InputStream contentStream, IncrementalParserFacade facade,
StringReplacement postFixtureParseReplacement) throws SemanticParserException, ParserInstantiationException {
AbstractToken content = createToken("");
TextBlock rootBlock = initialiseTextBlocksWithContentToken(content);
tbModel = new TextBlocksModel(rootBlock);
String fixtureContents = TcsTestHelper.getStreamContents(contentStream);
tbModel.replace(0, 0, fixtureContents);
rootBlock = TbVersionUtil.getOtherVersion(rootBlock, Version.PREVIOUS);
List<ParsingError> errorList = facade.dryParse(rootBlock);
if (errorList.size() != 0) {
if (!fixtureContents.equals("")) {
// empty fixture fails to parse but should still be a valid
// fixture
// as a special case
System.out.println("Error parsing fixture:");
for (ParsingError pe : errorList) {
System.out.println(pe.toString());
}
fail("error parsing fixture");
}
} else {
TextBlock result = facade.parseIncrementally(rootBlock);
assertNotNull(result);
// re-create tbModel
TbChangeUtil.cleanUp(result);
// add a new template
tbModel = new TextBlocksModel(rootBlock);
// add post-parse replacement
// this is used for strings that would otherwise throw parse errors
// if
// contained in the fixture directly
if (postFixtureParseReplacement != null) {
// used to compute offset
Document dummyDoc = new Document(fixtureContents);
int offset = 0;
try {
offset = dummyDoc.getLineOffset(postFixtureParseReplacement.getLine())
+ postFixtureParseReplacement.getCharPositionInLine();
} catch (BadLocationException e) {
fail("post-fixture-pase replacement failed");
}
tbModel.replace(offset, postFixtureParseReplacement.getLength(),
postFixtureParseReplacement.getReplacementString());
}
}
}
private static TextBlock initialiseTextBlocksWithContentToken(AbstractToken contentToken) {
TextBlocksModelElementFactory modelFactory = new EMFTextBlocksModelElementFactory();
return TestSourceTextBlockCreator.initialiseTextBlocksWithContentToken(modelFactory, contentToken);
}
private static LexedToken createToken(String content) {
TextBlocksModelElementFactory modelFactory = new EMFTextBlocksModelElementFactory();
return modelFactory.createToken(content);
}
}