using Explorer.Application; using Explorer.Domain; using Explorer.Domain.Abstractions; namespace Explorer.Application.Tests; public class UiPreferencesStoreTests { [Fact] public void Parse_reads_theme_and_independent_group_flags() { var prefs = UiPreferencesStore.Parse( [ "theme=Light", "group-network=true", "group-cloud=false", "index-archives=true", "auto-clear-queue=true" ]); Assert.Equal("Light", prefs.Theme); Assert.True(prefs.GroupNetworkPlaces); Assert.False(prefs.GroupCloudPlaces); Assert.True(prefs.IndexArchiveContents); Assert.True(prefs.AutoClearQueueWhenDone); } [Fact] public void Parse_defaults_missing_keys() { var prefs = UiPreferencesStore.Parse(["theme=dark"]); Assert.Equal("Dark", prefs.Theme); Assert.False(prefs.GroupNetworkPlaces); Assert.False(prefs.GroupCloudPlaces); Assert.False(prefs.IndexArchiveContents); Assert.True(prefs.ShowHiddenFiles); Assert.False(prefs.ShowProtectedSystemLocations); Assert.False(prefs.AutoClearQueueWhenDone); } [Fact] public void Parse_reads_window_layout() { var prefs = UiPreferencesStore.Parse( [ "theme=Dark", "window-width=1440.5", "window-height=900", "window-left=12", "window-top=24", "window-maximized=true", "tree-width=320" ]); Assert.Equal(1440.5, prefs.WindowWidth); Assert.Equal(900, prefs.WindowHeight); Assert.Equal(12, prefs.WindowLeft); Assert.Equal(24, prefs.WindowTop); Assert.True(prefs.WindowMaximized); Assert.Equal(320, prefs.TreeWidth); } [Fact] public void Load_and_save_roundtrip() { var dir = Path.Combine(Path.GetTempPath(), "ew-ui-prefs", Guid.NewGuid().ToString("N")); try { var store = new UiPreferencesStore(new PrefsEnv(dir)); store.Save(new UiPreferences("Light", true, false, true, AutoClearQueueWhenDone: true, WindowWidth: 1100, WindowHeight: 720, TreeWidth: 300)); var loaded = store.Load(); Assert.Equal("Light", loaded.Theme); Assert.True(loaded.GroupNetworkPlaces); Assert.False(loaded.GroupCloudPlaces); Assert.True(loaded.IndexArchiveContents); Assert.True(loaded.ShowHiddenFiles); Assert.False(loaded.ShowProtectedSystemLocations); Assert.True(loaded.AutoClearQueueWhenDone); Assert.Equal(1100, loaded.WindowWidth); Assert.Equal(720, loaded.WindowHeight); Assert.Equal(300, loaded.TreeWidth); } finally { try { Directory.Delete(dir, true); } catch { /* ignore */ } } } } public class LocationVisibilityTests { [Fact] public void Hides_protected_when_setting_is_off() { var prefs = UiPreferences.Default; var svi = LocationClassifier.Classify( @"C:\System Volume Information", "System Volume Information", AttributeFlags.Directory | AttributeFlags.Hidden | AttributeFlags.System, true); Assert.False(LocationVisibility.ShouldShow(svi, prefs)); Assert.True(LocationVisibility.ShouldShow(svi, prefs with { ShowProtectedSystemLocations = true })); } [Fact] public void Unknown_size_when_access_denied_and_zero() { var info = new LocationInfo(true, true, true, true, false); Assert.Equal(SizeKnowledge.Unknown, LocationVisibility.ResolveSizeKnowledge(info, true, 0, true)); Assert.Equal(SizeKnowledge.Partial, LocationVisibility.ResolveSizeKnowledge(info, true, 1000, true)); } } file sealed class PrefsEnv : IAppEnvironment { public PrefsEnv(string dir) { DataDirectory = dir; Directory.CreateDirectory(dir); DatabasePath = Path.Combine(dir, "index.db"); LogDirectory = Path.Combine(dir, "logs"); Directory.CreateDirectory(LogDirectory); } public string DataDirectory { get; } public string DatabasePath { get; } public string LogDirectory { get; } }