/*=============================================================================#
 # 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.renv.core;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

import org.junit.Test;

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


@NonNullByDefault
public class BasicREnvConfigurationTest {
	
	
	private static class TestREnvConfiguration extends BasicREnvConfiguration {
		
		
		private final byte expliciteOs;
		
		
		public TestREnvConfiguration(final REnv rEnv, final Path stateRootDirectoryPath,
				final byte expliciteOs) {
			super(rEnv, stateRootDirectoryPath);
			this.expliciteOs= expliciteOs;
		}
		
		
		@Override
		protected byte getOs() {
			return this.expliciteOs;
		}
		
	}
	
	
	private final Path statePath;
	
	
	public BasicREnvConfigurationTest() throws IOException {
		this.statePath= Files.createTempDirectory("rj.renv.core-tests");
	}
	
	
	private TestREnvConfiguration createCommonLocalConfig(final byte os) {
		try {
			final String id= "test";
			final Path path= this.statePath.resolve(id);
			Files.createDirectories(path);
			final TestREnvConfiguration config= new TestREnvConfiguration(
					new BasicREnvManager.ActualREnv(id), path, os );
			config.setFlags(TestREnvConfiguration.LOCAL | TestREnvConfiguration.SPEC_SETUP);
			return config;
		}
		catch (final IOException e) {
			throw new RuntimeException(e);
		}
	}
	
	
	@Test
	public void setget_RHomeDirectory_Win() throws IOException {
		final TestREnvConfiguration config= createCommonLocalConfig(SystemUtils.OS_WIN);
		
		config.setRHomeDirectory("C:/R-3.5");
		assertEquals("C:/R-3.5", config.getRHomeDirectory());
		assertNull(config.getRHomeDirectoryPath());
		
		config.setRHomeDirectory("C:/R-3.5/");
		assertEquals("C:/R-3.5", config.getRHomeDirectory());
		assertNull(config.getRHomeDirectoryPath());
		
		config.setRHomeDirectory("C:\\R-3.5");
		assertEquals("C:/R-3.5", config.getRHomeDirectory());
		assertNull(config.getRHomeDirectoryPath());
		
		config.setRHomeDirectory("C:\\R-3.5\\");
		assertEquals("C:/R-3.5", config.getRHomeDirectory());
		assertNull(config.getRHomeDirectoryPath());
	}
	
	@Test
	public void setget_RHomeDirectory_Nix() throws IOException {
		final TestREnvConfiguration config= createCommonLocalConfig((byte) 0);
		
		config.setRHomeDirectory("/opt/R-3.5");
		assertEquals("/opt/R-3.5", config.getRHomeDirectory());
		assertNull(config.getRHomeDirectoryPath());
		
		config.setRHomeDirectory("/opt/R-3.5/");
		assertEquals("/opt/R-3.5", config.getRHomeDirectory());
		assertNull(config.getRHomeDirectoryPath());
		
		config.setRHomeDirectory("/opt/R-3.5/");
		config.setRHomeDirectory(null);
		assertNull(config.getRHomeDirectory());
		assertNull(config.getRHomeDirectoryPath());
		
		config.setRHomeDirectory("/opt/R-3.5/");
		config.setRHomeDirectory("");
		assertNull(config.getRHomeDirectory());
		assertNull(config.getRHomeDirectoryPath());
	}
	
	@Test
	public void setget_RArch_Win() {
		final TestREnvConfiguration config= createCommonLocalConfig(SystemUtils.OS_WIN);
		
		config.setRArch("x64");
		assertEquals(SystemUtils.ARCH_X86_64, config.getRArch());
		
		config.setRArch("/x64");
		assertEquals(SystemUtils.ARCH_X86_64, config.getRArch());
		
		config.setRArch("amd64");
		assertEquals(SystemUtils.ARCH_X86_64, config.getRArch());
		
		config.setRArch("i386");
		assertEquals(SystemUtils.ARCH_X86_32, config.getRArch());
		
		config.setRArch("/i386");
		assertEquals(SystemUtils.ARCH_X86_32, config.getRArch());
		
		config.setRArch("x64");
		config.setRArch(null);
		assertNull(config.getRArch());
		
		config.setRArch("x64");
		config.setRArch("");
		assertNull(config.getRArch());
	}
	
	@Test
	public void setget_RDocDirectory_Win() {
		final TestREnvConfiguration config= createCommonLocalConfig(SystemUtils.OS_WIN);
		
		config.setRDocDirectory("C:/R-3.5/doc");
		assertEquals("C:/R-3.5/doc", config.getRDocDirectory());
		assertNull(config.getRDocDirectoryPath());
		
		config.setRDocDirectory("C:/R-3.5/doc/");
		assertEquals("C:/R-3.5/doc", config.getRDocDirectory());
		assertNull(config.getRDocDirectoryPath());
		
		config.setRDocDirectory("${r_home}/doc");
		assertEquals("${r_home}/doc", config.getRDocDirectory());
		assertNull(config.getRDocDirectoryPath());
		
		config.setRDocDirectory("C:/R-3.5/doc");
		config.setRDocDirectory(null);
		assertNull(config.getRDocDirectory());
		assertNull(config.getRDocDirectoryPath());
		
		config.setRDocDirectory("C:/R-3.5/doc");
		config.setRDocDirectory("");
		assertNull(config.getRDocDirectory());
		assertNull(config.getRDocDirectoryPath());
	}
	
	@Test
	public void setget_RShareDirectory_Win() {
		final TestREnvConfiguration config= createCommonLocalConfig(SystemUtils.OS_WIN);
		
		config.setRShareDirectory("C:/R-3.5/share");
		assertEquals("C:/R-3.5/share", config.getRShareDirectory());
		assertNull(config.getRShareDirectoryPath());
		
		config.setRShareDirectory("C:/R-3.5/share/");
		assertEquals("C:/R-3.5/share", config.getRShareDirectory());
		assertNull(config.getRShareDirectoryPath());
		
		config.setRShareDirectory("${r_home}/share");
		assertEquals("${r_home}/share", config.getRShareDirectory());
		assertNull(config.getRShareDirectoryPath());
		
		config.setRShareDirectory("C:/R-3.5/share");
		config.setRShareDirectory(null);
		assertNull(config.getRShareDirectory());
		assertNull(config.getRShareDirectoryPath());
		
		config.setRShareDirectory("C:/R-3.5/share");
		config.setRShareDirectory("");
		assertNull(config.getRShareDirectory());
		assertNull(config.getRShareDirectoryPath());
	}
	
	@Test
	public void setget_RIncludeDirectory_Win() {
		final TestREnvConfiguration config= createCommonLocalConfig(SystemUtils.OS_WIN);
		
		config.setRIncludeDirectory("C:/R-3.5/include");
		assertEquals("C:/R-3.5/include", config.getRIncludeDirectory());
		assertNull(config.getRIncludeDirectoryPath());
		
		config.setRIncludeDirectory("C:/R-3.5/include/");
		assertEquals("C:/R-3.5/include", config.getRIncludeDirectory());
		assertNull(config.getRIncludeDirectoryPath());
		
		config.setRIncludeDirectory("${r_home}/include");
		assertEquals("${r_home}/include", config.getRIncludeDirectory());
		assertNull(config.getRIncludeDirectoryPath());
		
		config.setRIncludeDirectory("C:/R-3.5/include");
		config.setRIncludeDirectory(null);
		assertNull(config.getRIncludeDirectory());
		assertNull(config.getRIncludeDirectoryPath());
		
		config.setRIncludeDirectory("C:/R-3.5/include");
		config.setRIncludeDirectory("");
		assertNull(config.getRIncludeDirectory());
		assertNull(config.getRIncludeDirectoryPath());
	}
	
}
