/** JavaScript -- DOT NET Javascript Library
* Copyright (C) 2005 John Garrison
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
using System;
using NUnit.Framework;
namespace JavaScript.UnitTest
{
/// <summary>
/// Summary description for InterpTest.
/// </summary>
[TestFixture]
public class InterpTest
{
public InterpTest()
{
}
[Test]
public void ShortExprPlus()
{
string src = "1+1;";
Assert.AreEqual("2", Exec(src), "1+1");
}
[Test]
public void ShortExprMinus()
{
string src = "1-1;";
Assert.AreEqual("0", Exec(src), "1-1;");
}
[Test]
public void ShortExprNoSemi()
{
string src = "1";
Assert.AreEqual(true, ExecHasException(src), "No SEMI");
}
[Test]
public void ShortExprNoSemi2()
{
string src = "1+1";
Assert.AreEqual(true, ExecHasException(src), "No SEMI 2");
}
[Test]
public void ShortExprNegate()
{
string src = "-1;";
Assert.AreEqual("-1", Exec(src), "-1");
}
[Test]
public void ShortExprMult()
{
string src = "1*2;";
Assert.AreEqual("2", Exec(src), "1*2");
src = "4*4;";
Assert.AreEqual("16", Exec(src), "4*4");
src = "4*.5;";
Assert.AreEqual("2", Exec(src), "4*.5;");
}
[Test]
public void ShortExprDiv()
{
string src = "1/2;";
Assert.AreEqual("0", Exec(src), "1/2");
src = "1/2.0;";
Assert.AreEqual("0.5", Exec(src), "1/2.0");
src = "10/5;";
Assert.AreEqual("2", Exec(src), "10/5;");
}
[Test]
public void ShortExprMod()
{
string src = "6 % 12;";
Assert.AreEqual("6", Exec(src), "6 % 12");
src = "13 % 12;";
Assert.AreEqual("1", Exec(src), "13 % 12");
}
[Test]
public void ShortExprCmb()
{
string src = "13 % 12 + 1;";
Assert.AreEqual("2", Exec(src), "13 % 12 + 1;");
src = "1 + 2 * 2;";
Assert.AreEqual("5", Exec(src), "1 + 2 * 2;");
}
[Test]
public void ShortExprLogOr()
{
string src = "true || true;";
Assert.AreEqual("True", Exec(src), "true || true;");
src = "false || false;";
Assert.AreEqual("False", Exec(src), "false || false;");
src = "false || true;";
Assert.AreEqual("True", Exec(src), "false || true;");
src = "true || false;";
Assert.AreEqual("True", Exec(src), "true || false;");
}
[Test]
public void ShortExprBinOr()
{
string src = "1 | 2;";
Assert.AreEqual("3", Exec(src), "1 | 2;");
}
[Test]
public void ShortExprLogAnd()
{
string src = "true && true;";
Assert.AreEqual("True", Exec(src), "true && true;");
src = "false && false;";
Assert.AreEqual("False", Exec(src), "false && false;");
src = "false && true;";
Assert.AreEqual("False", Exec(src), "false && true;");
src = "true && false;";
Assert.AreEqual("False", Exec(src), "true && false;");
}
[Test]
public void ShortExprBinAnd()
{
string src = "1 & 2;";
Assert.AreEqual("0", Exec(src), "1 & 2;");
src = "1 & 1;";
Assert.AreEqual("1", Exec(src), "1 & 1;");
}
[Test]
public void ShortExprXor()
{
string src = "1 ^ 1;";
Assert.AreEqual("0", Exec(src), "1 ^ 1;");
src = "1 ^ 2;";
Assert.AreEqual("3", Exec(src), "1 ^ 2;");
}
[Test]
public void ShortExprNot()
{
string src = "! false;";
Assert.AreEqual("True", Exec(src), "! false;");
src = "! true;";
Assert.AreEqual("False", Exec(src), "! true;");
}
[Test]
public void ShortExprVar()
{
JsEngine eng = new JsEngine();
Exec( "var a;", eng );
Exec( "a = 1;", eng );
Assert.AreEqual("1", Exec("a;", eng), "Assigment a=1");
Exec( "var b = 1;", eng );
Assert.AreEqual("1", Exec("b;", eng), "Assigment var b=1");
Assert.AreEqual("2", Exec("a+b;", eng), "a+b");
Exec( "var c = a+b;", eng );
Assert.AreEqual("2", Exec("c;", eng), "var c = a+b");
}
[Test]
public void ShortExprInc()
{
JsEngine eng = new JsEngine();
Exec( "var a = 1; var b = 1;", eng );
Assert.AreEqual("2", Exec("a+b;", eng), "Assigment a=1;b=1");
Assert.AreEqual("True", Exec("a++ == 1;", eng), "a++ == 1");
Assert.AreEqual("2", Exec("a;", eng), "a==2");
Assert.AreEqual("2", Exec("a = ++b; a;", eng),"a = ++b; a;");
Assert.AreEqual("3", Exec("++b;", eng), "++b == 3;");
}
[Test]
public void ShortExprPara()
{
Assert.AreEqual("2", Exec("(1+1);"), "(1+1);");
Assert.AreEqual("4", Exec("(1+1)*2;"), "(1+1)*2;");
Assert.AreEqual("6", Exec("2*(1+2);"), "2*(1+2);");
}
[Test]
public void ShortExprIf()
{
Console.WriteLine("ShortExprIf");
string src = "var a = 1;\n" +
"if ( a == 1 )\n" +
"{\n" +
"a = 2;\n" +
"}\n" +
"a;\n";
Assert.AreEqual("2", Exec(src), "if ( a == 1 )");
}
[Test]
public void ShortExprElse()
{
Console.WriteLine("ShortExprElse");
string src = "var x = 1;\n" +
"if ( x == 2)\n" +
"{\n" +
"x = 3;\n" +
"}\n" +
"else\n" +
"x = 4;\n" +
"x;\n";
Assert.AreEqual("4", Exec(src), "if ... else ... ");
src = "var x = 1;\n" +
"if ( x == 2 || x == 1 )\n" +
"x = 3;\n" +
"else\n" +
"{\n" +
"x = 4;\n" +
"}\n" +
"x;\n";
Assert.AreEqual("3", Exec(src), "if ... else ... ");
}
[Test]
public void ShortExprWhile()
{
Console.WriteLine("ShortExprWhile");
string src = "var x = 1;" +
"while ( x < 3 )" +
"{" +
"x++;" +
"}" +
"x;";
Assert.AreEqual("3", Exec(src), "while (x < 3)");
}
[Test]
public void ShortExprIfElse2()
{
Console.WriteLine("ShortExprIfElse2");
string src = "if ( x == 33 )\n" +
"{\n" +
"x = 100;\n" +
"}\n" +
"else if ( x == 22 )\n" +
"{\n" +
"x = 33;\n" +
"}\n" +
"else\n" +
"{\n" +
"x = 22;\n" +
"}";
JsEngine eng = new JsEngine();
Exec( "var x = 1;", eng );
Assert.AreEqual("1", Exec("x;", eng), "1");
Exec( src, eng );
Assert.AreEqual("22", Exec("x;", eng), "2");
Exec( src, eng );
Assert.AreEqual("33", Exec("x;", eng), "3");
Exec( src, eng );
Assert.AreEqual("100", Exec("x;", eng), "4");
}
[Test]
public void NestedIf()
{
Console.WriteLine("NestedIf");
string src = "var x = 1;" +
"if ( x == 1 )" +
"{" +
"if ( x < 2 )" +
"{" +
"x = 5;" +
"}" +
"}" +
"x;";
Assert.AreEqual("5", Exec(src), "if");
}
[Test]
public void ArraySyntax()
{
JsEngine eng = new JsEngine();
Exec( "function arr(){this.a=1;this.b=2;}", eng );
Exec( "var x = new arr();", eng );
Assert.AreEqual("1", Exec("x.a;", eng), "x.a");
Assert.AreEqual("2", Exec("x.b;", eng), "x.b");
Assert.AreEqual("1", Exec("x['a'];", eng), "x['a']");
Assert.AreEqual("2", Exec("x['b'];", eng), "x['b']");
}
[Test]
public void ForTest()
{
string src = "var x = 1;" +
"for ( var y = 0; y < 1; y++ )" +
"{" +
"x++;" +
"}" +
"x;";
Assert.AreEqual("2", Exec(src), "x");
}
[Test]
public void BreakTest()
{
string src = "function fn(a)" +
"{" +
"var ret = \"\";" +
"for ( var x = 0; x < a.length; x++ )" +
"{" +
"if ( a.charAt(x) == 'b' )" +
"break;" +
"ret += a.charAt(x);" +
"}" +
"return ret;" +
"}" +
"fn('12b34');";
Assert.AreEqual("12", Exec(src), "x");
}
[Test]
public void ConditionalTest()
{
Assert.AreEqual("false", Exec("(1 > 1) ? 'true' : 'false';"), "conditional 1");
Assert.AreEqual("true", Exec("(1 > 0) ? 'true' : 'false';"), "conditional 1");
JsEngine eng = new JsEngine();
eng.Eval( "var mstrVersion = \"IE\";" );
eng.Eval("var isNav = (mstrVersion == \"Netscape\") ? true : false;");
Assert.AreEqual("False", eng.Eval("isNav;").ToString(), "isNav;");
eng.Eval( "var mstrVersion = \"Netscape\";" );
eng.Eval("isNav = (mstrVersion == \"Netscape\") ? true : false;");
Assert.AreEqual("True", eng.Eval("isNav;").ToString(), "isNav;");
}
[Test]
public void CommentTest()
{
Exec("// this is a comment\r\n");
}
[Test]
public void ConditionalOperatorTest()
{
Assert.AreEqual("1", Exec("var x = (1 > 0) ? 1 : 0; x;"));
}
private bool ExecHasException( string src )
{
try
{
Exec( src );
return false;
}
catch ( Exception )
{
return true;
}
}
private string Exec( string src )
{
JsEngine eng = new JsEngine();
return Exec( src, eng );
}
private string Exec( string src, JsEngine eng )
{
JsObject o = eng.Eval( src, 1 );
return o.ToString();
}
}
}