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)); }
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); } }
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); } }
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]); } }
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); } }
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); }
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); }
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); }