diff --git a/SRC.Sharp/SRCCoreTests/CmdDatas/UnitCombatCmdTests.cs b/SRC.Sharp/SRCCoreTests/CmdDatas/UnitCombatCmdTests.cs new file mode 100644 index 00000000..4f448a18 --- /dev/null +++ b/SRC.Sharp/SRCCoreTests/CmdDatas/UnitCombatCmdTests.cs @@ -0,0 +1,258 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SRCCore.CmdDatas; +using SRCCore.CmdDatas.Commands; +using SRCCore.Events; +using SRCCore.TestLib; +using System.Collections.Generic; + +namespace SRCCore.CmdDatas.Tests +{ + /// + /// DestroyCmd / TransformCmd / AttackCmd / SupplyCmd / + /// ExchangeItemCmd / FixCmd / RemoveItemCmd / + /// MapAttackCmd / MapAbilityCmd のユニットテスト + /// ヘルプの記載に基づく期待値を検証する + /// + [TestClass] + public class UnitCombatCmdTests + { + private SRC CreateSrc() + { + var src = new SRC { GUI = new MockGUI() }; + src.Event.EventData = new List(); + src.Event.EventCmd = new List(); + src.Event.EventFileNames = new List(); + src.Event.AdditionalEventFileNames = new List(); + src.Event.EventQue = new System.Collections.Generic.Queue(); + return src; + } + + private CmdData CreateCmd(SRC src, string cmdText, int id = 0) + { + var line = new EventDataLine(id, EventDataSource.Scenario, "test", id, cmdText); + src.Event.EventData.Add(line); + var parser = new CmdParser(); + var cmd = parser.Parse(src, line); + src.Event.EventCmd.Add(cmd); + return cmd; + } + + // ────────────────────────────────────────────── + // DestroyCmd + // ヘルプ: Destroy [unit] — ユニットを強制的に破壊する + // ────────────────────────────────────────────── + + [TestMethod] + public void DestroyCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 0 または 1 個のユニット名 + var src = CreateSrc(); + var cmd = CreateCmd(src, "Destroy unitA unitB unitC"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + [TestMethod] + public void DestroyCmd_NonExistentUnit_ReturnsError() + { + // 存在しないユニット名を指定した場合はエラー + var src = CreateSrc(); + var cmd = CreateCmd(src, "Destroy 存在しないユニット"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + // ────────────────────────────────────────────── + // TransformCmd + // ヘルプ: Transform [unit] 形態名 — ユニットを指定形態に変形させる + // ────────────────────────────────────────────── + + [TestMethod] + public void TransformCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 1 個(形態名のみ)または 2 個(unit + 形態名) + var src = CreateSrc(); + var cmd = CreateCmd(src, "Transform"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + [TestMethod] + public void TransformCmd_TooManyArgs_ReturnsError() + { + // 引数が 3 個以上 → エラー + var src = CreateSrc(); + var cmd = CreateCmd(src, "Transform unitA 形態A 余分"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + [TestMethod] + public void TransformCmd_NonExistentUnit_ReturnsError() + { + // 存在しないユニットを指定した場合はエラー + var src = CreateSrc(); + var cmd = CreateCmd(src, "Transform 存在しないユニット 形態A"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + // ────────────────────────────────────────────── + // AttackCmd + // ヘルプ: Attack unit1 weapon unit2 defense [通常戦闘] + // unit1 に weapon で unit2 を攻撃させる + // ────────────────────────────────────────────── + + [TestMethod] + public void AttackCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 5 個または 6 個 + var src = CreateSrc(); + var cmd = CreateCmd(src, "Attack unitA 武器 unitB"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + [TestMethod] + public void AttackCmd_InvalidOption_ReturnsError() + { + // 第6引数が「通常戦闘」以外 → オプション不正エラー + var src = CreateSrc(); + var cmd = CreateCmd(src, "Attack unitA 武器 unitB 防御 無効オプション"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + // ────────────────────────────────────────────── + // SupplyCmd + // ヘルプ: Supply [unit] — ユニットの EN・弾数を全回復させる + // ────────────────────────────────────────────── + + [TestMethod] + public void SupplyCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 0 または 1 個のユニット名 + var src = CreateSrc(); + var cmd = CreateCmd(src, "Supply unitA unitB unitC"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + [TestMethod] + public void SupplyCmd_NonExistentUnit_ReturnsError() + { + // 存在しないユニット名を指定した場合はエラー + var src = CreateSrc(); + var cmd = CreateCmd(src, "Supply 存在しないユニット"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + // ────────────────────────────────────────────── + // ExchangeItemCmd + // ヘルプ: ExchangeItem [unit [部位]] — アイテム交換画面を開く + // ────────────────────────────────────────────── + + [TestMethod] + public void ExchangeItemCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 0〜2 個 + var src = CreateSrc(); + var cmd = CreateCmd(src, "ExchangeItem unitA 部位 余分"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + // ────────────────────────────────────────────── + // FixCmd + // ヘルプ: Fix [パイロット名orアイテム名] — パイロット/アイテムを固定する + // ────────────────────────────────────────────── + + [TestMethod] + public void FixCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 0 または 1 個 + var src = CreateSrc(); + var cmd = CreateCmd(src, "Fix パイロットA 余分引数"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + [TestMethod] + public void FixCmd_NonExistentPilot_ReturnsError() + { + // 存在しないパイロット名またはアイテム名を指定した場合はエラー + var src = CreateSrc(); + var cmd = CreateCmd(src, "Fix 存在しないパイロット"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + // ────────────────────────────────────────────── + // RemoveItemCmd + // ヘルプ: RemoveItem [unit [アイテム名or番号]] — アイテムを外す + // ────────────────────────────────────────────── + + [TestMethod] + public void RemoveItemCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 0〜2 個 + var src = CreateSrc(); + var cmd = CreateCmd(src, "RemoveItem unitA アイテム 余分"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + // ────────────────────────────────────────────── + // MapAttackCmd + // ヘルプ: MapAttack [unit] マップ攻撃名 X Y [通常戦闘] + // unit に指定マップ攻撃をX,Y座標に実施させる + // ────────────────────────────────────────────── + + [TestMethod] + public void MapAttackCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 4 個または 5 個(+ 任意の「通常戦闘」) + var src = CreateSrc(); + var cmd = CreateCmd(src, "MapAttack unitA"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + [TestMethod] + public void MapAttackCmd_TooManyArgs_ReturnsError() + { + // 引数が 6 個以上かつ末尾が「通常戦闘」でない → エラー + var src = CreateSrc(); + var cmd = CreateCmd(src, "MapAttack unitA 武器 1 2 余分A 余分B"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + // ────────────────────────────────────────────── + // MapAbilityCmd + // ヘルプ: MapAbility [unit] アビリティ名 X Y + // unit のマップアビリティをX,Y座標で実行する + // ────────────────────────────────────────────── + + [TestMethod] + public void MapAbilityCmd_WrongArgCount_ReturnsError() + { + // ヘルプ: 引数は 4 個または 5 個 + var src = CreateSrc(); + var cmd = CreateCmd(src, "MapAbility unitA"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + + [TestMethod] + public void MapAbilityCmd_TooManyArgs_ReturnsError() + { + // 引数が 6 個以上 → エラー + var src = CreateSrc(); + var cmd = CreateCmd(src, "MapAbility unitA アビリティ 1 2 余分"); + var result = cmd.Exec(); + Assert.AreEqual(-1, result); + } + } +}