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