Esempio n. 1
0
        void Awake()
        {
            IFileSystem fileSystem;

            _mConsole = new MiniConsole(scrollRect, text, 100);
            _rt       = ScriptEngine.CreateRuntime();
            var asyncManager = new DefaultAsyncManager();
            var pathResolver = new PathResolver();

            pathResolver.AddSearchPath("node_modules");

            if (fileLoader == FileLoader.Resources)
            {
                fileSystem = new ResourcesFileSystem(_mConsole);
                pathResolver.AddSearchPath("dist"); // 这里的路径相对于 Unity Resources 空间
            }
            else if (fileLoader == FileLoader.HMR)
            {
                Debug.LogWarningFormat("功能未完成");
                fileSystem = new HttpFileSystem(_mConsole, baseUrl);
            }
            else
            {
                // 演示了一般文件系统的访问, 实际项目中典型的情况需要自行实现基于 AssetBundle(或 7z/zip) 的文件访问层
                fileSystem = new DefaultFileSystem(_mConsole);
                pathResolver.AddSearchPath("Scripts/out");
                // pathResolver.AddSearchPath("../Scripts/out");
                // _rt.AddSearchPath("Assets/Examples/Scripts/dist");
            }

            _rt.withStacktrace = stacktrace;
            if (sourceMap)
            {
                _rt.EnableSourceMap();
            }
            _rt.AddModuleResolvers();
            _rt.extraBinding = (runtime, register) =>
            {
                FSWatcher.Bind(register);
                QuickJS.Extra.WebSocket.Bind(register);
                QuickJS.Extra.XMLHttpRequest.Bind(register);
                if (!runtime.isWorker)
                {
                    var uri = new Uri(baseUrl);
                    QuickJS.Extra.DOMCompatibleLayer.Bind(register, uri);
                    QuickJS.Extra.NodeCompatibleLayer.Bind(register);
                }
            };
            _rt.Initialize(new ScriptRuntimeArgs
            {
                fileSystem          = fileSystem,
                pathResolver        = pathResolver,
                asyncManager        = asyncManager,
                logger              = _mConsole,
                byteBufferAllocator = new ByteBufferPooledAllocator(),
                binder              = ReflectionBinder.GetBinder(useReflectBind),
            });
            _rt.EvalMain(entryFileName);
        }
        public void Bind_SimpleForm()
        {
            var binder = new ReflectionBinder();

            var request = new DictionaryRequest
            {
                ["JobKey"] = "test"
            };

            Form1 form = (Form1)binder.Bind(typeof(Form1), request);

            Assert.That(form, Is.Not.Null);
            Assert.That(form.JobKey, Is.EqualTo("test"));
        }
        public void Bind_NestedArray_ShouldBeCaseInsensitive()
        {
            var binder = new ReflectionBinder();

            var request = new DictionaryRequest
            {
                ["ITEMS[0].key"] = "key1"
            };

            Form2 form = (Form2)binder.Bind(typeof(Form2), request);

            Assert.That(form, Is.Not.Null);
            Assert.That(form.Items, Is.Not.Null);
            Assert.That(form.Items.Length, Is.EqualTo(1));
            Assert.That(form.Items[0].Key, Is.EqualTo("key1"));
        }
        public void Bind_NestedArrayWrongKey_ShouldIgnore()
        {
            var binder = new ReflectionBinder();

            var request = new DictionaryRequest
            {
                ["Items[0]"]     = "key1",
                ["Items[0].Key"] = "key2"
            };

            Form2 form = (Form2)binder.Bind(typeof(Form2), request);

            Assert.That(form, Is.Not.Null);
            Assert.That(form.Items, Is.Not.Null);
            Assert.That(form.Items.Length, Is.EqualTo(1));
            Assert.That(form.Items[0].Key, Is.EqualTo("key2"));
        }
        public void Bind_NestedArray()
        {
            var binder = new ReflectionBinder();

            var request = new DictionaryRequest
            {
                ["Items[0].Key"]   = "key1",
                ["Items[0].Value"] = "value1",
                ["Items[1].Key"]   = "key2",
                ["Items[1].Value"] = "value2"
            };

            Form2 form = (Form2)binder.Bind(typeof(Form2), request);

            Assert.That(form, Is.Not.Null);
            Assert.That(form.Items, Is.Not.Null);
            Assert.That(form.Items.Length, Is.EqualTo(2));
            Assert.That(form.Items[0].Key, Is.EqualTo("key1"));
            Assert.That(form.Items[0].Value, Is.EqualTo("value1"));
            Assert.That(form.Items[1].Key, Is.EqualTo("key2"));
            Assert.That(form.Items[1].Value, Is.EqualTo("value2"));
        }