/*=============================================================================#
 # Copyright (c) 2019 Stephan Wahlbrink <sw@wahlbrink.eu> 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/bin/",
				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() 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_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_1() 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_2() 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") );
	}
	
}
