#if SELFTEST
using System;
using System.IO;
using NUnit.Framework;

namespace TIASshot.Tests {
    /// <summary>
    /// 一時設定ファイルの準備（SelfTestConfig.Prepare）の書き出し先のファイル名のテスト．
    ///
    /// 仕様: .claude/verify-profile.md「実機テスト」の後始末（実機テストの一時設定ファイルは config.hwtest.xml）・PLAN_06「守ること」
    ///   - fileName を省略したときは従来どおり config.selftest.xml に書き出す
    ///   - fileName に config.hwtest.xml を渡すとそのファイルに書き出し，config.selftest.xml は作らない
    ///   - 同梱の config.xml は読むだけ．作業は一時フォルダで行い，テストの終わりに削除する
    /// 本クラスは SELFTEST 構成（Debug|x64）でのみコンパイルされる．
    /// </summary>
    [TestFixture]
    public class SelfTestConfigTests {

        private string _sourceDir;
        private string _workDir;

        [SetUp]
        public void SetUp() {
            _sourceDir = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "..", "..", "TIASshot"));
            Assert.That(File.Exists(Path.Combine(_sourceDir, "config.xml")), Is.True, $"前提: 同梱 config.xml があること: {_sourceDir}");
            _workDir = Path.Combine(Path.GetTempPath(), "TIASshot-it", "selftestconfig-" + Guid.NewGuid().ToString("N"));
        }

        [TearDown]
        public void TearDown() {
            if (Directory.Exists(_workDir)) Directory.Delete(_workDir, true);
        }

        private SelfTestConfig.Prepared Prepare(string fileName) {
            var source = Path.Combine(_sourceDir, "config.xml");
            return fileName == null
                ? SelfTestConfig.Prepare(source, _sourceDir, _workDir)
                : SelfTestConfig.Prepare(source, _sourceDir, _workDir, null, fileName);
        }

        [Test]
        public void Prepare_ファイル名の省略_configSelftestXmlのパスを返す() {
            var prepared = Prepare(null);
            Assert.That(prepared.ConfigPath, Is.EqualTo(Path.Combine(_workDir, "config.selftest.xml")));
        }

        [Test]
        public void Prepare_ファイル名の省略_configSelftestXmlが作られる() {
            Prepare(null);
            Assert.That(File.Exists(Path.Combine(_workDir, "config.selftest.xml")), Is.True);
        }

        [Test]
        public void Prepare_configHwtestXmlを指定_そのパスを返す() {
            var prepared = Prepare("config.hwtest.xml");
            Assert.That(prepared.ConfigPath, Is.EqualTo(Path.Combine(_workDir, "config.hwtest.xml")));
        }

        [Test]
        public void Prepare_configHwtestXmlを指定_そのファイルが作られる() {
            Prepare("config.hwtest.xml");
            Assert.That(File.Exists(Path.Combine(_workDir, "config.hwtest.xml")), Is.True);
        }

        [Test]
        public void Prepare_configHwtestXmlを指定_configSelftestXmlは作られない() {
            Prepare("config.hwtest.xml");
            Assert.That(File.Exists(Path.Combine(_workDir, "config.selftest.xml")), Is.False);
        }

        [Test]
        public void Prepare_configHwtestXmlを指定_保存先は作業フォルダ配下() {
            var prepared = Prepare("config.hwtest.xml");
            Assert.That(Path.GetFullPath(prepared.SaveRoot), Does.StartWith(Path.GetFullPath(_workDir)));
        }
    }
}
#endif
