/*******************************************************************************
 * Copyright (c) 2010 Tasktop Technologies and others.
 * 
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * https://www.eclipse.org/legal/epl-2.0
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.resources.tests;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Set;

import junit.framework.TestCase;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.mylyn.internal.resources.ui.ResourcePatternExclusionStrategy;
import org.eclipse.mylyn.internal.resources.ui.ResourcesUiPreferenceInitializer;

/**
 * @author Shawn Minto
 */
public class ResourcePatternExclusionStrategyTest extends TestCase {
	public void testForcedExclusionPatterns() {
		String pattern = "file:/foo";
		try {
			ResourcesUiPreferenceInitializer.addForcedExclusionPattern(pattern);
			assertTrue(ResourcesUiPreferenceInitializer.getForcedExcludedResourcePatterns().contains(pattern));
			assertFalse(ResourcesUiPreferenceInitializer.getExcludedResourcePatterns().contains(pattern));
		} finally {
			ResourcesUiPreferenceInitializer.removeForcedExclusionPattern(pattern);
		}
	}

	public void testFileUriExclusionPattern() throws URISyntaxException {
		URI uri = new URI("file:/C:");
		assertTrue(ResourcePatternExclusionStrategy.isUriExcluded(uri.toString(), "file:/C:"));

		uri = new URI("file:/C:/foo/bar");
		assertTrue(ResourcePatternExclusionStrategy.isUriExcluded(uri.toString(), "file:/C:"));
	}

	public void testSnapshotExclusionPattern() {
		// .*

		Set<String> patterns = new HashSet<String>();
		patterns.addAll(ResourcePatternExclusionStrategy.convertToAntPattern(".*"));

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.foo"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.foo/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.foo"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.foo/foo2"), null, patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/foo.test"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/d.foo"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/d.foo"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/d.foo/foo2"), null, patterns));

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.foo2"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.foo2/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.foo2/foo3"), null, patterns));
	}

	public void testFileExclusionPattern() {
		// *.doc

		Set<String> patterns = new HashSet<String>();
		patterns.addAll(ResourcePatternExclusionStrategy.convertToAntPattern("*.doc"));

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc/foo2"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/d.doc"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/~d.doc"), null, patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/d.doc2"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/d.doc2/foo2"), null, patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/document"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2/test"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc2/foo3"), null, patterns));
	}

	public void testAllExclusionPattern() {
		// *
		Set<String> patterns = new HashSet<String>();
		patterns.addAll(ResourcePatternExclusionStrategy.convertToAntPattern("*"));

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc2/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/~"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/test"), null, patterns));

	}

	public void testAllFileExclusionPattern() {
		// *.*
		Set<String> patterns = new HashSet<String>();
		patterns.addAll(ResourcePatternExclusionStrategy.convertToAntPattern("*.*"));

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc2/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.test"), null, patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/~"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/test"), null, patterns));

	}

	public void testWildcardExclusionPattern() {
		// ~*
		Set<String> patterns = new HashSet<String>();
		patterns.addAll(ResourcePatternExclusionStrategy.convertToAntPattern("~*"));

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/~"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/~.doc"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/~.doc2/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/~folder/.doc2/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/~test.doc"), null, patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/test"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/test~"), null, patterns));

	}

	public void testNoWildcardExclusionPattern() {
		// folder
		Set<String> patterns = new HashSet<String>();
		patterns.addAll(ResourcePatternExclusionStrategy.convertToAntPattern("folder"));

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc2/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2/folder/test"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2/test/folder"), null, patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder.test"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/.folder"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder2"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2folder/test"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2/test"), null, patterns));
	}

	public void testPathPrefixExclusionPattern() {
		// test/**
		Set<String> patterns = new HashSet<String>();
		patterns.add("/folder/**");

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc2/test"), null, patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder2/folder"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2/folder/test"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/.doc2/test/folder"), null, patterns));

	}

	public void testPathPostfixExclusionPattern() {
		// **/test/
		Set<String> patterns = new HashSet<String>();
		patterns.add("**/folder");

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder1/folder"), null, patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder1/folder/folder2/test.doc"), null,
				patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc2/test"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/.doc2/test"), null, patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/folder2"), null, patterns));

	}

	public void testComplexExclusionPattern() {
		// **/folder/***.doc
		Set<String> patterns = new HashSet<String>();
		patterns.addAll(ResourcePatternExclusionStrategy.convertToAntPattern("**/folder/***.doc"));

		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/test.doc"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder/folder2/test.doc"), null, patterns));
		assertTrue(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder1/folder/folder2/test.doc"), null,
				patterns));

		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder1/folder/folder2/test.docx"), null,
				patterns));
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(new Path("/folder1/folder2/folder3/test.doc"), null,
				patterns));
	}

	public void testInclusion() {
		IPath path4 = new Path("bla/bla");
		assertFalse(ResourcePatternExclusionStrategy.isExcluded(path4, null, new HashSet<String>()));
	}
}
