Beispiel #1
0
        public void LuaNestedErrors()
        {
            using (var runtime = new LuaRuntime()) {
                Action errorer = () => { DoError(runtime); };
                using (var func = runtime.CreateFunctionFromDelegate(errorer)) {
                    runtime.Globals ["test"] = func;
                }

                Action errorer2 = () => { runtime.DoString("test()").Dispose(); };
                using (var func = runtime.CreateFunctionFromDelegate(errorer2)) {
                    runtime.Globals ["test2"] = func;
                }

                try {
                    runtime.DoString(@"
                    function test3()
                        test2()
                    end
                    test3()");
                } catch (LuaException e) {
                    Assert.AreEqual(e.Message, "[LuaTable]");
                    Assert.IsInstanceOf <LuaTable>(e.Value);
                    var tab = (LuaTable)e.Value;
                    Assert.AreEqual(tab ["a"].ToBoolean(), true);
                    Assert.IsNull(e.InnerException);
                }
            }
        }
Beispiel #2
0
        public void TypeMapping()
        {
            bool called = false;
            TypeMappingTestDelegate cb = (a, b, c, d, e, f, g) => {
                Assert.AreEqual(10, a, "a");
                Assert.AreEqual(20, b, "b");
                Assert.AreEqual(0.5, c, "c");
                Assert.AreEqual("foobar", d, "d");
                Assert.AreEqual("dingus", e["widget"].ToString(), "e");
                Assert.AreEqual(true, f, "f");
                Assert.IsNull(g, "g");

                called = true;
            };

            using (var runtime = new LuaRuntime()) {
                using (var wrapper = runtime.CreateFunctionFromDelegate(cb)) {
                    runtime.Globals["callback"] = wrapper;
                }

                runtime.DoString("callback(10, 20, 0.5, 'foobar', { widget='dingus' }, true, nil)");
            }

            Assert.IsTrue(called, "called");
        }
Beispiel #3
0
        public void Metatables()
        {
            using (var runtime = new LuaRuntime()) {
                using (var tab = runtime.CreateTable()) {
                    using (var mt = runtime.CreateTable()) {
                        Func <LuaTable, string, LuaValue> index = (self, key) => {
                            return("hey");
                        };
                        using (var func = runtime.CreateFunctionFromDelegate(index)) {
                            mt ["__index"] = func;
                        }

                        tab.Metatable = mt;
                    }

                    runtime.Globals ["test"] = tab;

                    using (var mt = tab.Metatable) {
                        using (var index = mt ["__index"]) {
                            Assert.IsInstanceOf(typeof(LuaFunction), index);
                        }
                        Assert.AreEqual(1, mt.Count);
                    }
                }

                using (var ret = runtime.DoString("return test.this_key_doesnt_exist")) {
                    Assert.AreEqual(1, ret.Count);
                    Assert.AreEqual("hey", ret [0].ToString());
                }
            }
        }
Beispiel #4
0
        public LuaValue Get(LuaRuntime runtime)
        {
            if (IsMethod)
                return runtime.CreateFunctionFromDelegate((Func<LuaVararg, LuaValue>)Invoke);

            if (IsGetProperty)
                return ((PropertyInfo)Member).GetValue(Target, null).ToLuaValue(context);

            throw new LuaException("The property '{0}' is write-only".F(Member.Name));
        }
Beispiel #5
0
        public void ClrExceptionPropagation()
        {
            Action thrower = () => { throw new InvalidOperationException(); };

            using (var runtime = new LuaRuntime()) {
                using (var wrapper = runtime.CreateFunctionFromDelegate(thrower)) {
                    runtime.Globals["callback"] = wrapper;
                }

                runtime.DoString("callback()");
            }
        }
Beispiel #6
0
        public void CallbackOnCoroutineFails()
        {
            using (var runtime = new LuaRuntime()) {
                using (var callback = runtime.CreateFunctionFromDelegate(new Action(() => { Assert.Fail("Function called."); }))) {
                    runtime.Globals["callback"] = callback;
                }

                using (var r = runtime.DoString("return coroutine.resume(coroutine.create(callback))")) {
                    Assert.IsFalse(r[0].ToBoolean(), "Call succeeded.");
                    Assert.IsTrue(r[1].ToString().EndsWith("Cannot enter the CLR from inside of a Lua coroutine."), "Error message is accurate.");
                }
            }
        }
Beispiel #7
0
        public void CallbackOnCoroutineFails()
        {
            using (var runtime = new LuaRuntime()) {
                using (var callback = runtime.CreateFunctionFromDelegate(new Action(() => { Assert.Fail("Function called."); }))) {
                    runtime.Globals["callback"] = callback;
                }

                using (var r = runtime.DoString("return coroutine.resume(coroutine.create(callback))")) {
                    Assert.IsFalse(r[0].ToBoolean(), "Call succeeded.");
                    Assert.IsTrue(r[1].ToString().EndsWith("Cannot enter the CLR from inside of a Lua coroutine."), "Error message is accurate.");
                }
            }
        }
Beispiel #8
0
        public void LuaClrStaticMethods()
        {
            using (var runtime = new LuaRuntime()) {
                Func <LuaClrTypeObject> testex = () => { return(new LuaClrTypeObject(typeof(string))); };
                using (var func = runtime.CreateFunctionFromDelegate(testex)) {
                    runtime.Globals ["extest"] = func;
                }

                runtime.DoString(@"
                    local str = extest()
                    print(str.Join(',', {'Hello', ' world!'}, 0, 2))
                ");
            }
        }
        public LuaValue Get(LuaRuntime runtime)
        {
            if (IsMethod)
            {
                return(runtime.CreateFunctionFromDelegate((Func <LuaVararg, LuaValue>)Invoke));
            }

            if (IsGetProperty)
            {
                return(((PropertyInfo)Member).GetValue(Target, null).ToLuaValue(context));
            }

            throw new LuaException($"The property '{Member.Name}' is write-only");
        }
Beispiel #10
0
        public void Callback()
        {
            int? cbValue = null;
            Action<int> callback = x => cbValue = x;

            using (var runtime = new LuaRuntime()) {
                using (var wrapper = runtime.CreateFunctionFromDelegate(callback)) {
                    runtime.Globals["callback"] = wrapper;
                }

                runtime.DoString("callback(42)");
            }

            Assert.AreEqual(42, cbValue, "cbValue");
        }
Beispiel #11
0
        public void Callback()
        {
            int?         cbValue  = null;
            Action <int> callback = x => cbValue = x;

            using (var runtime = new LuaRuntime()) {
                using (var wrapper = runtime.CreateFunctionFromDelegate(callback)) {
                    runtime.Globals["callback"] = wrapper;
                }

                runtime.DoString("callback(42)");
            }

            Assert.AreEqual(42, cbValue, "cbValue");
        }
Beispiel #12
0
        public void HugeResultList()
        {
            var range = Enumerable.Range(1, 1000);

            Func <LuaVararg> fn = () => new LuaVararg(range.Select(i => (LuaNumber)i), true);

            using (var runtime = new LuaRuntime()) {
                using (var f = runtime.CreateFunctionFromDelegate(fn)) {
                    runtime.Globals["callback"] = f;
                }

                using (var results = runtime.DoString("return callback()")) {
                    Assert.AreEqual(range.Sum(), results.Select(i => (int)i.ToNumber().Value).Sum());
                }
            }
        }
Beispiel #13
0
        public void OpaqueClrObjectAsArgument()
        {
            object object1 = new object();
            object object2 = null;

            using (var runtime = new LuaRuntime()) {
                runtime.Globals["o"] = new LuaOpaqueClrObject(object1);

                using (var d = runtime.CreateFunctionFromDelegate(new Action <object>(o => object2 = o))) {
                    runtime.Globals["fn"] = d;
                }

                runtime.DoString("fn(o)").Dispose();
            }

            Assert.AreSame(object1, object2);
        }
Beispiel #14
0
        public void ClrEnums()
        {
            using (var runtime = new LuaRuntime()) {
                using (var func = runtime.CreateFunctionFromDelegate(new Func <Type>(() => typeof(string)))) {
                    runtime.Globals ["get_string_type"] = func;
                }

                runtime.Globals ["StringComparison"] = new LuaClrTypeObject(typeof(StringComparison));

                runtime.DoString(@"
                    local string = get_string_type()
                    if not string.Equals('Hello!', 'Hello!', StringComparison.InvariantCulture) then
                        error('Strings aren\'t equal?')
                    end
                ").Dispose();
            }
        }
Beispiel #15
0
        /// <summary>
        /// Creates a Lua function from a delegate.
        /// </summary>
        /// <param name="func">Delegate to wrap in a lua function.</param>
        /// <returns>A LuaFunction bound to the delegate.</returns>
        public LuaFunction SafeCreateFunction(Delegate func)
        {
            LuaFunction lf;

            lock (_luaState)
            {
                try
                {
                    lf = (LuaFunction)_luaState.CreateFunctionFromDelegate(func);
                }
                catch (Exception ex)
                {
                    lf = HandleException <LuaFunction>(ex, null);
                }
            }

            return(lf);
        }
Beispiel #16
0
        public void OpaqueClrObjectAsArgument()
        {
            object object1 = new object();
            object object2 = null;

            using (var runtime = new LuaRuntime()) {
                runtime.Globals["o"] = new LuaOpaqueClrObject(object1);

                using (var d = runtime.CreateFunctionFromDelegate(new Action<object>(o => object2 = o))) {
                    runtime.Globals["fn"] = d;
                }

                runtime.DoString("fn(o)").Dispose();
            }

            Assert.AreSame(object1, object2);
        }
Beispiel #17
0
        public static void InitializeLua()
        {
            if (!File.Exists(StockMainLuaPath))
            {
                Logger.Warn("No main.lua - bailing out.");
                return;
            }

            try {
                if (LuaState != null)
                {
                    DeinitializeLua();
                }
                LuaState = new LuaRuntime();
                Logger.Info("Running Lua");
                LuaState.MonoStackTraceWorkaround = true;
                LuaState.InitializeClrPackage();
                using (var package = LuaState.Globals["package"] as LuaTable) {
                    package["path"]  = $"{Path.Combine(StockPath, "?.lua")};{Path.Combine(StockPath, "?/init.lua")}";
                    package["cpath"] = "";
                }
                using (var stock_table = LuaState.CreateTable()) {
                    stock_table["_VERSION"] = Assembly.GetExecutingAssembly().GetName().Version.ToString();

                    using (var func = LuaState.CreateFunctionFromDelegate(
                               new Action <LuaTable, LuaFunction>(LuaFunctions.Hook)
                               )) stock_table["hook"] = func;

                    using (var func = LuaState.CreateFunctionFromDelegate(
                               new Func <string, AssemblyHelper>(LuaFunctions.Assembly)
                               )) stock_table["assembly"] = func;

                    using (var func = LuaState.CreateFunctionFromDelegate(
                               new LuaFunctions.ArrayTypeFuncDelegate(LuaFunctions.ArrayType)
                               )) stock_table["array_type"] = func;

                    using (var func = LuaState.CreateFunctionFromDelegate(
                               new Func <Type, LuaTable, LuaClrTypeObject>(LuaFunctions.GenericType)
                               )) stock_table["generic_type"] = func;

                    using (var func = LuaState.CreateFunctionFromDelegate(
                               new Func <LuaVararg, object>(LuaFunctions.Get)
                               )) stock_table["get"] = func;

                    using (var func = LuaState.CreateFunctionFromDelegate(
                               new Action <LuaVararg>(LuaFunctions.Set)
                               )) stock_table["set"] = func;

                    LuaState.Globals["stock"] = stock_table;
                }
                LuaState.DoFile(StockMainLuaPath);

                using (var stock = LuaState.Globals["stock"]) {
                    var stock_table = stock as LuaTable;
                    if (stock_table != null)
                    {
                        var unload = stock_table["unload"];
                        if (!(unload is LuaFunction))
                        {
                            unload.Dispose();
                            unload = null;
                        }
                        var ready = stock_table["ready"];
                        if (!(ready is LuaFunction))
                        {
                            ready.Dispose();
                            ready = null;
                        }

                        if (unload != null)
                        {
                            Unload = unload as LuaFunction;
                        }
                        if (ready != null)
                        {
                            Ready = ready as LuaFunction;
                        }
                    }
                }
            } catch (LuaException e) {
                Logger.Error($"Failed initializing Lua: [{e.GetType()}]");
                Logger.ErrorIndent(e.Message);
                foreach (var line in e.TracebackArray)
                {
                    Logger.ErrorIndent(line);
                }
            } catch (Exception e) {
                Logger.Error($"Failed initializing Lua: [{e.GetType()}]");
                Logger.ErrorIndent(e.Message);
                foreach (var line in e.StackTrace.Split('\n'))
                {
                    Logger.ErrorIndent(line.Replace("  ", ""));
                }
            }

            if (_GameObject != null)
            {
                if (Ready != null)
                {
                    SafeExecLua(Ready, "running stock.ready");
                }
            }
        }
Beispiel #18
0
        public void HugeResultList()
        {
            var range = Enumerable.Range(1, 1000);

            Func<LuaVararg> fn = () => new LuaVararg(range.Select(i => (LuaNumber)i), true);

            using (var runtime = new LuaRuntime()) {
                using (var f = runtime.CreateFunctionFromDelegate(fn)) {
                    runtime.Globals["callback"] = f;
                }

                using (var results = runtime.DoString("return callback()")) {
                    Assert.AreEqual(range.Sum(), results.Select(i => (int)i.ToNumber().Value).Sum());
                }
            }
        }
Beispiel #19
0
        public void TypeMapping()
        {
            bool called = false;
            TypeMappingTestDelegate cb = (a, b, c, d, e, f, g) => {
                Assert.AreEqual(10, a, "a");
                Assert.AreEqual(20, b, "b");
                Assert.AreEqual(0.5, c, "c");
                Assert.AreEqual("foobar", d, "d");
                Assert.AreEqual("dingus", e["widget"].ToString(), "e");
                Assert.AreEqual(true, f, "f");
                Assert.IsNull(g, "g");

                called = true;
            };

            using (var runtime = new LuaRuntime()) {
                using (var wrapper = runtime.CreateFunctionFromDelegate(cb)) {
                    runtime.Globals["callback"] = wrapper;
                }

                runtime.DoString("callback(10, 20, 0.5, 'foobar', { widget='dingus' }, true, nil)");
            }

            Assert.IsTrue(called, "called");
        }
Beispiel #20
0
        public void ClrErrorPropagation()
        {
            Action thrower = () => { throw new LuaException("$TEST$"); };

            using (var runtime = new LuaRuntime()) {
                using (var wrapper = runtime.CreateFunctionFromDelegate(thrower)) {
                    runtime.Globals["callback"] = wrapper;
                }

                runtime.DoString("callback()");
            }
        }