public void Item_MemberExtendedClickTest_Up()
        {
            // Arrange
            // Field values
            Instance.SetPrivateField(MemberListViewModelMember.MembersField,
                new ObservableCollection<IMemberListItemViewModel>(MembersFieldMocks.Select(mock => mock.Object)));
            IMemberListItemViewModel valueLastClickedMember = MembersFieldMocks[4].Object;
            Instance.SetPrivateField("LastClickedMemberField", valueLastClickedMember);
            // Input data
            object inputSender = MembersFieldMocks[1].Object;
            MemberClickEventArgs inputE = new MemberClickEventArgs { IsChecked = true };
            // Expected data
            IMemberListItemViewModel expectedLastClickedMemberField = MembersFieldMocks[1].Object;

            // Act
            Instance.InvokePrivateMethod("Item_MemberExtendedClick", inputSender, inputE);

            // Assert
            // Members
            IMemberListItemViewModel actualLastClickedMember = (IMemberListItemViewModel)Instance.GetPrivateField("LastClickedMemberField");
            Assert.Same(expectedLastClickedMemberField, actualLastClickedMember);
            // Called method
            IList<Mock<IMemberListItemViewModel>> calledMemberMocks = new List<Mock<IMemberListItemViewModel>>
            {
                MembersFieldMocks[4],
                MembersFieldMocks[3],
                MembersFieldMocks[2],
                MembersFieldMocks[1]
            };
            foreach (Mock<IMemberListItemViewModel> mock in calledMemberMocks)
            {
                mock.VerifySet(vm => vm.IsChecked = false);
            }
            // Not called method
            foreach (Mock<IMemberListItemViewModel> mock in MembersFieldMocks.Except(calledMemberMocks))
            {
                mock.VerifySet(vm => vm.IsChecked = It.IsAny<bool>(), Times.Never);
            }
        }
        public void Item_MemberExtendedClickTest_FirstClick()
        {
            // Arrange
            // Field values
            Instance.SetPrivateField("LastClickedMemberField", null);
            // Input data
            object inputSender = MembersFieldMocks[1].Object;
            MemberClickEventArgs inputE = new MemberClickEventArgs { IsChecked = true };
            // Expected data
            IMemberListItemViewModel expectedLastClickedMemberField = MembersFieldMocks[1].Object;

            // Act
            Instance.InvokePrivateMethod("Item_MemberExtendedClick", inputSender, inputE);

            // Assert
            // Members
            IMemberListItemViewModel actualLastClickedMember = (IMemberListItemViewModel)Instance.GetPrivateField("LastClickedMemberField");
            Assert.Same(expectedLastClickedMemberField, actualLastClickedMember);
            // Not called method
            foreach (Mock<IMemberListItemViewModel> mock in MembersFieldMocks)
            {
                mock.VerifySet(vm => vm.IsChecked = It.IsAny<bool>(), Times.Never);
            }
        }
        public void Item_MemberExtendedClickTest_SenderTypeError()
        {
            // Arrange
            object inputSender = new object();
            MemberClickEventArgs inputE = new MemberClickEventArgs { IsChecked = false };

            // Act & Assert
            Assert.Throws<ArgumentException>(
                () =>
                {
                    Instance.InvokePrivateMethod("Item_MemberExtendedClick", inputSender, inputE);
                });
        }
        public void Item_MemberClickTest()
        {
            // Arrange
            object inputSender = new Mock<IMemberListItemViewModel>().Object;
            MemberClickEventArgs inputE = new MemberClickEventArgs { IsChecked = false };
            IMemberListItemViewModel expectedLastClickedMemberField = (IMemberListItemViewModel)inputSender;

            // Act
            Instance.InvokePrivateMethod("Item_MemberClick", inputSender, inputE);

            // Assert
            IMemberListItemViewModel actualLastClickedMemberField = (IMemberListItemViewModel)Instance.GetPrivateField("LastClickedMemberField");
            Assert.Same(expectedLastClickedMemberField, actualLastClickedMemberField);
        }
        /// <summary>
        /// メンバーリストのメンバーが連続選択クリックされたときのイベントハンドラ
        /// </summary>
        /// <param name="sender">クリックされたメンバーのViewModel (<see cref="IMemberListItemViewModel"/>)</param>
        /// <param name="e">イベントデータ</param>
        /// <exception cref="ArgumentException"><paramref name="sender"/>が<see cref="IMemberListItemViewModel"/>でない.</exception>
        private void Item_MemberExtendedClick(object sender, MemberClickEventArgs e)
        {
            if (!(sender is IMemberListItemViewModel))
            {
                throw new ArgumentException();
            }

            if (LastClickedMember != null)
            {
                int clickedIndex = Members.IndexOf((IMemberListItemViewModel)sender);
                int lastClickedIndex = Members.IndexOf(LastClickedMember);

                int firstIndex = Math.Min(clickedIndex, lastClickedIndex);
                int selectCount = Math.Abs(clickedIndex - lastClickedIndex) + 1;
                bool nextIsCheckedState = LastClickedMember.IsChecked;

                IEnumerable<IMemberListItemViewModel> targetMembers =
                    Members.Skip(firstIndex).Take(selectCount);
                foreach (IMemberListItemViewModel member in targetMembers)
                {
                    member.IsChecked = nextIsCheckedState;
                }
            }

            LastClickedMember = sender as IMemberListItemViewModel;
        }
        /// <summary>
        /// メンバーリストのメンバーがクリックされたときのイベントハンドラ
        /// </summary>
        /// <param name="sender">クリックされたメンバーのViewModel (<see cref="IMemberListItemViewModel"/>)</param>
        /// <param name="e">イベントデータ</param>
        /// <exception cref="ArgumentException"><paramref name="sender"/>が<see cref="IMemberListItemViewModel"/>でない.</exception>
        private void Item_MemberClick(object sender, MemberClickEventArgs e)
        {
            if (!(sender is IMemberListItemViewModel)) { throw new ArgumentException(); }

            LastClickedMember = sender as IMemberListItemViewModel;
        }
        /// <summary>
        /// <see cref="MemberExtendedClickCommand"/>の<see cref="ICommand.Execute"/>の処理
        /// </summary>
        private void ExtendClickMember()
        {
            this.IsChecked = !this.IsChecked; // MouseBindingなのでチェック状態は自動で変わらない

            MemberClickEventArgs e = new MemberClickEventArgs();
            e.IsChecked = this.IsChecked;
            MemberExtendedClick?.Invoke(this, e);
        }
 /// <summary>
 /// <see cref="MemberClickCommand"/>の<see cref="ICommand.Execute"/>の処理
 /// </summary>
 private void ClickMember()
 {
     MemberClickEventArgs e = new MemberClickEventArgs();
     e.IsChecked = this.IsChecked;
     MemberClick?.Invoke(this, e);
 }