/*******************************************************************************
 * Copyright (c) 2010 Red Hat Inc. 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
 *******************************************************************************/
package org.eclipse.linuxtools.changelog.tests.fixtures;

import static org.junit.Assert.*;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.cdt.core.model.CoreModel;

/**
 * @author Redhat Inc.
 * 
 */
public class TestChangeLogTestProject {

	private ChangeLogTestProject project;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		project = new ChangeLogTestProject("com.redhat.testchangelog.project");
	}

	/**
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
		// dispose
		project.getTestProject().delete(true, null);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.linuxtools.changelog.tests.fixtures.ChangeLogTestProject#addFileToProject(java.lang.String, java.lang.String, java.io.InputStream)}
	 * .
	 */
	@Test
	public void testAddFileToProject() throws Exception {
		String fileContent = "some content";
		InputStream newFileInputStream = new ByteArrayInputStream(
				fileContent.getBytes());
		// Create file "testfile.txt" with content "some content" at
		// "/this/is/a/testpath"
		project.addFileToProject("/this/is/a/testpath", "testfile.txt",
				newFileInputStream);
		IProject p = project.getTestProject();

		// Paths along the way should have been created
		IResource member = p.findMember(new Path("/this"));
		assertNotNull(member);
		assertEquals("this", member.getName());
		member = p.findMember(new Path("/this/is"));
		assertNotNull(member);
		assertEquals("is", member.getName());
		member = p.findMember(new Path("/this/is/a"));
		assertNotNull(member);
		assertEquals("a", member.getName());
		member = p.findMember(new Path("/this/is/a/testpath"));
		assertNotNull(member);
		assertEquals("testpath", member.getName());

		// Testfile should be around
		IResource createdFile = p.findMember(new Path("/this/is/a/testpath/testfile.txt"));
		assertNotNull(createdFile);
		assertEquals("this/is/a/testpath/testfile.txt", createdFile.getProjectRelativePath().toString());
		assertEquals("testfile.txt", createdFile.getName());
		assertTrue(createdFile instanceof IFile);

		// Content should be "some content"
		BufferedReader br = new BufferedReader(new InputStreamReader(
				new FileInputStream(createdFile.getLocation().toFile())));
		String actualContent = br.readLine();
		br.close();
		assertEquals(fileContent, actualContent);
		
		// this should throw an IllegalStateException
		boolean exceptionTrown = false;
		try {
			project.addFileToProject("donnot/care", "not_important.java",
					null /* should cause exception */);
		} catch (IllegalStateException e) {
			// pass
			exceptionTrown = true;
		}
		assertTrue(exceptionTrown);
	}
	
	/**
	 * We should be able to add a Java nature to a project.
	 * 
	 * @throws Exception
	 */
	@Test
	public void canAddJavaNature() throws Exception {
		IJavaProject javaProject = this.project.addJavaNature();
		assertNotNull(javaProject);
	}
	
	/**
	 * We should be able to add a C nature to a project.
	 * 
	 * @throws Exception
	 */
	@Test
	public void canAddCNature() throws Exception {
		IProject cProject = this.project.getTestProject();
		assertTrue(!CoreModel.hasCNature(cProject));
		// Add C nature
		this.project.addCNature();
		cProject = this.project.getTestProject();
		assertTrue(CoreModel.hasCNature(cProject));
	}
	
	/**
	 * We should be able to add a C++ nature to a project.
	 * 
	 * @throws Exception
	 */
	@Test
	public void canAddCCNature() throws Exception {
		IProject ccProject = this.project.getTestProject();
		assertTrue(!CoreModel.hasCCNature(ccProject));
		// Add C++ nature
		this.project.addCCNature();
		ccProject = this.project.getTestProject();
		assertTrue(CoreModel.hasCCNature(ccProject));
	}

}
