Newer
Older
TIASshot / TIASshot.Tests / MemBenchSupportTests.cs
using NUnit.Framework;
using OpenCvSharp;

namespace TIASshot.Tests {
    /// <summary>
    /// MemBenchSupport のテスト
    /// </summary>
    [TestFixture]
    public class MemBenchSupportTests {

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

        /// <summary>channels=4 の ColorCorrector を生成する</summary>
        private static ColorCorrector MakeCorrectorWith4Channels()
            => new ColorCorrector(null, null, new int[] { 4 });

        // ---- ConvertImageLeaky テスト ----------------------------------------

        /// <summary>
        /// ConvertImageLeaky: 2x2 の CV_8UC3 入力と 4x3 の conv 行列を与えたとき
        /// 出力が CV_8UC3 かつ入力と同じ高さ×幅になること。
        /// これは MemBenchSupport.ConvertImageLeaky が ColorCorrector.ConvertImage と
        /// 同じ出力形式を持つことの不変量確認(ヘルパー抽出の正しさの担保)。
        /// </summary>
        [Test]
        public void ConvertImageLeaky_2x2Input_OutputIsCV8UC3WithSameSize() {
            // Arrange: 2行2列 CV_8UC3(B=50, G=100, R=150)
            using (var conv = new Mat(4, 3, MatType.CV_64FC1, new Scalar(0.01))) {
                var corrector = MakeCorrectorWith4Channels();

                // src は ConvertImageLeaky の in-place 書き換えで CV_64FC3 に変化するため、
                // using で囲みつつ返り値(convImg8)も Dispose する
                using (var src = new Mat(2, 2, MatType.CV_8UC3, new Scalar(50, 100, 150)))
                using (var dst = MemBenchSupport.ConvertImageLeaky(corrector, src, conv)) {
                    // Assert: 型・サイズ
                    Assert.AreEqual(MatType.CV_8UC3, dst.Type(), "出力型は CV_8UC3");
                    Assert.AreEqual(2, dst.Rows, "出力行数は入力と同じ(2)");
                    Assert.AreEqual(2, dst.Cols, "出力列数は入力と同じ(2)");
                }
            }
        }

        /// <summary>
        /// ConvertImageLeaky: conv が全ゼロのとき出力全ピクセルが 0 になること。
        /// ConvertImageLeaky の変換処理が conv 行列の値に依存して決まることの確認。
        /// (ColorCorrector.ConvertImage の同等テストと対称的な確認)
        /// </summary>
        [Test]
        public void ConvertImageLeaky_ZeroConv_AllOutputPixelsAreZero() {
            // Arrange: 2x2 CV_8UC3(B=50, G=100, R=150)、conv は全ゼロ
            using (var conv = new Mat(4, 3, MatType.CV_64FC1, new Scalar(0.0))) {
                var corrector = MakeCorrectorWith4Channels();

                using (var src = new Mat(2, 2, MatType.CV_8UC3, new Scalar(50, 100, 150)))
                using (var dst = MemBenchSupport.ConvertImageLeaky(corrector, src, conv)) {
                    // Assert: 全ピクセルが 0
                    for (int row = 0; row < dst.Rows; row++) {
                        for (int col = 0; col < dst.Cols; col++) {
                            var pixel = dst.At<Vec3b>(row, col);
                            Assert.AreEqual(0, pixel.Item0, $"row={row}, col={col}: B は 0");
                            Assert.AreEqual(0, pixel.Item1, $"row={row}, col={col}: G は 0");
                            Assert.AreEqual(0, pixel.Item2, $"row={row}, col={col}: R は 0");
                        }
                    }
                }
            }
        }
    }
}