public void ItemSelections()
        {
            var accessor = _fileStatusList.GetTestAccessor();

            GitItemStatus        itemNotInList = new(name : "not in list");
            GitItemStatus        item0         = new(name : "z.0");
            GitItemStatus        item1         = new(name : "x.1");
            GitItemStatus        item2         = new(name : "y.2");
            List <GitItemStatus> items         = new() { item0, item1, item2 };

            // alphabetical order
            var         itemAt0   = item1;
            var         itemAt1   = item2;
            var         itemAt2   = item0;
            GitRevision firstRev  = new(ObjectId.Random());
            GitRevision secondRev = new(ObjectId.Random());

            _fileStatusList.SetDiffs(firstRev: firstRev, secondRev: secondRev, items: items);

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt0);
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0
            });

            _fileStatusList.SelectedGitItem.Should().BeSameAs(_fileStatusList.SelectedItem.Item);
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(_fileStatusList.SelectedItems.Items());

            // SelectedIndex

            _fileStatusList.SelectedIndex = 1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            _fileStatusList.SelectedIndex = -1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedGitItem.Should().BeNull();
            _fileStatusList.SelectedItems.Items().Should().BeEmpty();

            _fileStatusList.SelectedIndex = 2;
            _fileStatusList.SelectedIndex = 42;                           // clears the selection

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedGitItem.Should().BeNull();
            _fileStatusList.SelectedItems.Items().Should().BeEmpty();

            _fileStatusList.SelectedIndex = 1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            // SelectedGitItem

            _fileStatusList.SelectedGitItem = itemAt1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            _fileStatusList.SelectedGitItem = null;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedGitItem.Should().BeNull();
            _fileStatusList.SelectedItems.Items().Should().BeEmpty();

            _fileStatusList.SelectedGitItem = itemAt2;
            _fileStatusList.SelectedGitItem = itemNotInList;              // clears the selection

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedGitItem.Should().BeNull();
            _fileStatusList.SelectedItems.Items().Should().BeEmpty();

            _fileStatusList.SelectedGitItem = itemAt1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            // SelectedItems.Items() (up to one item)

            _fileStatusList.SelectedGitItems = new List <GitItemStatus> {
                itemAt1
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            _fileStatusList.SelectedItems = null;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedGitItem.Should().BeNull();
            _fileStatusList.SelectedItems.Items().Should().BeEmpty();

            _fileStatusList.SelectedGitItems = new List <GitItemStatus> {
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedGitItem.Should().BeNull();
            _fileStatusList.SelectedItems.Items().Should().BeEmpty();

            _fileStatusList.SelectedGitItems = new List <GitItemStatus> {
                itemAt2
            };
            _fileStatusList.SelectedGitItems = new List <GitItemStatus> {
                itemNotInList
            };                                                            // clears the selection

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedGitItem.Should().BeNull();
            _fileStatusList.SelectedItems.Items().Should().BeEmpty();

            _fileStatusList.SelectedGitItems = new List <GitItemStatus> {
                itemAt1
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            // SelectedItems.Items() (multiple items)

            _fileStatusList.SelectedIndex    = 2;
            _fileStatusList.SelectedGitItems = new List <GitItemStatus> {
                itemAt2, itemAt0, itemNotInList
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt0); // focused item
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0, itemAt2
            });

            accessor.FileStatusListView.Items[1].Focused = true;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt2); // LastSelectedItem
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0, itemAt2
            });

            _fileStatusList.SelectedIndex    = 2;
            _fileStatusList.SelectedGitItems = new List <GitItemStatus> {
                itemAt2, itemAt1, itemNotInList
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt1); // focused item
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1, itemAt2
            });

            accessor.FileStatusListView.Items[0].Focused = true;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt2); // LastSelectedItem
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1, itemAt2
            });

            // SelectAll

            _fileStatusList.SelectedIndex = 2;
            _fileStatusList.SelectAll();

            foreach (var item in accessor.FileStatusListView.Items())
            {
                item.Selected.Should().BeTrue();
            }

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt0); // focused item
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0, itemAt1, itemAt2
            });

            // SelectFirstVisibleItem

            _fileStatusList.SelectedIndex = 2;
            _fileStatusList.SelectFirstVisibleItem();

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedGitItem.Should().BeSameAs(itemAt0); // focused item
            _fileStatusList.SelectedItems.Items().Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0
            });
        }
        public void ItemSelections()
        {
            var accessor = _fileStatusList.GetTestAccessor();

            var itemNotInList = new GitItemStatus {
                Name = "not in list"
            };
            var item0 = new GitItemStatus {
                Name = "z.0"
            };
            var item1 = new GitItemStatus {
                Name = "x.1"
            };
            var item2 = new GitItemStatus {
                Name = "y.2"
            };
            var items = new List <GitItemStatus> {
                item0, item1, item2
            };

            // alphabetical order
            var itemAt0 = item1;
            var itemAt1 = item2;
            var itemAt2 = item0;

            _fileStatusList.SetDiffs(selectedRev: null, parentRev: null, items: items);

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt0);
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0
            });

            // SelectedIndex

            _fileStatusList.SelectedIndex = 1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            _fileStatusList.SelectedIndex = -1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedItem.Should().BeNull();
            _fileStatusList.SelectedItems.Should().BeEmpty();

            _fileStatusList.SelectedIndex = 2;
            _fileStatusList.SelectedIndex = 42;                           // clears the selection

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedItem.Should().BeNull();
            _fileStatusList.SelectedItems.Should().BeEmpty();

            _fileStatusList.SelectedIndex = 1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            // SelectedItem

            _fileStatusList.SelectedItem = itemAt1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            _fileStatusList.SelectedItem = null;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedItem.Should().BeNull();
            _fileStatusList.SelectedItems.Should().BeEmpty();

            _fileStatusList.SelectedItem = itemAt2;
            _fileStatusList.SelectedItem = itemNotInList;                 // clears the selection

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedItem.Should().BeNull();
            _fileStatusList.SelectedItems.Should().BeEmpty();

            _fileStatusList.SelectedItem = itemAt1;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            // SelectedItems (up to one item)

            _fileStatusList.SelectedItems = new List <GitItemStatus> {
                itemAt1
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            _fileStatusList.SelectedItems = null;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedItem.Should().BeNull();
            _fileStatusList.SelectedItems.Should().BeEmpty();

            _fileStatusList.SelectedItems = new List <GitItemStatus> {
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedItem.Should().BeNull();
            _fileStatusList.SelectedItems.Should().BeEmpty();

            _fileStatusList.SelectedItems = new List <GitItemStatus> {
                itemAt2
            };
            _fileStatusList.SelectedItems = new List <GitItemStatus> {
                itemNotInList
            };                                                            // clears the selection

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(2); // unchanged
            _fileStatusList.SelectedIndex.Should().Be(-1);
            _fileStatusList.SelectedItem.Should().BeNull();
            _fileStatusList.SelectedItems.Should().BeEmpty();

            _fileStatusList.SelectedItems = new List <GitItemStatus> {
                itemAt1
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1);
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1
            });

            // SelectedItems (multiple items)

            _fileStatusList.SelectedIndex = 2;
            _fileStatusList.SelectedItems = new List <GitItemStatus> {
                itemAt2, itemAt0, itemNotInList
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt0); // focused item
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0, itemAt2
            });

            accessor.FileStatusListView.Items[1].Focused = true;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt2); // LastSelectedItem
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0, itemAt2
            });

            _fileStatusList.SelectedIndex = 2;
            _fileStatusList.SelectedItems = new List <GitItemStatus> {
                itemAt2, itemAt1, itemNotInList
            };

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(1);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt1); // focused item
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1, itemAt2
            });

            accessor.FileStatusListView.Items[0].Focused = true;

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(1);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt2); // LastSelectedItem
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt1, itemAt2
            });

            // SelectAll

            _fileStatusList.SelectedIndex = 2;
            _fileStatusList.SelectAll();

            foreach (var item in accessor.FileStatusListView.Items())
            {
                item.Selected.Should().BeTrue();
            }

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt0); // focused item
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0, itemAt1, itemAt2
            });

            // SelectFirstVisibleItem

            _fileStatusList.SelectedIndex = 2;
            _fileStatusList.SelectFirstVisibleItem();

            accessor.FileStatusListView.FocusedItem.Index.Should().Be(0);
            _fileStatusList.SelectedIndex.Should().Be(0);
            _fileStatusList.SelectedItem.Should().BeSameAs(itemAt0); // focused item
            _fileStatusList.SelectedItems.Should().BeEquivalentTo(new List <GitItemStatus> {
                itemAt0
            });
        }