public void RefreshRightItemStatusesAndCommandsFromChilds_UnknownChild()
        {
            var testSynchronizedItems = new TestSynchronizedItems(null);

            var childSynchronizedDirectories = new TestSynchronizedItems(null);

            childSynchronizedDirectories.RightItem.UpdateStatus(ItemStatusEnum.Unknown);
            testSynchronizedItems.ChildItemsList.Add(childSynchronizedDirectories);

            var level2Child1 = new TestSynchronizedItems(null);

            level2Child1.RightItem.UpdateStatus(ItemStatusEnum.Older);
            level2Child1.RightItem.SyncCommand.SetCommandAction(() => { return(Task.FromResult(true)); });
            childSynchronizedDirectories.ChildItemsList.Add(level2Child1);

            var level2Child2 = new TestSynchronizedItems(null);

            level2Child2.RightItem.UpdateStatus(ItemStatusEnum.ThereIs);
            level2Child2.RightItem.SyncCommand.SetCommandAction(() => { return(Task.FromResult(true)); });
            childSynchronizedDirectories.ChildItemsList.Add(level2Child2);

            var synchronizedItemsStatusAndCommandsUpdater = new SynchronizedItemsStatusAndCommandsUpdater(null);

            synchronizedItemsStatusAndCommandsUpdater.RefreshRightItemStatusesAndCommandsFromChilds(testSynchronizedItems);

            // У дочерней строки должен остаться неопределённый статус.
            Assert.Equal(ItemStatusEnum.Unknown, childSynchronizedDirectories.RightItem.Status.StatusEnum);

            // Статусы родительской строки должны измениться на неопредёлённые.
            Assert.Equal(ItemStatusEnum.Unknown, testSynchronizedItems.RightItem.Status.StatusEnum);

            // Команд не должно быть ни у дочерней строки, ни у родительской.
            Assert.Null(childSynchronizedDirectories.RightItem.SyncCommand.CommandAction);
            Assert.Null(testSynchronizedItems.RightItem.SyncCommand.CommandAction);
        }
        public async Task RefreshRightItemStatusesAndCommandsFromChilds_CheckCommands(string strRightStatus)
        {
            var rightStatus = Enum.Parse <ItemStatusEnum>(strRightStatus);

            var usedCommands = new List <string>(); // Наименования элемнтов, чьи команды будут выполнены.

            var testSynchronizedItems = new TestSynchronizedItems(null);

            for (byte i = 0; i < 4; i++)
            {
                var childSynchronizedItems = new TestSynchronizedItems("Test" + i.ToString());
                testSynchronizedItems.ChildItemsList.Add(childSynchronizedItems);

                // Запишем команды синхронизации для каждого элемента.
                childSynchronizedItems.RightItem.SyncCommand.SetCommandAction(() =>
                {
                    return(Task.Run(() => usedCommands.Add(childSynchronizedItems.RightItem.Name)));
                });

                // Лишь половина элементов будет иметь статус для синхронизации и лишь команды этих элементов должны быть выполнены.
                childSynchronizedItems.RightItem.UpdateStatus(i % 2 == 0 ? rightStatus : ItemStatusEnum.Equally);
            }

            var synchronizedItemsStatusAndCommandsUpdater = new SynchronizedItemsStatusAndCommandsUpdater(null);

            synchronizedItemsStatusAndCommandsUpdater.RefreshRightItemStatusesAndCommandsFromChilds(testSynchronizedItems);
            await testSynchronizedItems.RightItem.SyncCommand.Process();

            Assert.Equal(2, usedCommands.Count);
            Assert.Equal("Test0", usedCommands[0]);
            Assert.Equal("Test2", usedCommands[1]);
        }
        public void RefreshRightItemStatusesAndCommandsFromChilds_CheckStatus(string rightStartStatus, string[] rightItemsStatuses, string rightExpectedStatus)
        {
            var testSynchronizedItems = new TestSynchronizedItems(null);

            testSynchronizedItems.RightItem.UpdateStatus((ItemStatusEnum)Enum.Parse(typeof(ItemStatusEnum), rightStartStatus));

            foreach (var rightItemStatus in rightItemsStatuses)
            {
                var childSynchronizedItems = new TestSynchronizedItems(null);
                childSynchronizedItems.RightItem.UpdateStatus((ItemStatusEnum)Enum.Parse(typeof(ItemStatusEnum), rightItemStatus));
                testSynchronizedItems.ChildItemsList.Add(childSynchronizedItems);
            }

            var synchronizedItemsStatusAndCommandsUpdater = new SynchronizedItemsStatusAndCommandsUpdater(null);

            synchronizedItemsStatusAndCommandsUpdater.RefreshRightItemStatusesAndCommandsFromChilds(testSynchronizedItems);

            Assert.Equal(rightExpectedStatus, testSynchronizedItems.RightItem.Status.StatusEnum.ToString());
        }