예제 #1
0
        public async Task TwoWay_Maps_CommandWithoutParameter_CanExecuteValue_With_CanExecute(bool canExecute)
        {
            var command = Substitute.For <ICommandWithoutParameter>();

            command.CanExecute.Returns(canExecute);
            var datacontexttest = new FakeTestViewModel()
            {
                CommandWithoutParameters = command
            };

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

                    var mycommand = GetAttribute(js, "CommandWithoutParameters");

                    var res = GetBoolAttribute(mycommand, "CanExecuteValue");
                    res.Should().Be(canExecute);
                }
            };

            await RunAsync(test);
        }
예제 #2
0
        public async Task TwoWay_Maps_CommandGeneric()
        {
            var command           = Substitute.For <ICommand <string> >();
            var fakeTestViewModel = new FakeTestViewModel()
            {
                CommandGeneric = command
            };

            var test = new TestInContext()
            {
                Bind = (win) => HtmlBinding.Bind(win, fakeTestViewModel, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js = ((HtmlBinding)mb).JsBrideRootObject as JsGenericObject;

                    var jsCommand = js.GetAttribute("CommandGeneric") as JsCommand <string>;
                    jsCommand.Should().NotBeNull();
                    jsCommand.ToString().Should().Be("{}");
                    jsCommand.Type.Should().Be(JsCsGlueType.Command);
                    jsCommand.CachableJsValue.Should().NotBeNull();
                }
            };

            await RunAsync(test);
        }
예제 #3
0
        public async Task TwoWay_Maps_CommandGeneric_CanExecuteValue_With_CanExecute(bool canExecute)
        {
            var command = Substitute.For <ICommand <string> >();

            command.CanExecute(Arg.Any <string>()).Returns(canExecute);
            var fakeTestViewModel = new FakeTestViewModel()
            {
                CommandGenericNotBound = command
            };

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

                    var jsCommand = GetAttribute(js, "CommandGenericNotBound");

                    var res = GetBoolAttribute(jsCommand, "CanExecuteValue");
                    res.Should().BeTrue();
                }
            };

            await RunAsync(test);
        }
예제 #4
0
        private Task Test_HTMLBinding_Stress_Collection_CreateBinding(JavascriptBindingMode imode, TestPerformanceKind context, TestContext ipath = TestContext.Index)
        {
            var r           = 100;
            var datacontext = new TwoList();

            datacontext.L1.AddRange(Enumerable.Range(0, r).Select(i => new Skill()));

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            var test = new TestInContext()
            {
                Path = ipath,
                Bind = (win) => HtmlBinding.Bind(win, datacontext, imode),
                Test = (mb) =>
                {
                    stopWatch.Stop();
                    var ts = stopWatch.ElapsedMilliseconds;
                    _Logger.Info($"Perf: {((double)(ts)) / 1000} sec for {r} iterations");

                    var js = mb.JsRootObject;

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

                    CheckVsExpectation(ts, context);
                }
            };

            return(RunAsync(test));
        }
예제 #5
0
        public async Task TwoWay_Maps_SimpleCommand_With_Correct_Name()
        {
            var command = Substitute.For <ISimpleCommand>();
            var simpleCommandTestViewModel = new SimpleCommandTestViewModel()
            {
                SimpleCommandNoArgument = command
            };

            var test = new TestInContext()
            {
                Bind = (win) => HtmlBinding.Bind(win, simpleCommandTestViewModel, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js = (mb as HtmlBinding).JsBrideRootObject as JsGenericObject;

                    var jsCommand = js.GetAttribute("SimpleCommandNoArgument") as JsSimpleCommand;
                    jsCommand.Should().NotBeNull();
                    jsCommand.ToString().Should().Be("{}");
                    jsCommand.Type.Should().Be(JsCsGlueType.SimpleCommand);
                    jsCommand.CachableJsValue.Should().NotBeNull();
                }
            };

            await RunAsync(test);
        }
예제 #6
0
        public async Task TwoWay_Listens_Only_Once_To_Each_Object(ViewModelTestBase dataContext,
                                                                  params ViewModelTestBase[] children)
        {
            var test = new TestInContext()
            {
                Bind = (win) => Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = (mb) => { children.ForEach(child => child.ListenerCount.Should().Be(1)); }
            };

            await RunAsync(test);
        }
예제 #7
0
        public async Task OneTime_Does_Not_Listen_To_Any_Object(ViewModelTestBase dataContext,
                                                                params ViewModelTestBase[] children)
        {
            var test = new TestInContext()
            {
                Bind = (win) => Bind(win, dataContext, JavascriptBindingMode.OneTime),
                Test = (mb) => { children.ForEach(child => child.ListenerCount.Should().Be(0)); }
            };

            await RunAsync(test);
        }
예제 #8
0
        public async Task TwoWay_Listens_To_Elements_In_List()
        {
            var root = BuildList();
            var list = root.Children.ToList();
            var test = new TestInContext()
            {
                Bind = (win) => Bind(win, root, JavascriptBindingMode.TwoWay),
                Test = (mb) => { list.ForEach(child => child.ListenerCount.Should().Be(1)); }
            };

            await RunAsync(test);
        }
예제 #9
0
        public async Task Bind_Is_Robust()
        {
            var test = new TestInContext()
            {
                Bind = (win) => HtmlBinding.Bind(win, _DataContext, JavascriptBindingMode.TwoWay),
                Test = _ => { }
            };

            for (var i = 0; i < 150; i++)
            {
                _Logger.Info($"Runing interaction {i}");
                await RunAsync(test);
            }
        }
예제 #10
0
        public async Task TwoWay_creates_listener_only_for_write_property(Type type, ObjectObservability expected)
        {
            var datacontext = Activator.CreateInstance(type);

            var test = new TestInContext()
            {
                Bind = (win) => Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js = mb.JsRootObject;
                    CheckObjectObservability(js, expected);
                }
            };

            await RunAsync(test);
        }
        public async Task TwoWay_should_create_listener_only_for_write_property(Type type, bool readOnly)
        {
            var datacontext = Activator.CreateInstance(type);

            var test = new TestInContext()
            {
                Bind = (win) => Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js = mb.JsRootObject;
                    CheckReadOnly(js, readOnly);
                }
            };

            await RunAsync(test);
        }
예제 #12
0
        public async Task TwoWay_Freezes_Readonly_Objects(Type type, bool expectedIsFrozen)
        {
            var dataContext = Activator.CreateInstance(type);

            var test = new TestInContext()
            {
                Bind = (win) => Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js       = mb.JsRootObject;
                    var isFrozen = IsFrozen(js);
                    isFrozen.Should().Be(expectedIsFrozen);
                }
            };

            await RunAsync(test);
        }
예제 #13
0
        public async Task TwoWay_Freezes_Readonly_Objects_Deep_Property(Type type, bool expectedIsFozen)
        {
            var child       = (Observability)Activator.CreateInstance(type);
            var dataContext = new Composite(child);

            var test = new TestInContext()
            {
                Bind = (win) => Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js       = mb.JsRootObject;
                    var childJs  = GetAttribute(js, "Child");
                    var isFrozen = IsFrozen(childJs);
                    isFrozen.Should().Be(expectedIsFozen);
                }
            };

            await RunAsync(test);
        }
예제 #14
0
        public async Task TwoWay_freezes_readonly_objects_deep_array(Type type, bool expectedIsFozen)
        {
            var child       = (Observability)Activator.CreateInstance(type);
            var datacontext = new Composite(children: new[] { child });

            var test = new TestInContext()
            {
                Bind = (win) => Bind(win, datacontext, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js       = mb.JsRootObject;
                    var array    = GetCollectionAttribute(js, "Children");
                    var childJs  = array.GetArrayElements()[0];
                    var isFrozen = IsFrozen(childJs);
                    isFrozen.Should().Be(expectedIsFozen);
                }
            };

            await RunAsync(test);
        }
예제 #15
0
        public async Task Binding_Can_Create_Collection_With_Count_Greater_Than_Max_Stack()
        {
            var value       = 3;
            var dataContext = new BigCollectionVM <int>(value);
            var test        = new TestInContext()
            {
                Bind = (win) => HtmlBinding.Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js = mb.JsRootObject;

                    var res = GetCollectionAttribute(js, "Values");
                    res.GetArrayLength().Should().Be(BigCollectionVM <int> .Limit);

                    var lastElement = res.GetValue(BigCollectionVM <int> .Limit - 1);
                    lastElement.GetIntValue().Should().Be(value);
                }
            };

            await RunAsync(test);
        }
예제 #16
0
        public async Task Binding_Can_Create_More_Object_Than_Max_Stack()
        {
            var dataContext = new BigCollectionVM <Simple>(_ => new Simple());
            var test        = new TestInContext()
            {
                Bind = (win) => HtmlBinding.Bind(win, dataContext, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js = mb.JsRootObject;

                    var res = GetCollectionAttribute(js, "Values");
                    res.GetArrayLength().Should().Be(BigCollectionVM <Simple> .Limit);

                    var lastElement = res.GetValue(BigCollectionVM <Simple> .Limit - 1);
                    var id          = GetIntAttribute(lastElement, "Id");
                    id.Should().Be(23);
                }
            };

            await RunAsync(test);
        }
예제 #17
0
        public async Task TwoWay_SimpleCommand_Maps_As_ReadOnly()
        {
            var command         = Substitute.For <ISimpleCommand <SimpleCommandTestViewModel> >();
            var datacontexttest = new SimpleCommandTestViewModel()
            {
                SimpleCommandObjectArgument = command
            };

            var test = new TestInContext()
            {
                Bind = (win) => HtmlBinding.Bind(win, datacontexttest, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js        = mb.JsRootObject;
                    var mycommand = GetAttribute(js, "SimpleCommandObjectArgument");
                    CheckObjectObservability(mycommand, ObjectObservability.ReadOnly);
                }
            };

            await RunAsync(test);
        }
예제 #18
0
        public async Task TwoWay_Maps_ResultCommand_Without_Argument()
        {
            var function = Substitute.For <Func <string> >();
            var dc       = new FakeFactory <string>(function);

            var test = new TestInContext()
            {
                Path = TestContext.IndexPromise,
                Bind = (win) => HtmlBinding.Bind(win, dc, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var glueObject      = (mb as HtmlBinding).JsBrideRootObject as JsGenericObject;
                    var jsResultCommand = glueObject.GetAttribute("CreateObject") as JsResultCommand <string>;
                    jsResultCommand.Should().NotBeNull();
                    jsResultCommand.ToString().Should().Be("{}");
                    jsResultCommand.Type.Should().Be(JsCsGlueType.ResultCommand);
                    jsResultCommand.CachableJsValue.Should().NotBeNull();
                }
            };

            await RunAsync(test);
        }
예제 #19
0
        public async Task TwoWay_Command_Generic_String_Maps_As_ObservableReadOnly()
        {
            var command = Substitute.For <ICommand <string> >();

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

            var test = new TestInContext()
            {
                Path = TestContext.GenericBind,
                Bind = (win) => HtmlBinding.Bind(win, datacontexttest, JavascriptBindingMode.TwoWay),
                Test = (mb) =>
                {
                    var js        = mb.JsRootObject;
                    var mycommand = GetAttribute(js, "CommandGeneric");
                    CheckObjectObservability(mycommand, ObjectObservability.ReadOnlyObservable);
                }
            };

            await RunAsync(test);
        }
 protected Task RunAsync(TestInContext test, [CallerMemberName] string memberName = "")
 {
     return RunAsync(test, mb => RunInContext(() => test.Test(mb)), memberName); 
 }
        public Task Test_HTMLBinding_Stress_Collection_CreateBinding(JavascriptBindingMode imode, TestPerformanceKind context, TestContext ipath = TestContext.Index) 
        {
            int r = 100;
            var datacontext = new TwoList();
            datacontext.L1.AddRange(Enumerable.Range(0, r).Select(i => new Skill()));

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

            var test = new TestInContext() 
            {
                Path = ipath,
                Bind = (win) => HTML_Binding.Bind(win, datacontext, imode),
                Test = (mb) => 
                {
                    stopWatch.Stop();
                    var ts = stopWatch.ElapsedMilliseconds;
                    _Logger.Info($"Perf: {((double) (ts)) / 1000} sec for {r} iterations");

                    var js = mb.JSRootObject;

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

                    CheckVsExpectation(ts, context);
                }
            };
            return RunAsync(test);
        }
        public async Task Bind_ShouldBeRobust() 
        {
            var test = new TestInContext() 
            {
                Bind = (win) => HTML_Binding.Bind(win,  _DataContext, JavascriptBindingMode.TwoWay),
                Test = _ =>  { }
            };

            for (var i = 0; i < 150; i++) 
            {
                _Logger.Info($"Runing interaction {i}");
                 await RunAsync(test);
            }    
        }