/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
package org.apache.easyant4e.tests;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.util.List;

import org.apache.easyant.core.report.PhaseReport;
import org.apache.easyant.core.report.TargetReport;
import org.apache.easyant4e.EasyAntConstants;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.junit.Test;

public class EasyantProjectServiceTest extends AbstractEasyAntTest {

/*
	@Test
	public void testGetIvyInstance() {
		Ivy ivy = projectService.getIvyInstance(testProject);
		assertNotNull(ivy);
	}
*/
	
	// @Test
	// public void testAddNature(){
	// assertFalse(projectService.hasEasyAntNature(testProject));
	// projectService.addNature(testProject);
	// assertTrue(projectService.hasEasyAntNature(testProject));
	// assertFalse(projectService.hasEasyAntBuilder(testProject));
	// }
	//	
	// @Test
	// public void testRemoveNature(){
	// assertFalse(projectService.hasEasyAntNature(testProject));
	// projectService.addNature(testProject);
	// assertTrue(projectService.hasEasyAntNature(testProject));
	// assertFalse(projectService.hasEasyAntBuilder(testProject));
	// projectService.removeNature(testProject);
	// assertFalse(projectService.hasEasyAntNature(testProject));
	// assertFalse(projectService.hasEasyAntBuilder(testProject));
	// }

	@Test
	public void testAddNatureOnJavaProject() {
		IProject javaProject = testJavaProject.getProject();
		assertFalse(projectService.hasEasyAntNature(javaProject));
		assertFalse(projectService.hasEasyAntBuilder(javaProject));
		projectService.addNature(javaProject);
		assertTrue(projectService.hasEasyAntNature(javaProject));
		assertTrue(projectService.hasEasyAntBuilder(javaProject));
		// TODO check classpath and source folder
	}

	@Test
	public void testRemoveNatureOnJavaProject() {
		IProject javaProject = testJavaProject.getProject();
		assertFalse(projectService.hasEasyAntNature(javaProject));
		projectService.addNature(javaProject);
		assertTrue(projectService.hasEasyAntNature(javaProject));
		assertTrue(projectService.hasEasyAntBuilder(javaProject));
		projectService.removeNature(javaProject);
		assertFalse(projectService.hasEasyAntNature(javaProject));
		assertFalse(projectService.hasEasyAntBuilder(javaProject));
		// TODO check classpath and source folder
	}

	@Test
	public void testGetPhases() {
		IProject javaProject = testJavaProject.getProject();
		IFile ivyFile = javaProject.getFile("module.ivy");
		assertNotNull(ivyFile);
		List<PhaseReport> phases = projectService.getPhases(ivyFile);
		assertNotNull(phases);		
		assertTrue("nb phases:" + phases.size(), phases.size() > 0);
	}

	@Test
	public void testGetTargets() {
		IProject javaProject = testJavaProject.getProject();
		IFile ivyFile = javaProject.getFile("module.ivy");
		assertNotNull(ivyFile);
		List<TargetReport> targets = projectService.getTargets(ivyFile);
		assertNotNull(targets);		
		assertTrue("nb targets:" + targets.size(), targets.size() > 0);
	}

	@Test
	public void testRunBuild() {
		try {
			projectService.runBuild(testJavaProject.getProject(), "compile", EasyAntConstants.ANT_LOGLEVEL_DEBUG, null);
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}

}
