File: DocumentExtensionElementTests.cs
Web Access
Project: src\test\Libraries\Microsoft.Extensions.Documents.Abstractions.Tests\Microsoft.Extensions.Documents.Abstractions.Tests.csproj (Microsoft.Extensions.Documents.Abstractions.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.Documents;
using Xunit;
 
namespace Microsoft.Extensions.Documents.Tests;
 
public class DocumentExtensionElementTests
{
    [Fact]
    public void Cleanup_RemovesObsoletePublicTypesAndMembers()
    {
        var assembly = typeof(ExtractionDocument).Assembly;
        foreach (string name in new[] { "DocumentArtifactCollection", "DocumentExtensionElement", "DocumentTextKind" })
        {
            Assert.Null(assembly.GetType("Microsoft.Extensions.Documents." + name));
        }
 
        foreach (Type type in new[]
        {
            typeof(ExtractionDocument), typeof(ExtractionDocumentElement), typeof(ExtractionDocumentSection),
            typeof(ExtractionDocumentTextElement), typeof(ExtractionDocumentImageElement), typeof(ExtractionDocumentTableElement)
        })
        {
            Assert.Null(type.GetProperty("StoredMarkdown"));
            Assert.Null(type.GetMethod("GetMarkdown"));
            Assert.Null(type.GetProperty("Markdown"));
            Assert.Equal(typeof(AIContent), type.GetProperty("Content")!.PropertyType);
        }
 
        foreach (string name in new[] { "Metadata", "HasMetadata", "Artifacts" })
        {
            Assert.Null(typeof(ExtractionDocumentElement).GetProperty(name));
            Assert.Null(typeof(ExtractionDocumentElement).GetProperty(name,
                System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic));
        }
 
        Assert.Null(typeof(ExtractionDocumentTextElement).GetProperty("HeaderLevel"));
        Assert.Null(typeof(ExtractionDocumentTextElement).GetProperty("Kind"));
        Assert.Equal(typeof(int?), typeof(ExtractionDocumentTextElement).GetProperty("HeadingLevel")!.PropertyType);
        Assert.Equal(typeof(string), typeof(ExtractionDocumentTextElement).GetProperty("Role")!.PropertyType);
        Assert.False(typeof(ExtractionDocumentTextElement).GetProperty("Role")!.CanWrite);
        var parameters = Assert.Single(typeof(ExtractionDocumentTextElement).GetConstructors()).GetParameters();
        Assert.Equal(2, parameters.Length);
        Assert.Equal("content", parameters[0].Name);
        Assert.Equal("role", parameters[1].Name);
        Assert.Equal(typeof(TextContent), parameters[0].ParameterType);
        Assert.Equal(typeof(string), parameters[1].ParameterType);
        Assert.False(parameters[0].IsOptional);
        Assert.True(parameters[1].IsOptional);
        Assert.Null(parameters[1].DefaultValue);
        Assert.Equal(typeof(System.Collections.Generic.Dictionary<string, object>),
            typeof(ExtractionDocument).GetProperty("Metadata")!.PropertyType);
        Assert.Null(typeof(ExtractionDocument).GetProperty("Artifacts"));
    }
 
    [Fact]
    public void RootMetadataAndSources_PreserveOpaqueNestedPayloadAndNativeObservations()
    {
        ExtractionDocument document = new("payload");
        using DocumentAnnotationTestData.BorrowedNative nestedNative = new();
        var payload = new { kind = "vendor-extra", nested = new { unknown = new object[] { 3, "x" }, native = nestedNative } };
        var attributes = new { vendorFlag = "kept", provenance = "urn:synthetic:engine:v1", native = nestedNative };
        ExtractionDocumentTextElement extension = new(new TextContent("visible **text**"), role: "vendor-extra");
        ExtractionDocumentSourceReference first = new(DocumentAnnotationTestData.PdfPage(), DocumentAnnotationTestData.Polygon(), attributes);
        ExtractionDocumentSourceReference second = new(new ExtractionDocumentSourcePage("frame-2", 2), DocumentAnnotationTestData.Polygon());
        extension.Sources.Add(first);
        extension.Sources.Add(second);
        document.SourcePages.Add(first.Page);
        document.SourcePages.Add(second.Page);
        document.RawRepresentation = payload;
        document.Metadata["vendor-extra"] = payload;
        document.Metadata["vendorFlag"] = "kept";
        ExtractionDocumentSection section = new(null);
        section.Elements.Add(extension);
        document.Sections.Add(section);
 
        Assert.Same(payload, document.Metadata["vendor-extra"]);
        Assert.Equal("vendor-extra", extension.Role);
        Assert.Equal(new object[] { 3, "x" }, payload.nested.unknown);
        Assert.Same(attributes, first.GetRawRepresentation());
        Assert.Equal("kept", attributes.vendorFlag);
        Assert.Equal("urn:synthetic:engine:v1", attributes.provenance);
        Assert.Equal(new[] { first, second }, extension.Sources);
        Assert.Equal(new[] { first.Page, second.Page }, document.SourcePages);
        Assert.Same(extension, Assert.Single(document.EnumerateContent()));
        Assert.Equal("kept", document.Metadata["vendorFlag"]);
        Assert.Equal("visible **text**", Assert.IsType<TextContent>(extension.Content).Text);
        Assert.Throws<NotSupportedException>(() => ((System.Collections.Generic.IList<ExtractionDocumentPoint>)first.Polygon).Clear());
        Assert.Same(payload, document.RawRepresentation);
        Assert.Same(attributes, first.GetRawRepresentation());
        Assert.Same(nestedNative, payload.nested.native);
        Assert.Same(nestedNative, attributes.native);
        Assert.Equal(0, nestedNative.DisposeCount);
    }
}