public async Task UsesDocumentNestingForComplexChildren()
            {
                // Given
                TestDocument document = new TestDocument(@"
C:
  - X: 1
    Y: 2
  - X: 4
    Z: 5
");
                ParseYaml    yaml     = new ParseYaml();

                // When
                TestDocument result = await ExecuteAsync(document, yaml).SingleAsync();

                // Then
                result.Keys.ShouldBe(new[] { "C", "Source", "Destination", "ContentProvider" }, true);
                result["C"].ShouldBeOfType <IDocument[]>();
                IDocument[] subDocuments = (IDocument[])result["C"];
                subDocuments.Length.ShouldBe(2);
                subDocuments[0].Keys.ShouldBe(new[] { "X", "Y", "Source", "Destination", "ContentProvider" }, true);
                subDocuments[0]["X"].ShouldBe("1");
                subDocuments[0]["Y"].ShouldBe("2");
                subDocuments[1].Keys.ShouldBe(new[] { "X", "Z", "Source", "Destination", "ContentProvider" }, true);
                subDocuments[1]["X"].ShouldBe("4");
                subDocuments[1]["Z"].ShouldBe("5");
            }
            public async Task SetsMetadataKey()
            {
                // Given
                TestDocument document = new TestDocument("A: 1");
                ParseYaml    yaml     = new ParseYaml("MyYaml");

                // When
                TestDocument result = await ExecuteAsync(document, yaml).SingleAsync();

                // Then
                result.Keys.ShouldBe(new[] { "MyYaml", "Source", "Destination", "ContentProvider" }, true);
            }
            public async Task ReturnsDocumentIfEmptyInputAndFlatten()
            {
                // Given
                TestDocument document = new TestDocument(@"
");
                ParseYaml    yaml     = new ParseYaml();

                // When
                TestDocument result = await ExecuteAsync(document, yaml).SingleAsync();

                // Then
                result.Keys.ShouldBe(new[] { "Source", "Destination", "ContentProvider" }, true);
            }
            public async Task EmptyReturnIfEmptyInputAndNotFlatten()
            {
                // Given
                TestDocument document = new TestDocument(@"
");
                ParseYaml    yaml     = new ParseYaml("Foo");

                // When
                IReadOnlyList <TestDocument> results = await ExecuteAsync(document, yaml);

                // Then
                results.ShouldBeEmpty();
            }
            public async Task FlattensTopLevelScalarNodes()
            {
                // Given
                TestDocument document = new TestDocument(@"
A: 1
B: true
C: Yes
");
                ParseYaml    yaml     = new ParseYaml();

                // When
                TestDocument result = await ExecuteAsync(document, yaml).SingleAsync();

                // Then
                result.Keys.ShouldBe(new[] { "A", "B", "C", "Source", "Destination", "ContentProvider" }, true);
                result["A"].ShouldBe("1");
                result["B"].ShouldBe("true");
                result["C"].ShouldBe("Yes");
            }
            public async Task GeneratesDynamicObject()
            {
                // Given
                TestDocument document = new TestDocument(@"
A: 1
B: true
C: Yes
");
                ParseYaml    yaml     = new ParseYaml("MyYaml");

                // When
                TestDocument result = await ExecuteAsync(document, yaml).SingleAsync();

                // Then
                result.Keys.ShouldBe(new[] { "MyYaml", "Source", "Destination", "ContentProvider" }, true);
                result["MyYaml"].ShouldBeOfType <DynamicYaml>();
                ((int)((dynamic)result["MyYaml"]).A).ShouldBe(1);
                ((bool)((dynamic)result["MyYaml"]).B).ShouldBe(true);
                ((string)((dynamic)result["MyYaml"]).C).ShouldBe("Yes");
            }