Exemplo n.º 1
0
        public async Task ReactBridge_InvokeCallback()
        {
            await JavaScriptHelpers.Run(async (executor, jsQueueThread) =>
            {
                using (var nativeThread = MessageQueueThread.Create(MessageQueueThreadSpec.Create("native", MessageQueueThreadKind.BackgroundAnyThread), ex => { Assert.Fail(); }))
                {
                    var reactCallback = new MockReactCallback();
                    var bridge        = new ReactBridge(executor, new MockReactCallback(), nativeThread);
                    var token         = await jsQueueThread.CallOnQueue(() =>
                    {
                        bridge.InvokeCallback(1, new JArray());
                        return(executor.GetGlobalVariable("CallbackCalls"));
                    });

                    var expected = new JArray
                    {
                        new JArray
                        {
                            1,
                            new JArray(),
                        },
                    };

                    Assert.AreEqual(expected.ToString(Formatting.None), token.ToString(Formatting.None));
                }
            });
        }
Exemplo n.º 2
0
        public async Task ReactBridge_Ctor_ArgumentChecks()
        {
            await JavaScriptHelpers.Run((executor, jsQueueThread) =>
            {
                using (var nativeThread = CreateNativeModulesThread())
                {
                    var reactCallback = new MockReactCallback();

                    Assert.That(
                        () => new ReactBridge(null, reactCallback, nativeThread),
                        Throws.ArgumentNullException.With.Property("ParamName").EqualTo("executor")
                        );

                    Assert.That(
                        () => new ReactBridge(executor, null, nativeThread),
                        Throws.ArgumentNullException.With.Property("ParamName").EqualTo("reactCallback")
                        );

                    Assert.That(
                        () => new ReactBridge(executor, reactCallback, null),
                        Throws.ArgumentNullException.With.Property("ParamName").EqualTo("nativeModulesQueueThread")
                        );
                }
            });
        }
Exemplo n.º 3
0
        public async Task ReactBridge_CallFunction()
        {
            await JavaScriptHelpers.Run(async (executor, jsQueueThread) =>
            {
                using (var nativeThread = CreateNativeModulesThread())
                {
                    var reactCallback = new MockReactCallback();
                    var bridge        = new ReactBridge(executor, new MockReactCallback(), nativeThread);
                    var token         = await jsQueueThread.CallOnQueue(() =>
                    {
                        bridge.CallFunction("module", "method", new JArray());
                        return(executor.GetGlobalVariable("FunctionCalls"));
                    });

                    var expected = new JArray
                    {
                        new JArray
                        {
                            "module",
                            "method",
                            new JArray(),
                        },
                    };

                    Assert.AreEqual(expected.ToString(Formatting.None), token.ToString(Formatting.None));
                }
            });
        }
        public void ReactBridge_ReactCallbacks()
        {
            using (var nativeThread = CreateNativeModulesThread())
            {
                var jsonResponse = JArray.Parse("[[42,17],[16,22],[[],[\"foo\"]]]");

                var executor = new MockJavaScriptExecutor((module, method, args) =>
                {
                    return(jsonResponse);
                });

                var callbacks    = new List <Tuple <int, int, JArray> >();
                var eventHandler = new AutoResetEvent(false);
                var callback     = new MockReactCallback(
                    (moduleId, methodId, args) => callbacks.Add(Tuple.Create(moduleId, methodId, args)),
                    () => eventHandler.Set());

                var bridge = new ReactBridge(executor, callback, nativeThread);
                bridge.CallFunction("module", "method", new JArray());

                Assert.IsTrue(eventHandler.WaitOne());

                Assert.AreEqual(2, callbacks.Count);

                Assert.AreEqual(42, callbacks[0].Item1);
                Assert.AreEqual(16, callbacks[0].Item2);
                Assert.AreEqual(0, callbacks[0].Item3.Count);

                Assert.AreEqual(17, callbacks[1].Item1);
                Assert.AreEqual(22, callbacks[1].Item2);
                Assert.AreEqual(1, callbacks[1].Item3.Count);
                Assert.AreEqual("foo", callbacks[1].Item3[0].Value <string>());
            }
        }
Exemplo n.º 5
0
        public async Task ReactBridge_Method_ArgumentChecks()
        {
            await JavaScriptHelpers.Run((executor, jsQueueThread) =>
            {
                using (var nativeThread = CreateNativeModulesThread())
                {
                    var reactCallback = new MockReactCallback();
                    var bridge        = new ReactBridge(executor, reactCallback, nativeThread);

                    AssertEx.Throws <ArgumentNullException>(
                        () => bridge.SetGlobalVariable(null, null),
                        ex => Assert.AreEqual("propertyName", ex.ParamName));
                }
            });
        }
Exemplo n.º 6
0
        public async Task ReactBridge_SyncCallback()
        {
            var jsFactories = new Func <IJavaScriptExecutor>[]
            {
                () => new ChakraJavaScriptExecutor(),
#if WINDOWS_UWP
                () => new NativeJavaScriptExecutor(),
#endif
            };

            foreach (var jsFactory in jsFactories)
            {
                await JavaScriptHelpers.Run(async (executor, jsQueueThread) =>
                {
                    using (var nativeThread = CreateNativeModulesThread())
                    {
                        var moduleId = 42;
                        var methodId = 7;
                        var called   = 0;
                        var callback = new MockReactCallback
                        {
                            InvokeSyncHandler = (mod, met, arg) =>
                            {
                                Assert.AreEqual(moduleId, mod);
                                Assert.AreEqual(methodId, met);
                                Assert.AreEqual(0, arg.Count);
                                ++called;
                                return(JValue.CreateNull());
                            },
                        };

                        var bridge = new ReactBridge(executor, callback, nativeThread);
                        await jsQueueThread.RunAsync(() =>
                        {
                            bridge.CallFunction("SyncModule", "test", new JArray {
                                42, 7, new JArray()
                            });
                        });

                        Assert.AreEqual(1, called);
                    }
                },
                                            jsFactory,
                                            @"Resources/sync.js");
            }
        }
Exemplo n.º 7
0
        public async Task ReactBridge_Ctor_ArgumentChecks()
        {
            await JavaScriptHelpers.Run((executor, jsQueueThread) =>
            {
                using (var nativeThread = CreateNativeModulesThread())
                {
                    var reactCallback = new MockReactCallback();

                    AssertEx.Throws <ArgumentNullException>(
                        () => new ReactBridge(null, reactCallback, nativeThread),
                        ex => Assert.AreEqual("executor", ex.ParamName));

                    AssertEx.Throws <ArgumentNullException>(
                        () => new ReactBridge(executor, null, nativeThread),
                        ex => Assert.AreEqual("reactCallback", ex.ParamName));

                    AssertEx.Throws <ArgumentNullException>(
                        () => new ReactBridge(executor, reactCallback, null),
                        ex => Assert.AreEqual("nativeModulesQueueThread", ex.ParamName));
                }
            });
        }
Exemplo n.º 8
0
        public async Task ReactBridge_FlushQueueImmediate()
        {
            var jsFactories = new Func <IJavaScriptExecutor>[]
            {
                () => new ChakraJavaScriptExecutor(),
#if WINDOWS_UWP
                () => new NativeJavaScriptExecutor(),
#endif
            };

            foreach (var jsFactory in jsFactories)
            {
                await JavaScriptHelpers.Run(async (executor, jsQueueThread) =>
                {
                    using (var nativeThread = CreateNativeModulesThread())
                    {
                        var moduleId       = 42;
                        var methodId       = 7;
                        var called         = 0;
                        var countdownEvent = new CountdownEvent(1);
                        var callback       = new MockReactCallback
                        {
                            InvokeHandler = (mod, met, arg) =>
                            {
                                Assert.AreEqual(moduleId, mod);
                                Assert.AreEqual(methodId, met);
                                Assert.AreEqual(1, arg.Count);
                                Assert.AreEqual("foo", arg[0].Value <string>());
                                ++called;
                            },
                            OnBatchCompleteHandler = () => countdownEvent.Signal(),
                        };

                        var bridge = new ReactBridge(executor, callback, nativeThread);
                        await jsQueueThread.RunAsync(() =>
                        {
                            bridge.CallFunction("FlushQueueImmediateModule", "test", new JArray {
                                10, new JArray {
                                    new JArray {
                                        42
                                    }, new JArray {
                                        7
                                    }, new JArray {
                                        new JArray {
                                            "foo"
                                        }
                                    }
                                }
                            });
                        });

                        // wait for `OnBatchComplete` in background
                        // so we don't block native module thread
                        await Task.Run(new Action(countdownEvent.Wait));

                        Assert.AreEqual(10, called);
                    }
                },
                                            jsFactory,
                                            @"Resources/immediate.js");
            }
        }