diff --git a/mRemoteNGTests/Container/ContainerInfoTests.cs b/mRemoteNGTests/Container/ContainerInfoTests.cs
new file mode 100644
index 000000000..528991067
--- /dev/null
+++ b/mRemoteNGTests/Container/ContainerInfoTests.cs
@@ -0,0 +1,84 @@
+using mRemoteNG.Connection;
+using mRemoteNG.Container;
+using NUnit.Framework;
+
+
+namespace mRemoteNGTests.Container
+{
+ public class ContainerInfoTests
+ {
+ private ContainerInfo _containerInfo;
+ private ConnectionInfo _connectionInfo;
+
+ [SetUp]
+ public void Setup()
+ {
+ _containerInfo = new ContainerInfo();
+ _connectionInfo = new ConnectionInfo();
+ }
+
+ [TearDown]
+ public void Teardown()
+ {
+ _containerInfo = null;
+ _connectionInfo = null;
+ }
+
+ [Test]
+ public void AddSetsParentPropertyOnTheChild()
+ {
+ _containerInfo.Add(_connectionInfo);
+ Assert.That(_connectionInfo.Parent, Is.EqualTo(_containerInfo));
+ }
+
+ [Test]
+ public void AddAddsChildToChildrenList()
+ {
+ _containerInfo.Add(_connectionInfo);
+ Assert.That(_containerInfo.Children, Does.Contain(_connectionInfo));
+ }
+
+ [Test]
+ public void AddRangeAddsAllItems()
+ {
+ var collection = new[] {new ConnectionInfo(),new ConnectionInfo(), new ContainerInfo()};
+ _containerInfo.AddRange(collection);
+ Assert.That(_containerInfo.Children, Is.EquivalentTo(collection));
+ }
+
+ [Test]
+ public void RemoveUnsetsParentPropertyOnChild()
+ {
+ _containerInfo.Add(_connectionInfo);
+ _containerInfo.Remove(_connectionInfo);
+ Assert.That(_connectionInfo.Parent, Is.Not.EqualTo(_containerInfo));
+ }
+
+ [Test]
+ public void RemoveRemovesChildFromChildrenList()
+ {
+ _containerInfo.Add(_connectionInfo);
+ _containerInfo.Remove(_connectionInfo);
+ Assert.That(_containerInfo.Children, Does.Not.Contains(_connectionInfo));
+ }
+
+ [Test]
+ public void RemoveRangeRemovesAllIndicatedItems()
+ {
+ var collection = new[] { new ConnectionInfo(), new ConnectionInfo(), new ContainerInfo() };
+ _containerInfo.AddRange(collection);
+ _containerInfo.RemoveRange(collection);
+ Assert.That(_containerInfo.Children, Does.Not.Contains(collection[0]).And.Not.Contains(collection[1]).And.Not.Contains(collection[2]));
+ }
+
+ [Test]
+ public void RemoveRangeDoesNotRemoveUntargetedMembers()
+ {
+ var collection = new[] { new ConnectionInfo(), new ConnectionInfo(), new ContainerInfo() };
+ _containerInfo.AddRange(collection);
+ _containerInfo.Add(_connectionInfo);
+ _containerInfo.RemoveRange(collection);
+ Assert.That(_containerInfo.Children, Does.Contain(_connectionInfo));
+ }
+ }
+}
\ No newline at end of file
diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj
index ffac55f93..5a93836be 100644
--- a/mRemoteNGTests/mRemoteNGTests.csproj
+++ b/mRemoteNGTests/mRemoteNGTests.csproj
@@ -105,6 +105,7 @@
+
diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs
index 39ea7b279..3c5892b28 100644
--- a/mRemoteV1/Container/ContainerInfo.cs
+++ b/mRemoteV1/Container/ContainerInfo.cs
@@ -19,12 +19,40 @@ namespace mRemoteNG.Container
IsContainer = true;
}
+ public void Add(ConnectionInfo newChildItem)
+ {
+ newChildItem.Parent = this;
+ Children.Add(newChildItem);
+ }
+
+ public void AddRange(IEnumerable newChildren)
+ {
+ foreach (var child in newChildren)
+ {
+ Add(child);
+ }
+ }
+
+ public void Remove(ConnectionInfo removalTarget)
+ {
+ removalTarget.Parent = null;
+ Children.Remove(removalTarget);
+ }
+
+ public void RemoveRange(IEnumerable removalTargets)
+ {
+ foreach (var child in removalTargets)
+ {
+ Remove(child);
+ }
+ }
+
public new ContainerInfo Copy()
{
return (ContainerInfo)MemberwiseClone();
}
- public void SetDefaults()
+ private void SetDefaults()
{
IsExpanded = true;
}