| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- // -----------------------------------------------------------------------
- // <copyright file="InteractiveTests.cs" company="Steven Kirk">
- // Copyright 2014 MIT Licence. See licence.md for more information.
- // </copyright>
- // -----------------------------------------------------------------------
- namespace Perspex.Interactivity.UnitTests
- {
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Perspex.Interactivity;
- using Perspex.VisualTree;
- using Xunit;
- public class InteractiveTests
- {
- [Fact]
- public void Direct_Event_Should_Go_Straight_To_Source()
- {
- var ev = new RoutedEvent("test", RoutingStrategies.Direct, typeof(RoutedEventArgs), typeof(TestInteractive));
- var invoked = new List<string>();
- EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
- var target = this.CreateTree(ev, handler, RoutingStrategies.Direct);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[] { "2b" }, invoked);
- }
- [Fact]
- public void Direct_Event_Should_Have_Route_Set_To_Direct()
- {
- var ev = new RoutedEvent("test", RoutingStrategies.Direct, typeof(RoutedEventArgs), typeof(TestInteractive));
- bool called = false;
- EventHandler<RoutedEventArgs> handler = (s, e) =>
- {
- Assert.Equal(RoutingStrategies.Direct, e.Route);
- called = true;
- };
- var target = this.CreateTree(ev, handler, RoutingStrategies.Direct);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.True(called);
- }
- [Fact]
- public void Bubbling_Event_Should_Bubble_Up()
- {
- var ev = new RoutedEvent("test", RoutingStrategies.Bubble, typeof(RoutedEventArgs), typeof(TestInteractive));
- var invoked = new List<string>();
- EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
- var target = this.CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[] { "2b", "1" }, invoked);
- }
- [Fact]
- public void Tunneling_Event_Should_Tunnel()
- {
- var ev = new RoutedEvent("test", RoutingStrategies.Tunnel, typeof(RoutedEventArgs), typeof(TestInteractive));
- var invoked = new List<string>();
- EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
- var target = this.CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[] { "1", "2b" }, invoked);
- }
- [Fact]
- public void Tunneling_Bubbling_Event_Should_Tunnel_Then_Bubble_Up()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var invoked = new List<string>();
- EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
- var target = this.CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[] { "1", "2b", "2b", "1" }, invoked);
- }
- [Fact]
- public void Events_Should_Have_Route_Set()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var invoked = new List<RoutingStrategies>();
- EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(e.Route);
- var target = this.CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[]
- {
- RoutingStrategies.Tunnel,
- RoutingStrategies.Tunnel,
- RoutingStrategies.Bubble,
- RoutingStrategies.Bubble,
- },
- invoked);
- }
- [Fact]
- public void Direct_Subscription_Should_Not_Catch_Tunneling_Or_Bubbling()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var count = 0;
- EventHandler<RoutedEventArgs> handler = (s, e) =>
- {
- ++count;
- };
- var target = this.CreateTree(ev, handler, RoutingStrategies.Direct);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(0, count);
- }
- [Fact]
- public void Bubbling_Subscription_Should_Not_Catch_Tunneling()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var count = 0;
- EventHandler<RoutedEventArgs> handler = (s, e) =>
- {
- Assert.Equal(RoutingStrategies.Bubble, e.Route);
- ++count;
- };
- var target = this.CreateTree(ev, handler, RoutingStrategies.Bubble);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(2, count);
- }
- [Fact]
- public void Tunneling_Subscription_Should_Not_Catch_Bubbling()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var count = 0;
- EventHandler<RoutedEventArgs> handler = (s, e) =>
- {
- Assert.Equal(RoutingStrategies.Tunnel, e.Route);
- ++count;
- };
- var target = this.CreateTree(ev, handler, RoutingStrategies.Tunnel);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(2, count);
- }
- [Fact]
- public void Event_Should_Should_Keep_Propogating_To_HandedEventsToo_Handlers()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var invoked = new List<string>();
- EventHandler<RoutedEventArgs> handler = (s, e) =>
- {
- invoked.Add(((TestInteractive)s).Name);
- e.Handled = true;
- };
- var target = this.CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, true);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[] { "1", "2b", "2b", "1" }, invoked);
- }
- [Fact]
- public void Direct_Class_Handlers_Should_Be_Called()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Direct,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var invoked = new List<string>();
- EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
- var target = this.CreateTree(ev, null, 0);
- ev.AddClassHandler(typeof(TestInteractive), handler, RoutingStrategies.Direct);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[] { "2b" }, invoked);
- }
- [Fact]
- public void Tunneling_Class_Handlers_Should_Be_Called()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var invoked = new List<string>();
- EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
- var target = this.CreateTree(ev, null, 0);
- ev.AddClassHandler(typeof(TestInteractive), handler, RoutingStrategies.Tunnel);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[] { "1", "2b" }, invoked);
- }
- [Fact]
- public void Bubbling_Class_Handlers_Should_Be_Called()
- {
- var ev = new RoutedEvent(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(RoutedEventArgs),
- typeof(TestInteractive));
- var invoked = new List<string>();
- EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
- var target = this.CreateTree(ev, null, 0);
- ev.AddClassHandler(typeof(TestInteractive), handler, RoutingStrategies.Bubble);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.Equal(new[] { "2b", "1" }, invoked);
- }
- [Fact]
- public void Typed_Class_Handlers_Should_Be_Called()
- {
- var ev = new RoutedEvent<RoutedEventArgs>(
- "test",
- RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
- typeof(TestInteractive));
- var target = this.CreateTree(ev, null, 0);
- ev.AddClassHandler<TestInteractive>(x => x.ClassHandler, RoutingStrategies.Bubble);
- var args = new RoutedEventArgs(ev, target);
- target.RaiseEvent(args);
- Assert.True(target.ClassHandlerInvoked);
- Assert.True(target.GetVisualParent<TestInteractive>().ClassHandlerInvoked);
- }
- private TestInteractive CreateTree(
- RoutedEvent ev,
- EventHandler<RoutedEventArgs> handler,
- RoutingStrategies handlerRoutes,
- bool handledEventsToo = false)
- {
- TestInteractive target;
- var tree = new TestInteractive
- {
- Name = "1",
- Children = new[]
- {
- new TestInteractive
- {
- Name = "2a",
- },
- (target = new TestInteractive
- {
- Name = "2b",
- Children = new[]
- {
- new TestInteractive
- {
- Name = "3",
- },
- },
- }),
- }
- };
- if (handler != null)
- {
- foreach (var i in tree.GetSelfAndVisualDescendents().Cast<Interactive>())
- {
- i.AddHandler(ev, handler, handlerRoutes, handledEventsToo);
- }
- }
- return target;
- }
- private class TestInteractive : Interactive
- {
- public string Name { get; set; }
- public bool ClassHandlerInvoked { get; private set; }
- public IEnumerable<IVisual> Children
- {
- get
- {
- return ((IVisual)this).VisualChildren.AsEnumerable();
- }
- set
- {
- this.AddVisualChildren(value.Cast<Visual>());
- }
- }
- public void ClassHandler(RoutedEventArgs e)
- {
- this.ClassHandlerInvoked = true;
- }
- }
- }
- }
|