public void AllPacketsAreHandled() { World world = new World(); PacketHandler ph = new PacketHandler(world); Dictionary <Type, PacketProcessor> authenticatedPacketProcessorsByType = (Dictionary <Type, PacketProcessor>) typeof(PacketHandler).GetField("authenticatedPacketProcessorsByType", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ph); Dictionary <Type, PacketProcessor> unauthenticatedPacketProcessorsByType = (Dictionary <Type, PacketProcessor>) typeof(PacketHandler).GetField("unauthenticatedPacketProcessorsByType", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ph); HashSet <Type> packetTypes = new HashSet <Type>( authenticatedPacketProcessorsByType .Concat(unauthenticatedPacketProcessorsByType) .Select(kvp => kvp.Key)); ContainerBuilder containerBuilder = new ContainerBuilder(); ClientAutoFaqRegistrar clientDependencyRegistrar = new ClientAutoFaqRegistrar(); clientDependencyRegistrar.RegisterDependencies(containerBuilder); IContainer clientDependencyContainer = containerBuilder.Build(ContainerBuildOptions.IgnoreStartableComponents); typeof(Packet).Assembly.GetTypes() .Where(p => typeof(Packet).IsAssignableFrom(p) && p.IsClass && !p.IsAbstract) .ToList() .ForEach(packet => { Type clientPacketProcessorType = typeof(ClientPacketProcessor <>); Type clientProcessorType = clientPacketProcessorType.MakeGenericType(packet); Console.WriteLine("Checking handler for packet {0}...", packet); Assert.IsTrue(packetTypes.Contains(packet) || clientDependencyContainer.Resolve(clientProcessorType) != null, $"Runtime has not detected a handler for {packet}!"); } ); }
public void RuntimeDetectsAllClientPacketProcessors() { ContainerBuilder containerBuilder = new ContainerBuilder(); ClientAutoFaqRegistrar clientDependencyRegistrar = new ClientAutoFaqRegistrar(); clientDependencyRegistrar.RegisterDependencies(containerBuilder); IContainer clientDependencyContainer = containerBuilder.Build(ContainerBuildOptions.IgnoreStartableComponents); // Check if every PacketProcessor has been detected: typeof(Multiplayer).Assembly.GetTypes() .Where(p => typeof(PacketProcessor).IsAssignableFrom(p) && p.IsClass && !p.IsAbstract) .ToList() .ForEach(processor => Assert.IsTrue(clientDependencyContainer.Resolve(processor.BaseType) != null, $"{processor} has not been discovered by the runtime code!") ); }