diff --git a/TIASshot.Tests/ConfigTests.cs b/TIASshot.Tests/ConfigTests.cs index 538f91c..6d6b36b 100644 --- a/TIASshot.Tests/ConfigTests.cs +++ b/TIASshot.Tests/ConfigTests.cs @@ -24,6 +24,8 @@ " 42" + " hello" + " deep" + + " abc" + + " " + ""; [SetUp] @@ -103,5 +105,81 @@ var value = Config.GetString("Nested/Child"); Assert.AreEqual(ExpectedNested, value); } + + /// + /// 数値としてパースできない値を GetInt で指定したとき ArgumentException がスローされる + /// (キー欠落時と同様に設定不備として扱う.黙って 0 を返さない) + /// + [Test] + public void GetInt_数値でない値_ArgumentExceptionをスロー() { + Assert.Throws(() => Config.GetInt("BadNumVal")); + } + + /// + /// 数値としてパースできない値を GetFloat で指定したとき ArgumentException がスローされる + /// + [Test] + public void GetFloat_数値でない値_ArgumentExceptionをスロー() { + Assert.Throws(() => Config.GetFloat("BadNumVal")); + } + + /// + /// 空要素を GetInt で指定したとき ArgumentException がスローされる + /// + [Test] + public void GetInt_空の値_ArgumentExceptionをスロー() { + Assert.Throws(() => Config.GetInt("EmptyVal")); + } + + /// + /// 小数点にカンマを使うロケール(de-DE)でもピリオド小数の設定値を正しく解釈する + /// (config.xml はピリオド小数で記述される仕様のため,パースはロケール非依存であること) + /// + [Test] + public void GetFloat_カンマ小数ロケール_ピリオド小数を正しく解釈する() { + var original = System.Threading.Thread.CurrentThread.CurrentCulture; + try { + System.Threading.Thread.CurrentThread.CurrentCulture = + new System.Globalization.CultureInfo("de-DE"); + var value = Config.GetFloat("FloatVal"); + Assert.AreEqual(ExpectedFloat, value, 1e-6f); + } finally { + System.Threading.Thread.CurrentThread.CurrentCulture = original; + } + } + + /// + /// 特性化テスト: リポジトリ同梱の config.xml に対して,本体コードが参照する + /// 全数値キーが例外なく読めること(不正値 throw 化で正常系が変わらない保護) + /// + [Test] + public void GetIntGetFloat_同梱config_本体が参照する全数値キーを例外なく読める() { + var repoConfigPath = Path.GetFullPath(Path.Combine( + TestContext.CurrentContext.TestDirectory, + "..", "..", "..", "..", "TIASshot", "config.xml")); + Assert.IsTrue(File.Exists(repoConfigPath), $"同梱 config.xml が見つからない: {repoConfigPath}"); + Config.Load(repoConfigPath); + + string[] intKeys = { + "Calib/ChartSetCount", "Calib/Frames", "Calib/UpdateInterval", + "Shot/PreviewMonitorWidth", "LightSource/BaudRate", + "DFK33UX178/ROI/X", "DFK33UX178/ROI/Y", "DFK33UX178/ROI/W", "DFK33UX178/ROI/H", + "DFK23UX249/ROI/X", "DFK23UX249/ROI/Y", "DFK23UX249/ROI/W", "DFK23UX249/ROI/H", + }; + string[] floatKeys = { + "Lucam/Exposure", "Lucam/Gain", "Lucam/GainB", "Lucam/GainG", "Lucam/GainR", + "Calib/ChartSetCriteria", "Calib/UpdateRate", + "Calib/Reference/B", "Calib/Reference/G", "Calib/Reference/R", + }; + foreach (var key in intKeys) { + Assert.DoesNotThrow(() => Config.GetInt(key), $"GetInt(\"{key}\") が例外を投げた"); + } + foreach (var key in floatKeys) { + Assert.DoesNotThrow(() => Config.GetFloat(key), $"GetFloat(\"{key}\") が例外を投げた"); + } + // ゼロ除算・校正停止に直結する値が有効値で読めることを固定する + Assert.AreNotEqual(0, Config.GetInt("Calib/UpdateInterval")); + Assert.AreNotEqual(0.0f, Config.GetFloat("Calib/UpdateRate")); + } } }