Newer
Older
TIASShot / TIASshot.Tests / HwTestOptionsTests.cs
#if HWTEST
using System;
using NUnit.Framework;

namespace TIASshot.Tests {
    /// <summary>
    /// 実機テストの引数(HwTestOptions)の解析のテスト(層①).
    ///
    /// 仕様: PLAN_06「仕組み」・.claude/verify-profile.md「実機テスト」
    ///   - 起動: TIASshot.exe --hwtest --camera &lt;lucam|iscam&gt; [--with-chart] [--hwtest-out &lt;結果ファイル&gt;] [--hwtest-keep]
    ///   - --camera は必須.機種は lucam / iscam のみ(指定した機種だけを使う)
    ///   - 未知のフラグ・値の欠落・重複・不正な機種は誤り(打ち間違いで別の検査が走らない)
    ///   - 先頭要素が実行ファイルのパス(Environment.GetCommandLineArgs の形)でもよい
    /// 本クラスは HWTEST 構成(Debug|x64)でのみコンパイルされる.
    /// </summary>
    [TestFixture]
    public class HwTestOptionsTests {

        private const string Exe = @"C:\app\TIASshot.exe";

        private static HwTestOptions ParseOk(params string[] args) {
            string error;
            var options = HwTestOptions.Parse(args, out error);
            Assert.That(error, Is.Null, "前提: 解析が成功すること");
            Assert.That(options, Is.Not.Null, "前提: 解析が成功すること");
            return options;
        }

        private static string ParseError(params string[] args) {
            string error;
            var options = HwTestOptions.Parse(args, out error);
            Assert.That(options, Is.Null, "誤りのときは null を返すこと");
            return error;
        }

        // ---------------------------------------------------------------
        // IsRequested
        // ---------------------------------------------------------------

        [Test]
        public void IsRequested_hwtestあり_true() {
            Assert.That(HwTestOptions.IsRequested(new[] { Exe, "--hwtest", "--camera", "lucam" }), Is.True);
        }

        [Test]
        public void IsRequested_hwtestなし_false() {
            Assert.That(HwTestOptions.IsRequested(new[] { Exe, "--selftest" }), Is.False);
        }

        [Test]
        public void IsRequested_null_false() {
            Assert.That(HwTestOptions.IsRequested(null), Is.False);
        }

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

        // ---------------------------------------------------------------
        // TryParseCamera
        // ---------------------------------------------------------------

        [Test]
        public void TryParseCamera_lucam_Lucam() {
            HwTestCameraKind kind;
            var ok = HwTestOptions.TryParseCamera("lucam", out kind);
            Assert.That(ok && kind == HwTestCameraKind.Lucam, Is.True);
        }

        [Test]
        public void TryParseCamera_iscam_IScam() {
            HwTestCameraKind kind;
            var ok = HwTestOptions.TryParseCamera("iscam", out kind);
            Assert.That(ok && kind == HwTestCameraKind.IScam, Is.True);
        }

        [Test]
        public void TryParseCamera_大文字_受け付ける() {
            HwTestCameraKind kind;
            var ok = HwTestOptions.TryParseCamera("ISCAM", out kind);
            Assert.That(ok && kind == HwTestCameraKind.IScam, Is.True);
        }

        [TestCase("lumenera")]
        [TestCase("")]
        [TestCase(" lucam")]
        public void TryParseCamera_不正な機種_false(string value) {
            HwTestCameraKind kind;
            Assert.That(HwTestOptions.TryParseCamera(value, out kind), Is.False);
        }

        [Test]
        public void TryParseCamera_null_false() {
            HwTestCameraKind kind;
            Assert.That(HwTestOptions.TryParseCamera(null, out kind), Is.False);
        }

        // ---------------------------------------------------------------
        // Parse: 正常系
        // ---------------------------------------------------------------

        [Test]
        public void Parse_cameraのみ_機種が設定される() {
            var o = ParseOk("--hwtest", "--camera", "iscam");
            Assert.That(o.Camera, Is.EqualTo(HwTestCameraKind.IScam));
        }

        [Test]
        public void Parse_先頭が実行ファイルのパス_受け付ける() {
            var o = ParseOk(Exe, "--hwtest", "--camera", "lucam");
            Assert.That(o.Camera, Is.EqualTo(HwTestCameraKind.Lucam));
        }

        [Test]
        public void Parse_省略時_既定値() {
            var o = ParseOk(Exe, "--hwtest", "--camera", "lucam");
            Assert.That(new object[] { o.OutPath, o.WithChart, o.Keep }, Is.EqualTo(new object[] { null, false, false }));
        }

        [Test]
        public void Parse_hwtestOut_出力先が設定される() {
            var o = ParseOk(Exe, "--hwtest", "--camera", "lucam", "--hwtest-out", @"C:\tmp\result.txt");
            Assert.That(o.OutPath, Is.EqualTo(@"C:\tmp\result.txt"));
        }

        [Test]
        public void Parse_withChart_true() {
            var o = ParseOk(Exe, "--hwtest", "--camera", "lucam", "--with-chart");
            Assert.That(o.WithChart, Is.True);
        }

        [Test]
        public void Parse_hwtestKeep_true() {
            var o = ParseOk(Exe, "--hwtest", "--camera", "lucam", "--hwtest-keep");
            Assert.That(o.Keep, Is.True);
        }

        [Test]
        public void Parse_順序が入れ替わっても_同じ結果() {
            var o = ParseOk(Exe, "--hwtest-out", "r.txt", "--with-chart", "--camera", "iscam", "--hwtest", "--hwtest-keep");
            Assert.That(new object[] { o.Camera, o.OutPath, o.WithChart, o.Keep },
                Is.EqualTo(new object[] { HwTestCameraKind.IScam, "r.txt", true, true }));
        }

        [Test]
        public void Parse_機種名の大文字_受け付ける() {
            var o = ParseOk(Exe, "--hwtest", "--camera", "LuCam");
            Assert.That(o.Camera, Is.EqualTo(HwTestCameraKind.Lucam));
        }

        // ---------------------------------------------------------------
        // Parse: 誤り
        // ---------------------------------------------------------------

        [Test]
        public void Parse_null_誤り() {
            Assert.That(ParseError(null), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_cameraなし_誤り() {
            Assert.That(ParseError(Exe, "--hwtest"), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_cameraの値の欠落_末尾_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera"), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_cameraの値の欠落_次がフラグ_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "--with-chart"), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_hwtestOutの値の欠落_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lucam", "--hwtest-out"), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_hwtestOutの値が空白_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lucam", "--hwtest-out", "  "), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_不正な機種_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lumenera"), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_不正な機種_誤りの理由に値が含まれる() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lumenera"), Does.Contain("lumenera"));
        }

        [Test]
        public void Parse_cameraの重複_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lucam", "--camera", "iscam"), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_hwtestOutの重複_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lucam", "--hwtest-out", "a.txt", "--hwtest-out", "b.txt"),
                Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_未知のフラグ_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lucam", "--with-chrat"), Is.Not.Null.And.Not.Empty);
        }

        [Test]
        public void Parse_未知のフラグ_誤りの理由にフラグが含まれる() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lucam", "--with-chrat"), Does.Contain("--with-chrat"));
        }

        [Test]
        public void Parse_先頭以外の余分な値_誤り() {
            Assert.That(ParseError(Exe, "--hwtest", "--camera", "lucam", "extra"), Is.Not.Null.And.Not.Empty);
        }
    }
}
#endif