diff --git a/TIASshot.Tests/IoUtilSaveImageTests.cs b/TIASshot.Tests/IoUtilSaveImageTests.cs new file mode 100644 index 0000000..4103e30 --- /dev/null +++ b/TIASshot.Tests/IoUtilSaveImageTests.cs @@ -0,0 +1,68 @@ +using System; +using System.IO; +using NUnit.Framework; +using OpenCvSharp; + +namespace TIASshot.Tests { + /// + /// IoUtil.SaveImage のテスト. + /// Cv2.ImWrite は保存失敗(存在しないフォルダ・ディスク満杯・権限等)で例外を出さず + /// false を返すだけであり,戻り値を検査しないと保存失敗が無通知で成功扱いになる. + /// SaveImage が失敗を false として正しく報告すること,および正常パスでは + /// true を返して実際にファイルが生成されること(従来挙動の特性化)を検証する. + /// + [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); + } + } + + /// + /// 存在しないフォルダへの保存は false を返す(保存失敗が無通知で成功扱いにならない) + /// + [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.IsFalse(result, "存在しないフォルダへの保存失敗が false で報告されること"); + Assert.IsFalse(File.Exists(path), "ファイルが生成されていないこと"); + } + } + + /// + /// 正常なパスへの保存は true を返しファイルが生成される(従来挙動の特性化) + /// + [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.IsTrue(result, "正常な保存では true を返すこと"); + Assert.IsTrue(File.Exists(path), "ファイルが生成されていること"); + } + } + } +} diff --git a/TIASshot.Tests/TIASshot.Tests.csproj b/TIASshot.Tests/TIASshot.Tests.csproj index e700351..4c8a255 100644 --- a/TIASshot.Tests/TIASshot.Tests.csproj +++ b/TIASshot.Tests/TIASshot.Tests.csproj @@ -61,6 +61,7 @@ + diff --git a/TIASshot/Utils/IoUtil.cs b/TIASshot/Utils/IoUtil.cs index 925d032..3bbd776 100644 --- a/TIASshot/Utils/IoUtil.cs +++ b/TIASshot/Utils/IoUtil.cs @@ -112,6 +112,21 @@ } /// + /// 画像をファイルに保存する. + /// Cv2.ImWrite は保存失敗(ディスク満杯・パス不正・権限等)で例外を出さず false を + /// 返すだけのため,戻り値を検査して失敗を Debug.WriteLine に記録し bool で返す. + /// 例外(拡張子不正等)は捕捉せず伝播する(従来挙動どおり). + /// + /// 保存先ファイルパス + /// 保存する画像 + /// 保存に成功したら true + public static bool SaveImage(string path, Mat img) { + var ok = Cv2.ImWrite(path, img); + if (!ok) Debug.WriteLine($"画像の保存に失敗しました: {path}"); + return ok; + } + + /// /// 設定値をCSVファイルに書き込む /// ///