Commit d7f1849b authored by Vinicius Jarina's avatar Vinicius Jarina
Browse files

Fixed #116 problem accessing base class method

+ regression test.
parent f70558bd
......@@ -684,6 +684,14 @@ namespace NLua
LuaLib.LuaPushNil (luaState);
}
} else {
if (objType.UnderlyingSystemType != typeof(object)) {
#if NETFX_CORE
return GetMember (luaState, new ProxyType(objType.UnderlyingSystemType.GetTypeInfo().BaseType), obj, methodName, bindingType);
#else
return GetMember (luaState, new ProxyType(objType.UnderlyingSystemType.BaseType), obj, methodName, bindingType);
#endif
}
// kevinh - we want to throw an exception because meerly returning 'nil' in this case
// is not sufficient. valid data members may return nil and therefore there must be some
// way to know the member just doesn't exist.
......
......@@ -21,69 +21,94 @@ using NUnit.Framework;
namespace NLuaTest
{
#if MONOTOUCH
[Preserve (AllMembers = true)]
#endif
public class TestCaseName {
public string name = "name";
public string Name {
get {
return "**" + name + "**";
}
}
}
#if MONOTOUCH
[Preserve (AllMembers = true)]
#endif
public class Vector
public class master
{
public double x;
public double y;
public static Vector operator * (float k, Vector v)
{
var r = new Vector ();
r.x = v.x * k;
r.y = v.y * k;
return r;
}
public static Vector operator * (Vector v, float k)
public static string read()
{
var r = new Vector ();
r.x = v.x * k;
r.y = v.y * k;
return r;
}
public void Func ()
{
Console.WriteLine ("Func");
return "test-master";
}
}
public static class VectorExtension
#if MONOTOUCH
[Preserve (AllMembers = true)]
#endif
public class testClass : master
{
public static double Lenght (this Vector v)
public String strData;
public int intData;
public static string read2()
{
return v.x * v.x + v.y * v.y;
return "test";
}
}
#if MONOTOUCH
[Preserve (AllMembers = true)]
#endif
public class TestCaseName {
public string name = "name";
public string Name {
get {
return "**" + name + "**";
}
}
}
#if MONOTOUCH
[Preserve (AllMembers = true)]
#endif
public class Vector
{
public double x;
public double y;
public static Vector operator * (float k, Vector v)
{
var r = new Vector ();
r.x = v.x * k;
r.y = v.y * k;
return r;
}
public static Vector operator * (Vector v, float k)
{
var r = new Vector ();
r.x = v.x * k;
r.y = v.y * k;
return r;
}
public void Func ()
{
Console.WriteLine ("Func");
}
}
public static class VectorExtension
{
public static double Lenght (this Vector v)
{
return v.x * v.x + v.y * v.y;
}
}
[TestFixture]
#if MONOTOUCH
[Preserve (AllMembers = true)]
#endif
public class LuaTests
{
public static readonly char UnicodeChar = '\uE007';
public static string UnicodeString
{
get
{
return Convert.ToString (UnicodeChar);
}
{
public static readonly char UnicodeChar = '\uE007';
public static string UnicodeString
{
get
{
return Convert.ToString (UnicodeChar);
}
}
/*
* Tests capturing an exception
......@@ -165,20 +190,20 @@ namespace NLuaTest
lua.DoString ("val=test.Struct.val");
Assert.AreEqual (2.0d, (double)lua ["val"]);
}
}
[Test]
public void TestStructHashesEqual()
{
using (Lua lua = new Lua())
{
lua.DoString("luanet.load_assembly('NLuaTest')");
lua.DoString("TestStruct=luanet.import_type('NLuaTest.Mock.TestStruct')");
lua.DoString("struct1=TestStruct(0)");
lua.DoString("struct2=TestStruct(0)");
lua.DoString("struct2.val=1");
Assert.AreEqual(0, (double)lua["struct1.val"]);
}
}
[Test]
public void TestStructHashesEqual()
{
using (Lua lua = new Lua())
{
lua.DoString("luanet.load_assembly('NLuaTest')");
lua.DoString("TestStruct=luanet.import_type('NLuaTest.Mock.TestStruct')");
lua.DoString("struct1=TestStruct(0)");
lua.DoString("struct2=TestStruct(0)");
lua.DoString("struct2.val=1");
Assert.AreEqual(0, (double)lua["struct1.val"]);
}
}
[Test]
......@@ -1887,17 +1912,17 @@ namespace NLuaTest
lua.DoString ("test:Print('this will pass')");
lua.DoString ("test:Print('this will ','fail')");
}
}
[Test]
public void TestCtype ()
{
using (Lua lua = new Lua ()) {
}
[Test]
public void TestCtype ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString ("import'System'");
lua.DoString ("import'System'");
var x = lua.DoString ("return luanet.ctype(String)")[0];
Assert.AreEqual (x, typeof(String), "#1 String ctype test");
}
Assert.AreEqual (x, typeof(String), "#1 String ctype test");
}
}
[Test]
......@@ -1910,298 +1935,310 @@ namespace NLuaTest
}
[Test]
public void TestUnicodeChars ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString ("import('NLuaTest')");
lua.DoString ("res = LuaTests.UnicodeString");
string res = (string)lua ["res"];
Assert.AreEqual (LuaTests.UnicodeString, res);
}
}
[Test]
public void TestCoroutine ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.RegisterFunction ("func1", null, typeof (TestClass2).GetMethod ("func"));
lua.DoString ("function yielder() " +
"a=1;" + "coroutine.yield();" +
"func1(3,2);" + "coroutine.yield();" + // This line triggers System.NullReferenceException
"a=2;" + "coroutine.yield();" +
"end;" +
"co_routine = coroutine.create(yielder);" +
"while coroutine.resume(co_routine) do end;");
double num = lua.GetNumber ("a");
//Console.WriteLine("a="+num);
Assert.AreEqual (num, 2d);
}
}
[Test]
public void TestDebugHook ()
{
int [] lines = { 1, 2, 1, 3 };
int line = 0;
using (Lua lua = new Lua ()) {
lua.DebugHook += (sender,args) => {
Assert.AreEqual (args.LuaDebug.currentline,lines [line]);
line ++;
};
lua.SetDebugHook (NLua.Event.EventMasks.LUA_MASKLINE, 0);
lua.DoString (@"function testing_hooks() return 10 end
val = testing_hooks()
val = val + 1");
}
}
[Test]
public void TestKeyWithDots ()
{
using (Lua lua = new Lua ()) {
lua.DoString (@"g_dot = {}
g_dot['key.with.dot'] = 42");
Assert.AreEqual (42, (int)(double)lua ["g_dot.key\\.with\\.dot"]);
}
public void TestUnicodeChars ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString ("import('NLuaTest')");
lua.DoString ("res = LuaTests.UnicodeString");
string res = (string)lua ["res"];
Assert.AreEqual (LuaTests.UnicodeString, res);
}
}
[Test]
public void TestCoroutine ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.RegisterFunction ("func1", null, typeof (TestClass2).GetMethod ("func"));
lua.DoString ("function yielder() " +
"a=1;" + "coroutine.yield();" +
"func1(3,2);" + "coroutine.yield();" + // This line triggers System.NullReferenceException
"a=2;" + "coroutine.yield();" +
"end;" +
"co_routine = coroutine.create(yielder);" +
"while coroutine.resume(co_routine) do end;");
double num = lua.GetNumber ("a");
//Console.WriteLine("a="+num);
Assert.AreEqual (num, 2d);
}
}
[Test]
public void TestDebugHook ()
{
int [] lines = { 1, 2, 1, 3 };
int line = 0;
using (Lua lua = new Lua ()) {
lua.DebugHook += (sender,args) => {
Assert.AreEqual (args.LuaDebug.currentline,lines [line]);
line ++;
};
lua.SetDebugHook (NLua.Event.EventMasks.LUA_MASKLINE, 0);
lua.DoString (@"function testing_hooks() return 10 end
val = testing_hooks()
val = val + 1");
}
}
[Test]
public void TestKeyWithDots ()
{
using (Lua lua = new Lua ()) {
lua.DoString (@"g_dot = {}
g_dot['key.with.dot'] = 42");
Assert.AreEqual (42, (int)(double)lua ["g_dot.key\\.with\\.dot"]);
}
}
#if !WINDOWS_PHONE && !NET_3_5
[Test]
public void TestOperatorAdd ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a + b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a + b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestOperatorMinus ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a - b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a - b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestOperatorMultiply ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a * b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a * b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestOperatorEqual ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a == b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a == b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestOperatorNotEqual ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a != b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a ~= b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestUnaryMinus ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString (@" import ('System.Numerics')
c = Complex (10, 5)
c = -c ");
var expected = new System.Numerics.Complex (-10, -5);
var res = lua ["c"];
Assert.AreEqual (expected, res);
}
public void TestOperatorAdd ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a + b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a + b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestOperatorMinus ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a - b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a - b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestOperatorMultiply ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a * b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a * b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestOperatorEqual ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a == b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a == b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestOperatorNotEqual ()
{
using (Lua lua = new Lua ()) {
var a = new System.Numerics.Complex (10, 0);
var b = new System.Numerics.Complex (0, 3);
var x = a != b;
lua ["a"] = a;
lua ["b"] = b;
var res = lua.DoString (@"return a ~= b") [0];
Assert.AreEqual (x, res);
}
}
[Test]
public void TestUnaryMinus ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString (@" import ('System.Numerics')
c = Complex (10, 5)
c = -c ");
var expected = new System.Numerics.Complex (-10, -5);
var res = lua ["c"];
Assert.AreEqual (expected, res);
}
}
#endif
[Test]
public void TestCaseFields ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString (@" import ('NLuaTest')
x = TestCaseName()
name = x.name;
name2 = x.Name;
Name = x.Name;
Name2 = x.name");
Assert.AreEqual ("name", lua ["name"]);
Assert.AreEqual ("**name**", lua ["name2"]);
Assert.AreEqual ("**name**", lua ["Name"]);
Assert.AreEqual ("name", lua ["Name2"]);
}
}
[Test]
public void TestStaticOperators ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString (@" import ('NLuaTest')
v = Vector()
v.x = 10
v.y = 3
v = v*2 ");
var v = (Vector)lua ["v"];
Assert.AreEqual (20, v.x, "#1");
Assert.AreEqual (6, v.y, "#2");
lua.DoString (@" x = 2 * v");
var x = (Vector)lua ["x"];
Assert.AreEqual (40, x.x, "#3");
Assert.AreEqual (12, x.y, "#4");
}
}
[Test]
public void TestExtensionMethods ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString (@" import ('NLuaTest')
v = Vector()
v.x = 10
v.y = 3
v = v*2 ");
var v = (Vector)lua ["v"];
double len = v.Lenght ();
lua.DoString (" v:Lenght() ");
lua.DoString (@" len2 = v:Lenght()");
double len2 = (double)lua ["len2"];
Assert.AreEqual (len, len2, "#1");
}
}
[Test]
public void TestOverloadedMethods ()
{
using (Lua lua = new Lua ()) {
var obj = new TestClassWithOverloadedMethod ();
lua ["obj"] = obj;
lua.DoString (@"
obj:Func (10)
obj:Func ('10')
obj:Func (10)
obj:Func ('10')
obj:Func (10)
");
Assert.AreEqual (3, obj.CallsToIntFunc,"#integer");
Assert.AreEqual (2, obj.CallsToStringFunc, "#string");
}
}
[Test]
public void TestGetStack ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
m_lua = lua;
lua.DoString (@"
import ('NLuaTest')
function f1 ()
f2 ()
end
function f2()
f3()
end
function f3()
LuaTests.func()
end
f1 ()
");
}
m_lua = null;
}
public static void func()
{
#if USE_KOPILUA
string expected = "[0] [C]:-1 -- func [field]\n[1] [string \"chunk\"]:12 -- f3 [global]\n[2] [string \"chunk\"]:8 -- f2 [global]\n[3] [string \"chunk\"]:4 -- f1 [global]\n[4] [string \"chunk\"]:15 -- <unknow> []\n";
KopiLua.LuaDebug info = new KopiLua.LuaDebug ();
#else
//string expected = "[0] func:-1 -- <unknown> [func]\n[1] f3:12 -- <unknown> [f3]\n[2] f2:8 -- <unknown> [f2]\n[3] f1:4 -- <unknown> [f1]\n[4] :15 -- []\n";
KeraLua.LuaDebug info = new KeraLua.LuaDebug ();
#endif
int level = 0;
StringBuilder sb = new StringBuilder ();
while (m_lua.GetStack (level,ref info) != 0) {
m_lua.GetInfo ("nSl", ref info);
string name = "<unknow>";
if (info.name != null && !string.IsNullOrEmpty(info.name.ToString()))
name = info.name.ToString ();
sb.AppendFormat ("[{0}] {1}:{2} -- {3} [{4}]\n",
level, info.shortsrc, info.currentline,
name, info.namewhat);
++level;
}
string x = sb.ToString ();
Assert.True (!string.IsNullOrEmpty(x));
}
public void TestCaseFields ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString (@" import ('NLuaTest')
x = TestCaseName()
name = x.name;
name2 = x.Name;
Name = x.Name;
Name2 = x.name");
Assert.AreEqual ("name", lua ["name"]);
Assert.AreEqual ("**name**", lua ["name2"]);
Assert.AreEqual ("**name**", lua ["Name"]);
Assert.AreEqual ("name", lua ["Name2"]);
}
}
[Test]
public void TestStaticOperators ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString (@" import ('NLuaTest')
v = Vector()
v.x = 10
v.y = 3
v = v*2 ");
var v = (Vector)lua ["v"];
Assert.AreEqual (20, v.x, "#1");
Assert.AreEqual (6, v.y, "#2");
lua.DoString (@" x = 2 * v");
var x = (Vector)lua ["x"];
Assert.AreEqual (40, x.x, "#3");
Assert.AreEqual (12, x.y, "#4");
}
}
[Test]
public void TestExtensionMethods ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
lua.DoString (@" import ('NLuaTest')
v = Vector()
v.x = 10
v.y = 3
v = v*2 ");
var v = (Vector)lua ["v"];
double len = v.Lenght ();
lua.DoString (" v:Lenght() ");
lua.DoString (@" len2 = v:Lenght()");
double len2 = (double)lua ["len2"];
Assert.AreEqual (len, len2, "#1");
}
}
[Test]
public void TestOverloadedMethods ()
{
using (Lua lua = new Lua ()) {
var obj = new TestClassWithOverloadedMethod ();
lua ["obj"] = obj;
lua.DoString (@"
obj:Func (10)
obj:Func ('10')
obj:Func (10)
obj:Func ('10')
obj:Func (10)
");
Assert.AreEqual (3, obj.CallsToIntFunc,"#integer");
Assert.AreEqual (2, obj.CallsToStringFunc, "#string");
}
}
[Test]
public void TestGetStack ()
{
using (Lua lua = new Lua ()) {
lua.LoadCLRPackage ();
m_lua = lua;
lua.DoString (@"
import ('NLuaTest')
function f1 ()
f2 ()
end
function f2()
f3()
end
function f3()
LuaTests.func()
end
f1 ()
");
}
m_lua = null;
}
public static void func()
{
#if USE_KOPILUA
string expected = "[0] [C]:-1 -- func [field]\n[1] [string \"chunk\"]:12 -- f3 [global]\n[2] [string \"chunk\"]:8 -- f2 [global]\n[3] [string \"chunk\"]:4 -- f1 [global]\n[4] [string \"chunk\"]:15 -- <unknow> []\n";
KopiLua.LuaDebug info = new KopiLua.LuaDebug ();
#else
//string expected = "[0] func:-1 -- <unknown> [func]\n[1] f3:12 -- <unknown> [f3]\n[2] f2:8 -- <unknown> [f2]\n[3] f1:4 -- <unknown> [f1]\n[4] :15 -- []\n";
KeraLua.LuaDebug info = new KeraLua.LuaDebug ();
#endif
int level = 0;
StringBuilder sb = new StringBuilder ();
while (m_lua.GetStack (level,ref info) != 0) {
m_lua.GetInfo ("nSl", ref info);
string name = "<unknow>";
if (info.name != null && !string.IsNullOrEmpty(info.name.ToString()))
name = info.name.ToString ();
sb.AppendFormat ("[{0}] {1}:{2} -- {3} [{4}]\n",
level, info.shortsrc, info.currentline,
name, info.namewhat);
++level;
}
string x = sb.ToString ();
Assert.True (!string.IsNullOrEmpty(x));
}
[Test]
public void TestCallImplicitBaseMethod ()
{
using (var l = new Lua ()) {
l.LoadCLRPackage ();
l.DoString ("import ('NLuaTest')");
l.DoString ("res = testClass.read() ");
string res = (string)l ["res"];
Assert.AreEqual (testClass.read (), res);
}
}
static Lua m_lua;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment