Skip to content

Commit 630cb91

Browse files
authored
Merge pull request #906 from 7474/unit-tests/pilot-recover-cmd-execution-tests-20260328-288a5715366a5457
[unit-tests] ユニットテスト補完: RecoverHP/EN/SP・LevelUp・ExpUp・IncreaseMorale コマンド
2 parents efbab24 + 3842fd5 commit 630cb91

File tree

2 files changed

+390
-0
lines changed

2 files changed

+390
-0
lines changed
Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
using Microsoft.VisualStudio.TestTools.UnitTesting;
2+
using SRCCore.CmdDatas;
3+
using SRCCore.CmdDatas.Commands;
4+
using SRCCore.Events;
5+
using SRCCore.TestLib;
6+
using System.Collections.Generic;
7+
8+
namespace SRCCore.CmdDatas.Tests
9+
{
10+
/// <summary>
11+
/// LevelUpCmd / ExpUpCmd / RecoverSPCmd / IncreaseMoraleCmd のユニットテスト
12+
/// ヘルプの記載に基づくパイロットステータス変更を検証する
13+
/// </summary>
14+
[TestClass]
15+
public class PilotCmdExecutionTests
16+
{
17+
private SRC CreateSrc()
18+
{
19+
var src = new SRC { GUI = new MockGUI() };
20+
src.Event.EventData = new List<EventDataLine>();
21+
src.Event.EventCmd = new List<CmdData>();
22+
src.Event.EventFileNames = new List<string>();
23+
src.Event.AdditionalEventFileNames = new List<string>();
24+
src.Event.EventQue = new Queue<string>();
25+
return src;
26+
}
27+
28+
private CmdData CreateCmd(SRC src, string cmdText, int id = 0)
29+
{
30+
var line = new EventDataLine(id, EventDataSource.Scenario, "test", id, cmdText);
31+
src.Event.EventData.Add(line);
32+
var parser = new CmdParser();
33+
var cmd = parser.Parse(src, line);
34+
src.Event.EventCmd.Add(cmd);
35+
return cmd;
36+
}
37+
38+
/// <summary>
39+
/// パイロットを PDList と PList に登録してレベル 1 で返すヘルパー
40+
/// </summary>
41+
private Pilots.Pilot CreatePilot(SRC src, string name, int level = 1)
42+
{
43+
var pd = src.PDList.Add(name);
44+
pd.SP = 100;
45+
return src.PList.Add(name, level, "味方");
46+
}
47+
48+
// ──────────────────────────────────────────────
49+
// LevelUpCmd
50+
// ヘルプ: LevelUp [pilot] level — パイロットのレベルを level 分上げる
51+
// 解説: レベルは最大 99 まで(レベル限界突破オプション時は 999 まで)
52+
// ──────────────────────────────────────────────
53+
54+
/// <summary>
55+
/// LevelUp パイロット名 1 — 指定パイロットのレベルが 1 上がる
56+
/// </summary>
57+
[TestMethod]
58+
public void LevelUpCmd_WithNamedPilot_IncreasesLevel()
59+
{
60+
// ヘルプ: LevelUp pilot level — pilot のレベルを level 分上げる
61+
var src = CreateSrc();
62+
var pilot = CreatePilot(src, "テストパイロット", 10);
63+
Assert.AreEqual(10, pilot.Level);
64+
65+
var cmd = CreateCmd(src, "LevelUp テストパイロット 1");
66+
var result = cmd.Exec();
67+
68+
Assert.AreEqual(1, result);
69+
Assert.AreEqual(11, pilot.Level);
70+
}
71+
72+
/// <summary>
73+
/// LevelUp パイロット名 10 — 複数レベルまとめて上げられる
74+
/// </summary>
75+
[TestMethod]
76+
public void LevelUpCmd_WithNamedPilot_MultiLevelIncrease()
77+
{
78+
// ヘルプ: level 分だけ上げる(複数も可)
79+
var src = CreateSrc();
80+
var pilot = CreatePilot(src, "テストパイロット2", 5);
81+
82+
var cmd = CreateCmd(src, "LevelUp テストパイロット2 10");
83+
cmd.Exec();
84+
85+
Assert.AreEqual(15, pilot.Level);
86+
}
87+
88+
/// <summary>
89+
/// LevelUp — レベルは 99 を超えない(上限チェック)
90+
/// </summary>
91+
[TestMethod]
92+
public void LevelUpCmd_WithNamedPilot_CapAt99()
93+
{
94+
// ヘルプ: ただしパイロットのレベルは最大でも 99 までです
95+
var src = CreateSrc();
96+
var pilot = CreatePilot(src, "テストパイロット3", 98);
97+
98+
// レベルを 98 → 105 に上げようとする → 99 に制限される
99+
var cmd = CreateCmd(src, "LevelUp テストパイロット3 7");
100+
cmd.Exec();
101+
102+
Assert.AreEqual(99, pilot.Level);
103+
}
104+
105+
/// <summary>
106+
/// LevelUp 存在しないパイロット 1 → エラー
107+
/// </summary>
108+
[TestMethod]
109+
public void LevelUpCmd_NonExistentPilot_ReturnsError()
110+
{
111+
// 存在しないパイロット名を指定した場合はエラー
112+
var src = CreateSrc();
113+
var cmd = CreateCmd(src, "LevelUp 存在しないパイロット 1");
114+
var result = cmd.Exec();
115+
Assert.AreEqual(-1, result);
116+
}
117+
118+
// ──────────────────────────────────────────────
119+
// ExpUpCmd
120+
// ヘルプ: ExpUp [pilot] exp — パイロットに経験値を加算する
121+
// 解説: 経験値がレベルアップ閾値を超えるとレベルが上がる
122+
// ──────────────────────────────────────────────
123+
124+
/// <summary>
125+
/// ExpUp パイロット名 100 — 経験値が加算される
126+
/// </summary>
127+
[TestMethod]
128+
public void ExpUpCmd_WithNamedPilot_IncreasesExp()
129+
{
130+
// ヘルプ: pilot の経験値を exp 分加算する
131+
var src = CreateSrc();
132+
var pilot = CreatePilot(src, "経験値テスト", 1);
133+
var initialExp = pilot.Exp;
134+
135+
var cmd = CreateCmd(src, "ExpUp 経験値テスト 100");
136+
var result = cmd.Exec();
137+
138+
Assert.AreEqual(1, result);
139+
Assert.IsTrue(pilot.Exp >= initialExp + 100 || pilot.Level > 1,
140+
"経験値が加算されるかレベルアップしている必要がある");
141+
}
142+
143+
/// <summary>
144+
/// ExpUp 存在しないパイロット 100 → エラー
145+
/// </summary>
146+
[TestMethod]
147+
public void ExpUpCmd_NonExistentPilot_ReturnsError()
148+
{
149+
var src = CreateSrc();
150+
var cmd = CreateCmd(src, "ExpUp 存在しないパイロット 100");
151+
var result = cmd.Exec();
152+
Assert.AreEqual(-1, result);
153+
}
154+
155+
// ──────────────────────────────────────────────
156+
// RecoverSPCmd
157+
// ヘルプ: RecoverSP [pilot] rate — パイロットの SP を rate % 回復する
158+
// 解説: SP は最大SP を超えず 0 未満にもならない
159+
// ──────────────────────────────────────────────
160+
161+
/// <summary>
162+
/// RecoverSP パイロット名 -100 — SP がゼロより下に行かない
163+
/// </summary>
164+
[TestMethod]
165+
public void RecoverSPCmd_WithNamedPilot_SPDoesNotGoBelowZero()
166+
{
167+
// ヘルプ: RecoverSP によって SP が 0 未満になることはない
168+
var src = CreateSrc();
169+
var pilot = CreatePilot(src, "SPテスト", 1);
170+
// MaxSP = pd.SP (= 100), 現在 SP = 100
171+
pilot.SP = 50;
172+
Assert.AreEqual(50, pilot.SP);
173+
174+
// RecoverSP SPテスト -200 → SP = max(0, 50 - 200) = 0
175+
var cmd = CreateCmd(src, "RecoverSP SPテスト -200");
176+
var result = cmd.Exec();
177+
178+
Assert.AreEqual(1, result);
179+
Assert.AreEqual(0, pilot.SP);
180+
}
181+
182+
/// <summary>
183+
/// RecoverSP パイロット名 100 — SP が MaxSP まで回復する
184+
/// </summary>
185+
[TestMethod]
186+
public void RecoverSPCmd_WithNamedPilot_SPRecovery()
187+
{
188+
// ヘルプ: pilot の SP を rate % だけ回復する
189+
// MaxSP は実際の計算結果に依存するため、回復後 SP == MaxSP であることを確認する
190+
var src = CreateSrc();
191+
var pilot = CreatePilot(src, "SPテスト2", 1);
192+
pilot.SP = 0;
193+
Assert.AreEqual(0, pilot.SP);
194+
var maxSP = pilot.MaxSP;
195+
Assert.IsTrue(maxSP > 0, "MaxSP > 0 が前提");
196+
197+
// RecoverSP SPテスト2 100 → SP = 0 + (100 * MaxSP / 100) = MaxSP
198+
var cmd = CreateCmd(src, "RecoverSP SPテスト2 100");
199+
var result = cmd.Exec();
200+
201+
Assert.AreEqual(1, result);
202+
Assert.AreEqual(maxSP, pilot.SP);
203+
}
204+
205+
/// <summary>
206+
/// RecoverSP 存在しないパイロット 100 → エラー
207+
/// </summary>
208+
[TestMethod]
209+
public void RecoverSPCmd_NonExistentPilot_ReturnsError()
210+
{
211+
var src = CreateSrc();
212+
var cmd = CreateCmd(src, "RecoverSP 存在しないパイロット 100");
213+
var result = cmd.Exec();
214+
Assert.AreEqual(-1, result);
215+
}
216+
217+
// ──────────────────────────────────────────────
218+
// IncreaseMoraleCmd
219+
// ヘルプ: IncreaseMorale [pilot] value — パイロットの気力を value 分増加させる
220+
// 解説: 気力は 50 〜 150 の範囲(設定によって変動)
221+
// ──────────────────────────────────────────────
222+
223+
/// <summary>
224+
/// IncreaseMorale パイロット名 10 — 気力が増加する
225+
/// </summary>
226+
[TestMethod]
227+
public void IncreaseMoraleCmd_WithNamedPilot_IncreaseMorale()
228+
{
229+
// ヘルプ: pilot の気力を value 分上げる
230+
var src = CreateSrc();
231+
var pilot = CreatePilot(src, "気力テスト", 1);
232+
var initialMorale = pilot.Morale;
233+
234+
var cmd = CreateCmd(src, "IncreaseMorale 気力テスト 10");
235+
var result = cmd.Exec();
236+
237+
Assert.AreEqual(1, result);
238+
Assert.IsTrue(pilot.Morale >= initialMorale, "気力が下がってはいけない");
239+
}
240+
241+
/// <summary>
242+
/// IncreaseMorale 存在しないパイロット 10 → エラー
243+
/// </summary>
244+
[TestMethod]
245+
public void IncreaseMoraleCmd_NonExistentPilot_ReturnsError()
246+
{
247+
var src = CreateSrc();
248+
var cmd = CreateCmd(src, "IncreaseMorale 存在しないパイロット 10");
249+
var result = cmd.Exec();
250+
Assert.AreEqual(-1, result);
251+
}
252+
}
253+
}

SRC.Sharp/SRCCoreTests/CmdDatas/UnitCombatCmdTests.cs

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,5 +254,142 @@ public void MapAbilityCmd_TooManyArgs_ReturnsError()
254254
var result = cmd.Exec();
255255
Assert.AreEqual(-1, result);
256256
}
257+
258+
// ──────────────────────────────────────────────
259+
// RecoverHPCmd
260+
// ヘルプ: RecoverHP [unit] rate — ユニットの HP を rate %回復
261+
// 解説: マイナス値でHP減少も可能。HP は最大HPを超えず、0以下にならない。
262+
// ──────────────────────────────────────────────
263+
264+
/// <summary>
265+
/// RecoverHP rate (unit 省略) — SelectedUnitForEvent が null の場合、エラーなく NextID を返す
266+
/// </summary>
267+
[TestMethod]
268+
public void RecoverHPCmd_NullSelectedUnit_ReturnsNextId()
269+
{
270+
// ヘルプ: unit 省略時はデフォルトユニット。null でも例外を出さず NextID を返す
271+
var src = CreateSrc();
272+
// SelectedUnitForEvent は null のまま
273+
var cmd = CreateCmd(src, "RecoverHP 100");
274+
var result = cmd.Exec();
275+
Assert.AreEqual(1, result);
276+
}
277+
278+
/// <summary>
279+
/// RecoverHP 50 — 半HPユニットの HP が回復する
280+
/// </summary>
281+
[TestMethod]
282+
public void RecoverHPCmd_WithUnit_RecoveryIncreasesHP()
283+
{
284+
// ヘルプ: unit の HP を rate % だけ回復する
285+
var src = CreateSrc();
286+
var ud = src.UDList.Add("HPテスト");
287+
ud.Transportation = "陸";
288+
ud.Adaption = "AAAA";
289+
ud.HP = 100;
290+
ud.EN = 10;
291+
// Unit コマンドでユニット作成
292+
var unitCmd = CreateCmd(src, "Unit HPテスト 0", 0);
293+
unitCmd.Exec();
294+
var u = src.Event.SelectedUnitForEvent;
295+
Assert.IsNotNull(u);
296+
// HP を半分に減らす
297+
u.HP = 50;
298+
Assert.AreEqual(50, u.HP);
299+
// RecoverHP 50 → 50 + (100 * 50 / 100) = 100
300+
var recoverCmd = CreateCmd(src, "RecoverHP 50", 1);
301+
recoverCmd.Exec();
302+
Assert.AreEqual(100, u.HP);
303+
}
304+
305+
/// <summary>
306+
/// RecoverHP -200 — HP を大幅に減らしても HP は 1 以下にならない
307+
/// </summary>
308+
[TestMethod]
309+
public void RecoverHPCmd_NegativeRate_HpDoesNotGoToZero()
310+
{
311+
// ヘルプ: RecoverHP によってユニットが破壊されることはない(HP は最小 1)
312+
var src = CreateSrc();
313+
var ud = src.UDList.Add("HPテスト2");
314+
ud.Transportation = "陸";
315+
ud.Adaption = "AAAA";
316+
ud.HP = 100;
317+
ud.EN = 10;
318+
var unitCmd = CreateCmd(src, "Unit HPテスト2 0", 0);
319+
unitCmd.Exec();
320+
var u = src.Event.SelectedUnitForEvent;
321+
Assert.IsNotNull(u);
322+
// RecoverHP -200 → HP = max(1, 100 - 200) = 1
323+
var recoverCmd = CreateCmd(src, "RecoverHP -200", 1);
324+
recoverCmd.Exec();
325+
Assert.AreEqual(1, u.HP);
326+
}
327+
328+
// ──────────────────────────────────────────────
329+
// RecoverENCmd
330+
// ヘルプ: RecoverEN [unit] rate — ユニットの EN を rate %回復
331+
// 解説: マイナス値でEN減少も可能。EN は最大ENを超えず、0未満にならない。
332+
// ──────────────────────────────────────────────
333+
334+
/// <summary>
335+
/// RecoverEN rate (unit 省略) — SelectedUnitForEvent が null の場合、エラーなく NextID を返す
336+
/// </summary>
337+
[TestMethod]
338+
public void RecoverENCmd_NullSelectedUnit_ReturnsNextId()
339+
{
340+
// ヘルプ: unit 省略時はデフォルトユニット。null でも例外なく NextID を返す
341+
var src = CreateSrc();
342+
var cmd = CreateCmd(src, "RecoverEN 100");
343+
var result = cmd.Exec();
344+
Assert.AreEqual(1, result);
345+
}
346+
347+
/// <summary>
348+
/// RecoverEN 100 — 消費後の EN が最大まで回復する
349+
/// </summary>
350+
[TestMethod]
351+
public void RecoverENCmd_WithUnit_RecoveryIncreasesEN()
352+
{
353+
// ヘルプ: unit の EN を rate % だけ回復する
354+
var src = CreateSrc();
355+
var ud = src.UDList.Add("ENテスト");
356+
ud.Transportation = "陸";
357+
ud.Adaption = "AAAA";
358+
ud.HP = 100;
359+
ud.EN = 50;
360+
var unitCmd = CreateCmd(src, "Unit ENテスト 0", 0);
361+
unitCmd.Exec();
362+
var u = src.Event.SelectedUnitForEvent;
363+
Assert.IsNotNull(u);
364+
// EN を 0 に
365+
u.EN = 0;
366+
// RecoverEN 100 → 0 + (50 * 100 / 100) = 50
367+
var recoverCmd = CreateCmd(src, "RecoverEN 100", 1);
368+
recoverCmd.Exec();
369+
Assert.AreEqual(50, u.EN);
370+
}
371+
372+
/// <summary>
373+
/// RecoverEN -200 — EN はゼロより下には下がらない
374+
/// </summary>
375+
[TestMethod]
376+
public void RecoverENCmd_NegativeRate_ENDoesNotGoBelowZero()
377+
{
378+
// ヘルプ: RecoverEN によって EN が 0 未満になることはない
379+
var src = CreateSrc();
380+
var ud = src.UDList.Add("ENテスト2");
381+
ud.Transportation = "陸";
382+
ud.Adaption = "AAAA";
383+
ud.HP = 100;
384+
ud.EN = 50;
385+
var unitCmd = CreateCmd(src, "Unit ENテスト2 0", 0);
386+
unitCmd.Exec();
387+
var u = src.Event.SelectedUnitForEvent;
388+
Assert.IsNotNull(u);
389+
// RecoverEN -200 → EN = max(0, 50 - 100) = 0
390+
var recoverCmd = CreateCmd(src, "RecoverEN -200", 1);
391+
recoverCmd.Exec();
392+
Assert.AreEqual(0, u.EN);
393+
}
257394
}
258395
}

0 commit comments

Comments
 (0)