Newer
Older
TIASShot / TIASshot.Tests / IoUtilTests.cs
using System.IO;
using NUnit.Framework;
using OpenCvSharp;

namespace TIASshot.Tests {
    /// <summary>
    /// IoUtil のテスト(CSV 読み書き往復でネイティブ DLL ロードも検証)
    /// </summary>
    [TestFixture]
    public class IoUtilTests {

        private string _csvPath;

        [SetUp]
        public void SetUp() {
            _csvPath = Path.GetTempFileName();
        }

        [TearDown]
        public void TearDown() {
            if (File.Exists(_csvPath)) File.Delete(_csvPath);
        }

        /// <summary>
        /// 2x3 の CV_64FC1 Mat を CSV に保存して再読込したとき、各要素が ±1e-6 以内で一致する
        /// </summary>
        [Test]
        public void SaveAndLoad_2x3Mat_ValuesMatch() {
            // Arrange
            using (var src = CreateMat2x3()) {
                // Act
                IoUtil.SaveMatToCsv(_csvPath, src);
                using (var loaded = IoUtil.LoadMatFromCsv(_csvPath)) {
                    // Assert
                    Assert.IsNotNull(loaded, "ロード結果が null であってはならない");
                    Assert.AreEqual(src.Rows, loaded.Rows, "行数が一致すること");
                    Assert.AreEqual(src.Cols, loaded.Cols, "列数が一致すること");

                    for (int row = 0; row < src.Rows; row++) {
                        for (int col = 0; col < src.Cols; col++) {
                            Assert.AreEqual(
                                src.At<double>(row, col),
                                loaded.At<double>(row, col),
                                1e-6,
                                $"[{row},{col}] の値が ±1e-6 以内で一致すること");
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 1x1 の Mat(スカラー)を CSV に保存して再読込しても値が保たれる
        /// </summary>
        [Test]
        public void SaveAndLoad_1x1Mat_ValuePreserved() {
            // Arrange
            const double Pi = 3.14159265358979;
            using (var src = new Mat(1, 1, MatType.CV_64FC1)) {
                src.At<double>(0, 0) = Pi;

                // Act
                IoUtil.SaveMatToCsv(_csvPath, src);
                using (var loaded = IoUtil.LoadMatFromCsv(_csvPath)) {
                    // Assert
                    Assert.IsNotNull(loaded);
                    Assert.AreEqual(Pi, loaded.At<double>(0, 0), 1e-6);
                }
            }
        }

        /// <summary>
        /// 存在しないファイルをロードしたとき null を返す
        /// </summary>
        [Test]
        public void LoadMatFromCsv_NonExistentFile_ReturnsNull() {
            // Act
            var result = IoUtil.LoadMatFromCsv("does_not_exist_xyz.csv");

            // Assert
            Assert.IsNull(result, "存在しないファイルのロードは null を返すこと");
        }

        // ---------------------------------------------------------------
        // ヘルパー
        // ---------------------------------------------------------------

        /// <summary>
        /// 代表的な 2x3 CV_64FC1 Mat を生成する
        /// </summary>
        private static Mat CreateMat2x3() {
            var m = new Mat(2, 3, MatType.CV_64FC1);
            m.At<double>(0, 0) = 1.234567;
            m.At<double>(0, 1) = -2.345678;
            m.At<double>(0, 2) = 0.000001;
            m.At<double>(1, 0) = 100.0;
            m.At<double>(1, 1) = -0.5;
            m.At<double>(1, 2) = 999.999999;
            return m;
        }
    }
}