refactored repo unlocker select-next method

This commit is contained in:
David Sparer
2017-04-13 12:29:48 -06:00
parent 2f20acfa34
commit dc72b87479
2 changed files with 56 additions and 13 deletions

View File

@@ -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<ICredentialRepository> BuildRepos(int count)
{
var list = new List<ICredentialRepository>();

View File

@@ -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<ICredentialRepository> OrderListForNextLockedRepo()
{
if (_repositories.Count == 0)
return new List<ICredentialRepository>();
var reorderedList = new List<ICredentialRepository>();
var itemsAfterCurrent = BuildListOfItemsAfterCurrent();
var itemsBeforeAndIncludingCurrent = BuildListOfItemsBeforeAndIncludingCurrent();
reorderedList.AddRange(itemsAfterCurrent.Where(repository => !repository.IsLoaded));
reorderedList.AddRange(itemsBeforeAndIncludingCurrent.Where(repository => !repository.IsLoaded));
return reorderedList;
}
private IList<ICredentialRepository> 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<ICredentialRepository> BuildListOfItemsBeforeAndIncludingCurrent()
{
var newListStartIndex = GetNewListStartIndex();
return _repositories.GetRange(0, newListStartIndex);
}
private int GetNewListStartIndex()
{
var currentItemIndex = _repositories.IndexOf(SelectedRepository);
return currentItemIndex + 1;
}
}
}