blob: c0137a26d2a78a577a2cfd9a13486d6b83fe6ade [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2017 NumberFour 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:
* NumberFour AG - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.core.tests;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
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.dltk.compiler.problem.DefaultProblem;
import org.eclipse.dltk.compiler.problem.DefaultProblemIdentifier;
import org.eclipse.dltk.compiler.problem.IProblemIdentifier;
import org.eclipse.dltk.core.IScriptModelMarker;
import org.eclipse.dltk.internal.core.util.Util;
import org.eclipse.dltk.utils.CharArraySequence;
import org.eclipse.dltk.utils.TextUtils;
import org.junit.Assert;
/**
* Static methods for problem marker validation in JUnit 4 tests. Can be used as
* supertype of the test class.
*/
public class ProblemTestUtil extends Assert {
/**
* Returns all the problem markers of the specified resource, the markers
* are order by the start offset.
*/
public static IMarker[] findProblems(IResource resource)
throws CoreException {
final IMarker[] problems = resource.findMarkers(
DefaultProblem.MARKER_TYPE_PROBLEM, true,
IResource.DEPTH_INFINITE);
Arrays.sort(problems, (o1, o2) -> o1.getAttribute(IMarker.CHAR_START, 0)
- o2.getAttribute(IMarker.CHAR_START, 0));
return problems;
}
/**
* Returns problem identifier from the specified problem marker.
*/
public static IProblemIdentifier getProblemId(final IMarker problem) {
return DefaultProblemIdentifier.decode(problem.getAttribute(
IScriptModelMarker.ID, null));
}
/**
* Returns message from the specified problem marker.
*/
public static String getMessage(final IMarker problem) {
return problem.getAttribute(IMarker.MESSAGE, null);
}
/**
* Asserts that specified resource doesn't have any problem markers.
*/
public static void assertNoProblems(IResource resource)
throws CoreException {
final IMarker[] problems = findProblems(resource);
assertEquals(resource.getName() + ":" + toString(problems), 0,
problems.length);
}
/**
* Asserts the expected number of problems in the specified array.
*/
public static void assertProblemCount(int expectedCount, IMarker[] problems) {
assertEquals(toString(problems), expectedCount, problems.length);
}
/**
* Returns string representation of the specified problem marker.
*/
public static String toString(IMarker marker) {
final StringBuilder sb = new StringBuilder();
sb.append(marker.getResource().getFullPath()).append(':');
final IProblemIdentifier id = getProblemId(marker);
if (id != null) {
sb.append(id.name()).append(":");
}
final String message = marker.getAttribute(IMarker.MESSAGE, "?");
sb.append(message);
final int lineNumber = marker.getAttribute(IMarker.LINE_NUMBER, 0);
if (lineNumber > 0) {
sb.append(":").append(lineNumber);
}
return sb.toString();
}
/**
* @param markers
* @return messages values concatenated with ',', e.g
* "message1,message2,message3"
*/
public static String toString(IMarker[] markers) {
final List<String> text = new ArrayList<String>();
for (IMarker marker : markers) {
text.add(toString(marker));
}
return TextUtils.join(text, ", ");
}
/**
* Returns the text of the line referenced by the specified marker.
*/
public static String getLine(IMarker marker) throws CoreException {
final IFile file = (IFile) marker.getResource();
final int lineNumber = marker.getAttribute(IMarker.LINE_NUMBER, 0) - 1;
assertTrue("Marker doesn't have line number", lineNumber >= 0);
final String[] lines = TextUtils.splitLines(new CharArraySequence(Util
.getResourceContentsAsCharArray(file)));
return lines[lineNumber];
}
/**
* Returns project with the specified name.
*/
protected static IProject getProject(String name) {
return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
}
}