/*******************************************************************************
* Copyright (c) 2010-2011 SAP AG 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:
* SAP AG - initial API and implementation
******************************************************************************/
package com.sap.furcas.runtime.parser.testbase;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import com.sap.furcas.runtime.parser.IModelAdapter;
import com.sap.furcas.runtime.parser.ModelParsingResult;
import com.sap.furcas.runtime.parser.ParserFacade;
import com.sap.furcas.runtime.parser.ParsingError;
import com.sap.furcas.runtime.parser.exceptions.UnknownProductionRuleException;
/**
* Parsing helper for parsing text fragments / files using a generated parser.
*/
public abstract class AbstractParsingHelper<ParsingResult> {
// public static class ParsingResult {
// /**
// * The injected model as the result of the parsing
// */
// public final ModelParsingResult result;
// /**
// * The model adapter used to
// */
// public final IModelAdapter modelAdapter;
//
// public ParsingResult(ModelParsingResult result, IModelAdapter modelAdapter) {
// this.result = result;
// this.modelAdapter = modelAdapter;
// }
// }
private final ParserFacade parserFacade;
public AbstractParsingHelper(ParserFacade parserFacade) {
this.parserFacade = parserFacade;
}
protected abstract IModelAdapter createModelAdapter();
protected abstract ParsingResult createParsingResult(IModelAdapter modelAdapter, ModelParsingResult result);
public ParsingResult parseString(String sample) throws IOException, UnknownProductionRuleException {
InputStream charStream = new ByteArrayInputStream(sample.getBytes());
IModelAdapter modelAdapter = createModelAdapter();
ModelParsingResult result = parseStream(charStream, modelAdapter);
return createParsingResult(modelAdapter, result);
}
public ModelParsingResult parseString(String sample, IModelAdapter modelAdapter) throws IOException, UnknownProductionRuleException {
InputStream charStream = new ByteArrayInputStream(sample.getBytes());
return parseStream(charStream, modelAdapter);
}
public ParsingResult parseString(String sample, int expectedErrors) throws IOException, UnknownProductionRuleException {
InputStream charStream = new ByteArrayInputStream(sample.getBytes());
IModelAdapter modelAdapter = createModelAdapter();
ModelParsingResult result = parseStream(charStream, expectedErrors, modelAdapter);
return createParsingResult(modelAdapter, result);
}
public ParsingResult parseFile(String dslSampleFile, String DSLSAMPLEDIR, int expectedErrors) throws Exception {
IModelAdapter modelAdapter = createModelAdapter();
InputStream charStream = new FileInputStream(new File(DSLSAMPLEDIR + dslSampleFile));
ModelParsingResult result = parseStream(charStream, expectedErrors, modelAdapter);
return createParsingResult(modelAdapter, result);
}
public ModelParsingResult parseFile(String dslSampleFile, String DSLSAMPLEDIR, int expectedErrors, IModelAdapter modelAdapter) throws Exception {
return parseFile(new File(DSLSAMPLEDIR + dslSampleFile), expectedErrors, modelAdapter);
}
protected ModelParsingResult parseFile(File file, int expectedErrors, IModelAdapter modelAdapter) throws Exception {
InputStream charStream = new FileInputStream(file);
return parseStream(charStream, expectedErrors, modelAdapter);
}
/**
* Low level parsing method offering full control over the used model adapter.
*/
public ModelParsingResult parseStream(InputStream in, int expectedErrors, IModelAdapter modelAdapter) throws IOException, UnknownProductionRuleException {
ModelParsingResult result = parseStream(in, modelAdapter);
checkModelForParsingErrors(expectedErrors, result);
return result;
}
/**
* Low level parsing method offering full control over the used model adapter.
*/
public ModelParsingResult parseStream(InputStream in, IModelAdapter modelAdapter) throws IOException,
UnknownProductionRuleException {
return parserFacade.parseProductionRule(in, modelAdapter, /* use main rule */null, null, null);
}
protected void checkModelForParsingErrors(int expectedErrors, ModelParsingResult result) {
List<ParsingError> errors = result.getErrors();
if (errors != null && errors.size() > 0) {
if (expectedErrors != errors.size()) {
StringBuffer messages = new StringBuffer();
for (ParsingError parsingError : errors) {
messages.append(parsingError.getMessage()).append(" in line ").append(parsingError.getLine()).append('\n');
}
if (expectedErrors == 0) {
fail(messages.toString());
} else { // fail special message if more than 0 errors were
// expected, so that it is obvious this test indeed
// intended some errors
assertEquals("Bad number of errors after parsing\n" + messages.toString(), expectedErrors, errors.size());
}
}
} else {
// fail if expected errors are more than 0
assertEquals("No errors occured, but errors were expected. ", expectedErrors, 0);
}
}
}