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