Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions SRC.Sharp/SRCCoreTests/Commands/CommandLaunchTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,5 +142,62 @@ public void LaunchCmdID_CancelFromListBox_SelectedCommandCleared()

Assert.AreEqual("", src.Commands.SelectedCommand);
}

// ──────────────────────────────────────────────
// 追加テスト
// ──────────────────────────────────────────────

[TestMethod]
public void LaunchCmdID_CancelFromListBox_CommandStateIsUnitSelect()
{
// CancelCommand() 後は CommandState = "ユニット選択"
var src = CreateSrc();
src.Commands.CommandState = "コマンド選択";
((MockGUI)src.GUI).ListBoxHandler = _ => 0;
((MockGUI)src.GUI).RedrawScreenHandler = _ => { };

try { src.Commands.UnitCommand(new UiCommand(Command.LaunchCmdID, "発進")); }
catch (GUINotImplementedException) { }

Assert.AreEqual("ユニット選択", src.Commands.CommandState);
}

[TestMethod]
public void LaunchCmdID_ListBoxCaption_IsUnitSelect()
{
var src = CreateSrc();
src.Commands.CommandState = "コマンド選択";
string captionUsed = null;
((MockGUI)src.GUI).ListBoxHandler = args => { captionUsed = args.lb_caption; return 0; };
((MockGUI)src.GUI).RedrawScreenHandler = _ => { };

try { src.Commands.UnitCommand(new UiCommand(Command.LaunchCmdID, "発進")); }
catch (GUINotImplementedException) { }

Assert.AreEqual("ユニット選択", captionUsed);
}

[TestMethod]
public void LaunchCmdID_ListBoxHasFlag_IsTrue()
{
// StartLaunchCommand は HasFlag=true でリストを表示する
var src = CreateSrc();
src.Commands.CommandState = "コマンド選択";
bool? hasFlagValue = null;
((MockGUI)src.GUI).ListBoxHandler = args => { hasFlagValue = args.HasFlag; return 0; };
((MockGUI)src.GUI).RedrawScreenHandler = _ => { };

try { src.Commands.UnitCommand(new UiCommand(Command.LaunchCmdID, "発進")); }
catch (GUINotImplementedException) { }

Assert.AreEqual(true, hasFlagValue, "StartLaunchCommand は HasFlag=true を渡す");
}

[TestMethod]
public void LaunchCmdID_InitialSelectedCommand_IsEmpty()
{
var src = CreateSrc();
Assert.IsTrue(string.IsNullOrEmpty(src.Commands.SelectedCommand));
}
}
}
58 changes: 58 additions & 0 deletions SRC.Sharp/SRCCoreTests/Commands/CommandMapCommandTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,5 +120,63 @@ public void MapCommand_AutoDefenseCmdID_SetCommandStateToUnitSelect()
}
Assert.AreEqual("ユニット選択", src.Commands.CommandState);
}

// ──────────────────────────────────────────────
// 追加テスト
// ──────────────────────────────────────────────

[TestMethod]
public void MapCommand_AlwaysSetsCommandStateToUnitSelect_FromMapCommand()
{
var src = CreateSrc();
src.Commands.CommandState = "マップコマンド";
src.Commands.ViewMode = true;
src.Commands.MapCommand(new UiCommand(Command.EndTurnCmdID, "ターン終了"));
Assert.AreEqual("ユニット選択", src.Commands.CommandState);
}

[TestMethod]
public void MapCommand_EndTurnWithViewModeTrue_DoesNotCallEndTurnCommand()
{
// ViewMode=true の早期 return では EndTurnCommand (GUI依存) は呼ばれない
// → GUINotImplementedException は発生しない
var src = CreateSrc();
src.Commands.ViewMode = true;
bool threw = false;
try
{
src.Commands.MapCommand(new UiCommand(Command.EndTurnCmdID, "ターン終了"));
}
catch (SRCCore.Exceptions.GUINotImplementedException)
{
threw = true;
}
Assert.IsFalse(threw, "ViewMode=true の場合 EndTurnCommand は呼ばれない");
}

[TestMethod]
public void MapCommand_AutoDefenseCmdID_TogglesFromFalseToTrue()
{
var src = CreateSrc();
src.SystemConfig.AutoDefense = false;
try { src.Commands.MapCommand(new UiCommand(Command.AutoDefenseCmdID, "自動反撃")); } catch { }
Assert.IsTrue(src.SystemConfig.AutoDefense);
}

[TestMethod]
public void MapCommand_AutoDefenseCmdID_TogglesFromTrueToFalse()
{
var src = CreateSrc();
src.SystemConfig.AutoDefense = true;
try { src.Commands.MapCommand(new UiCommand(Command.AutoDefenseCmdID, "自動反撃")); } catch { }
Assert.IsFalse(src.SystemConfig.AutoDefense);
}

[TestMethod]
public void MapCommand_ViewMode_InitiallyFalse()
{
var src = CreateSrc();
Assert.IsFalse(src.Commands.ViewMode);
}
}
}
167 changes: 167 additions & 0 deletions SRC.Sharp/SRCCoreTests/Commands/CommandProcessTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SRCCore.Commands;
using SRCCore.Maps;
using SRCCore.TestLib;
using SRCCore.Units;

namespace SRCCore.Commands.Tests
{
/// <summary>
/// Command.process.cs の ProceedInput / ProceedCommand のユニットテスト。
/// </summary>
[TestClass]
public class CommandProcessTests
{
private SRC CreateSrc() => new SRC { GUI = new MockGUI() };

// ──────────────────────────────────────────────
// ProceedInput - 左クリック
// ──────────────────────────────────────────────

[TestMethod]
public void ProceedInput_LeftClick_MapCommand_SetsStateToUnitSelect()
{
var src = CreateSrc();
src.Commands.CommandState = "マップコマンド";
src.Commands.ProceedInput(GuiButton.Left, null, null);
Assert.AreEqual("ユニット選択", src.Commands.CommandState);
}

[TestMethod]
public void ProceedInput_LeftClick_CommandSelect_NoUnit_CancelsToUnitSelect()
{
// unit == null → CancelCommand() → CommandState = "ユニット選択"
var src = CreateSrc();
src.Commands.CommandState = "コマンド選択";
src.Commands.ProceedInput(GuiButton.Left, null, null);
Assert.AreEqual("ユニット選択", src.Commands.CommandState);
}

[TestMethod]
public void ProceedInput_LeftClick_CommandSelect_NoUnit_ClearsSelectedCommand()
{
var src = CreateSrc();
src.Commands.CommandState = "コマンド選択";
src.Commands.SelectedCommand = "攻撃";
src.Commands.ProceedInput(GuiButton.Left, null, null);
Assert.AreEqual("", src.Commands.SelectedCommand);
}

[TestMethod]
public void ProceedInput_LeftClick_AfterMoveCommandSelect_CancelsToUnitSelect()
{
// "移動後コマンド選択" + 左クリック → CancelCommand() が呼ばれる
// CancelCommand() は "移動後コマンド選択" → "ターゲット選択" に変更し、
// 以降は GUI 依存処理で例外が出る可能性があるが、
// CancelCommand の直前まで "移動後コマンド選択" だった事実を確認
var src = CreateSrc();
src.Commands.CommandState = "移動後コマンド選択";
// CancelCommand() が "移動後コマンド選択" ケースを処理するので例外が出うる
try { src.Commands.ProceedInput(GuiButton.Left, null, null); } catch { }
// CommandState は "移動後コマンド選択" ではなくなる (CancelCommand が呼ばれた)
Assert.AreNotEqual("移動後コマンド選択", src.Commands.CommandState);
}

// ──────────────────────────────────────────────
// ProceedInput - 右クリック
// ──────────────────────────────────────────────

[TestMethod]
public void ProceedInput_RightClick_MapCommand_SetsStateToUnitSelect()
{
var src = CreateSrc();
src.Commands.CommandState = "マップコマンド";
src.Commands.ProceedInput(GuiButton.Right, null, null);
Assert.AreEqual("ユニット選択", src.Commands.CommandState);
}

[TestMethod]
public void ProceedInput_RightClick_CommandSelect_CancelsToUnitSelect()
{
// "コマンド選択" は右クリックの default ケース → CancelCommand()
var src = CreateSrc();
src.Commands.CommandState = "コマンド選択";
src.Commands.ProceedInput(GuiButton.Right, null, null);
Assert.AreEqual("ユニット選択", src.Commands.CommandState);
}

[TestMethod]
public void ProceedInput_RightClick_TargetSelect_CancelsCommand()
{
// "ターゲット選択" + 右クリック → default ケース → CancelCommand()
// CancelCommand("ターゲット選択") → "コマンド選択" → GUI 依存で例外が出うる
var src = CreateSrc();
src.Commands.CommandState = "ターゲット選択";
try { src.Commands.ProceedInput(GuiButton.Right, null, null); } catch { }
// "ターゲット選択" のまま残らないことを確認
Assert.AreNotEqual("ターゲット選択", src.Commands.CommandState);
}

// ──────────────────────────────────────────────
// ProceedCommand - ViewMode ガード
// ──────────────────────────────────────────────

[TestMethod]
public void ProceedCommand_ViewModeTrue_ByCancel_DisablesViewMode()
{
var src = CreateSrc();
src.Commands.ViewMode = true;
src.Commands.CommandState = "ユニット選択";
src.Commands.ProceedCommand(by_cancel: true);
Assert.IsFalse(src.Commands.ViewMode);
}

[TestMethod]
public void ProceedCommand_ViewModeTrue_ByCancel_ReturnsAfterDisablingViewMode()
{
// by_cancel=true で ViewMode=false になり、それ以降の処理には進まない
// CommandState は変化しないことで確認
var src = CreateSrc();
src.Commands.ViewMode = true;
src.Commands.CommandState = "ユニット選択";
src.Commands.ProceedCommand(by_cancel: true);
// GUI.IsGUILocked は ViewMode 分岐より後でセットされるので false のまま
Assert.IsFalse(src.GUI.IsGUILocked);
}

[TestMethod]
public void ProceedCommand_ViewModeTrue_NotByCancel_StateUnchanged()
{
// by_cancel=false かつ ViewMode=true → 何もせず即 return
var src = CreateSrc();
src.Commands.ViewMode = true;
src.Commands.CommandState = "コマンド選択";
src.Commands.ProceedCommand(by_cancel: false);
// ViewMode は変化しない
Assert.IsTrue(src.Commands.ViewMode);
// CommandState も変化しない
Assert.AreEqual("コマンド選択", src.Commands.CommandState);
}

[TestMethod]
public void ProceedCommand_ViewModeTrue_NotByCancel_GUIRemainsUnlocked()
{
var src = CreateSrc();
src.Commands.ViewMode = true;
src.Commands.CommandState = "コマンド選択";
src.Commands.ProceedCommand(by_cancel: false);
Assert.IsFalse(src.GUI.IsGUILocked);
}

// ──────────────────────────────────────────────
// ProceedInput - 左クリック + ViewMode=true の CommandSelect ガード
// ──────────────────────────────────────────────

[TestMethod]
public void ProceedInput_LeftClick_CommandSelect_ViewModeTrue_CancelsThenViewModeRemains()
{
// "コマンド選択" + unit=null → CancelCommand() → "ユニット選択"
// (ViewMode ガードは ProceedCommand 内なので CancelCommand は通る)
var src = CreateSrc();
src.Commands.CommandState = "コマンド選択";
src.Commands.ViewMode = true;
src.Commands.ProceedInput(GuiButton.Left, null, null);
Assert.AreEqual("ユニット選択", src.Commands.CommandState);
}
}
}
74 changes: 74 additions & 0 deletions SRC.Sharp/SRCCoreTests/Commands/CommandUnitSpTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,5 +107,79 @@ public void SpecialPowerCmdID_PrevCommandSavedBeforeCall()
// その後 SelectedCommand = "スペシャルパワー" になる
Assert.AreEqual("スペシャルパワー", src.Commands.SelectedCommand);
}

// ──────────────────────────────────────────────
// 追加テスト
// ──────────────────────────────────────────────

[TestMethod]
public void SpecialPowerCmdID_InitialSelectedCommandIsEmpty()
{
var src = CreateSrc();
Assert.IsTrue(string.IsNullOrEmpty(src.Commands.SelectedCommand));
}

[TestMethod]
public void SpecialPowerCmdID_LockCalledBeforeSelectedCommandSet()
{
// LockGUI が呼ばれてから SelectedCommand が設定されること
var src = CreateSrc();
var mock = (MockGUI)src.GUI;
bool lockCalledBeforeSet = false;
mock.LockGUIHandler = () =>
{
// この時点ではまだ SelectedCommand は変わっていない
lockCalledBeforeSet = (src.Commands.SelectedCommand != "スペシャルパワー");
};

try { src.Commands.UnitCommand(new UiCommand(Command.SpecialPowerCmdID, "スペシャルパワー")); }
catch { }

Assert.IsTrue(lockCalledBeforeSet, "LockGUI は SelectedCommand 設定前に呼ばれる");
}

[TestMethod]
public void SpecialPowerCmdID_CommandStateIsCommandSelect_BeforeCall()
{
// SelectedUnit が存在するとき、UnitCommand は CommandState="コマンド選択" を前提とする
var src = CreateSrc();
src.Commands.CommandState = "コマンド選択";
var mock = (MockGUI)src.GUI;
mock.LockGUIHandler = () => { };

try { src.Commands.UnitCommand(new UiCommand(Command.SpecialPowerCmdID, "スペシャルパワー")); }
catch { }

Assert.AreEqual("スペシャルパワー", src.Commands.SelectedCommand);
}

[TestMethod]
public void SpecialPowerCmdID_DifferentSrcInstances_IndependentState()
{
// 複数の SRC インスタンスが独立していることを確認
var src1 = CreateSrc();
var src2 = CreateSrc();
((MockGUI)src1.GUI).LockGUIHandler = () => { };
((MockGUI)src2.GUI).LockGUIHandler = () => { };

try { src1.Commands.UnitCommand(new UiCommand(Command.SpecialPowerCmdID, "スペシャルパワー")); } catch { }
// src2 は呼ばない

Assert.AreEqual("スペシャルパワー", src1.Commands.SelectedCommand);
Assert.IsTrue(string.IsNullOrEmpty(src2.Commands.SelectedCommand));
}

[TestMethod]
public void SpecialPowerCmdID_CalledTwice_SelectedCommandRemainsSpecialPower()
{
var src = CreateSrc();
var mock = (MockGUI)src.GUI;
mock.LockGUIHandler = () => { };

try { src.Commands.UnitCommand(new UiCommand(Command.SpecialPowerCmdID, "スペシャルパワー")); } catch { }
try { src.Commands.UnitCommand(new UiCommand(Command.SpecialPowerCmdID, "スペシャルパワー")); } catch { }

Assert.AreEqual("スペシャルパワー", src.Commands.SelectedCommand);
}
}
}
Loading