using JdeScoping.ConfigManager.ViewModels; namespace JdeScoping.ConfigManager.Tests.ViewModels; public class TreeNodeViewModelTests { [Fact] public void Constructor_SetsProperties() { // Arrange & Act var node = new TreeNodeViewModel("DataSync", "⟳", TreeNodeType.SettingsSection); // Assert node.Name.ShouldBe("DataSync"); node.Icon.ShouldBe("⟳"); node.NodeType.ShouldBe(TreeNodeType.SettingsSection); } [Fact] public void IsModified_WhenSet_RaisesPropertyChanged() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); var propertyChangedRaised = false; node.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(TreeNodeViewModel.IsModified)) propertyChangedRaised = true; }; // Act node.IsModified = true; // Assert propertyChangedRaised.ShouldBeTrue(); } [Fact] public void IsExpanded_WhenSet_RaisesPropertyChanged() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); var propertyChangedRaised = false; node.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(TreeNodeViewModel.IsExpanded)) propertyChangedRaised = true; }; // Act node.IsExpanded = true; // Assert propertyChangedRaised.ShouldBeTrue(); node.IsExpanded.ShouldBeTrue(); } [Fact] public void IsSelected_WhenSet_RaisesPropertyChanged() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); var propertyChangedRaised = false; node.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(TreeNodeViewModel.IsSelected)) propertyChangedRaised = true; }; // Act node.IsSelected = true; // Assert propertyChangedRaised.ShouldBeTrue(); node.IsSelected.ShouldBeTrue(); } [Fact] public void ValidationState_WhenSetToValid_StatusIconIsCheckmark() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); // Act node.ValidationState = ValidationState.Valid; // Assert node.StatusIcon.ShouldBe("✓"); } [Fact] public void ValidationState_WhenSetToWarning_StatusIconIsWarning() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); // Act node.ValidationState = ValidationState.Warning; // Assert node.StatusIcon.ShouldBe("⚠"); } [Fact] public void ValidationState_WhenSetToError_StatusIconIsX() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); // Act node.ValidationState = ValidationState.Error; // Assert node.StatusIcon.ShouldBe("✗"); } [Fact] public void ValidationState_WhenSetToUnknown_StatusIconIsEmpty() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); // Act node.ValidationState = ValidationState.Unknown; // Assert node.StatusIcon.ShouldBe(""); } [Fact] public void ValidationState_WhenChanged_RaisesPropertyChangedForStatusIcon() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); var statusIconPropertyChanged = false; node.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(TreeNodeViewModel.StatusIcon)) statusIconPropertyChanged = true; }; // Act node.ValidationState = ValidationState.Valid; // Assert statusIconPropertyChanged.ShouldBeTrue(); } [Fact] public void SectionKey_CanBeSetViaInitializer() { // Arrange & Act var node = new TreeNodeViewModel("DataSync", "⟳", TreeNodeType.SettingsSection) { SectionKey = "DataSync" }; // Assert node.SectionKey.ShouldBe("DataSync"); } [Fact] public void Children_IsInitialized() { // Arrange & Act var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); // Assert node.Children.ShouldNotBeNull(); node.Children.ShouldBeEmpty(); } [Fact] public void Children_CanAddChildNodes() { // Arrange var parent = new TreeNodeViewModel("Settings", "📁", TreeNodeType.Folder); var child = new TreeNodeViewModel("DataSync", "⟳", TreeNodeType.SettingsSection); // Act parent.Children.Add(child); // Assert parent.Children.Count.ShouldBe(1); parent.Children[0].ShouldBe(child); } [Theory] [InlineData(TreeNodeType.Folder)] [InlineData(TreeNodeType.SettingsSection)] [InlineData(TreeNodeType.Pipeline)] public void NodeType_CanBeSetForAllTypes(TreeNodeType nodeType) { // Arrange & Act var node = new TreeNodeViewModel("Test", "📁", nodeType); // Assert node.NodeType.ShouldBe(nodeType); } [Fact] public void IsModified_WhenSetToSameValue_DoesNotRaisePropertyChanged() { // Arrange var node = new TreeNodeViewModel("Test", "📁", TreeNodeType.Folder); node.IsModified = true; var propertyChangedRaised = false; node.PropertyChanged += (s, e) => { if (e.PropertyName == nameof(TreeNodeViewModel.IsModified)) propertyChangedRaised = true; }; // Act node.IsModified = true; // Same value // Assert propertyChangedRaised.ShouldBeFalse(); } }