public void TestFuruRon()
        {
            Semaphore semaphore = new Semaphore(0, 4);

            LoveLive_MahjongClass.InitializeMahjongClass();

            MahjongLogic mahjongLogic = new MahjongLogic();

            // 反射,强行配置玩家顺序
            FieldInfo field = mahjongLogic.GetType().GetField("order", BindingFlags.NonPublic | BindingFlags.Instance);

            field.SetValue(mahjongLogic, new int[] { 0, 1, 2, 3 });
            field = mahjongLogic.GetType().GetField("playing", BindingFlags.NonPublic | BindingFlags.Instance);
            field.SetValue(mahjongLogic, 3);

            // 配置一些可以副露和荣和的牌组
            // 玩家A(等待杠Ruby)
            mahjongLogic.player_info[0].card_onhand = new List <MahjongCard>()
            {
                LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby),
                LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby),
                LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby),
            };

            // 玩家B(等待吃Ruby(年级))
            mahjongLogic.player_info[1].card_onhand = new List <MahjongCard>()
            {
                LoveLive_MahjongClass.GetCard(MahjongCardName.Yoshiko),
                LoveLive_MahjongClass.GetCard(MahjongCardName.Hanamaru),
            };

            // 玩家C(等待荣Ruby)
            mahjongLogic.player_info[2].waiting.Add(LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby));

            // 当前D (打出了Ruby)
            mahjongLogic.player_info[3].card_played.Add(LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby));

            // 设置回调
            mahjongLogic.PlayerActionResponseCallback = delegate(List <PlayerAction> actions)
            {
                foreach (PlayerAction act in actions)
                {
                    Trace.WriteLine(act.ToString());
                }
                semaphore.Release();
            };

            mahjongLogic.PlayerActionAcceptedCallback = delegate(int playerId, bool accept)
            {
                Trace.WriteLine($"ID = {playerId}, Accept = {accept}");
                semaphore.Release();
            };

            // 强行设定状态机
            mahjongLogic.StartGamingThread();
            mahjongLogic.gameStateMachine.SetState(MahjongLogic.GameStateMachine.State.SendPlayerAction);
            mahjongLogic.gameStateMachine.ReleaseSemaphore();

            // 等待回调执行完毕后再继续
            semaphore.WaitOne();

            // 模拟发送消息
            mahjongLogic.SendPlayerAction(new PlayerAction(2)
            {
                actionType = PlayerActionType.Cancel
            });
            //mahjongLogic.SendPlayerAction(new PlayerAction(1) { actionType = PlayerActionType.Cancel });
            mahjongLogic.SendPlayerAction(new PlayerAction(0)
            {
                actionType = PlayerActionType.Pong
            });

            // 等待回调执行完毕后再继续
            semaphore.WaitOne();
            semaphore.WaitOne();
            semaphore.WaitOne();
        }