public async Task ExportsAtCursor()
            {
                var cursor = new DateTime(2018, 9, 13);

                var component = new TestComponent("hi");

                ComponentExporter
                .Setup(x => x.Export())
                .Returns(component);

                var events = new Event[0];

                EventExporter
                .Setup(x => x.Export(cursor))
                .Returns(events);

                var lastUpdated = new DateTime(2018, 9, 12);

                Cursor
                .Setup(x => x.Get(StatusUpdater.LastUpdatedCursorName))
                .ReturnsAsync(lastUpdated);

                await Exporter.Export(cursor);

                Serializer
                .Verify(
                    x => x.Serialize(cursor, lastUpdated, component, events),
                    Times.Once());
            }
    private IEnumerator SendComponents(GC_GameObject obj)
    {
        foreach (var child in obj.Childs)
        {
            ComponentExporter.ExportComponents(child.Transform.GetComponents <Component>());
            yield return(new WaitForEndOfFrame());
        }

        foreach (var child in obj.Childs)
        {
            yield return(SendComponents(child));
        }
    }
            public ComponentExporterTest()
            {
                var level3AFrom2A = new TestComponent("3A");
                var level3BFrom2A = new TestComponent("3B");
                var level2A       = new TestComponent("2A",
                                                      new[] { level3AFrom2A, level3BFrom2A });

                var level3AFrom2B = new TestComponent("3A");
                var level3BFrom2B = new TestComponent("3B");
                var level2B       = new TestComponent("2B",
                                                      new[] { level3AFrom2B, level3BFrom2B });

                Root = new TestComponent("Root", new[] { level2A, level2B });

                // We have to get the subcomponents by iterating through the tree.
                // Components only have a path in the context of accessing them through a parent.
                Level2A = Root
                          .SubComponents.Single(c => c.Name == "2A");
                Level3AFrom2A = Root
                                .SubComponents.Single(c => c.Name == "2A")
                                .SubComponents.Single(c => c.Name == "3A");
                Level3BFrom2A = Root
                                .SubComponents.Single(c => c.Name == "2A")
                                .SubComponents.Single(c => c.Name == "3B");

                Level2B = Root
                          .SubComponents.Single(c => c.Name == "2B");
                Level3AFrom2B = Root
                                .SubComponents.Single(c => c.Name == "2B")
                                .SubComponents.Single(c => c.Name == "3A");
                Level3BFrom2B = Root
                                .SubComponents.Single(c => c.Name == "2B")
                                .SubComponents.Single(c => c.Name == "3B");

                Factory = new Mock <IComponentFactory>();
                Factory
                .Setup(x => x.Create())
                .Returns(Root);

                Table = new Mock <ITableWrapper>();

                Exporter = new ComponentExporter(
                    Table.Object,
                    Factory.Object,
                    Mock.Of <ILogger <ComponentExporter> >());
            }
            public async Task ExportsAtCursor()
            {
                var cursor = new DateTime(2018, 9, 13);

                var component = new TestComponent("hi");

                ComponentExporter
                .Setup(x => x.Export())
                .Returns(component);

                var events = new Event[0];

                EventExporter
                .Setup(x => x.Export(cursor))
                .Returns(events);

                await Exporter.Export(cursor);

                Serializer
                .Verify(
                    x => x.Serialize(cursor, component, events),
                    Times.Once());
            }