/*=============================================================================#
 # Copyright (c) 2019, 2020 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.rj.server.util;

import static org.junit.Assert.assertEquals;

import org.junit.Assume;
import org.junit.Test;

import org.eclipse.statet.jcommons.lang.NonNullByDefault;

import org.eclipse.statet.rj.server.util.PathEntryProvider.DevBinPathEntryProvider;
import org.eclipse.statet.rj.server.util.PathEntryProvider.JarFilePathEntryProvider;


@NonNullByDefault
public class PathEntryProviderTest {
	
	
	public PathEntryProviderTest() {
	}
	
	
	@Test
	public void detectLibPaths_DevFolder() throws Exception { // in IDE
		final PathEntryProvider provider= PathEntryProvider.detectLibPaths(
				"file:/../org.eclipse.statet-rj/core/org.eclipse.statet.rj.server/target/classes/",
				null );
		
		assertEquals(DevBinPathEntryProvider.class, provider.getClass());
	}
	
	@Test
	public void detectLibPaths_SimpleServerJar() throws Exception { // e.g. console server
		final PathEntryProvider provider= PathEntryProvider.detectLibPaths(
				"jar:file:/../rserver/org.eclipse.statet.rj.server.jar!/",
				null );
		
		assertEquals(JarFilePathEntryProvider.class, provider.getClass());
		
		final JarFilePathEntryProvider jarProvider= (JarFilePathEntryProvider) provider;
		assertEquals("org.eclipse.statet.rj.server",
				jarProvider.getBundleId("org.eclipse.statet.rj.server.jar") );
	}
	
	@Test
	public void detectLibPaths_TargetJar_Snapshot() throws Exception {
		final PathEntryProvider provider= PathEntryProvider.detectLibPaths(
				"jar:file:/../org.eclipse.statet-rj/core/org.eclipse.statet.rj.server/target/org.eclipse.statet.rj.server-4.0.0-SNAPSHOT.jar!/",
				null );
		
		assertEquals(JarFilePathEntryProvider.class, provider.getClass());
		
		final JarFilePathEntryProvider jarProvider= (JarFilePathEntryProvider) provider;
		assertEquals("org.eclipse.statet.rj.server",
				jarProvider.getBundleId("org.eclipse.statet.rj.server-4.0.0-SNAPSHOT.jar") );
	}
	
	@Test
	public void detectLibPaths_TargetJar_Release() throws Exception {
		final PathEntryProvider provider= PathEntryProvider.detectLibPaths(
				"jar:file:/../org.eclipse.statet-rj/core/org.eclipse.statet.rj.server/target/org.eclipse.statet.rj.server-4.0.0.201906060800-r.jar!/",
				null );
		
		assertEquals(JarFilePathEntryProvider.class, provider.getClass());
		
		final JarFilePathEntryProvider jarProvider= (JarFilePathEntryProvider) provider;
		assertEquals("org.eclipse.statet.rj.server",
				jarProvider.getBundleId("org.eclipse.statet.rj.server-4.0.0.201906060800-r.jar") );
	}
	
	@Test
	public void detectLibPaths_NexusJar() throws Exception {
		final PathEntryProvider provider= PathEntryProvider.detectLibPaths(
				"jar:file:/../WEB-INF/lib/org.eclipse.statet.rj.server-4.0.0-20190529.154707-7.jar!/",
				null );
		
		assertEquals(JarFilePathEntryProvider.class, provider.getClass());
		
		final JarFilePathEntryProvider jarProvider= (JarFilePathEntryProvider) provider;
		assertEquals("org.eclipse.statet.rj.server",
				jarProvider.getBundleId("org.eclipse.statet.rj.server-4.0.0-20190529.154707-7.jar") );
	}
	
	@Test
	public void detectLibPaths_NestedJar_Snapshot() throws Exception { // e.g. R help server
		final String folder= System.getenv("STATET_TEST_FILES");
		Assume.assumeTrue(folder != null);
		
		final PathEntryProvider provider= PathEntryProvider.detectLibPaths(
				"jar:file:/" + folder.replace('\\', '/') + "/org.eclipse.statet.rhelp.server.jar!/BOOT-INF/lib/org.eclipse.statet.rj.server-4.0.0-SNAPSHOT.jar!/",
				null );
		
		assertEquals(JarFilePathEntryProvider.class, provider.getClass());
		
		final JarFilePathEntryProvider jarProvider= (JarFilePathEntryProvider) provider;
		assertEquals("org.eclipse.statet.rj.server",
				jarProvider.getBundleId("org.eclipse.statet.rj.server-4.0.0-SNAPSHOT.jar") );
	}
	
	@Test
	public void detectLibPaths_NestedJar_Nexus() throws Exception { // e.g. R help server
		final String folder= System.getenv("STATET_TEST_FILES");
		Assume.assumeTrue(folder != null);
		
		final PathEntryProvider provider= PathEntryProvider.detectLibPaths(
				"jar:file:/" + folder.replace('\\', '/') + "/rhelp.server-4.0.0-SNAPSHOT.jar!/BOOT-INF/lib/org.eclipse.statet.rj.server-4.0.0-20190529.154707-7.jar!/",
				null );
		
		assertEquals(JarFilePathEntryProvider.class, provider.getClass());
		
		final JarFilePathEntryProvider jarProvider= (JarFilePathEntryProvider) provider;
		assertEquals("org.eclipse.statet.rj.server",
				jarProvider.getBundleId("org.eclipse.statet.rj.server-4.0.0-20190529.154707-7.jar") );
	}
	
	@Test
	public void detectLibPaths_NestedJar_Release() throws Exception { // e.g. R help server
		final String folder= System.getenv("STATET_TEST_FILES");
		Assume.assumeTrue(folder != null);
		
		final PathEntryProvider provider= PathEntryProvider.detectLibPaths(
				"jar:file:/" + folder.replace('\\', '/') + "/org.eclipse.statet.rhelp.server.jar!/BOOT-INF/lib/org.eclipse.statet.rj.server-4.0.0.201906060800-r.jar!/",
				null );
		
		assertEquals(JarFilePathEntryProvider.class, provider.getClass());
		
		final JarFilePathEntryProvider jarProvider= (JarFilePathEntryProvider) provider;
		assertEquals("org.eclipse.statet.rj.server",
				jarProvider.getBundleId("org.eclipse.statet.rj.server-4.0.0.201906060800-r.jar") );
	}
	
}
