public void WhenSendingCommand_ThenInvokesCompatibleHandler()
        {
            var handler = new Mock <ICommandHandler <TestCommand> >();
            var e       = new ManualResetEventSlim();

            handler.Setup(x => x.Handle(It.IsAny <TestCommand>()))
            .Callback(() => e.Set());

            var bus = new MemoryCommandBus(handler.Object);

            bus.Send(new TestCommand());

            e.Wait(1000);

            handler.Verify(x => x.Handle(It.IsAny <TestCommand>()));
        }
        public void WhenSendingCommand_ThenDoesNotInvokeIncompatibleHandler()
        {
            var compatibleHandler   = new Mock <ICommandHandler <TestCommand> >();
            var incompatibleHandler = new Mock <ICommandHandler <FooCommand> >();
            var e = new ManualResetEventSlim();

            compatibleHandler.Setup(x => x.Handle(It.IsAny <TestCommand>()))
            .Callback(() => e.Set());

            var bus = new MemoryCommandBus(incompatibleHandler.Object, compatibleHandler.Object);

            bus.Send(new TestCommand());

            e.Wait(1000);

            incompatibleHandler.Verify(x => x.Handle(It.IsAny <FooCommand>()), Times.Never());
        }
        public void WhenSendingMultipleCommands_ThenInvokesCompatibleHandlerMultipleTimes()
        {
            var handler = new Mock <ICommandHandler <TestCommand> >();
            var e       = new ManualResetEventSlim();

            var called = 0;

            handler.Setup(x => x.Handle(It.IsAny <TestCommand>()))
            .Callback(() => { if (called++ == 4)
                              {
                                  e.Set();
                              }
                      });

            var bus = new MemoryCommandBus(handler.Object);

            bus.Send(new [] { new TestCommand(), new TestCommand(), new TestCommand(), new TestCommand() });

            e.Wait(1000);

            Assert.Equal(4, called);
        }
        static void Main(string[] args)
        {
            var shuffler = new KnuthShuffler();
            var clientChannel = new ClientChannelMock(Console.WriteLine);
            var tables = new MemoryTableProjection();
            var players = new MemoryPlayerProjection();

            var cmdBus = new MemoryCommandBus();
            var evtBus = new MemoryEventBus();
            var evtStore = new MemoryEventStore(evtBus);
            var tableRepos = new Repository<Table>(evtStore);

            cmdBus.Register(new TableCommandHandler(tableRepos));
            cmdBus.Register(new GameCommandHandler(tables, players, new Repository<OFCP_Game>(evtStore)));
            evtBus.Register(new GameEventHandler(clientChannel));
            var tblEvtHandler = new TableEventHandler(clientChannel, tables, players);
            tblEvtHandler.CommandBus = cmdBus;
            evtBus.Register(tblEvtHandler);

            //var table = new OFCPTable(Guid.NewGuid().ToString());
            //var newGame = GameFactory.CreateGame(table.Id, GameType.ChinesePoker, shuffler);

            cmdBus.Send(new CreateNewTableCommand(Game.OFCP.Games.OFCP_Game.OFCP_GAME_TYPE));

            while (tables.ListTables().Count == 0)
            {
                Thread.Sleep(25);
            }

            var table = tables.ListTables()[0];

            var p1Id = Guid.NewGuid().ToString();
            var p2Id = Guid.NewGuid().ToString();
            var p3Id = Guid.NewGuid().ToString();
            var p4Id = Guid.NewGuid().ToString();

            cmdBus.Send(new SeatPlayerCommand(table.TableId, p1Id, "Fred"));
            cmdBus.Send(new SeatPlayerCommand(table.TableId, p2Id, "John"));
            cmdBus.Send(new SeatPlayerCommand(table.TableId, p3Id, "Sally"));
            cmdBus.Send(new SeatPlayerCommand(table.TableId, p4Id, "Bob"));

            cmdBus.Send(new SetPlayerReadyCommand(table.TableId, p1Id));
            cmdBus.Send(new SetPlayerReadyCommand(table.TableId, p2Id));
            cmdBus.Send(new SetPlayerReadyCommand(table.TableId, p3Id));
            cmdBus.Send(new SetPlayerReadyCommand(table.TableId, p4Id));

            //table.SeatPlayer(p1Id, "Phil");
            //table.SeatPlayer(p2Id, "Rod");
            //table.SeatPlayer(p3Id, "Steve");
            //table.SeatPlayer(p4Id, "Shannon");

            //newGame.SetHand(p1Id, new string[13] { "2c", "3c", "4c", "5c", "6c", "7c", "8c", "9c", "Tc", "Jc", "Qc", "Kc", "Ac" });
            //newGame.SetHand(p2Id, new string[13] { "2d", "3d", "4d", "5d", "6d", "7d", "8d", "9d", "Td", "Jd", "Qd", "Kd", "Ad" });
            //newGame.SetHand(p3Id, new string[13] { "2h", "3h", "4h", "5h", "6h", "7h", "8h", "9h", "Th", "Jh", "Qh", "Kh", "Ah" });
            //newGame.SetHand(p4Id, new string[13] { "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "Ts", "Js", "Qs", "Ks", "As" });

            //var sw = new Stopwatch();
            //sw.Start();
            //deck.Shuffle();
            //sw.Stop();
            //Console.WriteLine(String.Format("Post-shuffle - {0}", deck.ToString()));
            //Console.WriteLine(String.Format("Shuffle took {0} ms", sw.ElapsedMilliseconds));

            //var hand1 = deck.Take(5);
            //Console.WriteLine(PokerCalculator.PokerLib.print_hand(hand1.ToArray(), hand1.Count));

            //var hand2 = deck.Take(5);
            //Console.WriteLine(PokerCalculator.PokerLib.print_hand(hand2.ToArray(), hand2.Count));

            //var hand3 = deck.Take(5);
            //Console.WriteLine(PokerCalculator.PokerLib.print_hand(hand3.ToArray(), hand3.Count));

            //var hand4 = deck.Take(5);
            //Console.WriteLine(PokerCalculator.PokerLib.print_hand(hand4.ToArray(), hand4.Count));

            //var hand1Val = PokerCalculator.PokerLib.eval_5hand(hand1.ToArray());
            //var hand1Rank = PokerCalculator.PokerLib.hand_rank(hand1Val);
            //Console.WriteLine(String.Format("Hand1 value: {0}", hand1Val));
            //Console.WriteLine(String.Format("Hand1 rank: {0}", hand1Rank));

            //var hand2Val = PokerCalculator.PokerLib.eval_5hand(hand2.ToArray());
            //var hand2Rank = PokerCalculator.PokerLib.hand_rank(hand2Val);
            //Console.WriteLine(String.Format("Hand2 value: {0}", hand2Val));
            //Console.WriteLine(String.Format("Hand2 rank: {0}", hand2Rank));

            //var hand3Val = PokerCalculator.PokerLib.eval_5hand(hand3.ToArray());
            //var hand3Rank = PokerCalculator.PokerLib.hand_rank(hand3Val);
            //Console.WriteLine(String.Format("Hand3 value: {0}", hand3Val));
            //Console.WriteLine(String.Format("Hand3 rank: {0}", hand3Rank));

            //var hand4Val = PokerCalculator.PokerLib.eval_5hand(hand4.ToArray());
            //var hand4Rank = PokerCalculator.PokerLib.hand_rank(hand4Val);
            //Console.WriteLine(String.Format("Hand4 value: {0}", hand4Val));
            //Console.WriteLine(String.Format("Hand4 rank: {0}", hand4Rank));

            //var hand5 = deck.Take(3);
            //hand5.Add(0);
            //hand5.Add(0);

            //Console.WriteLine(PokerCalculator.PokerLib.print_hand(hand5.ToArray(), hand5.Count));
            //var hand5Val = PokerCalculator.PokerLib.eval_5hand(hand5.ToArray());
            //var hand5Rank = PokerCalculator.PokerLib.hand_rank(hand5Val);
            //Console.WriteLine(String.Format("Hand2 value: {0}", hand5Val));
            //Console.WriteLine(String.Format("Hand2 rank: {0}", hand5Rank));

            Console.Read();
        }