package jhydra.core.scripting;
import jhydra.core.config.IRuntimeConfig;
import jhydra.core.logging.ILog;
import jhydra.core.scripting.exceptions.ScriptNotExistException;
import jhydra.core.scripting.scriptinfo.exceptions.ScriptInfoLoadException;
import jhydra.core.uinav.IMasterNavigator;
import jhydra.core.valuemap.IValueMap;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
/**
* Author: jantic
* Date: 4/4/13
*/
public class MasterScriptFactoryTests {
//Needed to verify sum set in NormalScript from project 1.
private String sum = "";
//Needed to verify message in Proj2Script from project 2
private String message = "";
/***Tests normally executing, existing scripts ****************************************/
@Test
public void getScript_proj1_normalScript_getName_NormalScript() throws Exception{
final IScript script = getProj1Script("NormalScript");
final String expected = "NormalScript";
final String actual = script.getName();
Assert.assertEquals(expected, actual);
}
@Test
public void hasScript_proj1_normalScript_true() throws Exception{
final MasterScriptFactory scriptFactory = this.getMasterScriptFactory(1);
final Boolean expected = true;
final Boolean actual = scriptFactory.hasScript("NormalScript");
Assert.assertEquals(expected, actual);
}
@Test
public void getScript_proj2_proj2Script_getName_Proj2Script() throws Exception{
final IScript script = getProj2Script("Proj2Script");
final String expected = "Proj2Script";
final String actual = script.getName();
Assert.assertEquals(expected, actual);
}
/***Tests non-existing scripts ******************************************************/
@Test
public void hasScript_proj1_proj2Script_false() throws Exception{
final MasterScriptFactory scriptFactory = this.getMasterScriptFactory(1);
final Boolean expected = false;
final Boolean actual = scriptFactory.hasScript("Proj2Script");
Assert.assertEquals(expected, actual);
}
@Test(expected = ScriptNotExistException.class)
public void getScript_proj1_proj2Script_throwsScriptNotExistException() throws Exception{
getProj1Script("Proj2Script");
}
@Test(expected = ScriptNotExistException.class)
public void getScript_proj1_null_throwsScriptNotExistException() throws Exception{
getProj1Script(null);
}
@Test(expected = ScriptNotExistException.class)
public void getScript_proj1_empty_throwsScriptNotExistException() throws Exception{
getProj1Script("");
}
/***PRIVATE METHODS*********************************************************************/
private IScript getProj1Script(String name) throws Exception{
final IValueMap valueMap = mock(IValueMap.class);
when(valueMap.getValue("num1")).thenReturn("5.0");
when(valueMap.getValue("num2")).thenReturn("6.0");
sum = "";
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
sum = (String) invocation.getArguments()[1];
return null;
}
}).when(valueMap).setValue(eq("sum"), anyString());
final MasterScriptFactory masterScriptFactory = getMasterScriptFactory(1);
final IMasterNavigator navigator = mock(IMasterNavigator.class);
return masterScriptFactory.getScript(name, valueMap, navigator);
}
private IScript getProj2Script(String name) throws Exception{
final IValueMap valueMap = mock(IValueMap.class);
message = "";
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
message = (String) invocation.getArguments()[1];
return null;
}
}).when(valueMap).setValue(eq("message"), anyString());
final MasterScriptFactory masterScriptFactory = getMasterScriptFactory(2);
final IMasterNavigator navigator = mock(IMasterNavigator.class);
return masterScriptFactory.getScript(name, valueMap, navigator);
}
private MasterScriptFactory getMasterScriptFactory(Integer projNum) throws ScriptInfoLoadException {
final IRuntimeConfig config = mock(IRuntimeConfig.class);
final String projectsDirectory = "./test projects/project " + projNum.toString();
final List<URI> scriptDirectories = new ArrayList<>();
scriptDirectories.add(getURI(projectsDirectory + "/scripts/"));
scriptDirectories.add(getURI(projectsDirectory + "/alt scripts/"));
when(config.getScriptDirectories()).thenReturn(scriptDirectories);
when(config.getProjectDirectory()).thenReturn(getURI(projectsDirectory));
when(config.getScriptMaxNumTries()).thenReturn(1);
final ILog log = mock(ILog.class);
return new MasterScriptFactory(config, log);
}
private URI getURI(String relativePath){
final File file = new File(relativePath);
return file.toURI();
}
}