package com.sap.furcas.parser.tcs.bootstrap;
import java.io.File;
import java.io.FileInputStream;
import java.util.Set;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.ocl.ecore.opposites.DefaultOppositeEndFinder;
import org.junit.BeforeClass;
import org.junit.Test;
import com.sap.furcas.metamodel.FURCAS.FURCASPackage;
import com.sap.furcas.modeladaptation.emf.adaptation.EMFModelAdapter;
import com.sap.furcas.modeladaptation.emf.lookup.QueryBasedEcoreMetaModelLookUp;
import com.sap.furcas.parser.tcs.TCSSyntaxDefinition;
import com.sap.furcas.parser.tcs.scenario.ClassLookupImpl;
import com.sap.furcas.parsergenerator.TCSSyntaxContainerBean;
import com.sap.furcas.runtime.common.interfaces.IMetaModelLookup;
import com.sap.furcas.runtime.common.util.EcoreHelper;
import com.sap.furcas.runtime.common.util.TCSSpecificOCLEvaluator;
import com.sap.furcas.runtime.parser.IModelAdapter;
import com.sap.furcas.runtime.parser.ParserFacade;
import com.sap.furcas.runtime.parser.PartitionAssignmentHandlerBaseImpl;
import com.sap.furcas.runtime.parser.impl.DefaultTextAwareModelAdapter;
import com.sap.furcas.runtime.parser.testbase.GeneratedParserBasedTest;
import com.sap.furcas.runtime.parser.testbase.GeneratedParserTestConfiguration;
import com.sap.furcas.runtime.parser.testbase.stubs.StubParsingHelper;
import com.sap.furcas.test.testutils.ResourceTestHelper;
/**
* This class runs a full bootstrap cycle, if started with the useBootstrappedTCSParser = true system property.
*
* The bootstrapped parser is used to create a new TCSParser based on the same TCS.tcs that was used
* to create the bootstrapped parser himself. The new TCSParser is then used to parse the TCS.tcs again.
*
* If this test passes, then it is known that bootstrapped parser is capable of performing a full bootstrap
* cycle. The old stable TCSParser can be replaced by the boostrapped one with confidence.
*
*
* @author Stephan Erb (d049157)
*
*/
public class TCSBootstrappingTest extends GeneratedParserBasedTest {
private static final String LANGUAGE = "TCS";
private static final File TCS = TCSSyntaxDefinition.TCS_TCS;
private static final File[] METAMODELS = { }; // keep empty. The FURCAS metamodel is added below
private static StubParsingHelper parsingHelper;
private static IModelAdapter modelAdapter;
@BeforeClass
public static void setupParser() throws Exception {
GeneratedParserTestConfiguration testConfig = new GeneratedParserTestConfiguration(LANGUAGE, TCS, METAMODELS);
ResourceSet resourceSet = testConfig.getSourceConfiguration().getResourceSet();
Set<URI> metamodels = testConfig.getSourceConfiguration().getReferenceScope();
metamodels.addAll(ResourceTestHelper.createEcoreReferenceScope());
metamodels.addAll(ResourceTestHelper.createFURCASReferenceScope());
IMetaModelLookup<EObject> metamodelLookup = new QueryBasedEcoreMetaModelLookUp(resourceSet, metamodels);
TCSSyntaxContainerBean syntaxBeanyntaxBean = parseSyntax(testConfig);
ParserFacade facade = generateParserForLanguage(syntaxBeanyntaxBean, testConfig, new ClassLookupImpl());
Resource transientResource = EcoreHelper.createTransientParsingResource(resourceSet, FURCASPackage.eINSTANCE.getNsURI());
parsingHelper = new StubParsingHelper(facade);
modelAdapter = new DefaultTextAwareModelAdapter(new EMFModelAdapter(testConfig.getSourceConfiguration().getResourceSet(),
new PartitionAssignmentHandlerBaseImpl(transientResource), metamodelLookup, metamodels, new TCSSpecificOCLEvaluator(),
DefaultOppositeEndFinder.getInstance()));
}
@Test
public void testParseTCSTCSWithoutErrors() throws Exception {
parsingHelper.parseStream(new FileInputStream(TCS), /* expected errors */ 0, modelAdapter);
}
}