Newer
Older
TIASShot / TIASshot.Tests / SelfTestRunnerTests.cs
#if SELFTEST
using NUnit.Framework;

namespace TIASshot.Tests {
    /// <summary>
    /// SelfTestRunner のうちテストプロジェクトから参照できる純粋ロジック(引数判定・終了コードの規約)のテスト.
    ///
    /// 仕様: ENV_04「セルフテスト」・ENV_06「SELFTEST」・.claude/verify-profile.md
    ///   - `TIASshot.exe --selftest` でセルフテストを実行する(それ以外は通常起動)
    ///   - 終了コード 0=全項目合格,1=不合格あり,2=セルフテスト自体の異常,3=タイムアウト
    ///
    /// 対象外: Run 本体(ヘッドレス Form1・偽カメラ・メッセージポンプ・Environment.Exit を伴う)と,
    /// private の引数値取得(--selftest-out)・結果集約・リダイレクト突き合わせはハードウェア結合層の一部として
    /// ランナー(scripts/verify/run_selftest.py)による実行で担保する.
    /// 本クラスは SELFTEST 構成(Debug|x64)でのみコンパイルされる.
    /// </summary>
    [TestFixture]
    public class SelfTestRunnerTests {

        [Test]
        public void IsRequested_selftestフラグあり_真() {
            Assert.That(SelfTestRunner.IsRequested(new[] { @"C:\app\TIASshot.exe", "--selftest" }), Is.True);
        }

        [Test]
        public void IsRequested_selftestフラグが出力先指定と併用_真() {
            var args = new[] { "TIASshot.exe", "--selftest", "--selftest-out", @"C:\tmp\r.txt" };
            Assert.That(SelfTestRunner.IsRequested(args), Is.True);
        }

        [Test]
        public void IsRequested_大文字小文字違い_真() {
            Assert.That(SelfTestRunner.IsRequested(new[] { "TIASshot.exe", "--SelfTest" }), Is.True);
        }

        [Test]
        public void IsRequested_引数なし_偽で通常起動() {
            Assert.That(SelfTestRunner.IsRequested(new[] { "TIASshot.exe" }), Is.False);
        }

        [Test]
        public void IsRequested_空配列_偽() {
            Assert.That(SelfTestRunner.IsRequested(new string[0]), Is.False);
        }

        [Test]
        public void IsRequested_出力先指定のみでselftestなし_偽() {
            // --selftest-out は --selftest の前方一致だが,それ単独ではセルフテストを起動しない
            var args = new[] { "TIASshot.exe", "--selftest-out", @"C:\tmp\r.txt" };
            Assert.That(SelfTestRunner.IsRequested(args), Is.False);
        }

        [Test]
        public void IsRequested_keepのみ_偽() {
            Assert.That(SelfTestRunner.IsRequested(new[] { "TIASshot.exe", "--selftest-keep" }), Is.False);
        }

        [Test]
        public void IsRequested_前後に文字が付いた値_偽() {
            Assert.That(SelfTestRunner.IsRequested(new[] { "TIASshot.exe", "-selftest", "selftest", "--selftestx" }), Is.False);
        }

        [Test]
        public void IsRequested_出力先パスの値がselftestという文字列_真() {
            // 出力先の値として "--selftest" が来た場合も含め,フラグの存在で判定する(誤起動にはならない方向の確認)
            Assert.That(SelfTestRunner.IsRequested(new[] { "TIASshot.exe", "--selftest-out", "--selftest" }), Is.True);
        }

        [Test]
        public void 終了コード_合格は0() {
            Assert.That(SelfTestRunner.ExitPass, Is.EqualTo(0));
        }

        [Test]
        public void 終了コード_不合格ありは1() {
            Assert.That(SelfTestRunner.ExitFail, Is.EqualTo(1));
        }

        [Test]
        public void 終了コード_セルフテスト自体の異常は2() {
            Assert.That(SelfTestRunner.ExitError, Is.EqualTo(2));
        }

        [Test]
        public void 終了コード_タイムアウトは3() {
            Assert.That(SelfTestRunner.ExitTimeout, Is.EqualTo(3));
        }

        [Test]
        public void フラグ名_仕様どおりselftest() {
            Assert.That(SelfTestRunner.FlagSelfTest, Is.EqualTo("--selftest"));
        }
    }
}
#endif