From dc72b87479f155bb0362dc17c3d9e4f4f2039471 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 13 Apr 2017 12:29:48 -0600 Subject: [PATCH] refactored repo unlocker select-next method --- .../CompositeRepositoryUnlockerTests.cs | 18 +++++++ .../Credential/CompositeRepositoryUnlocker.cs | 51 ++++++++++++++----- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/mRemoteNGTests/Credential/CompositeRepositoryUnlockerTests.cs b/mRemoteNGTests/Credential/CompositeRepositoryUnlockerTests.cs index 418b55d9..a9940859 100644 --- a/mRemoteNGTests/Credential/CompositeRepositoryUnlockerTests.cs +++ b/mRemoteNGTests/Credential/CompositeRepositoryUnlockerTests.cs @@ -74,6 +74,24 @@ namespace mRemoteNGTests.Credential Assert.That(_repositoryUnlocker.SelectedRepository, Is.EqualTo(_repos[0])); } + [Test] + public void NothingIsSelectedIfNoReposExist() + { + var repositoryUnlocker = new CompositeRepositoryUnlocker(new ICredentialRepository[0]); + repositoryUnlocker.SelectNextLockedRepository(); + Assert.That(repositoryUnlocker.SelectedRepository, Is.Null); + } + + [Test] + public void FirstLockedRepoSelectedIfNoRepoCurrentlySelected() + { + var repo = BuildRepos(1); + repo[0].IsLoaded.Returns(false); + var repositoryUnlocker = new CompositeRepositoryUnlocker(repo); + repositoryUnlocker.SelectNextLockedRepository(); + Assert.That(repositoryUnlocker.SelectedRepository, Is.EqualTo(repo[0])); + } + private IList BuildRepos(int count) { var list = new List(); diff --git a/mRemoteV1/Credential/CompositeRepositoryUnlocker.cs b/mRemoteV1/Credential/CompositeRepositoryUnlocker.cs index ce607433..5d3b2bc9 100644 --- a/mRemoteV1/Credential/CompositeRepositoryUnlocker.cs +++ b/mRemoteV1/Credential/CompositeRepositoryUnlocker.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Security; namespace mRemoteNG.Credential @@ -17,7 +18,7 @@ namespace mRemoteNG.Credential throw new ArgumentNullException(nameof(repositories)); _repositories.AddRange(repositories); - SelectedRepository = _repositories[0]; + SelectNextLockedRepository(); } public void Unlock(SecureString key) @@ -32,18 +33,42 @@ namespace mRemoteNG.Credential private ICredentialRepository GetNextLockedRepo() { - var initialIndex = _repositories.IndexOf(SelectedRepository); - var currentIndex = initialIndex + 1; - if (currentIndex >= _repositories.Count) return SelectedRepository; - while (_repositories[currentIndex].IsLoaded) - { - if (currentIndex == initialIndex) - return null; - currentIndex += 1; - if (currentIndex >= _repositories.Count) - currentIndex = 0; - } - return _repositories[currentIndex]; + var newOrder = OrderListForNextLockedRepo(); + return newOrder.Any() ? newOrder.First() : null; + } + + private IList OrderListForNextLockedRepo() + { + if (_repositories.Count == 0) + return new List(); + var reorderedList = new List(); + var itemsAfterCurrent = BuildListOfItemsAfterCurrent(); + var itemsBeforeAndIncludingCurrent = BuildListOfItemsBeforeAndIncludingCurrent(); + reorderedList.AddRange(itemsAfterCurrent.Where(repository => !repository.IsLoaded)); + reorderedList.AddRange(itemsBeforeAndIncludingCurrent.Where(repository => !repository.IsLoaded)); + return reorderedList; + } + + private IList BuildListOfItemsAfterCurrent() + { + var lastListIndex = _repositories.Count - 1; + var newListStartIndex = GetNewListStartIndex(); + + if (newListStartIndex > lastListIndex) newListStartIndex--; + var countToEndOfList = _repositories.Count - newListStartIndex; + return _repositories.GetRange(newListStartIndex, countToEndOfList); + } + + private IList BuildListOfItemsBeforeAndIncludingCurrent() + { + var newListStartIndex = GetNewListStartIndex(); + return _repositories.GetRange(0, newListStartIndex); + } + + private int GetNewListStartIndex() + { + var currentItemIndex = _repositories.IndexOf(SelectedRepository); + return currentItemIndex + 1; } } } \ No newline at end of file