示例#1
0
        public void SendWaitCallTest()
        {
            var config     = ConfigUtil.Deserialize(Resources.TestConfig13);
            var dsc        = new DummySendKeyCode();
            var model      = new Model(config, dsc);
            var windowInfo = new WindowInfo("ClipStudioPaint.exe",
                                            "新規ファイル.clip - CLIP STUDIO PAINT");

            model.WindowInfo = windowInfo;
            model.ApplicationGroup.Name.Is("CLIP STUDIO PAINT");
            model.Bank.Name.Is("");
            model.Bank.Entries.Count.Is(3);
            model.Bank.Entries[2].Trigger.Is("H");
            model.Bank.Entries[2].ActionItem.ActionType.Is(ActionType.Send);
            model.Bank.Entries[2].ActionItem.ActionValue.Is("12345");

            var state = new KeyboardState
            {
                KeyCode = Keys.H
            };

            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyDown, ref state));
            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyUp, ref state));

            dsc.EventLog.Count.Is(1);
            dsc.EventLog[0].Type.Is(DummySendKeyCode.EventType.SendWait);
            dsc.EventLog[0].Value.Is("12345");
        }
示例#2
0
        public void SelfEventPathThroughTest()
        {
            var config     = ConfigUtil.Deserialize(Resources.TestConfig13);
            var dsc        = new DummySendKeyCode();
            var model      = new Model(config, dsc);
            var windowInfo = new WindowInfo("ClipStudioPaint.exe",
                                            "新規ファイル.clip - CLIP STUDIO PAINT");

            model.WindowInfo = windowInfo;
            model.ApplicationGroup.Name.Is("CLIP STUDIO PAINT");
            model.Bank.Name.Is("");
            model.Bank.Entries.Count.Is(3);
            model.Bank.Entries[0].Trigger.Is("F");
            model.Bank.Entries[0].ActionItem.ActionType.Is(ActionType.Send);
            model.Bank.Entries[0].ActionItem.ActionValue.Is("g");
            model.Bank.Entries[1].Trigger.Is("G");
            model.Bank.Entries[1].ActionItem.ActionType.Is(ActionType.Send);
            model.Bank.Entries[1].ActionItem.ActionValue.Is("r");

            var ksF = new KeyboardState {
                KeyCode = Keys.F
            };
            var ksG = new KeyboardState {
                KeyCode = Keys.G
            };

            // Fを押す
            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyDown, ref ksF));

            // g を送出する
            dsc.EventLog.Count.Is(1);
            dsc.EventLog[0].Type.Is(DummySendKeyCode.EventType.SendWait);
            dsc.EventLog[0].Value.Is("g");

            // g を自分で受け取ってしまう
            var e1 = new KeyboardHookedEventArgs(
                KeyboardMessage.KeyDown, ref ksG);

            model.SetEvent(e1);
            var e2 = new KeyboardHookedEventArgs(
                KeyboardMessage.KeyUp, ref ksG);

            model.SetEvent(e2);

            // g がキャンセルされて、r が送出されてしまっているとまずい。
            dsc.EventLog.Count.Is(1);
            e1.Cancel.Is(false);
            e2.Cancel.Is(false);

            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyUp, ref ksF));
            dsc.EventLog.Count.Is(1);
        }
示例#3
0
        public void SendSelfKeyTest()
        {
            var ksF = new KeyboardState {
                KeyCode = Keys.F
            };
            var config     = ConfigUtil.Deserialize(Resources.TestConfig16);
            var dsc        = new DummySendKeyCode();
            var model      = new Model(config, dsc);
            var windowInfo = new WindowInfo("ClipStudioPaint.exe",
                                            "新規ファイル.clip - CLIP STUDIO PAINT");

            model.WindowInfo = windowInfo;
            model.ApplicationGroup.Name.Is("CLIP STUDIO PAINT");
            model.Bank.Name.Is("");
            model.Bank.Entries.Count.Is(1);
            model.Bank.Entries[0].Trigger.Is("F");
            model.Bank.Entries[0].ActionItem.ActionType.Is(ActionType.None);
            model.Bank.Entries[0].ActionItem.ActionValue.IsNull();
            model.Bank.Entries[0].ActionItem.NextBank.Is("Bank02");

            // f(down) -> f(up)
            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyDown, ref ksF));
            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyUp, ref ksF));
            dsc.EventLog.Count.Is(0);

            model.Bank.Name.Is("Bank02");
            model.Bank.Entries.Count.Is(1);
            model.Bank.Entries[0].Trigger.Is("F");
            model.Bank.Entries[0].ActionItem.ActionType.Is(ActionType.Send);
            model.Bank.Entries[0].ActionItem.ActionValue.Is("f");
            model.Bank.Entries[0].ActionItem.NextBank.Is("");

            /*
             * 処理の時系列が反転するけれども、
             * dsc.SendWaitLambda に処理をセットしておくと SendWait() の中で呼び
             * 出される。
             * これにより、ProcAction() 中で呼び出される SendWait() の中から呼び
             * 出されたイベントが model の中に到達してそれがキャンセルされずに、
             * 操作対象のアプリケーションに届くことを 確認できる。
             * 検証に失敗した場合は dsc.SendWaitLambdaExceptions に記録されるので、
             * 件数を検証する必要がある。
             */
            dsc.SendWaitLambda = () =>
            {
                var ksF2 = new KeyboardState {
                    KeyCode = Keys.F
                };
                var e1 = new KeyboardHookedEventArgs(
                    KeyboardMessage.KeyDown, ref ksF2);
                model.SetEvent(e1);
                e1.Cancel.Is(false);
                dsc.EventLog.Count.Is(1);

                var e2 = new KeyboardHookedEventArgs(
                    KeyboardMessage.KeyUp, ref ksF2);
                model.SetEvent(e2);
                e2.Cancel.Is(false);
                dsc.EventLog.Count.Is(1);
            };

            // action を呼び出す。この中で SendWait() が呼び出されて、
            // dsc.SendWaitLambda が呼び出され、上記の検証が走る
            var e3 = new KeyboardHookedEventArgs(
                KeyboardMessage.KeyDown, ref ksF);

            model.SetEvent(e3);
            e3.Cancel.Is(true);
            dsc.SendWaitLambda = null; // 余分に呼び出されないようにクリア
            dsc.SendWaitLambdaExceptions.Count.Is(0);
            dsc.EventLog.Count.Is(1);

            // ここらへんで LoadBank が起こる
            model.Bank.Name.Is("");
            model.Bank.Entries.Count.Is(1);

            // 最後にユーザー入力の f(up) が来る
            var e4 = new KeyboardHookedEventArgs(
                KeyboardMessage.KeyUp, ref ksF);

            model.SetEvent(e4);
            e4.Cancel.Is(true);
            dsc.EventLog.Count.Is(1);
        }
示例#4
0
        public void ProceActionTest()
        {
            var config     = ConfigUtil.Deserialize(Resources.TestConfig15);
            var dsc        = new DummySendKeyCode();
            var model      = new Model(config, dsc);
            var windowInfo = new WindowInfo("ClipStudioPaint.exe",
                                            "新規ファイル.clip - CLIP STUDIO PAINT");

            model.WindowInfo = windowInfo;
            model.ApplicationGroup.Name.Is("CLIP STUDIO PAINT");
            model.Bank.Name.Is("");
            model.Bank.Entries.Count.Is(2);
            model.Bank.Entries[0].Trigger.Is("F");
            model.Bank.Entries[0].ActionItem.ActionType.Is(ActionType.Send);
            model.Bank.Entries[0].ActionItem.ActionValue.Is("a");
            model.Bank.Entries[1].Trigger.Is("G");
            model.Bank.Entries[1].ActionItem.ActionType.Is(ActionType.Menu);
            model.Bank.Entries[1].ActionItem.ActionValue.Is("01");

            var action = model.Bank.Entries[1].ActionItem;

            model.ProcAction(action, KeyboardUpDown.Down);
            model.ProcAction(action, KeyboardUpDown.Up);

            model.Menu.Name.Is("01");
            model.Menu.MenuItem.Count.Is(1);
            model.Menu.MenuItem[0].ActionItem.ActionType.Is(ActionType.Send);
            model.Menu.MenuItem[0].ActionItem.ActionValue.Is("f");

            /*
             * 処理の時系列が反転するけれども、
             * dsc.SendWaitLambda に処理をセットしておくと SendWait() の中で呼び
             * 出される。
             * これにより、ProcAction() 中で呼び出される SendWait() の中から呼び
             * 出されたイベントが model の中に到達してそれがキャンセルされずに、
             * 操作対象のアプリケーションに届くことを 確認できる。
             * 検証に失敗した場合は dsc.SendWaitLambdaExceptions に記録されるので、
             * 件数を検証する必要がある。
             */
            dsc.SendWaitLambda = () =>
            {
                var ksF = new KeyboardState {
                    KeyCode = Keys.F
                };

                var e1 = new KeyboardHookedEventArgs(
                    KeyboardMessage.KeyDown, ref ksF);
                model.SetEvent(e1);
                e1.Cancel.Is(false);
                dsc.EventLog.Count.Is(1);

                var e2 = new KeyboardHookedEventArgs(
                    KeyboardMessage.KeyUp, ref ksF);
                model.SetEvent(e2);
                e2.Cancel.Is(false);
                dsc.EventLog.Count.Is(1);
            };

            // action を呼び出す。この中で SendWait() が呼び出されて、
            // dsc.SendWaitLambda が呼び出され、上記の検証が走る
            action = model.Menu.MenuItem[0].ActionItem;
            model.ProcAction(action, KeyboardUpDown.Down);
            dsc.SendWaitLambda = null; // 余分に呼び出されないようにクリア
            dsc.SendWaitLambdaExceptions.Count.Is(0);
            dsc.EventLog.Count.Is(1);
            dsc.EventLog[0].Type.Is(DummySendKeyCode.EventType.SendWait);
            dsc.EventLog[0].Value.Is("f");

            model.ProcAction(action, KeyboardUpDown.Up);
            dsc.EventLog.Count.Is(1);
        }
示例#5
0
        public void SendAfterLoadBankTest()
        {
            var config     = ConfigUtil.Deserialize(Resources.TestConfig14);
            var dsc        = new DummySendKeyCode();
            var model      = new Model(config, dsc);
            var windowInfo = new WindowInfo("ClipStudioPaint.exe",
                                            "新規ファイル.clip - CLIP STUDIO PAINT");

            model.WindowInfo = windowInfo;
            model.ApplicationGroup.Name.Is("CLIP STUDIO PAINT");
            model.Bank.Name.Is("");
            model.Bank.Entries.Count.Is(2);
            model.Bank.Entries[0].Trigger.Is("F");
            model.Bank.Entries[0].ActionItem.ActionType.Is(ActionType.None);
            model.Bank.Entries[0].ActionItem.ActionValue.IsNull();
            model.Bank.Entries[0].ActionItem.NextBank.Is("Bank01");
            model.Bank.Entries[1].Trigger.Is("R");
            model.Bank.Entries[1].ActionItem.ActionType.Is(ActionType.Send);
            model.Bank.Entries[1].ActionItem.ActionValue.Is("a");
            model.Bank.Entries[1].ActionItem.NextBank.Is("");

            var ksF = new KeyboardState {
                KeyCode = Keys.F
            };
            var ksG = new KeyboardState {
                KeyCode = Keys.G
            };
            var ksR = new KeyboardState {
                KeyCode = Keys.R
            };

            // Fを押す
            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyDown, ref ksF));
            dsc.EventLog.Count.Is(0);

            // この時点で LoadBank が完了していなければならない。
            model.Bank.Name.Is("Bank01");
            model.Bank.Entries.Count.Is(2);
            model.Bank.Entries[0].Trigger.Is("G");
            model.Bank.Entries[0].ActionItem.ActionType.Is(ActionType.Send);
            model.Bank.Entries[0].ActionItem.ActionValue.Is("r");
            model.Bank.Entries[0].ActionItem.NextBank.Is("");
            model.Bank.Entries[1].Trigger.Is("R");
            model.Bank.Entries[1].ActionItem.ActionType.Is(ActionType.Send);
            model.Bank.Entries[1].ActionItem.ActionValue.Is("b");
            model.Bank.Entries[1].ActionItem.NextBank.Is("");

            // f(down)のまま g(down) を送出する
            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyDown, ref ksG));

            // この時に SendWait("r") が実行済みでなければならない。
            dsc.EventLog.Count.Is(1);
            dsc.EventLog[0].Type.Is(DummySendKeyCode.EventType.SendWait);
            dsc.EventLog[0].Value.Is("r");

            // 当然、LoadBank も完了済みでなければならない。
            model.Bank.Name.Is("");
            model.Bank.Entries.Count.Is(2);

            // 自分で出した r を受け取ってしまう。
            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyDown, ref ksR));
            dsc.EventLog.Count.Is(1);

            model.SetEvent(new KeyboardHookedEventArgs(
                               KeyboardMessage.KeyUp, ref ksR));
            dsc.EventLog.Count.Is(1);

            // g(up) と f(up) はどこかのタイミングで発生する。
            // これらのいずれもキャンセルされなければならない。
            var e1 = new KeyboardHookedEventArgs(
                KeyboardMessage.KeyUp, ref ksG);

            model.SetEvent(e1);
            e1.Cancel.Is(true);
            dsc.EventLog.Count.Is(1);

            var e2 = new KeyboardHookedEventArgs(
                KeyboardMessage.KeyUp, ref ksF);

            model.SetEvent(e2);
            e2.Cancel.Is(true);
            dsc.EventLog.Count.Is(1);
        }