public async Task TwoWay_ResultCommand_Without_Argument_Returns_Result()
        {
            var result   = "resultString";
            var function = Substitute.For <Func <string> >();

            function.Invoke().Returns(result);

            var dc = new FakeFactory <string>(function);

            var test = new TestInContextAsync()
            {
                Path = TestContext.IndexPromise,
                Bind = (win) => HtmlBinding.Bind(win, dc, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js        = mb.JsRootObject;
                    var mycommand = GetAttribute(js, "CreateObject");
                    var cb        = GetCallBackObject();

                    var resdummy = this.CallWithRes(mycommand, "Execute", cb);

                    await Task.Delay(700);

                    var resvalue = _WebView.GetGlobal().GetValue("res");

                    await Task.Delay(100);

                    var originalValue = resvalue.GetStringValue();

                    originalValue.Should().Be(result);
                }
            };

            await RunAsync(test);
        }
Beispiel #2
0
        public async Task TwoWay_Calls_Command_With_Correct_Argument()
        {
            var fakeTestViewModel = new BasicFatherTestViewModel();
            var child             = new BasicTestViewModel();

            fakeTestViewModel.Child = child;

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, fakeTestViewModel, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js      = mb.JsRootObject;
                    var childJs = GetAttribute(js, "Child");

                    var jsCommand = GetAttribute(js, "Command");
                    DoSafe(() => Call(jsCommand, "Execute", childJs));
                    await Task.Delay(300);

                    fakeTestViewModel.CallCount.Should().Be(1);
                    fakeTestViewModel.LastCallElement.Should().Be(child);
                }
            };

            await RunAsync(test);
        }
Beispiel #3
0
        public async Task TwoWay_CommandWithoutParameter_Updates_From_Null()
        {
            var command           = Substitute.For <ICommandWithoutParameter>();
            var fakeTestViewModel = new FakeTestViewModel();

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, fakeTestViewModel, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var jsCommand = GetAttribute(js, "Command");
                    jsCommand.IsNull.Should().BeTrue();

                    DoSafeUI(() => fakeTestViewModel.CommandWithoutParameters = command);
                    await Task.Delay(200);

                    jsCommand = GetAttribute(js, "CommandWithoutParameters");
                    DoSafe(() => Call(jsCommand, "Execute"));
                    await Task.Delay(200);

                    command.Received().Execute();
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Unlistens_When_Property_Is_Changed(BasicTestViewModel remplacementChild)
        {
            var child       = new BasicTestViewModel();
            var datacontext = new BasicTestViewModel {
                Child = child
            };

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    child.ListenerCount.Should().Be(1);

                    DoSafeUI(() => datacontext.Child = remplacementChild);
                    await Task.Delay(300);

                    child.ListenerCount.Should().Be(0);

                    //If still listening to child, this will raise an exception
                    //for changing property on the wrong thread
                    var    third = new BasicTestViewModel();
                    Action safe  = () => child.Child = third;
                    safe.Should().NotThrow();
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Cleans_Javascript_Objects_Cache_When_Object_Is_Not_Part_Of_The_Graph(BasicTestViewModel remplacementChild)
        {
            var datacontext = new BasicFatherTestViewModel();
            var child       = new BasicTestViewModel();

            datacontext.Child = child;

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js      = mb.JsRootObject;
                    var childJs = GetAttribute(js, "Child");

                    DoSafeUI(() => datacontext.Child = remplacementChild);
                    await Task.Delay(300);

                    var mycommand = GetAttribute(js, "Command");
                    DoSafe(() => Call(mycommand, "Execute", childJs));
                    await Task.Delay(300);

                    datacontext.CallCount.Should().Be(0);
                    datacontext.LastCallElement.Should().BeNull();
                }
            };

            await RunAsync(test);
        }
Beispiel #6
0
        public async Task TwoWay_Collection_Updates_After_ReplaceRange_One_Collection_Changes()
        {
            var dataContext = new VmWithRangeCollection <int>();

            dataContext.List.AddRange(new[] { 100, 200 });
            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    DoSafeUI(() =>
                    {
                        dataContext.List.ReplaceRange(new[] { 1, 2, 3, 4, 5 });
                    });

                    await Task.Delay(500);

                    var col = GetCollectionAttribute(js, "List");
                    col.Should().NotBeNull();
                    CheckIntCollection(col, new[] { 1, 2, 3, 4, 5 });
                }
            };

            await RunAsync(test);
        }
Beispiel #7
0
        public async Task TwoWay_Maps_None_Generic_List()
        {
            var dataContext = new VmWithList();

            dataContext.List.Add(888);

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var col = GetSafe(() => GetCollectionAttribute(js, "List"));
                    col.GetArrayLength().Should().Be(1);

                    var res = GetAttribute(js, "List");
                    Call(res, "push", _WebView.Factory.CreateString("newvalue"));

                    col = GetSafe(() => GetCollectionAttribute(js, "List"));
                    col.GetArrayLength().Should().Be(2);

                    await Task.Delay(350);

                    dataContext.List.Should().HaveCount(2);
                    dataContext.List[1].Should().Be("newvalue");
                }
            };

            await RunAsync(test);
        }
Beispiel #8
0
        public async Task TwoWay_Listens_To_Key_Added_CSharp_Side()
        {
            dynamic dynamicDataContext = new ExpandoObject();

            dynamicDataContext.ValueInt = 1;

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, dynamicDataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var res = GetAttribute(js, "ValueDouble");
                    res.IsUndefined.Should().BeTrue();

                    await DoSafeAsyncUI(() =>
                    {
                        dynamicDataContext.ValueDouble = 0.5;
                    });

                    var resDouble = await GetDoubleAttributeAsync(js, "ValueDouble");

                    resDouble.Should().Be(0.5);
                }
            };

            await RunAsync(test);
        }
Beispiel #9
0
        public async Task TwoWay_Listens_To_Key_Added_Js_Side()
        {
            dynamic dynamicDataContext = new ExpandoObject();

            dynamicDataContext.ValueInt = 1;

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, dynamicDataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    AddAttribute(js, "ValueDouble", _WebView.Factory.CreateDouble(49));

                    var resDouble = await GetDoubleAttributeAsync(js, "ValueDouble");

                    resDouble.Should().Be(49);

                    double value = dynamicDataContext.ValueDouble;
                    value.Should().Be(49);
                }
            };

            await RunAsync(test);
        }
Beispiel #10
0
        public async Task TwoWay_Cleans_JavascriptObject_Listeners_When_Object_Is_Not_Part_Of_The_Graph_Js()
        {
            var dataContext = new BasicFatherTestViewModel();
            var child       = new BasicTestViewModel();

            dataContext.Child = child;

            var test = new TestInContextAsync()
            {
                Bind = (win) => Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js      = mb.JsRootObject;
                    var childJs = GetAttribute(js, "Child");

                    CheckObjectObservability(childJs, ObjectObservability.Observable);

                    var nullJs = Factory.CreateNull();
                    await SetAttributeAsync(js, "Child", nullJs);

                    await DoSafeAsyncUI(() => dataContext.Child.Should().BeNull());

                    child.ListenerCount.Should().Be(0);

                    //await WaitAnotherWebContextCycle();
                    await CheckHasListenerAsync(childJs, false);
                }
            };

            await RunAsync(test);
        }
Beispiel #11
0
        public async Task TwoWay_Cleans_JavascriptObject_Listeners_When_Object_Is_Not_Part_Of_The_Graph_Array_Js_Context()
        {
            var dataContext = new BasicListTestViewModel();
            var child       = new BasicTestViewModel();

            dataContext.Children.Add(child);

            var test = new TestInContextAsync()
            {
                Bind = (win) => Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    CheckObjectObservability(js, ObjectObservability.ReadOnlyObservable);

                    var childrenJs = GetCollectionAttribute(js, "Children");
                    var childJs    = childrenJs.GetValue(0);

                    await CheckObjectObservabilityAsync(childJs, ObjectObservability.Observable);

                    var observableCollection = GetAttribute(js, "Children");
                    Call(observableCollection, "pop");


                    await CheckHasListenerAsync(childJs, false);
                }
            };

            await RunAsync(test);
        }
Beispiel #12
0
        public async Task TwoWay_Cleans_JavascriptObject_Listeners_When_Object_Is_Not_Part_Of_The_Graph_Multiple_Changes(BasicTestViewModel remplacementChild)
        {
            var dataContext = new BasicFatherTestViewModel();
            var child       = new BasicTestViewModel();

            dataContext.Child = child;

            var tempChild1 = new BasicTestViewModel();
            var tempChild2 = new BasicTestViewModel();

            var test = new TestInContextAsync()
            {
                Bind = (win) => Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js      = mb.JsRootObject;
                    var childJs = GetAttribute(js, "Child");

                    CheckObjectObservability(childJs, ObjectObservability.Observable);

                    await DoSafeAsyncUI(() =>
                    {
                        dataContext.Child = tempChild1;
                        dataContext.Child = tempChild2;
                        dataContext.Child = remplacementChild;
                    });

                    await CheckHasListenerAsync(childJs, false);
                }
            };

            await RunAsync(test);
        }
Beispiel #13
0
        public async Task Stress_Big_Vm_Commands(int commandsCount)
        {
            var root = new CommandsTestViewModel();
            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, root, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var commands = Enumerable.Range(0, commandsCount).Select(_ => NSubstitute.Substitute.For <ICommand>()).ToArray();

                    using (var perf = GetPerformanceCounter($"Perf to create Vm with {commandsCount} commands"))
                    {
                        perf.DiscountTime = DelayForTimeOut;
                        await DoSafeAsyncUI(() => root.Commands = commands);

                        await Task.Delay(DelayForTimeOut);

                        var other = await _WebView.EvaluateAsync(() => GetAttribute(js, "Commands"));

                        other.IsArray.Should().BeTrue();
                    }
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Cleans_JavascriptObject_Listeners_When_Object_Is_Not_Part_Of_The_Graph_Array_Context(BasicTestViewModel remplacementChild)
        {
            var datacontext = new BasicListTestViewModel();
            var child       = new BasicTestViewModel();

            datacontext.Children.Add(child);

            var test = new TestInContextAsync()
            {
                Bind = (win) => Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    CheckObjectObservability(js, ObjectObservability.ReadOnlyObservable);

                    var childrenJs = GetCollectionAttribute(js, "Children");
                    var childJs    = childrenJs.GetValue(0);

                    CheckObjectObservability(childJs, ObjectObservability.Observable);

                    DoSafeUI(() => datacontext.Children[0] = remplacementChild);
                    await Task.Delay(150);

                    CheckHasListener(childJs, false);
                }
            };

            await RunAsync(test);
        }
Beispiel #15
0
        public async Task Update_from_int(int value, IJavascriptObjectBuilderStrategyFactory strategyFactory)
        {
            var root = new FakeIntViewModel();
            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, root, JavascriptBindingMode.TwoWay, strategyFactory),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var stopWatch = new Stopwatch();
                    stopWatch.Start();

                    await DoSafeAsyncUI(() => root.Value = value);

                    await Task.Delay(DelayForTimeOut);

                    var other = await _WebView.EvaluateAsync(() => GetAttribute(js, "Value"));

                    other.GetIntValue().Should().Be(value);

                    stopWatch.Stop();
                    var ts = stopWatch.ElapsedMilliseconds - DelayForTimeOut;
                    _Logger.Info($"Perf: {((double)(ts)) / 1000} sec");
                }
            };

            await RunAsync(test);
        }
Beispiel #16
0
        public async Task TwoWay_Listens_On_Js_Side_To_Keys_Added_On_Js_Side()
        {
            dynamic dynamicDataContext = new ExpandoObject();

            dynamicDataContext.ValueInt = 1;

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, dynamicDataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;
                    AddAttribute(js, "ValueDouble", _WebView.Factory.CreateDouble(49));

                    await WaitAnotherWebContextCycle();

                    await SetAttributeAsync(js, "ValueDouble", _WebView.Factory.CreateDouble(7));

                    await DoSafeAsyncUI(() =>
                    {
                        double value = dynamicDataContext.ValueDouble;
                        value.Should().Be(7);
                    });
                }
            };

            await RunAsync(test);
        }
Beispiel #17
0
        public async Task Stress_Vm_FromStrategy(int childrenCount, int rank, IJavascriptObjectBuilderStrategyFactory strategyFactory)
        {
            var root = new SimpleFatherTestViewModel();
            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, root, JavascriptBindingMode.TwoWay, strategyFactory),
                Test = async(mb) =>
                {
                    var bigVm = SimpleReadOnlyTestViewModel.BuildBigVm(childrenCount, rank);
                    var js    = mb.JsRootObject;

                    var stopWatch = new Stopwatch();
                    stopWatch.Start();

                    await DoSafeAsyncUI(() => root.Other = bigVm);

                    await Task.Delay(DelayForTimeOut);

                    var other = await _WebView.EvaluateAsync(() => GetAttribute(js, "Other"));

                    stopWatch.Stop();
                    var ts = stopWatch.ElapsedMilliseconds - DelayForTimeOut;
                    _Logger.Info($"Perf: {((double)(ts)) / 1000} sec");

                    other.IsObject.Should().BeTrue();
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_should_clean_javascriptObject_listeners_when_object_is_not_part_of_the_graph(BasicTestViewModel remplacementChild)
        {
            var datacontext = new BasicFatherTestViewModel();
            var child       = new BasicTestViewModel();

            datacontext.Child = child;

            var test = new TestInContextAsync()
            {
                Bind = (win) => Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js      = mb.JsRootObject;
                    var childJs = GetAttribute(js, "Child");

                    CheckReadOnly(childJs, false);

                    DoSafeUI(() => datacontext.Child = remplacementChild);
                    await Task.Delay(150);

                    CheckHasListener(childJs, false);
                }
            };

            await RunAsync(test);
        }
Beispiel #19
0
        public async Task TwoWay_Updates_Collection()
        {
            var datacontext = new ChangingCollectionViewModel();

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var col = GetSafe(() => GetCollectionAttribute(js, "Items"));
                    col.GetArrayLength().Should().NotBe(0);

                    DoSafeUI(() => datacontext.Replace.Execute(null));

                    datacontext.Items.Should().BeEmpty();

                    await Task.Delay(300);

                    col = GetSafe(() => GetCollectionAttribute(js, "Items"));
                    col.GetArrayLength().Should().Be(0);
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_should_clean_javascriptObject_listeners_when_object_is_not_part_of_the_graph_js()
        {
            var datacontext = new BasicFatherTestViewModel();
            var child       = new BasicTestViewModel();

            datacontext.Child = child;

            var test = new TestInContextAsync()
            {
                Bind = (win) => Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js      = mb.JsRootObject;
                    var childJs = GetAttribute(js, "Child");

                    CheckReadOnly(childJs, false);

                    var nullJs = Factory.CreateNull();
                    SetAttribute(js, "Child", nullJs);

                    await Task.Delay(150);

                    DoSafeUI(() => datacontext.Child.Should().BeNull());

                    child.ListenerCount.Should().Be(0);

                    await Task.Delay(100);

                    CheckHasListener(childJs, false);
                }
            };

            await RunAsync(test);
        }
Beispiel #21
0
        public async Task TwoWay_Survives_Collection_Update_From_Js_With_Wrong_Type()
        {
            var test = new TestInContextAsync()
            {
                Path = TestContext.Simple,
                Bind = (win) => HtmlBinding.Bind(win, _DataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var root = (mb as HtmlBinding).JsBrideRootObject as JsGenericObject;
                    var js   = mb.JsRootObject;

                    var col = GetCollectionAttribute(js, "Skills");
                    col.GetArrayLength().Should().Be(2);

                    CheckCollection(col, _DataContext.Skills);

                    var coll = GetAttribute(js, "Skills");
                    Call(coll, "push", _WebView.Factory.CreateString("Whatever"));

                    await Task.Delay(150);

                    _DataContext.Skills.Should().HaveCount(2);
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_should_clean_javascriptObject_listeners_when_object_is_not_part_of_the_graph_array_js_context()
        {
            var datacontext = new BasicListTestViewModel();
            var child       = new BasicTestViewModel();

            datacontext.Children.Add(child);

            var test = new TestInContextAsync()
            {
                Bind = (win) => Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    CheckReadOnly(js, true);

                    var childrenJs = GetCollectionAttribute(js, "Children");
                    var childJs    = childrenJs.GetValue(0);

                    CheckReadOnly(childJs, false);

                    Call(childrenJs, "pop");

                    await Task.Delay(150);

                    CheckHasListener(childJs, false);
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Unlistens_When_Property_Has_Transients_Changes(BasicTestViewModel remplacementChild)
        {
            var child       = new BasicTestViewModel();
            var datacontext = new BasicTestViewModel {
                Child = child
            };
            var tempChild1 = new BasicTestViewModel();
            var tempChild2 = new BasicTestViewModel();

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    child.ListenerCount.Should().Be(1);

                    DoSafeUI(() =>
                    {
                        datacontext.Child = tempChild1;
                        datacontext.Child = tempChild2;
                        datacontext.Child = remplacementChild;
                    });
                    await Task.Delay(300);

                    tempChild1.ListenerCount.Should().Be(0);
                    tempChild2.ListenerCount.Should().Be(0);
                    child.ListenerCount.Should().Be(0);
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Listens_On_CSharp_Side_To_Keys_Added_On_CSharp_Side()
        {
            dynamic dynamicDataContext = new ExpandoObject();

            dynamicDataContext.ValueInt = 1;

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, dynamicDataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;
                    DoSafeUI(() => { dynamicDataContext.ValueDouble = 0.5; });

                    await Task.Delay(50);

                    DoSafeUI(() => { dynamicDataContext.ValueDouble = 23; });

                    await Task.Delay(50);

                    var resDouble = GetDoubleAttribute(js, "ValueDouble");
                    resDouble.Should().Be(23);
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Listens_To_Property_Update_During_Property_Changes_Update_From_Csharp()
        {
            var dataContext = new PropertyUpdatingTestViewModel();

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var res = GetStringAttribute(js, "Property1");
                    res.Should().Be("1");

                    res = GetStringAttribute(js, "Property2");
                    res.Should().Be("2");

                    DoSafeUI(() =>
                    {
                        dataContext.Property1 = "a";
                    });

                    await Task.Delay(50);

                    res = GetStringAttribute(js, "Property1");
                    res.Should().Be("a");

                    res = GetStringAttribute(js, "Property2");
                    res.Should().Be("a", "Neutronium listen to object during update");
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Command_Generic_String_CanExecute_Refresh_Ok()
        {
            var command = Substitute.For <ICommand <string> >();

            command.CanExecute(Arg.Any <string>()).Returns(true);
            var datacontexttest = new FakeTestViewModel()
            {
                CommandGeneric = command
            };

            var test = new TestInContextAsync()
            {
                Path = TestContext.GenericBind,
                Bind = (win) => HtmlBinding.Bind(win, datacontexttest, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js        = mb.JsRootObject;
                    var mycommand = GetAttribute(js, "CommandGeneric");
                    var res       = GetBoolAttribute(mycommand, "CanExecuteValue");
                    res.Should().BeTrue();

                    command.CanExecute(Arg.Any <string>()).Returns(false);
                    command.CanExecuteChanged += Raise.EventWith(_ICommand, new EventArgs());

                    await Task.Delay(100);

                    mycommand = GetAttribute(js, "CommandGeneric");
                    res       = GetBoolAttribute(mycommand, "CanExecuteValue");
                    res.Should().BeFalse();
                }
            };

            await RunAsync(test);
        }
Beispiel #27
0
        public async Task TwoWay_CommandWithoutParameter_Is_Updated_When_CanExecute_Changes()
        {
            var command = Substitute.For <ICommandWithoutParameter>();

            command.CanExecute.Returns(true);
            var fakeTestViewModel = new FakeTestViewModel()
            {
                CommandWithoutParameters = command
            };

            var test = new TestInContextAsync()
            {
                Path = TestContext.GenericBind,
                Bind = (win) => HtmlBinding.Bind(win, fakeTestViewModel, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js        = mb.JsRootObject;
                    var jsCommand = GetAttribute(js, "CommandWithoutParameters");
                    var res       = GetBoolAttribute(jsCommand, "CanExecuteValue");
                    res.Should().BeTrue();

                    command.CanExecute.Returns(false);

                    DoSafeUI(() => command.CanExecuteChanged += Raise.EventWith(command, new EventArgs()));

                    await Task.Delay(150);

                    jsCommand = GetAttribute(js, "CommandWithoutParameters");
                    res       = GetBoolAttribute(jsCommand, "CanExecuteValue");
                    res.Should().BeFalse();
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Listens_On_Js_Side_To_Keys_Added_On_Js_Side()
        {
            dynamic dynamicDataContext = new ExpandoObject();

            dynamicDataContext.ValueInt = 1;

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, dynamicDataContext, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js  = mb.JsRootObject;
                    var Vue = _WebView.GetGlobal().GetValue("Vue");
                    Vue.InvokeNoResult("set", _WebView, js, _WebView.Factory.CreateString("ValueDouble"), _WebView.Factory.CreateDouble(49));

                    await Task.Delay(50);

                    SetAttribute(js, "ValueDouble", _WebView.Factory.CreateDouble(7));

                    await Task.Delay(50);

                    DoSafeUI(() =>
                    {
                        double value = dynamicDataContext.ValueDouble;
                        value.Should().Be(7);
                    });
                }
            };

            await RunAsync(test);
        }
Beispiel #29
0
        public async Task TwoWay_CommandGeneric_Can_Be_Called_With_Parameter(string parameter)
        {
            var command           = Substitute.For <ICommand <string> >();
            var fakeTestViewModel = new FakeTestViewModel()
            {
                CommandGeneric = command
            };

            var test = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, fakeTestViewModel, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var jsCommand   = GetAttribute(js, "CommandGeneric");
                    var jsParameter = (parameter != null) ? _WebView.Factory.CreateString(parameter) : _WebView.Factory.CreateNull();
                    DoSafe(() => Call(jsCommand, "Execute", jsParameter));
                    await Task.Delay(150);

                    command.Received(1).Execute(parameter);
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_Calls_Command_With_Null_Parameter()
        {
            var command = Substitute.For <ICommand>();
            var test    = new FakeTestViewModel()
            {
                Command = command
            };

            var testR = new TestInContextAsync()
            {
                Bind = (win) => HtmlBinding.Bind(win, test, JavascriptBindingMode.TwoWay),
                Test = async(mb) =>
                {
                    var js = mb.JsRootObject;

                    var mycommand = GetAttribute(js, "Command");
                    Call(mycommand, "Execute", _WebView.Factory.CreateNull());

                    await Task.Delay(150);

                    command.Received().Execute(null);
                }
            };

            await RunAsync(testR);
        }