Newer
Older
TIASShot / TIASshot.Tests / IoUtilSaveImageTests.cs
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>
        /// ファイル名が 255 文字を超える('a'×260+".png")保存は,例外にならず false を返す.
        /// 層②の「校正画像の保存失敗」の注入(File/TccImage に長いファイル名を設定)が,
        /// 例外ではなく「保存失敗=false」の経路を通ることの前提を固定する.
        /// </summary>
        [Test]
        public void SaveImage_255文字を超えるファイル名_例外にならずfalseを返す() {
            // Arrange
            var path = Path.Combine(_tempFolder, new string('a', 260) + ".png");
            using (var img = new Mat(4, 4, MatType.CV_8UC3, Scalar.All(128))) {

                // Act
                var result = true;
                Assert.DoesNotThrow((Action)(() => result = IoUtil.SaveImage(path, img)), "長いファイル名でも例外にならないこと");

                // Assert
                Assert.That(result, Is.False, "長いファイル名の保存失敗が 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, "ファイルが生成されていること");
            }
        }
    }
}