/**
* Copyright (C) 2010 STMicroelectronics
*
* This file is part of "Mind Compiler" is free software: you can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Contact: mind@ow2.org
*
* Authors: Matthieu Leclercq
* Contributors:
*/
package org.ow2.mind.unit;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.objectweb.fractal.adl.error.Error;
import org.objectweb.fractal.adl.error.ErrorLocator;
import org.ow2.mind.error.ErrorHelper;
public class ExpectedErrorHelper {
protected static final Pattern SEMANTIC_ERROR_PATTERN = Pattern
.compile("//#\\s*SemanticError\\s+GroupId=(\\w+)\\s+ErrorId=(\\w+)\\s+line=(\\d+)");
public static void checkErrors(final URL file, final List<Error> errors)
throws Exception {
final List<ExpectedError> expectedErrors = parserErrorLines(file);
if (errors.isEmpty() && !expectedErrors.isEmpty()) {
fail("Successful loading of erroneous " + file + ".");
}
for (final Error error : errors) {
checkError(error, expectedErrors);
}
assertTrue(expectedErrors.isEmpty(), "Exepected errors not found : "
+ expectedErrors);
}
public static List<ExpectedError> parserErrorLines(final URL file)
throws Exception {
final List<ExpectedError> expectedErrors = new ArrayList<ExpectedError>();
final LineNumberReader reader = new LineNumberReader(new InputStreamReader(
file.openStream()));
String line = reader.readLine();
while (line != null && line.startsWith("//#")) {
final Matcher matcher = SEMANTIC_ERROR_PATTERN.matcher(line);
if (!matcher.matches())
fail("Invalid SemanticError specification in " + file);
final ExpectedError expectedError = new ExpectedError();
expectedError.groupId = matcher.group(1);
expectedError.errorId = matcher.group(2);
expectedError.line = Integer.parseInt(matcher.group(3));
expectedErrors.add(expectedError);
line = reader.readLine();
}
return expectedErrors;
}
public static void checkError(final Error error,
final List<ExpectedError> expectedErrors) {
final ErrorLocator locator = error.getLocator();
assertNotNull(locator);
final int line = locator.getBeginLine();
final String groupId = error.getTemplate().getGroupId();
final String errorId = ((Enum<?>) error.getTemplate()).name();
final Iterator<ExpectedError> iter = expectedErrors.iterator();
while (iter.hasNext()) {
final ExpectedError expectedError = iter.next();
if (expectedError.line == line && expectedError.errorId.equals(errorId)
&& expectedError.groupId.equals(groupId)) {
iter.remove();
return;
}
}
// not found
fail("Unexpected error : GroupId=" + groupId + " ErrorId=" + errorId
+ " line=" + line + "\n" + ErrorHelper.formatError(error));
}
public static final class ExpectedError {
public String groupId;
public String errorId;
public int line;
@Override
public String toString() {
return "GroupId=" + groupId + " ErrorId=" + errorId + " line=" + line;
}
}
}