/*******************************************************************************
 * Copyright (c) 2008, 2016 xored software, Inc.
 *
 * 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:
 *     xored software, Inc. - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.ruby.testing.tests;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.tests.model.AbstractModelTests;
import org.eclipse.dltk.internal.testing.model.TestCaseElement;
import org.eclipse.dltk.internal.testing.model.TestSuiteElement;
import org.eclipse.dltk.ruby.testing.internal.testunit.TestUnitTestRunnerUI;
import org.eclipse.dltk.ruby.testing.internal.testunit.TestUnitTestingEngine;
import org.eclipse.dltk.testing.ITestElementResolver;
import org.eclipse.dltk.testing.TestElementResolution;
import org.eclipse.dltk.testing.model.ITestElement;
import org.junit.AfterClass;
import org.junit.Test;

public class RubyTestingTestUnitResolverTests extends AbstractModelTests {

	/**
	 * @param testProjectName
	 * @param name
	 */
	public RubyTestingTestUnitResolverTests(String name) {
		super(AllTests.BUNDLE_ID, name);
	}

	final static String projectName = "testing1"; //$NON-NLS-1$

	@Override
	public void setUpSuite() throws Exception {
		super.setUpSuite();
		setUpProject(projectName);
		waitUntilIndexesReady();
	}

	@AfterClass
	public static void cleanUp() throws Exception {
		deleteProject(projectName);
	}

	private ITestElementResolver createResolver() {
		final TestUnitTestingEngine engine = new TestUnitTestingEngine();
		return new TestUnitTestRunnerUI(engine, getScriptProject(projectName));
	}

	@Test
	public void testResolveMath() throws ModelException {
		final ITestElementResolver resolver = createResolver();
		final String moduleName = "test_math.rb"; //$NON-NLS-1$
		final String className = "X::MathTest"; //$NON-NLS-1$
		final String methodName = "test1"; //$NON-NLS-1$
		//
		final String testName = methodName + '(' + className + ')';
		TestSuiteElement suiteElement = new TestSuiteElement(null, className, className, 1);
		ITestElement testElement = new TestCaseElement(suiteElement, testName, testName);
		final TestElementResolution resolution = resolver.resolveElement(testElement);
		assertNotNull(resolution);
		assertNotNull(resolution.getElement());
		assertEquals(IModelElement.METHOD, resolution.getElement().getElementType());
		assertEquals(methodName, resolution.getElement().getElementName());
		final ISourceRange range = resolution.getRange();
		assertNotNull(range);
		final IResource resource = resolution.getElement().getResource();
		assertEquals(moduleName, resource.getProjectRelativePath().toString());
		ISourceModule module = (ISourceModule) DLTKCore.create((IFile) resource);
		assertNotNull(module);
		final String source = module.getSource();
		final int offset = range.getOffset();
		assertEquals("def " + methodName, source.substring(offset, offset //$NON-NLS-1$
				+ range.getLength()));
		final TestElementResolution resolution1 = resolver.resolveElement(suiteElement);
		assertNotNull(resolution1);
		assertNotNull(resolution1.getElement());
		assertEquals(IModelElement.TYPE, resolution1.getElement().getElementType());
		assertEquals(className, ((IType) resolution1.getElement()).getFullyQualifiedName("::")); //$NON-NLS-1$
		final ISourceRange range1 = resolution1.getRange();
		assertNotNull(range1);
		final IResource resource1 = resolution1.getElement().getResource();
		assertEquals(moduleName, resource1.getProjectRelativePath().toString());
		ISourceModule module1 = (ISourceModule) DLTKCore.create((IFile) resource1);
		assertNotNull(module1);
		final String source1 = module1.getSource();
		final int offset1 = range1.getOffset();
		final String rangeContent = source1.substring(offset1, offset1 + range1.getLength());
		assertTrue(rangeContent.indexOf("class") >= 0); //$NON-NLS-1$
		assertTrue(rangeContent.indexOf(resolution1.getElement().getElementName()) >= 0);
	}
}
