using System.Collections.Generic;
using NUnit.Framework;

namespace TIASshot.Tests {
    /// <summary>
    /// ImagingSource の接続先デバイスの選択（IScamDeviceSelector）のテスト（層①．IScam から切り出した判断ロジック）．
    ///
    /// 仕様: PLAN_06「カメラの選択」（両機種を同時につないでも指定した機種だけを使う）・IScamDeviceSelector の契約
    ///   - DeviceName（デバイス状態ファイル名・設定キー）は列挙名から空白を除いたもの
    ///   - キーが（大文字小文字を区別して）一致する最初の列挙名（空白入りの元の名前）を返す．見つからなければ null
    /// </summary>
    [TestFixture]
    public class IScamDeviceSelectorTests {

        [Test]
        public void ToDeviceKey_空白を除く() {
            Assert.That(IScamDeviceSelector.ToDeviceKey("DFK 33UX178"), Is.EqualTo("DFK33UX178"));
        }

        [Test]
        public void ToDeviceKey_複数の空白_すべて除く() {
            Assert.That(IScamDeviceSelector.ToDeviceKey(" DFK  33 UX178 "), Is.EqualTo("DFK33UX178"));
        }

        [Test]
        public void ToDeviceKey_null_null() {
            Assert.That(IScamDeviceSelector.ToDeviceKey(null), Is.Null);
        }

        [Test]
        public void FindDeviceName_キーが一致する元の名前を返す() {
            var names = new[] { "DFK 23UX249", "DFK 33UX178" };
            Assert.That(IScamDeviceSelector.FindDeviceName(names, "DFK33UX178"), Is.EqualTo("DFK 33UX178"));
        }

        [Test]
        public void FindDeviceName_同じキーが複数_最初の名前() {
            var names = new[] { "DFK 33UX178", "DFK33UX178" };
            Assert.That(IScamDeviceSelector.FindDeviceName(names, "DFK33UX178"), Is.EqualTo("DFK 33UX178"));
        }

        [Test]
        public void FindDeviceName_大文字小文字が違う_一致しない() {
            var names = new[] { "DFK 33UX178" };
            Assert.That(IScamDeviceSelector.FindDeviceName(names, "dfk33ux178"), Is.Null);
        }

        [Test]
        public void FindDeviceName_一致なし_null() {
            var names = new[] { "DFK 23UX249" };
            Assert.That(IScamDeviceSelector.FindDeviceName(names, "DFK33UX178"), Is.Null);
        }

        [Test]
        public void FindDeviceName_一覧がnull_null() {
            Assert.That(IScamDeviceSelector.FindDeviceName(null, "DFK33UX178"), Is.Null);
        }

        [Test]
        public void FindDeviceName_一覧が空_null() {
            Assert.That(IScamDeviceSelector.FindDeviceName(new List<string>(), "DFK33UX178"), Is.Null);
        }

        [Test]
        public void FindDeviceName_キーがnull_null() {
            Assert.That(IScamDeviceSelector.FindDeviceName(new[] { "DFK 33UX178" }, null), Is.Null);
        }

        [Test]
        public void FindDeviceName_キーが空_null() {
            // 一覧に空の名前があっても空のキーには一致させない
            Assert.That(IScamDeviceSelector.FindDeviceName(new[] { "", "DFK 33UX178" }, ""), Is.Null);
        }

        [Test]
        public void FindDeviceName_一覧中のnullと空を飛ばす() {
            var names = new[] { null, "", "DFK 33UX178" };
            Assert.That(IScamDeviceSelector.FindDeviceName(names, "DFK33UX178"), Is.EqualTo("DFK 33UX178"));
        }
    }
}
