SettingsTests.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using System;
  2. using System.IO;
  3. using System.Reflection;
  4. using DesktopClock.Properties;
  5. namespace DesktopClock.Tests;
  6. public class SettingsPersistenceTests
  7. {
  8. [Fact]
  9. public void Save_ThenPopulate_ShouldRoundTripKeyProperties()
  10. {
  11. using var _ = new TempSettingsFileScope();
  12. var original = CreateSettingsInstance();
  13. original.FontFamily = "My custom font";
  14. original.Height = 72;
  15. original.Topmost = false;
  16. original.Format = "{HH:mm:ss}";
  17. original.RunOnStartup = true;
  18. original.ClickThrough = true;
  19. original.SettingsWindowWidth = 840;
  20. original.SettingsWindowHeight = 640;
  21. original.SettingsScrollPosition = 128;
  22. var saved = original.Save();
  23. Assert.True(saved);
  24. Assert.True(File.Exists(Settings.FilePath));
  25. var loaded = CreateSettingsInstance();
  26. PopulateFromFile(loaded);
  27. Assert.Equal(original.FontFamily, loaded.FontFamily);
  28. Assert.Equal(original.Height, loaded.Height);
  29. Assert.Equal(original.Topmost, loaded.Topmost);
  30. Assert.Equal(original.Format, loaded.Format);
  31. Assert.Equal(original.RunOnStartup, loaded.RunOnStartup);
  32. Assert.Equal(original.ClickThrough, loaded.ClickThrough);
  33. Assert.Equal(original.SettingsWindowWidth, loaded.SettingsWindowWidth);
  34. Assert.Equal(original.SettingsWindowHeight, loaded.SettingsWindowHeight);
  35. Assert.Equal(original.SettingsScrollPosition, loaded.SettingsScrollPosition);
  36. }
  37. private static Settings CreateSettingsInstance() =>
  38. (Settings)Activator.CreateInstance(typeof(Settings), nonPublic: true)!;
  39. private static void PopulateFromFile(Settings settings)
  40. {
  41. var populateMethod = typeof(Settings).GetMethod(
  42. "Populate",
  43. BindingFlags.NonPublic | BindingFlags.Static);
  44. Assert.NotNull(populateMethod);
  45. populateMethod.Invoke(null, new object[] { settings });
  46. }
  47. private sealed class TempSettingsFileScope : IDisposable
  48. {
  49. private readonly string _originalFilePath;
  50. public TempSettingsFileScope()
  51. {
  52. _originalFilePath = Settings.FilePath;
  53. var tempDir = Path.Combine(Path.GetTempPath(), "DesktopClock.Tests");
  54. Directory.CreateDirectory(tempDir);
  55. var tempFilePath = Path.Combine(tempDir, $"{Guid.NewGuid():N}.settings");
  56. SetSettingsFilePath(tempFilePath);
  57. if (File.Exists(Settings.FilePath))
  58. File.Delete(Settings.FilePath);
  59. }
  60. public void Dispose()
  61. {
  62. try
  63. {
  64. if (File.Exists(Settings.FilePath))
  65. File.Delete(Settings.FilePath);
  66. }
  67. finally
  68. {
  69. SetSettingsFilePath(_originalFilePath);
  70. }
  71. }
  72. private static void SetSettingsFilePath(string filePath)
  73. {
  74. var filePathProperty = typeof(Settings).GetProperty(
  75. nameof(Settings.FilePath),
  76. BindingFlags.Public | BindingFlags.Static);
  77. Assert.NotNull(filePathProperty);
  78. var setMethod = filePathProperty.GetSetMethod(nonPublic: true);
  79. Assert.NotNull(setMethod);
  80. setMethod.Invoke(null, new object[] { filePath });
  81. }
  82. }
  83. }