public void FlattenObservableList()
        {
            var children = Enumerable.Range(1, 100).Select(i => new Person("Name" + i, i)).ToArray();

            int childIndex = 0;
            var parents    = Enumerable.Range(1, 50)
                             .Select(i =>
            {
                var parent = new ParentDynamic(i, new[]
                {
                    children[childIndex],
                    children[childIndex + 1]
                });

                childIndex = childIndex + 2;
                return(parent);
            }).ToArray();


            using (var source = new SourceList <ParentDynamic>())
                using (var aggregator = source.Connect()
                                        .TransformMany(p => p.ChildrenObservable)
                                        .AsAggregator())
                {
                    T at <T>(IEnumerable <T> elements, int i) => elements.Skip(i).First();

                    source.AddRange(parents);

                    aggregator.Data.Count.Should().Be(100);

                    //add a child to an observable collection and check the new item is added
                    parents[0].Children.Add(new Person("NewlyAddded", 100));
                    aggregator.Data.Count.Should().Be(101);

                    ////remove first parent and check children have gone
                    source.RemoveAt(0);
                    aggregator.Data.Count.Should().Be(98);


                    //check items can be cleared and then added back in
                    var childrenInZero = parents[1].Children.Items.ToArray();
                    parents[1].Children.Clear();
                    aggregator.Data.Count.Should().Be(96);
                    parents[1].Children.AddRange(childrenInZero);
                    aggregator.Data.Count.Should().Be(98);

                    //replace produces an update
                    var replacedChild = at(parents[1].Children.Items, 0);
                    var replacement   = new Person("Replacement", 100);
                    parents[1].Children.ReplaceAt(0, replacement);
                    aggregator.Data.Count.Should().Be(98);

                    //replace produces an update
                    aggregator.Data.Items.Contains(replacement).Should().BeTrue();
                    aggregator.Data.Items.Contains(replacedChild).Should().BeFalse();
                }
        }
        public void ObservableListWithoutInitialData()
        {
            using var parents = new SourceList <ParentDynamic>();
            var collection = parents.Connect().TransformMany(d => d.ChildrenObservable).AsObservableList();

            var parent = new ParentDynamic();

            parents.Add(parent);

            collection.Count.Should().Be(0);

            parent.Children.Add(new Person("child1", 1));
            collection.Count.Should().Be(1);

            parent.Children.Add(new Person("child2", 2));
            collection.Count.Should().Be(2);
        }