public void AddRemoveWorksAsExpectedWithFEParent()
        {
            var logicalChildSupportStub = new LogicalChildSupportFEStub();
            var collection = new ItemCollectionWithLogicalTreeSupport <object>(logicalChildSupportStub);

            var objItem = new object();

            {
                collection.Add(objItem);

                Assert.That(collection, Does.Contain(objItem));
                Assert.That(LogicalTreeHelper.GetChildren(logicalChildSupportStub), Does.Contain(objItem));

                Assert.That(collection.GetLogicalChildren(), Does.Contain(objItem));
            }

            var frameworkElement = new FrameworkElement();

            {
                collection.Add(frameworkElement);

                Assert.That(collection, Does.Contain(frameworkElement));
                Assert.That(LogicalTreeHelper.GetChildren(logicalChildSupportStub), Does.Contain(frameworkElement));

                Assert.That(collection.GetLogicalChildren(), Does.Contain(frameworkElement));
            }

            var frameworkContentElement = new FrameworkContentElement();

            {
                collection.Add(frameworkContentElement);

                Assert.That(collection, Does.Contain(frameworkContentElement));
                Assert.That(LogicalTreeHelper.GetChildren(logicalChildSupportStub), Does.Contain(frameworkContentElement));

                Assert.That(collection.GetLogicalChildren(), Does.Contain(frameworkContentElement));
            }

            // Remove
            {
                collection.Remove(frameworkElement);

                Assert.That(collection, Does.Not.Contain(frameworkElement));
                Assert.That(LogicalTreeHelper.GetChildren(logicalChildSupportStub), Does.Not.Contain(frameworkElement));

                Assert.That(collection.GetLogicalChildren(), Does.Not.Contain(frameworkElement));
            }
        }
        public void CollectionOperationsWorkAsExpected()
        {
            var logicalChildSupportStub = new LogicalChildSupportNoFEStub();
            var collection = new ItemCollectionWithLogicalTreeSupport <object>(logicalChildSupportStub);

            var item1 = "Item_1";
            var item2 = "Item_2";
            var item3 = "Item_3";

            // add items
            {
                collection.Add(item1);
                collection.Add(item2);
                collection.Add(item3);
            }

            Assert.That(collection.GetLogicalChildren(), Is.EquivalentTo(collection));

            collection.Clear();

            Assert.That(collection, Is.Empty);
            Assert.That(collection.GetLogicalChildren(), Is.EquivalentTo(collection));

            // add items
            {
                collection.Add(item1);
                collection.Add(item2);
                collection.Add(item3);
            }

            collection.RemoveAt(1);

            Assert.That(collection, Is.EquivalentTo(new[] { item1, item3 }));
            Assert.That(logicalChildSupportStub.LogicalChildren, Is.EquivalentTo(collection));
            Assert.That(collection.GetLogicalChildren(), Is.EquivalentTo(collection));

            collection[1] = item2;

            Assert.That(collection, Is.EquivalentTo(new[] { item1, item2 }));
            Assert.That(logicalChildSupportStub.LogicalChildren, Is.EquivalentTo(collection));
            Assert.That(collection.GetLogicalChildren(), Is.EquivalentTo(collection));

            collection.Insert(0, item3);

            Assert.That(collection, Is.EquivalentTo(new[] { item3, item1, item2 }));
            Assert.That(logicalChildSupportStub.LogicalChildren, Is.EquivalentTo(collection));
            Assert.That(collection.GetLogicalChildren(), Is.EquivalentTo(collection));

            collection.ReleaseLogicalOwnership();

            Assert.That(collection, Is.EquivalentTo(new[] { item3, item1, item2 }));
            Assert.That(logicalChildSupportStub.LogicalChildren, Is.Empty);
            Assert.That(collection.GetLogicalChildren(), Is.Empty);

            Assert.That(() => collection.ReleaseLogicalOwnership(), Throws.Nothing);

            Assert.That(logicalChildSupportStub.LogicalChildren, Is.Empty);
            Assert.That(collection.GetLogicalChildren(), Is.Empty);

            var item4 = "Item_4";

            collection.Add(item4);

            Assert.That(collection, Is.EquivalentTo(new[] { item3, item1, item2, item4 }));
            Assert.That(logicalChildSupportStub.LogicalChildren, Is.Empty);
            Assert.That(collection.GetLogicalChildren(), Is.Empty);

            collection.AquireLogicalOwnership();

            Assert.That(collection, Is.EquivalentTo(new[] { item3, item1, item2, item4 }));
            Assert.That(logicalChildSupportStub.LogicalChildren, Is.EquivalentTo(collection));
            Assert.That(collection.GetLogicalChildren(), Is.EquivalentTo(collection));

            Assert.That(() => collection.AquireLogicalOwnership(), Throws.Nothing);

            Assert.That(logicalChildSupportStub.LogicalChildren, Is.EquivalentTo(collection));
            Assert.That(collection.GetLogicalChildren(), Is.EquivalentTo(collection));

            collection.ReleaseLogicalOwnership();

            collection.Remove(item4);

            Assert.That(collection, Is.EquivalentTo(new[] { item3, item1, item2 }));
            Assert.That(logicalChildSupportStub.LogicalChildren, Is.Empty);
            Assert.That(collection.GetLogicalChildren(), Is.Empty);
        }