/*******************************************************************************
 * Copyright (c) 2008, 2017 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
 ******************************************************************************/

package org.eclipse.ui.tests.markers;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.expressions.EvaluationResult;
import org.eclipse.core.expressions.TestExpression;
import org.eclipse.core.resources.IFolder;
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.ui.tests.harness.util.UITestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/**
 *
 * @since 3.5
 * @author Prakash G.R.
 *
 */
@RunWith(JUnit4.class)
public class MarkerTesterTest extends UITestCase {

	private static final String MARKER_NAMESPACE = "org.eclipse.ui.ide.marker";
	private IProject project;

	public MarkerTesterTest() {
		super(MarkerTesterTest.class.getSimpleName());
	}

	@Override
	protected void doSetUp() throws Exception {
		super.doSetUp();
		project = ResourcesPlugin.getWorkspace().getRoot().getProject("tests");
		if (!project.exists()) {
			project.create(null);
		}

		if (!project.isOpen()) {
			project.open(null);
		}
	}

	@Override
	protected void doTearDown() throws Exception {
		super.doTearDown();
		if (project.exists()) {
			project.delete(true, null);
		}
	}

	@Test
	public void testSeverity() throws Exception {

		IMarker errorMarker = project.createMarker(IMarker.PROBLEM);
		Map<String, Object> attributes = new HashMap<>();
		attributes.put(IMarker.SEVERITY, Integer.valueOf(IMarker.SEVERITY_ERROR));
		errorMarker.setAttributes(attributes);

		EvaluationContext context = new EvaluationContext(null, errorMarker);
		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
				"severity", null, Integer.valueOf(IMarker.SEVERITY_ERROR));
		EvaluationResult result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		IMarker warningMarker = project.createMarker(IMarker.PROBLEM);
		attributes = new HashMap<>();
		attributes.put(IMarker.SEVERITY, Integer.valueOf(IMarker.SEVERITY_WARNING));
		warningMarker.setAttributes(attributes);

		context = new EvaluationContext(null, warningMarker);
		testExpression = new TestExpression(MARKER_NAMESPACE, "severity", null,
				Integer.valueOf(IMarker.SEVERITY_WARNING));
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

	}

	@Test
	public void testType() throws Exception {

		IMarker problemMarker = project.createMarker(IMarker.PROBLEM);

		EvaluationContext context = new EvaluationContext(null, problemMarker);
		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
				"type", null, IMarker.PROBLEM);
		EvaluationResult result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		IMarker bookmarkMarker = project.createMarker(IMarker.BOOKMARK);

		context = new EvaluationContext(null, bookmarkMarker);
		testExpression = new TestExpression(MARKER_NAMESPACE, "type", null,
				IMarker.BOOKMARK);
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);
	}

	@Test
	public void testSuperType() throws Exception {

		IMarker problemMarker = project.createMarker(IMarker.PROBLEM);

		EvaluationContext context = new EvaluationContext(null, problemMarker);
		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
				"superType", null, IMarker.MARKER);
		EvaluationResult result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		testExpression = new TestExpression(MARKER_NAMESPACE, "superType",
				null, IMarker.BOOKMARK);
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.FALSE, result);
	}

	@Test
	public void testPriority() throws Exception {

		IMarker highPriority = project.createMarker(IMarker.PROBLEM);
		Map<String, Object> attributes = new HashMap<>();
		attributes.put(IMarker.PRIORITY, Integer.valueOf(IMarker.PRIORITY_HIGH));
		highPriority.setAttributes(attributes);

		EvaluationContext context = new EvaluationContext(null, highPriority);
		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
				"priority", null, Integer.valueOf(IMarker.PRIORITY_HIGH));
		EvaluationResult result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		IMarker lowPriority = project.createMarker(IMarker.PROBLEM);
		attributes = new HashMap<>();
		attributes.put(IMarker.PRIORITY, Integer.valueOf(IMarker.PRIORITY_LOW));
		lowPriority.setAttributes(attributes);

		context = new EvaluationContext(null, lowPriority);
		testExpression = new TestExpression(MARKER_NAMESPACE, "priority", null,
				Integer.valueOf(IMarker.PRIORITY_LOW));
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);
	}

	@Test
	public void testDone() throws Exception {

		IMarker done = project.createMarker(IMarker.TASK);
		Map<String, Object> attributes = new HashMap<>();
		attributes.put(IMarker.DONE, Boolean.TRUE);
		done.setAttributes(attributes);

		EvaluationContext context = new EvaluationContext(null, done);
		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
				"done", null, Boolean.TRUE);
		EvaluationResult result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		IMarker notDone = project.createMarker(IMarker.TASK);
		attributes = new HashMap<>();
		attributes.put(IMarker.DONE, Boolean.FALSE);
		notDone.setAttributes(attributes);

		context = new EvaluationContext(null, notDone);
		testExpression = new TestExpression(MARKER_NAMESPACE, "done", null,
				Boolean.FALSE);
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		IMarker notSet = project.createMarker(IMarker.TASK);

		context = new EvaluationContext(null, notSet);
		testExpression = new TestExpression(MARKER_NAMESPACE, "done", null,
				Boolean.TRUE);
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.FALSE, result);
	}

	@Test
	public void testMessage() throws Exception {

		IMarker someTaskMarker = project.createMarker(IMarker.TASK);
		Map<String, String> attributes = new HashMap<>();
		attributes.put(IMarker.MESSAGE, "Some nice message to test");
		someTaskMarker.setAttributes(attributes);

		EvaluationContext context = new EvaluationContext(null, someTaskMarker);
		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
				"message", null, "Some nice message to test");
		EvaluationResult result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		testExpression = new TestExpression(MARKER_NAMESPACE, "message", null,
				"Some*");
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		testExpression = new TestExpression(MARKER_NAMESPACE, "message", null,
				"*test");
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		testExpression = new TestExpression(MARKER_NAMESPACE, "message", null,
				"*nice*");
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		testExpression = new TestExpression(MARKER_NAMESPACE, "message", null,
				"*noway*");
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.FALSE, result);

	}

	@Test
	public void testResourceType() throws Exception {

		IMarker someTaskMarker = project.createMarker(IMarker.TASK);
		Map<String, String> attributes = new HashMap<>();
		attributes.put(IMarker.MESSAGE, "Some nice message to test");
		someTaskMarker.setAttributes(attributes);

		EvaluationContext context = new EvaluationContext(null, someTaskMarker);
		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
				"resourceType", null, Integer.valueOf(IResource.PROJECT));
		EvaluationResult result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

		IFolder folder = project.getFolder("forMarker");
		folder.create(true, true, null);

		IMarker someOtherMarker = folder.createMarker(IMarker.TASK);
		attributes = new HashMap<>();
		attributes.put(IMarker.MESSAGE, "Some nice message to test");
		someOtherMarker.setAttributes(attributes);

		context = new EvaluationContext(null, someOtherMarker);
		testExpression = new TestExpression(MARKER_NAMESPACE, "resourceType",
				null, Integer.valueOf(IResource.FOLDER));
		result = testExpression.evaluate(context);
		assertEquals(EvaluationResult.TRUE, result);

	}
}
