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, "ファイルが生成されていること");
}
}
}
}