Example #1
0
        public void Frame_Should_Create_Layer_For_Root()
        {
            var loop       = new Mock <IRenderLoop>();
            var root       = new TestRoot();
            var rootLayer  = new Mock <IRenderTargetBitmapImpl>();
            var dispatcher = new ImmediateDispatcher();

            var sceneBuilder = new Mock <ISceneBuilder>();

            sceneBuilder.Setup(x => x.UpdateAll(It.IsAny <Scene>()))
            .Callback <Scene>(scene =>
            {
                scene.Size = root.ClientSize;
                scene.Layers.Add(root).Dirty.Add(new Rect(root.ClientSize));
            });

            var layers = new Mock <IRenderLayerFactory>();

            layers.Setup(x => x.CreateLayer(root, root.ClientSize, 96, 96)).Returns(CreateLayer());

            var renderInterface = new Mock <IPlatformRenderInterface>();

            var target = new DeferredRenderer(
                root,
                loop.Object,
                sceneBuilder: sceneBuilder.Object,
                layerFactory: layers.Object,
                dispatcher: dispatcher);

            target.Start();
            RunFrame(loop);

            layers.Verify(x => x.CreateLayer(root, root.ClientSize, 96, 96));
        }
Example #2
0
        public void Should_Update_VisualNodes_When_Child_Moved_To_New_Parent()
        {
            using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
            {
                var dispatcher = new ImmediateDispatcher();
                var loop       = new Mock <IRenderLoop>();

                Decorator moveFrom;
                Decorator moveTo;
                Canvas    moveMe;

                var root = new TestRoot
                {
                    Child = new StackPanel
                    {
                        Children =
                        {
                            (moveFrom = new Decorator {
                                Child = moveMe = new Canvas(),
                            }),
                            (moveTo   = new Decorator()),
                        }
                    }
                };

                var sceneBuilder = new SceneBuilder();

                var target = new DeferredRenderer(
                    root,
                    loop.Object,
                    sceneBuilder: sceneBuilder,
                    dispatcher: dispatcher);

                root.Renderer = target;
                target.Start();
                RunFrame(target);

                moveFrom.Child = null;
                moveTo.Child   = moveMe;

                RunFrame(target);

                var scene        = target.UnitTestScene();
                var moveFromNode = (VisualNode)scene.FindNode(moveFrom);
                var moveToNode   = (VisualNode)scene.FindNode(moveTo);

                Assert.Empty(moveFromNode.Children);
                Assert.Equal(1, moveToNode.Children.Count);
                Assert.Same(moveMe, moveToNode.Children[0].Visual);
            }
        }
Example #3
0
        public void Should_Update_VisualNode_Order_On_ZIndex_Change_With_Dirty_Ancestor()
        {
            using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
            {
                var dispatcher = new ImmediateDispatcher();
                var loop       = new Mock <IRenderLoop>();

                StackPanel stack;
                Canvas     canvas1;
                Canvas     canvas2;

                var root = new TestRoot
                {
                    Child = stack = new StackPanel
                    {
                        Children =
                        {
                            (canvas1   = new Canvas {
                                ZIndex =1
                            }), (canvas2= new Canvas {
                                ZIndex = 2
                            }),
                        }
                    }
                };

                var sceneBuilder = new SceneBuilder();

                var target = new DeferredRenderer(
                    root,
                    loop.Object,
                    sceneBuilder: sceneBuilder,
                    dispatcher: dispatcher);

                root.Renderer = target;
                target.Start();
                RunFrame(target);

                root.InvalidateVisual();
                canvas1.ZIndex = 3;

                RunFrame(target);

                var scene     = target.UnitTestScene();
                var stackNode = scene.FindNode(stack);

                Assert.Same(stackNode.Children[0].Visual, canvas2);
                Assert.Same(stackNode.Children[1].Visual, canvas1);
            }
        }
Example #4
0
        public void Should_Add_Dirty_Rect_On_Child_Remove()
        {
            using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
            {
                var dispatcher = new ImmediateDispatcher();
                var loop       = new Mock <IRenderLoop>();

                Decorator decorator;
                Border    border;

                var root = new TestRoot
                {
                    Width  = 100,
                    Height = 100,
                    Child  = decorator = new Decorator
                    {
                        Child = border = new Border {
                            Width = 50, Height = 50, Background = Brushes.Red,
                        },
                    }
                };

                root.Measure(Size.Infinity);
                root.Arrange(new Rect(root.DesiredSize));

                var sceneBuilder = new SceneBuilder();

                var target = new DeferredRenderer(
                    root,
                    loop.Object,
                    sceneBuilder: sceneBuilder,
                    dispatcher: dispatcher);

                root.Renderer = target;
                target.Start();
                RunFrame(target);

                decorator.Child = null;

                RunFrame(target);

                var scene     = target.UnitTestScene();
                var stackNode = scene.FindNode(decorator);
                var dirty     = scene.Layers[0].Dirty.ToList();

                Assert.Equal(1, dirty.Count);
                Assert.Equal(new Rect(25, 25, 50, 50), dirty[0]);
            }
        }
Example #5
0
        public void Should_Update_Dirty_Controls_In_Order()
        {
            using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
            {
                var dispatcher = new ImmediateDispatcher();
                var loop       = new Mock <IRenderLoop>();

                Border    border;
                Decorator decorator;
                Canvas    canvas;

                var root = new TestRoot
                {
                    Child = decorator = new Decorator
                    {
                        Child = border = new Border {
                            Child = canvas = new Canvas()
                        }
                    }
                };

                var sceneBuilder = MockSceneBuilder(root);

                var target = new DeferredRenderer(
                    root,
                    loop.Object,
                    sceneBuilder: sceneBuilder.Object,
                    dispatcher: dispatcher);

                target.Start();
                IgnoreFirstFrame(target, sceneBuilder);
                target.AddDirty(border);
                target.AddDirty(canvas);
                target.AddDirty(root);
                target.AddDirty(decorator);

                var result = new List <IVisual>();

                sceneBuilder.Setup(x => x.Update(It.IsAny <Scene>(), It.IsAny <IVisual>()))
                .Callback <Scene, IVisual>((_, v) => result.Add(v));

                RunFrame(target);

                Assert.Equal(new List <IVisual> {
                    root, decorator, border, canvas
                }, result);
            }
        }
Example #6
0
        public void RegisterHandlers(ImmediateDispatcher dispatcher)
        {
            var assembly    = typeof(HandlerRegistrar).Assembly;
            var handlerType = typeof(ICommandHandler);
            var handlers    = assembly.GetTypes()
                              .Where(p => handlerType.IsAssignableFrom(p) && !p.IsAbstract);

            foreach (var handler in handlers)
            {
                var constructor = handler.GetConstructors().Single();
                var parameters  = constructor.GetParameters();
                var instances   = parameters.Select(p => _serviceProvider.GetService(p.ParameterType)).ToArray();
                var newHandler  = Activator.CreateInstance(handler, instances) as ICommandHandler;
                dispatcher.RegisterHandler(newHandler);
            }
        }
        public void First_Frame_Calls_SceneBuilder_UpdateAll()
        {
            var loop         = new Mock <IRenderLoop>();
            var root         = new TestRoot();
            var sceneBuilder = MockSceneBuilder(root);
            var dispatcher   = new ImmediateDispatcher();
            var target       = new DeferredRenderer(
                root,
                loop.Object,
                sceneBuilder: sceneBuilder.Object,
                dispatcher: dispatcher);

            target.Start();
            RunFrame(loop);

            sceneBuilder.Verify(x => x.UpdateAll(It.IsAny <Scene>()));
        }
        public void Frame_Does_Not_Call_SceneBuilder_If_No_Dirty_Controls()
        {
            var dispatcher   = new ImmediateDispatcher();
            var loop         = new Mock <IRenderLoop>();
            var root         = new TestRoot();
            var sceneBuilder = MockSceneBuilder(root);
            var target       = new DeferredRenderer(
                root,
                loop.Object,
                sceneBuilder: sceneBuilder.Object);

            target.Start();
            IgnoreFirstFrame(target, sceneBuilder);
            RunFrame(target);

            sceneBuilder.Verify(x => x.UpdateAll(It.IsAny <Scene>()), Times.Never);
            sceneBuilder.Verify(x => x.Update(It.IsAny <Scene>(), It.IsAny <Visual>()), Times.Never);
        }
        public void Should_Update_VisualNode_Order_On_Child_Remove_Insert()
        {
            var dispatcher = new ImmediateDispatcher();
            var loop       = new Mock <IRenderLoop>();

            StackPanel stack;
            Canvas     canvas1;
            Canvas     canvas2;
            var        root = new TestRoot
            {
                Child = stack = new StackPanel
                {
                    Children =
                    {
                        (canvas1 = new Canvas()),
                        (canvas2 = new Canvas()),
                    }
                }
            };

            var sceneBuilder = new SceneBuilder();
            var target       = new DeferredRenderer(
                root,
                loop.Object,
                sceneBuilder: sceneBuilder,
                dispatcher: dispatcher);

            root.Renderer = target;
            target.Start();
            RunFrame(target);

            stack.Children.Remove(canvas2);
            stack.Children.Insert(0, canvas2);

            RunFrame(target);

            var scene     = target.UnitTestScene();
            var stackNode = scene.FindNode(stack);

            Assert.Same(stackNode.Children[0].Visual, canvas2);
            Assert.Same(stackNode.Children[1].Visual, canvas1);
        }
Example #10
0
        public void SetupDispatcher()
        {
            catchAllService       = new CatchAllService();
            errorService          = new ErrorService();
            somethingService      = new SomethingService();
            somethingErrorService = new SomethingErrorService();

            container = A.Fake <IContainer>();

            A.CallTo(() => container.ResolveAll <ISubscribe <IEvent> >())
            .Returns(new ISubscribe <IEvent>[] { catchAllService });

            A.CallTo(() => container.ResolveAll <ISubscribe <ErrorOccured> >())
            .Returns(new ISubscribe <ErrorOccured>[] { errorService, somethingErrorService });

            A.CallTo(() => container.ResolveAll <ISubscribe <SomethingHappened> >())
            .Returns(new ISubscribe <SomethingHappened>[] { somethingService, somethingErrorService });

            dispatcher = new ImmediateDispatcher(container);
        }
Example #11
0
        public void TestEventDispatcher()
        {
            var dispatcher = new ImmediateDispatcher();

            var numberOfHandlersCalled = 0;

            dispatcher.Handle <UserCreated>(e =>
            {
                ++numberOfHandlersCalled;
            });

            dispatcher.Handle <PasswordChanged>(e =>
            {
                ++numberOfHandlersCalled;
            });

            var src = new User();

            src.ChangePassword();

            dispatcher.Dispatch(((IEventSource)src).PopEvents());

            Assert.AreEqual(2, numberOfHandlersCalled);

            dispatcher.Dispatch(((IEventSource)src).PopEvents());

            Assert.AreEqual(2, numberOfHandlersCalled);

            dispatcher.Handle <PasswordChanged>(e =>
            {
                ++numberOfHandlersCalled;
            });

            src.ChangePassword();

            dispatcher.Dispatch(((IEventSource)src).PopEvents());

            Assert.AreEqual(4, numberOfHandlersCalled);
        }