public void ItemsShouldHaveTheCorrectSelectionStateInTheCollection()
        {
            var target = new HierarchicalItemCollection<string>( CreateNodeHierarchy() );
            target.SelectionMode = HierarchicalItemSelectionModes.All | HierarchicalItemSelectionModes.Synchronize;

            // select all items
            target[0].IsSelected = true;

            Assert.Equal( true, target[0].IsSelected );
            Assert.Equal( true, target[0][0].IsSelected );
            Assert.Equal( true, target[0][1].IsSelected );
            Assert.Equal( true, target[0][2].IsSelected );
            Assert.Equal( 13, target.SelectedItems.Count );

            // unselect a child item
            target[0][0][0].IsSelected = false;

            Assert.Equal( false, target[0][0][0].IsSelected );
            Assert.Null( target[0][0].IsSelected );
            Assert.Null( target[0].IsSelected );
            Assert.Equal( 10, target.SelectedItems.Count );

            // unselect all items
            target[0].IsSelected = false;

            Assert.Equal( false, target[0].IsSelected );
            Assert.Equal( false, target[0][0].IsSelected );
            Assert.Equal( false, target[0][1].IsSelected );
            Assert.Equal( false, target[0][2].IsSelected );
            Assert.Equal( 0, target.SelectedItems.Count );
        }
 public void CollectionShouldResembleTreeWhenRootNodeIsProvided()
 {
     var target = new HierarchicalItemCollection<string>( CreateNodeHierarchy() );
     Assert.Equal( 1, target.Count );
     Assert.Equal( false, target[0].IsSelected );
     Assert.Equal( 3, target[0].Count );
 }
 public void CollectionShouldResembleFanWhenMultipleRootNodesAreProvided()
 {
     var target = new HierarchicalItemCollection<string>( CreateNodeHierarchy().ToList() );
     Assert.Equal( 3, target[0].Count );
     Assert.Equal( false, target[0].IsSelected );
     Assert.Equal( false, target[1].IsSelected );
     Assert.Equal( false, target[2].IsSelected );
 }
        public void OnlyLeafItemsShouldBeSelectedInCollection()
        {
            var target = new HierarchicalItemCollection<string>( CreateNodeHierarchy() );
            target.SelectionMode = HierarchicalItemSelectionModes.Leaf | HierarchicalItemSelectionModes.Synchronize;

            // select all items
            target[0].IsSelected = true;

            Assert.Equal( true, target[0].IsSelected );
            Assert.Equal( true, target[0][0].IsSelected );
            Assert.Equal( true, target[0][1].IsSelected );
            Assert.Equal( true, target[0][2].IsSelected );
            Assert.Equal( true, target[0][0][0].IsSelected );
            Assert.Equal( true, target[0][0][1].IsSelected );
            Assert.Equal( true, target[0][0][2].IsSelected );
            Assert.Equal( 9, target.SelectedItems.Count );

            // unselect a child item
            target[0][0][0].IsSelected = false;

            Assert.Equal( false, target[0][0][0].IsSelected );
            Assert.Null( target[0][0].IsSelected );
            Assert.Null( target[0].IsSelected );
            Assert.Equal( 8, target.SelectedItems.Count );

            // unselect all items
            target[0].IsSelected = false;

            Assert.Equal( false, target[0].IsSelected );
            Assert.Equal( false, target[0][0].IsSelected );
            Assert.Equal( false, target[0][1].IsSelected );
            Assert.Equal( false, target[0][2].IsSelected );
            Assert.Equal( false, target[0][0][0].IsSelected );
            Assert.Equal( 0, target.SelectedItems.Count );
        }
        public void CollectionShouldBeInSyncWithSourceNodeCollection()
        {
            var source = CreateNodeHierarchy();
            var newItem = new Node<string>( "Item 1.4" );
            var target = new HierarchicalItemCollection<string>( source )
            {
                SelectionMode = HierarchicalItemSelectionModes.All | HierarchicalItemSelectionModes.Synchronize
            };

            // select all items
            target[0].IsSelected = true;
            Assert.Equal( 13, target.SelectedItems.Count );

            // add new item (should cause parent update and unselection of items due to indeterminate state)
            source[0].Add( newItem );
            Assert.Equal( 11, target.SelectedItems.Count );
            Assert.Equal( "Item 1.4", target[0][0][3].Value );
            Assert.Null( target[0].IsSelected );

            // select new item, which should make entire path selected
            target[0][0][3].IsSelected = true;
            Assert.Equal( 14, target.SelectedItems.Count );
            Assert.Equal( true, target[0][0][3].IsSelected );
            Assert.Equal( true, target[0].IsSelected );

            // unselect item to revert state
            target[0][0][3].IsSelected = false;
            Assert.Equal( 11, target.SelectedItems.Count );
            Assert.Null( target[0].IsSelected );

            // remove a source item should cause the hierarchy to update
            source[0].Remove( newItem );
            Assert.Equal( 13, target.SelectedItems.Count );
            Assert.Equal( true, target[0].IsSelected );
        }