/*******************************************************************************
 * 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);
	}

}
