package com.laytonsmith.core.functions;
import com.laytonsmith.PureUtilities.Common.FileUtil;
import com.laytonsmith.abstraction.MCPlayer;
import com.laytonsmith.abstraction.MCServer;
import com.laytonsmith.core.MethodScriptCompiler;
import com.laytonsmith.core.Static;
import com.laytonsmith.core.environments.CommandHelperEnvironment;
import com.laytonsmith.core.exceptions.ConfigRuntimeException;
import com.laytonsmith.testing.StaticTest;
import static com.laytonsmith.testing.StaticTest.RunCommand;
import static com.laytonsmith.testing.StaticTest.SRun;
import java.io.File;
import java.io.IOException;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
*
*
*/
public class DataHandlingTest {
MCServer fakeServer;
MCPlayer fakePlayer;
com.laytonsmith.core.environments.Environment env;
public DataHandlingTest() throws Exception{
StaticTest.InstallFakeServerFrontend();
env = Static.GenerateStandaloneEnvironment();
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
fakePlayer = StaticTest.GetOnlinePlayer();
fakeServer = StaticTest.GetFakeServer();
env.getEnv(CommandHelperEnvironment.class).SetPlayer(fakePlayer);
}
@After
public void tearDown() {
}
@Test(timeout = 10000)
public void testFor1() throws Exception {
String config = "/for = >>>\n"
+ " assign(@array, array())"
+ " for(assign(@i, 0), lt(@i, 5), inc(@i),\n"
+ " array_push(@array, @i)\n"
+ " )\n"
+ " msg(@array)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/for");
verify(fakePlayer).sendMessage("{0, 1, 2, 3, 4}");
}
@Test(expected = ConfigRuntimeException.class, timeout=10000)
public void testFor3() throws Exception {
String script =
" assign(@array, array())"
+ " for('nope', lt(@i, 5), inc(@i),\n"
+ " array_push(@array, @i)\n"
+ " )\n"
+ " msg(@array)\n";
MethodScriptCompiler.execute(MethodScriptCompiler.compile(MethodScriptCompiler.lex(script, null, true)), env, null, null);
}
@Test(timeout = 10000)
public void testForeach1() throws Exception {
String config = "/for = >>>\n"
+ " assign(@array, array(1, 2, 3, 4, 5))\n"
+ " assign(@array2, array())"
+ " foreach(@array, @i,\n"
+ " array_push(@array2, @i)\n"
+ " )\n"
+ " msg(@array2)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/for");
verify(fakePlayer).sendMessage("{1, 2, 3, 4, 5}");
}
@Test(timeout = 10000)
public void testForeach2() throws Exception {
String config = "/for = >>>\n"
+ " assign(@array, array(1, 2, 3, 4, 5))\n"
+ " assign(@array2, array())"
+ " foreach(@array, @i,\n"
+ " if(equals(@i, 1), continue(2))"
+ " array_push(@array2, @i)\n"
+ " )\n"
+ " msg(@array2)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/for");
verify(fakePlayer).sendMessage("{3, 4, 5}");
}
@Test(timeout = 10000)
public void testForeach3() throws Exception {
String config = "/for = >>>\n"
+ " assign(@array, array(1, 2, 3, 4, 5))\n"
+ " assign(@array1, array(1, 2, 3, 4, 5))\n"
+ " assign(@array2, array())\n"
+ " foreach(@array1, @j,"
+ " foreach(@array, @i,\n"
+ " if(equals(@i, 3), break(2))"
+ " array_push(@array2, @i)\n"
+ " )\n"
+ " )"
+ " msg(@array2)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/for");
verify(fakePlayer).sendMessage("{1, 2}");
}
@Test(timeout = 10000)
public void testForeachWithArraySlice() throws Exception{
SRun("foreach(1..2, @i, msg(@i))", fakePlayer);
verify(fakePlayer).sendMessage("1");
verify(fakePlayer).sendMessage("2");
}
@Test(timeout = 10000)
public void testForeachWithKeys1() throws Exception{
SRun("@array = array(1: 'one', 2: 'two') @string = '' foreach(@array, @key, @value, @string .= (@key.':'.@value.';')) msg(@string)", fakePlayer);
verify(fakePlayer).sendMessage("1:one;2:two;");
}
@Test(timeout = 10000)
public void testForeachWithKeys2() throws Exception{
SRun("@array = array('one': 1, 'two': 2) @string = '' foreach(@array, @key, @value, @string .= (@key.':'.@value.';')) msg(@string)", fakePlayer);
verify(fakePlayer).sendMessage("one:1;two:2;");
}
@Test(timeout = 10000)
public void testForeachWithKeys3() throws Exception{
SRun("@array = array('one': 1, 'two': 2)\nforeach(@array, @key, @value){\n\tmsg(@key.':'.@value)\n}", fakePlayer);
verify(fakePlayer).sendMessage("one:1");
verify(fakePlayer).sendMessage("two:2");
}
@Test
public void testForelse() throws Exception{
SRun("forelse(assign(@i, 0), @i < 0, @i++, msg('fail'), msg('pass'))", fakePlayer);
verify(fakePlayer).sendMessage("pass");
verify(fakePlayer, times(0)).sendMessage("fail");
}
@Test
public void testForeachelse() throws Exception{
SRun("foreachelse(array(), @val, msg('fail'), msg('pass'))", fakePlayer);
SRun("foreachelse(array(1), @val, msg('pass'), msg('fail'))", fakePlayer);
SRun("foreachelse(1..2, @val, msg('pass'), msg('fail'))", fakePlayer);
verify(fakePlayer, times(4)).sendMessage("pass");
verify(fakePlayer, times(0)).sendMessage("fail");
}
@Test(timeout = 10000)
public void testCallProcIsProc() throws Exception {
when(fakePlayer.isOp()).thenReturn(true);
String config = "/for = >>>\n"
+ " msg(is_proc(_proc))\n"
+ " proc(_proc,"
+ " msg('hello world')"
+ " )"
+ " msg(is_proc(_proc))"
+ " call_proc(_proc)"
+ "<<<\n";
RunCommand(config, fakePlayer, "/for");
verify(fakePlayer).sendMessage("false");
verify(fakePlayer).sendMessage("true");
verify(fakePlayer).sendMessage("hello world");
}
/**
* There is a bug that causes an infinite loop, so we put a 10 second
* timeout
*
* @throws Exception
*/
@Test(timeout = 10000)
public void testContinue1() throws Exception {
String config = "/continue = >>>\n"
+ " assign(@array, array())"
+ " for(assign(@i, 0), lt(@i, 5), inc(@i),\n"
+ " if(equals(@i, 2), continue(1))\n"
+ " array_push(@array, @i)\n"
+ " )\n"
+ " msg(@array)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/continue");
verify(fakePlayer).sendMessage("{0, 1, 3, 4}");
}
@Test(timeout = 10000)
public void testContinue2() throws Exception {
String config = "/continue = >>>\n"
+ " assign(@array, array())"
+ " for(assign(@i, 0), lt(@i, 5), inc(@i),\n"
+ " if(equals(@i, 2), continue(2))\n"
+ " array_push(@array, @i)\n"
+ " )\n"
+ " msg(@array)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/continue");
verify(fakePlayer).sendMessage("{0, 1, 4}");
}
@Test(timeout = 10000)
public void testContinue3() throws Exception {
String config = "/continue = >>>\n"
+ " assign(@array, array())"
+ " for(assign(@i, 0), lt(@i, 5), inc(@i),\n"
+ " if(equals(@i, 2), continue(3))\n"
+ " array_push(@array, @i)\n"
+ " )\n"
+ " msg(@array)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/continue");
verify(fakePlayer).sendMessage("{0, 1}");
}
@Test(timeout = 10000)
public void testBreak1() throws Exception {
String config = "/break = >>>\n"
+ " assign(@array, array())"
+ " for(assign(@i, 0), lt(@i, 2), inc(@i),\n"
+ " for(assign(@j, 0), lt(@j, 5), inc(@j),\n"
+ " if(equals(@j, 2), break())\n"
+ " array_push(@array, concat('j:', @j))\n"
+ " )\n"
+ " array_push(@array, concat('i:', @i))\n"
+ " )\n"
+ " msg(@array)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/break");
verify(fakePlayer).sendMessage("{j:0, j:1, i:0, j:0, j:1, i:1}");
}
@Test(timeout = 10000)
public void testBreak2() throws Exception {
String config = "/break = >>>\n"
+ " assign(@array, array())"
+ " for(assign(@i, 0), lt(@i, 2), inc(@i),\n"
+ " for(assign(@j, 0), lt(@j, 5), inc(@j),\n"
+ " if(equals(@j, 2), break(2))\n"
+ " array_push(@array, concat('j:', @j))\n"
+ " )\n"
+ " array_push(@array, concat('i:', @i))\n"
+ " )\n"
+ " msg(@array)\n"
+ "<<<\n";
RunCommand(config, fakePlayer, "/break");
verify(fakePlayer).sendMessage("{j:0, j:1}");
}
@Test(timeout = 10000)
public void testInclude() throws Exception, IOException {
String script =
"include('unit_test_inc.ms')";
//Create the test file
File test = new File("unit_test_inc.ms");
FileUtil.write("msg('hello')", test);
MethodScriptCompiler.execute(MethodScriptCompiler.compile(MethodScriptCompiler.lex(script, new File("./script.txt"), true)), env, null, null);
verify(fakePlayer).sendMessage("hello");
//delete the test file
test.delete();
test.deleteOnExit();
}
// This feature has been deprecated, and now removed.
// @Test(timeout = 10000)
// public void testExportImportIVariable() throws Exception {
// when(fakePlayer.isOp()).thenReturn(true);
// String script1 =
// "assign(@var, 10)"
// + "export(@var)";
// SRun(script1, null);
// SRun("import(@var) msg(@var)", fakePlayer);
// verify(fakePlayer).sendMessage("10");
// }
@Test(timeout = 10000)
public void testExportImportStringValue1() throws Exception {
when(fakePlayer.isOp()).thenReturn(Boolean.TRUE);
SRun("export('hi', 20)", fakePlayer);
SRun("msg(import('hi'))", fakePlayer);
verify(fakePlayer).sendMessage("20");
}
@Test
public void testExportImportStringValue2() throws Exception{
when(fakePlayer.isOp()).thenReturn(Boolean.TRUE);
SRun("assign(@test, array(1, 2, 3))"
+ "export('myarray', @test)"
+ "msg(@newtest)", fakePlayer);
SRun("assign(@newtest, import('myarray')) msg(@newtest)", fakePlayer);
verify(fakePlayer).sendMessage("{1, 2, 3}");
}
@Test
public void testExportImportWithProcs1() throws Exception{
SRun("proc(_derping," +
" msg(import('borked'))"+
" assign(@var, import('borked'))" +
" assign(@var, array('Am', 'I', 'borked?'))" +
" export('borked', @var)" +
" msg(import('borked'))" +
")\n" +
"_derping()\n"+
"_derping()", fakePlayer);
verify(fakePlayer).sendMessage("null");
verify(fakePlayer, times(3)).sendMessage("{Am, I, borked?}");
}
@Test
public void testExportImportWithProcs2() throws Exception{
SRun("assign(@array, array(1, 2))"
+ "export('myarray', @array)", fakePlayer);
SRun("proc(_get, return(import('myarray')))"
+ "msg(_get())", fakePlayer);
verify(fakePlayer).sendMessage("{1, 2}");
}
@Test
public void testExportImportArrayNameSpace() throws Exception{
when(fakePlayer.isOp()).thenReturn(Boolean.TRUE);
SRun("assign(@key, array('custom', 'key1'))"
+ "assign(@value, 'key1Value')"
+ "export(@key, @value)"
+ "msg(import('custom.key1'))", fakePlayer);
verify(fakePlayer).sendMessage("key1Value");
SRun("assign(@key, array('custom', 'key2'))"
+ "assign(@value, 'key2Value')"
+ "export('custom.key2', @value)"
+ "msg(import(@key))", fakePlayer);
verify(fakePlayer).sendMessage("key2Value");
}
@Test(timeout = 10000)
public void testIsBoolean() throws Exception {
SRun("msg(is_boolean(1)) msg(is_boolean(true))", fakePlayer);
verify(fakePlayer).sendMessage("false");
verify(fakePlayer).sendMessage("true");
}
@Test(timeout = 10000)
public void testIsInteger() throws Exception {
SRun("msg(is_integer(5.0)) msg(is_integer('s')) msg(is_integer(5))", fakePlayer);
verify(fakePlayer, times(2)).sendMessage("false");
verify(fakePlayer).sendMessage("true");
}
@Test(timeout = 10000)
public void testIsDouble() throws Exception {
SRun("msg(is_double(5)) msg(is_double('5.0')) msg(is_double('5'.0)) msg(is_double(5.'0'))"
+ "msg(is_double(5.0)) msg(is_double(5 . 0))", fakePlayer);
verify(fakePlayer, times(4)).sendMessage("false");
verify(fakePlayer, times(2)).sendMessage("true");
}
@Test(timeout = 10000)
public void testIsNull() throws Exception {
SRun("msg(is_null('null')) msg(is_null(null))", fakePlayer);
verify(fakePlayer).sendMessage("false");
verify(fakePlayer).sendMessage("true");
}
@Test(timeout = 10000)
public void testIsNumeric() throws Exception {
SRun("msg(is_numeric('s')) "
+ " msg(is_numeric(null))"
+ " msg(is_numeric(true))"
+ " msg(is_numeric(2))"
+ " msg(is_numeric(2.0))", fakePlayer);
verify(fakePlayer, times(1)).sendMessage("false");
verify(fakePlayer, times(4)).sendMessage("true");
}
@Test(timeout = 10000)
public void testIsIntegral() throws Exception {
SRun("msg(is_integral(5.5)) msg(is_integral(5)) msg(is_integral(4.0))", fakePlayer);
verify(fakePlayer).sendMessage("false");
verify(fakePlayer, times(2)).sendMessage("true");
}
@Test(timeout = 10000)
public void testDoubleCastToInteger() throws Exception {
SRun("msg(integer(4.5))", fakePlayer);
verify(fakePlayer).sendMessage("4");
}
@Test(timeout = 10000)
public void testClosure1() throws Exception {
SRun("assign(@go, closure(console( 'Hello World' ))) msg(@go)", fakePlayer);
verify(fakePlayer).sendMessage("console('Hello World')");
}
@Test(timeout = 10000)
public void testClosure2() throws Exception {
SRun("assign(@go, closure(msg('Hello World')))", fakePlayer);
verify(fakePlayer, times(0)).sendMessage("Hello World");
}
@Test(timeout = 10000)
public void testClosure3() throws Exception {
when(fakePlayer.isOp()).thenReturn(Boolean.TRUE);
SRun("assign(@go, closure(msg('Hello' 'World')))\n"
+ "execute(@go)", fakePlayer);
verify(fakePlayer).sendMessage("Hello World");
}
@Test(timeout = 10000)
public void testClosure4() throws Exception {
when(fakePlayer.isOp()).thenReturn(Boolean.TRUE);
SRun("assign(@hw, 'Hello World')\n"
+ "assign(@go, closure(msg(@hw)))\n"
+ "execute(@go)", fakePlayer);
verify(fakePlayer).sendMessage("Hello World");
}
@Test(timeout = 10000)
public void testClosure5() throws Exception {
when(fakePlayer.isOp()).thenReturn(Boolean.TRUE);
SRun("assign(@hw, 'Nope')\n"
+ "assign(@go, closure(@hw, msg(@hw)))\n"
+ "execute('Hello World', @go)", fakePlayer);
verify(fakePlayer).sendMessage("Hello World");
}
@Test(timeout = 10000)
public void testClosure6() throws Exception {
when(fakePlayer.isOp()).thenReturn(Boolean.TRUE);
SRun("assign(@hw, 'Hello World')\n"
+ "assign(@go, closure(msg(@hw)))\n"
+ "execute('Nope', @go)", fakePlayer);
verify(fakePlayer).sendMessage("Hello World");
}
@Test(timeout = 10000)
public void testClosure7() throws Exception {
when(fakePlayer.isOp()).thenReturn(Boolean.TRUE);
SRun("assign(@go, closure(assign(@hw, 'Hello World'), msg(@hw)))\n"
+ "execute(@go)", fakePlayer);
verify(fakePlayer).sendMessage("Hello World");
}
@Test(timeout = 10000)
public void testClosure8() throws Exception {
when(fakePlayer.isOp()).thenReturn(true);
SRun("execute(Hello, World, closure(msg(@arguments)))", fakePlayer);
verify(fakePlayer).sendMessage("{Hello, World}");
}
@Test(timeout = 10000)
public void testClosure9() throws Exception {
when(fakePlayer.isOp()).thenReturn(true);
SRun("assign(@a, closure(@array, assign(@array[0], 'Hello World')))\n"
+ "assign(@value, array())\n"
+ "execute(@value, @a)\n"
+ "msg(@value)", fakePlayer);
verify(fakePlayer).sendMessage("{Hello World}");
}
@Test(timeout=10000)
public void testWhile() throws Exception{
SRun("assign(@i, 2) while(@i > 0, @i-- msg('hi'))", fakePlayer);
verify(fakePlayer, times(2)).sendMessage("hi");
}
@Test(timeout=10000)
public void testDoWhile() throws Exception{
SRun("assign(@i, 2) dowhile(@i-- msg('hi'), @i > 0)", fakePlayer);
verify(fakePlayer, times(2)).sendMessage("hi");
}
@Test
public void testToRadix() throws Exception {
assertEquals("f", SRun("to_radix(15, 16)", null));
assertEquals("1111", SRun("to_radix(15, 2)", null));
}
@Test
public void testParseInt() throws Exception {
assertEquals("15", SRun("parse_int('F', 16)", null));
assertEquals("15", SRun("parse_int('1111', 2)", null));
}
@Test
public void testClosureReturnsFromExecute() throws Exception {
assertEquals("3", SRun("execute(closure(return(3)))", fakePlayer));
}
}