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"); }
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); }
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); }
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); }
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); }