public void TestHandlerChainBuilding() { Binding binding = new Binding(); var equivalent = new EventEquivalent(); binding.Bind(new SampleEvent1(), new MethodHandler <SampleEvent1>(OnSampleEvent1)); binding.Bind(new SampleEvent1 { Foo = 1 }, new MethodHandler <SampleEvent1>(OnSpecificSampleEvent1)); binding.Bind(new Event(), new MethodHandler <Event>(OnEvent)); var e1 = new SampleEvent1(); var e2 = new SampleEvent1 { Foo = 1 }; var e3 = new SampleEvent1 { Foo = 1, Bar = "bar" }; var e4 = new SampleEvent1 { Foo = 2 }; var e5 = new SampleEvent2 { Foo = 1, Bar = "bar" }; var e6 = new SampleEvent2 { Foo = 2, Bar = "bar" }; List <Handler> handlerChain = new List <Handler>(); handlerChain.Clear(); Assert.Equal(2, binding.BuildHandlerChain(e1, equivalent, handlerChain)); Assert.Equal(new MethodHandler <SampleEvent1>(OnSampleEvent1), handlerChain[0]); Assert.Equal(new MethodHandler <Event>(OnEvent), handlerChain[1]); handlerChain.Clear(); Assert.Equal(3, binding.BuildHandlerChain(e2, equivalent, handlerChain)); Assert.Equal(new MethodHandler <SampleEvent1>(OnSampleEvent1), handlerChain[0]); Assert.Equal(new MethodHandler <SampleEvent1>(OnSpecificSampleEvent1), handlerChain[1]); Assert.Equal(new MethodHandler <Event>(OnEvent), handlerChain[2]); handlerChain.Clear(); Assert.Equal(3, binding.BuildHandlerChain(e3, equivalent, handlerChain)); Assert.Equal(new MethodHandler <SampleEvent1>(OnSampleEvent1), handlerChain[0]); Assert.Equal(new MethodHandler <SampleEvent1>(OnSpecificSampleEvent1), handlerChain[1]); Assert.Equal(new MethodHandler <Event>(OnEvent), handlerChain[2]); handlerChain.Clear(); Assert.Equal(2, binding.BuildHandlerChain(e4, equivalent, handlerChain)); Assert.Equal(new MethodHandler <SampleEvent1>(OnSampleEvent1), handlerChain[0]); Assert.Equal(new MethodHandler <Event>(OnEvent), handlerChain[1]); handlerChain.Clear(); Assert.Equal(3, binding.BuildHandlerChain(e5, equivalent, handlerChain)); Assert.Equal(new MethodHandler <SampleEvent1>(OnSampleEvent1), handlerChain[0]); Assert.Equal(new MethodHandler <SampleEvent1>(OnSpecificSampleEvent1), handlerChain[1]); Assert.Equal(new MethodHandler <Event>(OnEvent), handlerChain[2]); handlerChain.Clear(); Assert.Equal(2, binding.BuildHandlerChain(e6, equivalent, handlerChain)); Assert.Equal(new MethodHandler <SampleEvent1>(OnSampleEvent1), handlerChain[0]); Assert.Equal(new MethodHandler <Event>(OnEvent), handlerChain[1]); binding.Unbind(new SampleEvent1(), new MethodHandler <SampleEvent1>(OnSampleEvent1)); handlerChain.Clear(); Assert.Equal(1, binding.BuildHandlerChain(e1, equivalent, handlerChain)); Assert.Equal(new MethodHandler <Event>(OnEvent), handlerChain[0]); binding.Unbind(new Event(), new MethodHandler <Event>(OnEvent)); handlerChain.Clear(); Assert.Equal(1, binding.BuildHandlerChain(e2, equivalent, handlerChain)); Assert.Equal(new MethodHandler <SampleEvent1>(OnSpecificSampleEvent1), handlerChain[0]); handlerChain.Clear(); Assert.Equal(1, binding.BuildHandlerChain(e3, equivalent, handlerChain)); Assert.Equal(new MethodHandler <SampleEvent1>(OnSpecificSampleEvent1), handlerChain[0]); handlerChain.Clear(); Assert.Equal(0, binding.BuildHandlerChain(e4, equivalent, handlerChain)); }
public void TestFullSerialization() { var eventFactory = new EventFactory(); eventFactory.Register <SampleEvent1>(); eventFactory.Register <SampleEvent2>(); eventFactory.Register <SampleEvent7>(); var buffer = new x2net.Buffer(); var event1 = new SampleEvent1 { // base Foo = 9, Bar = "hello" }; var event2 = new SampleEvent2 { // derived Foo = 9, Bar = "hello", Baz = true }; var e = new SampleEvent7 { // base > base > base SampleEvent = event1 }; // has base Serializer serializer = new Serializer(buffer); serializer.Write(e.GetTypeId()); e.Serialize(serializer); long bufferLength = buffer.Length; buffer.Rewind(); Deserializer deserializer = new Deserializer(buffer, eventFactory); int typeId; deserializer.Read(out typeId); var retrieved = eventFactory.Create(typeId); retrieved.Deserialize(deserializer); var e2 = retrieved as SampleEvent7; Assert.NotNull(e2); Assert.Equal(e.SampleEvent.Foo, e2.SampleEvent.Foo); Assert.Equal(e.SampleEvent.Bar, e2.SampleEvent.Bar); buffer.Reset(); // derived > base > base e.SampleEvent = event2; // base <= derived serializer = new Serializer(buffer); serializer.Write(e.GetTypeId()); e.Serialize(serializer); Assert.True(bufferLength < buffer.Length); { var e3 = new SampleEvent8 { SampleEvent = event2 // derived <= derived }; // has derived var buffer2 = new x2net.Buffer(); serializer = new Serializer(buffer2); serializer.Write(e3.GetTypeId()); e3.Serialize(serializer); Assert.Equal(buffer2.Length, buffer.Length); } buffer.Rewind(); deserializer = new Deserializer(buffer, eventFactory); deserializer.Read(out typeId); retrieved = eventFactory.Create(typeId); retrieved.Deserialize(deserializer); var e4 = retrieved as SampleEvent7; Assert.NotNull(e4); var deserialized = e4.SampleEvent as SampleEvent2; Assert.NotNull(deserialized); Assert.True(deserialized.Baz); Assert.Equal(e.SampleEvent.Foo, e4.SampleEvent.Foo); Assert.Equal(e.SampleEvent.Bar, e4.SampleEvent.Bar); }