Bug 549058: [REnv] Fix REnvConfiguration.getRShareDirectory

Change-Id: I2d7794bc18074d39bc5acbb64dd7fe549171b68f
diff --git a/core/org.eclipse.statet.rj.services.core-tests/src/org/eclipse/statet/rj/renv/core/BasicREnvConfigurationTest.java b/core/org.eclipse.statet.rj.services.core-tests/src/org/eclipse/statet/rj/renv/core/BasicREnvConfigurationTest.java
new file mode 100644
index 0000000..09ee423
--- /dev/null
+++ b/core/org.eclipse.statet.rj.services.core-tests/src/org/eclipse/statet/rj/renv/core/BasicREnvConfigurationTest.java
@@ -0,0 +1,232 @@
+/*=============================================================================#
+ # 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.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());
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.services.core/srcEnv/org/eclipse/statet/rj/renv/core/BasicREnvConfiguration.java b/core/org.eclipse.statet.rj.services.core/srcEnv/org/eclipse/statet/rj/renv/core/BasicREnvConfiguration.java
index 7d46244..6dd9990 100644
--- a/core/org.eclipse.statet.rj.services.core/srcEnv/org/eclipse/statet/rj/renv/core/BasicREnvConfiguration.java
+++ b/core/org.eclipse.statet.rj.services.core/srcEnv/org/eclipse/statet/rj/renv/core/BasicREnvConfiguration.java
@@ -259,6 +259,10 @@
 		}
 	}
 	
+	protected byte getOs() {
+		return ((this.flags & LOCAL) != 0) ? SystemUtils.getLocalOs() : 0;
+	}
+	
 	protected @Nullable String normalizeRArch(@Nullable String arch) {
 		if (arch == null || arch.isEmpty()) {
 			return null;
@@ -272,7 +276,7 @@
 		if (arch.equals("exec")) { //$NON-NLS-1$
 			return null;
 		}
-		if (SystemUtils.getLocalOs() == OS_WIN) {
+		if (getOs() == OS_WIN) {
 			final String knownArch= SystemUtils.getArch(arch);
 			if (knownArch != null) {
 				return knownArch;
@@ -284,7 +288,7 @@
 	
 	@Override
 	public @Nullable String getRShareDirectory() {
-		return this.rDocDirectory;
+		return this.rShareDirectory;
 	}
 	
 	@Override