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");
}
}
}
}
}
}
}