/*******************************************************************************
 * Copyright (c) 2009, 2016 Mountainminds GmbH & Co. KG and Contributors
 * 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:
 *    Marc R. Hoffmann - initial API and implementation
 *    
 *******************************************************************************/
package org.jacoco.ant;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.resources.FileResource;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

/**
 * Unit tests for {@link AntResourcesLocator}.
 */
public class AntResourcesLocatorTest {

	@Rule
	public final TemporaryFolder folder = new TemporaryFolder();

	private AntResourcesLocator locator;

	@Before
	public void setup() {
		locator = new AntResourcesLocator("UTF-8", 8);
	}

	@Test
	public void testGetTabWidth() {
		assertEquals(8, locator.getTabWidth());
	}

	@Test
	public void testEmpty() {
		assertTrue(locator.isEmpty());
	}

	@Test
	public void testFile() throws IOException {
		locator.add(createFile("org/jacoco/example/Test.java", "AAA"));

		assertFalse(locator.isEmpty());
		final Reader source = locator.getSourceFile("org/jacoco/example",
				"Test.java");
		assertContent("AAA", source);
	}

	@Test
	public void testDirectory() throws IOException {
		createFile("src/org/jacoco/example/Test.java", "AAA");
		locator.add(new FileResource(folder.getRoot(), "src"));

		assertFalse(locator.isEmpty());
		final Reader source = locator.getSourceFile("org/jacoco/example",
				"Test.java");
		assertContent("AAA", source);
	}

	@Test
	public void testFilePrecedence() throws IOException {
		createFile("src/org/jacoco/example/Test.java", "DDD");
		locator.add(new FileResource(folder.getRoot(), "src"));
		locator.add(createFile("org/jacoco/example/Test.java", "FFF"));

		final Reader source = locator.getSourceFile("org/jacoco/example",
				"Test.java");
		assertContent("FFF", source);
	}

	@Test
	public void testDirectoryOrdering() throws IOException {
		createFile("src1/org/jacoco/example/Test.java", "AAA");
		locator.add(new FileResource(folder.getRoot(), "src1"));
		createFile("src2/org/jacoco/example/Test.java", "BBB");
		locator.add(new FileResource(folder.getRoot(), "src2"));
		createFile("src3/org/jacoco/example/Test.java", "CCC");
		locator.add(new FileResource(folder.getRoot(), "src3"));

		final Reader source = locator.getSourceFile("org/jacoco/example",
				"Test.java");
		assertContent("AAA", source);
	}

	@Test
	public void testAddAll() throws IOException {
		List<Resource> resources = new ArrayList<Resource>();
		resources.add(createFile("org/jacoco/example/Test1.java", "AAA"));
		resources.add(createFile("org/jacoco/example/Test2.java", "BBB"));
		locator.addAll(resources.iterator());

		assertFalse(locator.isEmpty());
		Reader source = locator.getSourceFile("org/jacoco/example",
				"Test1.java");
		assertContent("AAA", source);
		source = locator.getSourceFile("org/jacoco/example", "Test2.java");
		assertContent("BBB", source);
	}

	private Resource createFile(String path, String content) throws IOException {
		final File file = new File(folder.getRoot(), path);
		file.getParentFile().mkdirs();
		final Writer writer = new OutputStreamWriter(
				new FileOutputStream(file), "UTF-8");
		writer.write(content);
		writer.close();
		return new FileResource(folder.getRoot(), path);
	}

	private void assertContent(String expected, Reader source)
			throws IOException {
		assertNotNull(source);
		final BufferedReader buffer = new BufferedReader(source);
		assertEquals(expected, buffer.readLine());
		assertNull(buffer.readLine());
		buffer.close();
	}

}
