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