blob: da531ab13efdd847d1450717c641ca36b055709a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2014 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Andrew Gvozdev
*******************************************************************************/
package org.eclipse.cdt.errorparsers.xlc.tests;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.IErrorParserNamed;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.core.ProblemMarkerInfo;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
/*
* Helper tester class to be able to test XlcErrorParser which extends AbstractErrorParser.
*/
public class XlcErrorParserTester {
public static final String XLC_ERROR_PARSER_ID = "org.eclipse.cdt.errorparsers.xlc.XlcErrorParser";
static private int counter = 0;
IProject fTempProject = ResourcesPlugin.getWorkspace().getRoot()
.getProject("XlcErrorParserTester.temp." + counter++);
XlcErrorParserTester() {
try {
fTempProject.create(null);
} catch (CoreException e) {
e.printStackTrace();
fail("Exception creating temporary project " + fTempProject.getName() + ": " + e);
}
}
private class MarkerData {
private String fileName;
private int lineNumber;
private int severity;
private String message;
}
private List<MarkerData> markerDataList = new ArrayList<>();
/*
* Dummy class implementing IMarkerGenerator lets get through testing
* without NPE.
*/
private class MockMarkerGenerator implements IMarkerGenerator {
@Override
public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) {
// dummy
}
@Override
public void addMarker(ProblemMarkerInfo problemMarkerInfo) {
// dummy
}
}
/*
* Class MockErrorParserManager replaces ErrorParserManager
* with the purpose to be able to inquire how the line was parsed.
* fileName, lineNumber, message and severity are populated
* to be accessed from the test cases.
* Relying on internal implementation of ErrorPattern.RecordError()
* to provide necessary data via generateExternalMarker() call
*/
private class MockErrorParserManager extends ErrorParserManager {
private MockErrorParserManager() {
super(fTempProject, new MockMarkerGenerator());
}
/*
* A stub function just to return non-null IFile.
* Necessary to trick ErrorPattern.RecordError() to generate markers.
*/
@Override
public IFile findFileName(String fileName) {
if (fileName != null && fileName.trim().length() > 0)
return fTempProject.getFile(fileName);
return null;
}
/**
* Called by ErrorPattern.RecordError() for external problem markers
*/
@Override
public void generateExternalMarker(IResource rc, int lineNumb, String desc, int sev, String varName,
IPath externalPath) {
// if rc is this project it means that file was not found
MarkerData markerData = new MarkerData();
if (rc != null && rc != fTempProject) {
markerData.fileName = rc.getName();
} else {
markerData.fileName = "";
}
markerData.lineNumber = lineNumb;
markerData.message = desc;
markerData.severity = sev;
markerDataList.add(markerData);
}
}
/**
* Main method called by individual error parser tests.
* @param line one xlC error message
* @return
*/
boolean parseLine(String line) {
IErrorParserNamed errorParser = ErrorParserManager.getErrorParserCopy(XLC_ERROR_PARSER_ID);
assertNotNull(errorParser);
MockErrorParserManager epManager = new MockErrorParserManager();
return errorParser.processLine(line, epManager);
}
int getNumberOfMarkers() {
return markerDataList.size();
}
String getFileName(int i) {
return markerDataList.get(i).fileName;
}
int getLineNumber(int i) {
return markerDataList.get(i).lineNumber;
}
int getSeverity(int i) {
return markerDataList.get(i).severity;
}
String getMessage(int i) {
return markerDataList.get(i).message;
}
}