using System;
using System.IO;
using NUnit.Framework;
using OpenCvSharp;

namespace TIASshot.Tests {
    /// <summary>
    /// IoUtil.SaveImage のテスト．
    /// Cv2.ImWrite は保存失敗（存在しないフォルダ・ディスク満杯・権限等）で例外を出さず
    /// false を返すだけであり，戻り値を検査しないと保存失敗が無通知で成功扱いになる．
    /// SaveImage が失敗を false として正しく報告すること，および正常パスでは
    /// true を返して実際にファイルが生成されること（従来挙動の特性化）を検証する．
    /// </summary>
    [TestFixture]
    public class IoUtilSaveImageTests {

        private string _tempFolder;

        [SetUp]
        public void SetUp() {
            _tempFolder = Path.Combine(Path.GetTempPath(), "TIASshotTests_" + Guid.NewGuid().ToString("N"));
            Directory.CreateDirectory(_tempFolder);
        }

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

        /// <summary>
        /// 存在しないフォルダへの保存は false を返す（保存失敗が無通知で成功扱いにならない）
        /// </summary>
        [Test]
        public void SaveImage_存在しないフォルダ_falseを返す() {
            // Arrange
            var path = Path.Combine(_tempFolder, "no_such_dir", "out.png");
            using (var img = new Mat(4, 4, MatType.CV_8UC3, Scalar.All(128))) {

                // Act
                var result = IoUtil.SaveImage(path, img);

                // Assert
                Assert.That(result, Is.False, "存在しないフォルダへの保存失敗が false で報告されること");
                Assert.That(File.Exists(path), Is.False, "ファイルが生成されていないこと");
            }
        }

        /// <summary>
        /// 正常なパスへの保存は true を返しファイルが生成される（従来挙動の特性化）
        /// </summary>
        [Test]
        public void SaveImage_正常なパス_trueを返しファイルが生成される() {
            // Arrange
            var path = Path.Combine(_tempFolder, "out.png");
            using (var img = new Mat(4, 4, MatType.CV_8UC3, Scalar.All(128))) {

                // Act
                var result = IoUtil.SaveImage(path, img);

                // Assert
                Assert.That(result, Is.True, "正常な保存では true を返すこと");
                Assert.That(File.Exists(path), Is.True, "ファイルが生成されていること");
            }
        }
    }
}
